./usr/sbin/service minix-base
./usr/sbin/services_mkdb minix-base
./usr/sbin/syslogd minix-base
+./usr/sbin/tcpdump minix-base
./usr/sbin/traceroute minix-base
./usr/sbin/traceroute6 minix-base use_inet6
./usr/sbin/unlink minix-base
./var/chroot/named/var/run/lwresd minix-base
./var/chroot/named/var/run/named minix-base
./var/chroot/named/var/tmp minix-base
+./var/chroot/tcpdump minix-base
./var/db minix-base
./var/db/obsolete minix-base
./var/db/obsolete/minix-base minix-base
./usr/libdata/debug/usr/sbin/rndc.debug minix-debug debug
./usr/libdata/debug/usr/sbin/services_mkdb.debug minix-debug debug
./usr/libdata/debug/usr/sbin/syslogd.debug minix-debug debug
+./usr/libdata/debug/usr/sbin/tcpdump.debug minix-debug debug
./usr/libdata/debug/usr/sbin/traceroute.debug minix-debug debug
./usr/libdata/debug/usr/sbin/traceroute6.debug minix-debug use_inet6,debug
./usr/libdata/debug/usr/sbin/unlink.debug minix-debug debug
./usr/man/man8/sysctl.8 minix-man
./usr/man/man8/syslogd.8 minix-man
./usr/man/man8/tcpd.8 minix-man obsolete
+./usr/man/man8/tcpdump.8 minix-man
./usr/man/man8/telnetd.8 minix-man
./usr/man/man8/traceroute.8 minix-man
./usr/man/man8/traceroute6.8 minix-man use_inet6
./var/chroot/named/var/run/lwresd mode=0775 gname=named
./var/chroot/named/var/run/named mode=0775 gname=named
./var/chroot/named/var/tmp mode=01775 gname=named
+./var/chroot/tcpdump mode=0755
./var/db
./var/db/obsolete
./var/db/xdm
SUBDIR= bind byacc dhcpcd \
fetch file flex less \
libarchive libevent libpcap mdocml \
- openresolv tmux top
+ openresolv tcpdump tmux top
.if (${MKATF} != "no")
SUBDIR+= atf
--- /dev/null
+# $NetBSD: Makefile,v 1.2 2010/12/05 05:24:21 christos Exp $
+
+SUBDIR= bin
+
+.include <bsd.subdir.mk>
--- /dev/null
+# $NetBSD: Makefile,v 1.13 2015/03/31 21:59:35 christos Exp $
+
+WARNS?= 1 # XXX: need to cleanup later
+
+CWARNFLAGS.clang+= -Wno-constant-logical-operand -Wno-error=unused-function
+
+.include <bsd.own.mk>
+
+USE_FORT?= yes # network client
+
+BINDIR=/usr/sbin
+SRCDIR= ${.CURDIR}/../dist
+.PATH: ${SRCDIR}
+
+PROG= tcpdump
+MAN= tcpdump.8
+
+SRCS= addrtoname.c cpack.c gmpls.c gmt2local.c machdep.c oui.c parsenfsfh.c \
+ setsignal.c smbutil.c tcpdump.c util.c checksum.c signature.c \
+ l2vpn.c nlpid.c ipproto.c af.c in_cksum.c pf_print_state.c
+
+SRCS+= bpf_dump.c
+SRCS+= version.c
+
+SRCS+= \
+print-802_11.c \
+print-802_15_4.c \
+print-ah.c \
+print-ahcp.c \
+print-aodv.c \
+print-aoe.c \
+print-ap1394.c \
+print-arcnet.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-calm-fast.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-eap.c \
+print-egp.c \
+print-eigrp.c \
+print-enc.c \
+print-esp.c \
+print-ether.c \
+print-fddi.c \
+print-forces.c \
+print-fr.c \
+print-frag6.c \
+print-ftp.c \
+print-geneve.c \
+print-geonet.c \
+print-gre.c \
+print-hsrp.c \
+print-http.c \
+print-icmp.c \
+print-igmp.c \
+print-igrp.c \
+print-ip.c \
+print-ipcomp.c \
+print-ipfc.c \
+print-ipnet.c \
+print-ipx.c \
+print-isakmp.c \
+print-isoclns.c \
+print-juniper.c \
+print-krb.c \
+print-l2tp.c \
+print-lane.c \
+print-ldp.c \
+print-llc.c \
+print-lldp.c \
+print-lmp.c \
+print-loopback.c \
+print-lspping.c \
+print-lwapp.c \
+print-lwres.c \
+print-m3ua.c \
+print-mobile.c \
+print-mobility.c \
+print-mpcp.c \
+print-mpls.c \
+print-mptcp.c \
+print-msdp.c \
+print-msnlb.c \
+print-nflog.c \
+print-nfs.c \
+print-ntp.c \
+print-null.c \
+print-olsr.c \
+print-openflow.c \
+print-openflow-1.0.c \
+print-ospf.c \
+print-otv.c \
+print-pflog.c \
+print-pfsync.c \
+print-pgm.c \
+print-pim.c \
+print-pktap.c \
+print-ppi.c \
+print-ppp.c \
+print-pppoe.c \
+print-pptp.c \
+print-radius.c \
+print-raw.c \
+print-rip.c \
+print-ripng.c \
+print-rpki-rtr.c \
+print-rrcp.c \
+print-rsvp.c \
+print-rtsp.c \
+print-rx.c \
+print-sctp.c \
+print-sflow.c \
+print-sip.c \
+print-sl.c \
+print-sll.c \
+print-slow.c \
+print-smb.c \
+print-smtp.c \
+print-snmp.c \
+print-stp.c \
+print-sunatm.c \
+print-symantec.c \
+print-syslog.c \
+print-tcp.c \
+print-telnet.c \
+print-tftp.c \
+print-timed.c \
+print-tipc.c \
+print-token.c \
+print-udld.c \
+print-udp.c \
+print-usb.c \
+print-vjc.c \
+print-vqp.c \
+print-vrrp.c \
+print-vtp.c \
+print-vxlan.c \
+print-wb.c \
+print-zephyr.c \
+print-zeromq.c
+# MINIX 3: readd this file once rpc has been imported!
+#print-sunrpc.c
+
+version.c: VERSION
+ ${_MKTARGET_CREATE}
+ ${TOOL_SED} -e 's/.*/char version[] = "&";/' ${.ALLSRC} > ${.TARGET}
+
+LDADD+= -lpcap -ll
+DPADD+= ${LIBPCAP} ${LIBL}
+
+CPPFLAGS+= -I${.CURDIR}/../include -I${.CURDIR} -I${SRCDIR} -DHAVE_CONFIG_H
+CPPFLAGS+= -I${NETBSDSRCDIR}/dist/pf/sbin/pfctl \
+ -I${NETBSDSRCDIR}/sys/dist/pf
+
+AWKS= atime.awk packetdat.awk stime.awk send-ack.awk
+
+CPPFLAGS+=-DHAVE_CONFIG_H -D_U_="__attribute__((__unused__))"
+
+CPPFLAGS+=-DWITH_USER=\"_tcpdump\"
+CPPFLAGS+=-DWITH_CHROOT=\"/var/chroot/tcpdump\"
+
+.if (${USE_INET6} != "no")
+SRCS+= print-babel.c print-ip6.c print-ip6opts.c print-icmp6.c \
+ print-rt6.c print-dhcp6.c print-ospf6.c
+
+CPPFLAGS+=-DINET6=1 -DHAVE_RES_USE_INET6=1
+.elif defined(__MINIX)
+# MINIX 3 compilation fix for USE_INET6=no (already fixed upstream!)
+SRCS+= print-ip6.c
+.endif
+
+.if (${MKCRYPTO} != "no")
+CPPFLAGS+=-DHAVE_LIBCRYPTO=1
+LDADD+= -lcrypto -lcrypt
+DPADD+= ${LIBCRYPTO} ${LIBCRYPT}
+.endif
+
+CLEANFILES+= version.c tcpdump.8
+
+tcpdump.8: tcpdump.1.in
+ @rm -f ${.TARGET}
+ cp ${.ALLSRC} ${.TARGET}
+
+.include <bsd.prog.mk>
--- /dev/null
+Monday March. 11, 2015 guy@alum.mit.edu
+ Summary for 4.7.3 tcpdump release
+ Capsicum fixes for FreeBSD 10
+
+Monday March. 10, 2015 guy@alum.mit.edu
+ Summary for 4.7.2 tcpdump release
+ DCCP: update Packet Types with RFC4340/IANA names
+ fixes for CVE-2015-0261: IPv6 mobility header check issue
+ fixes for CVE-2015-2153, 2154, 2155: kday packets
+
+Friday Nov. 12, 2014 guy@alum.mit.edu
+ Summary for 4.7.0 tcpdump release
+ changes to hex printing of CDP packets
+ Fix PPI printing
+ Radius: update Packet Type Codes and Attribute Types with RFC/IANA names
+ Add a routine to print "text protocols", and add FTP/HTTP/SMTP/RTSP support.
+ improvements to telnet printer, even if not -v
+ omit length for bcp, print-tcp uses it
+ formatting fixes for a bunch of protocols
+ new bounds checks for a number of protocols
+ split netflow 1,6, and 6 dissector up.
+ added geneve dissector
+ CVE-2014-9140 PPP dissector fixed.
+
+Tuesday Sep. 2, 2014 mcr@sandelman.ca
+ Summary for 4.6.2 tcpdump release
+ fix out-of-source-tree builds: find libpcap that is out of source
+ better configure check for libsmi
+
+Saturday Jul. 19, 2014 mcr@sandelman.ca
+ Summary for 4.6.1 tcpdump release
+ added FreeBSD capsicum
+ add a short option '#', same as long option '--number'
+
+Wednesday Jul. 2, 2014 mcr@sandelman.ca
+ Summary for 4.6.0 tcpdump release
+ all of tcpdump is now using the new "NDO" code base (Thanks Denis!)
+ nflog, mobile, forces, pptp, AODV, AHCP, IPv6, OSPFv4, RPL, DHCPv6 enhancements/fixes
+ M3UA decode added.
+ many new test cases: 82 in 4.5.1 to 133 in 4.6.0
+ many improvements to travis continuous integration system: OSX, and Coverity options
+ cleaned up some unnecessary header files
+ Added bittok2str().
+ a number of unaligned access faults fixed
+ -A flag does not consider CR to be printable anymore
+ fx.lebail took over coverity baby sitting
+ default snapshot size increased to 256K for accomodate USB captures
+ WARNING: this release contains a lot of very worthwhile code churn.
+
+Wednesday Jan. 15, 2014 guy@alum.mit.edu
+ Summary for 4.5.2 tcpdump release
+ Man page fix
+ Fix crashes on SPARC
+
+Monday Nov. 11, 2013 mcr@sandelman.ca
+ Summary for 4.5.1 tcpdump release
+ CREDITS file fixes
+
+Thursday Nov. 7, 2013 mcr@sandelman.ca and guy@alum.mit.edu.
+ Summary for 4.5.0 tcpdump release
+ some NFSv4 fixes for printing
+ fix printing of unknown TCP options, and tcp fast-open
+ fixes for syslog parser
+ some gcc-version-specific flag tuning
+ adopt MacOS deprecation workarounds for openssl
+ improvements to babel printing
+ add OpenFlow 1.0 (no SSL) and test cases
+ GeoNet printer.
+ added STBC Rx support
+ improvements to DHCPv6 decoder
+ clarify which autoconf is needed
+ Point users to the the-tcpdump-group repository on GitHub rather
+ than the mcr repository
+ Add MSDP printer.
+ Fixed IPv6 check on Solaris and other OSes requiring extra
+ networking libraries.
+ Add support for VXLAN (draft-mahalingam-dutt-dcops-vxlan-03),
+ and add "vxlan" as an option for -T.
+ Add support for OTV (draft-hasmit-otv-04).
+ fixes for DLT_IEEE802_11_RADIO datalink types
+ added MPTCP decoder
+
+Saturday April 6, 2013 guy@alum.mit.edu.
+ Summary for 4.4.0 tcpdump release
+ RPKI-RTR (RFC6810) is now official (TCP Port 323)
+ Fix detection of OpenSSL libcrypto.
+ Add DNSSL (RFC6106) support.
+ Add "radius" as an option for -T.
+ Update Action codes for handle_action function according to
+ 802.11s amendment.
+ Decode DHCPv6 AFTR-Name option (RFC6334).
+ Updates for Babel.
+ Fix printing of infinite lifetime in ICMPv6.
+ Added support for SPB, SPBM Service Identifier, and Unicast
+ Address sub-TLV in ISIS.
+ Decode RIPv2 authentication up to RFC4822.
+ Fix RIP Request/full table decoding issues.
+ On Linux systems with cap-ng.h, drop root privileges
+ using Linux Capabilities.
+ Add support for reading multiple files.
+ Add MS NLB heartbeat printer.
+ Separate multiple nexthops in BGP.
+
+Wednesday November 28, 2012 guy@alum.mit.edu.
+ Summary for 4.3.1 tcpdump release
+ Print "LLDP, length N" for LLDP packets even when not in verbose
+ mode, so something is printed even if only the timestamp is
+ present
+ Document "-T carp"
+ Print NTP poll interval correctly (it's an exponent, so print
+ both its raw value and 2^value)
+ Document that "-e" is used to get MAC addresses
+ More clearly document that you need to escape or quote
+ backslashes in filter expressions on the command line
+ Fix some "the the" in the man page
+ Use the right maximum path length
+ Don't treat 192_1_2, when passed to -i, as an interface number
+
+Friday April 3, 2012. mcr@sandelman.ca.
+ Summary for 4.3.0 tcpdump release
+ fixes for forces: SPARSE data (per RFC 5810)
+ some more test cases added
+ updates to documentation on -l, -U and -w flags.
+ Fix printing of BGP optional headers.
+ Tried to include DLT_PFSYNC support, failed due to headers required.
+ added TIPC support.
+ Fix LLDP Network Policy bit definitions.
+ fixes for IGMPv3's Max Response Time: it is in units of 0.1 second.
+ SIGUSR1 can be used rather than SIGINFO for stats
+ permit -n flag to affect print-ip for protocol numbers
+ ND_OPT_ADVINTERVAL is in milliseconds, not seconds
+ Teach PPPoE parser about RFC 4638
+
+
+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.
+ Don't blow up if a zero-length link-layer address is passed to
+ linkaddr_string().
+
+Thu. March 11, 2010. ken@netfunctional.ca/guy@alum.mit.edu.
+ Summary for 4.1.0 tcpdump release
+ Fix printing of MAC addresses for VLAN frames with a length
+ field
+ Add some additional bounds checks and use the EXTRACT_ macros
+ more
+ Add a -b flag to print the AS number in BGP packets in ASDOT
+ notation rather than ASPLAIN notation
+ Add ICMPv6 RFC 5006 support
+ Decode the access flags in NFS access requests
+ Handle the new DLT_ for memory-mapped USB captures on Linux
+ Make the default snapshot (-s) the maximum
+ Print name of device (when -L is used)
+ Support for OpenSolaris (and SXCE build 125 and later)
+ Print new TCP flags
+ Add support for RPL DIO
+ Add support for TCP User Timeout (UTO)
+ Add support for non-standard Ethertypes used by 3com PPPoE gear
+ Add support for 802.11n and 802.11s
+ Add support for Transparent Ethernet Bridge ethertype in GRE
+ Add 4 byte AS support for BGP printer
+ Add support for the MDT SAFI 66 BG printer
+ Add basic IPv6 support to print-olsr
+ Add USB printer
+ Add printer for ForCES
+ Handle frames with an FCS
+ Handle 802.11n Control Wrapper, Block Acq Req and Block Ack frames
+ Fix TCP sequence number printing
+ Report 802.2 packets as 802.2 instead of 802.3
+ Don't include -L/usr/lib in LDFLAGS
+ On x86_64 Linux, look in lib64 directory too
+ Lots of code clean ups
+ Autoconf clean ups
+ Update testcases to make output changes
+ Fix compiling with/out smi (--with{,out}-smi)
+ Fix compiling without IPv6 support (--disable-ipv6)
+
+Mon. October 27, 2008. ken@netfunctional.ca. Summary for 4.0.0 tcpdump release
+ Add support for Bluetooth Sniffing
+ Add support for Realtek Remote Control Protocol (openrrcp.org.ru)
+ Add support for 802.11 AVS
+ Add support for SMB over TCP
+ Add support for 4 byte BGP AS printing
+ Add support for compiling on case-insensitive file systems
+ Add support for ikev2 printing
+ Update support for decoding AFS
+ Update DHCPv6 printer
+ Use newer libpcap API's (allows -B option on all platforms)
+ Add -I to turn on monitor mode
+ Bugfixes in lldp, lspping, dccp, ESP, NFS printers
+ Cleanup unused files and various cruft
+
+Mon. September 10, 2007. ken@xelerance.com. Summary for 3.9.8 tcpdump release
+ Rework ARP printer
+ Rework OSPFv3 printer
+ Add support for Frame-Relay ARP
+ Decode DHCP Option 121 (RFC 3442 Classless Static Route)
+ Decode DHCP Option 249 (MS Classless Static Route) the same as Option 121
+ TLV: Add support for Juniper .pcap extensions
+ Print EGP header in new-world-order style
+ Converted print-isakmp.c to NETDISSECT
+ Moved AF specific stuff into af.h
+ Test subsystem now table driven, and saves outputs and diffs to one place
+ Require <net/pfvar.h> for pf definitions - allows reading of pflog formatted
+ libpcap files on an OS other than where the file was generated
+
+
+Wed. July 23, 2007. mcr@xelerance.com. Summary for 3.9.7 libpcap release
+
+ NFS: Print unsigned values as such.
+ RX: parse safely.
+ BGP: fixes for IPv6-less builds.
+ 801.1ag: use standard codepoint.
+ use /dev/bpf on systems with such a device.
+ 802.11: print QoS data, avoid dissect of no-data frame, ignore padding.
+ smb: make sure that we haven't gone past the end of the captured data.
+ smb: squelch an uninitialized complaint from coverity.
+ NFS: from NetBSD; don't interpret the reply as a possible NFS reply
+ if it got MSG_DENIED.
+ BGP: don't print TLV values that didn't fit, from www.digit-labs.org.
+ revised INSTALL.txt about libpcap dependancy.
+
+Wed. April 25, 2007. ken@xelerance.com. Summary for 3.9.6 tcpdump release
+ Update man page to reflect changes to libpcap
+ Changes to both TCP and IP Printer Output
+ Fix a potential buffer overflow in the 802.11 printer
+ Print basic info about a few more Cisco LAN protocols.
+ mDNS cleanup
+ ICMP MPLS rework of the extension code
+ bugfix: use the correct codepoint for the OSPF simple text auth token
+ entry, and use safeputs to print the password.
+ Add support in pflog for additional values
+ Add support for OIF RSVP Extensions UNI 1.0 Rev. 2 and additional RSVP objects
+ Add support for the Message-id NACK c-type.
+ Add support for 802.3ah loopback ctrl msg
+ Add support for Multiple-STP as per 802.1s
+ Add support for rapid-SPT as per 802.1w
+ Add support for CFM Link-trace msg, Link-trace-Reply msg,
+ Sender-ID tlv, private tlv, port, interface status
+ Add support for unidirectional link detection as per
+ http://www.ietf.org/internet-drafts/draft-foschiano-udld-02.txt
+ Add support for the olsr protocol as per RFC 3626 plus the LQ
+ extensions from olsr.org
+ Add support for variable-length checksum in DCCP, as per section 9 of
+ RFC 4340.
+ Add support for per-VLAN spanning tree and per-VLAN rapid spanning tree
+ Add support for Multiple-STP as per 802.1s
+ Add support for the cisco propriatry 'dynamic trunking protocol'
+ Add support for the cisco proprietary VTP protocol
+ Update dhcp6 options table as per IETF standardization activities
+
+
+Tue. September 19, 2006. ken@xelerance.com. Summary for 3.9.5 tcpdump release
+
+ Fix compiling on AIX (, at end of ENUM)
+ Updated list of DNS RR typecodes
+ Use local Ethernet defs on WIN32
+ Add support for Frame-Relay ARP
+ Fixes for compiling under MSVC++
+ Add support for parsing Juniper .pcap files
+ Add support for FRF.16 Multilink Frame-Relay (DLT_MFR)
+ Rework the OSPFv3 printer
+ Fix printing for 4.4BSD/NetBSD NFS Filehandles
+ Add support for Cisco style NLPID encapsulation
+ Add cisco prop. eigrp related, extended communities
+ Add support for BGP signaled VPLS
+ Cleanup the bootp printer
+ Add support for PPP over Frame-Relay
+ Add some bounds checking to the IP options code, and clean up
+ the options output a bit.
+ Add additional modp groups to ISAKMP printer
+ Add support for Address-Withdraw and Label-Withdraw Msgs
+ Add support for the BFD Discriminator TLV
+ Fixes for 64bit compiling
+ Add support for PIMv2 checksum verification
+ Add support for further dissection of the IPCP Compression Option
+ Add support for Cisco's proposed VQP protocol
+ Add basic support for keyed authentication TCP option
+ Lots of minor cosmetic changes to output printers
+
+
+Mon. September 19, 2005. ken@xelerance.com. Summary for 3.9.4 tcpdump release
+ Decoder support for more Juniper link-layer types
+ Fix a potential buffer overflow (although it can't occur in
+ practice).
+ Fix the handling of unknown management frame types in the 802.11
+ printer.
+ Add FRF.16 support, fix various Frame Relay bugs.
+ Add support for RSVP integrity objects, update fast-reroute
+ object printer to latest spec.
+ Clean up documentation of vlan filter expression, document mpls
+ filter expression.
+ Document new pppoed and pppoes filter expressions.
+ Update diffserver-TE codepoints as per RFC 4124.
+ Spelling fixes in ICMPv6.
+ Don't require any fields other than flags to be present in IS-IS
+ restart signaling TLVs, and only print the system ID in
+ those TLVs as system IDs, not as node IDs.
+ Support for DCCP.
+
+Tue. July 5, 2005. ken@xelerance.com. Summary for 3.9.3 tcpdump release
+
+ Option to chroot() when dropping privs
+ Fixes for compiling on nearly every platform,
+ including improved 64bit support
+ Many new testcases
+ Support for sending packets
+ Many compliation fixes on most platforms
+ Fixes for recent version of GCC to eliminate warnings
+ Improved Unicode support
+
+ Decoders & DLT Changes, Updates and New:
+ AES ESP support
+ Juniper ATM, FRF.15, FRF.16, PPPoE,
+ ML-FR, ML-PIC, ML-PPP, PL-PPP, LS-PIC
+ GGSN,ES,MONITOR,SERVICES
+ L2VPN
+ Axent Raptor/Symantec Firewall
+ TCP-MD5 (RFC 2385)
+ ESP-in-UDP (RFC 3948)
+ ATM OAM
+ LMP, LMP Service Discovery
+ IP over FC
+ IP over IEEE 1394
+ BACnet MS/TP
+ SS7
+ LDP over TCP
+ LACP, MARKER as per 802.3ad
+ PGM (RFC 3208)
+ LSP-PING
+ G.7041/Y.1303 Generic Framing Procedure
+ EIGRP-IP, EIGRP-IPX
+ ICMP6
+ Radio - via radiotap
+ DHCPv6
+ HDLC over PPP
+
+Tue. March 30, 2004. mcr@sandelman.ottawa.on.ca. Summary for 3.8.3 release
+
+ No changes from 3.8.2. Version bumped only to maintain consistency
+ with libpcap 0.8.3.
+
+Mon. March 29, 2004. mcr@sandelman.ottawa.on.ca. Summary for 3.8.2 release
+
+ Fixes for print-isakmp.c CVE: CAN-2004-0183, CAN-2004-0184
+ http://www.rapid7.com/advisories/R7-0017.html
+ IP-over-IEEE1394 printing.
+ some MINGW32 changes.
+ updates for autoconf 2.5
+ fixes for print-aodv.c - check for too short packets
+ formatting changes to print-ascii for hex output.
+ check for too short packets: print-bgp.c, print-bootp.c, print-cdp.c,
+ print-chdlc.c, print-domain.c, print-icmp.c, print-icmp6.c,
+ print-ip.c, print-lwres.c, print-ospf.c, print-pim.c,
+ print-ppp.c,print-pppoe.c, print-rsvp.c, print-wb.c
+ print-ether.c - better handling of unknown types.
+ print-isoclns.c - additional decoding of types.
+ print-llc.c - strings for LLC names added.
+ print-pfloc.c - various enhancements
+ print-radius.c - better decoding to strings.
+
+Wed. November 12, 2003. mcr@sandelman.ottawa.on.ca. Summary for 3.8 release
+
+ changed syntax of -E argument so that multiple SAs can be decrypted
+ fixes for Digital Unix headers and Documentation
+ __attribute__ fixes
+ CDP changes from Terry Kennedy <terry@tmk.com>.
+ IPv6 mobility updates from Kazushi Sugyo <sugyo@pb.jp.nec.com>
+ Fixes for ASN.1 decoder for 2.100.3 forms.
+ Added a count of packets received and processed to clarify numbers.
+ Incorporated WinDUMP patches for Win32 builds.
+ PPPoE payload length headers.
+ Fixes for HP C compiler builds.
+ Use new pcap_breakloop() and pcap_findalldevs() if we can.
+ BGP output split into multiple lines.
+ Fixes to 802.11 decoding.
+ Fixes to PIM decoder.
+ SuperH is a CPU that can't handle unaligned access. Many fixes for
+ unaligned access work.
+ Fixes to Frame-Relay decoder for Q.933/922 frames.
+ Clarified when Solaris can do captures as non-root.
+ Added tests/ subdir for examples/regression tests.
+ New -U flag. -flush stdout after every packet
+ New -A flag -print ascii only
+ support for decoding IS-IS inside Cisco HDLC Frames
+ more verbosity for tftp decoder
+ mDNS decoder
+ new BFD decoder
+ cross compilation patches
+ RFC 3561 AODV support.
+ UDP/TCP pseudo-checksum properly for source-route options.
+ sanitized all files to modified BSD license
+ Add support for RFC 2625 IP-over-Fibre Channel.
+ fixes for DECnet support.
+ Support RFC 2684 bridging of Ethernet, 802.5 Token Ring, and FDDI.
+ RFC 2684 encapsulation of BPDUs.
+
+Tuesday, February 25, 2003. fenner@research.att.com. 3.7.2 release
+
+ Fixed infinite loop when parsing malformed isakmp packets.
+ (reported by iDefense; already fixed in CVS)
+ Fixed infinite loop when parsing malformed BGP packets.
+ Fixed buffer overflow with certain malformed NFS packets.
+ Pretty-print unprintable network names in 802.11 printer.
+ Handle truncated nbp (appletalk) packets.
+ Updated DHCPv6 printer to match draft-ietf-dhc-dhcpv6-22.txt
+ Print IP protocol name even if we don't have a printer for it.
+ Print IP protocol name or number for fragments.
+ Print the whole MPLS label stack, not just the top label.
+ Print request header and file handle for NFS v3 FSINFO and PATHCONF
+ requests.
+ Fix NFS packet truncation checks.
+ Handle "old" DR-Priority and Bidir-Capable PIM HELLO options.
+ Handle unknown RADIUS attributes properly.
+ Fix an ASN.1 parsing error that would cause e.g. the OID
+ 2.100.3 to be misrepresented as 4.20.3 .
+
+Monday, January 21, 2002. mcr@sandelman.ottawa.on.ca. Summary for 3.7 release
+see http://www.tcpdump.org/cvs-log/2002-01-21.10:16:48.html for commit log.
+ keyword "ipx" added.
+ Better OSI/802.2 support on Linux.
+ IEEE 802.11 support, from clenahan@fortresstech.com, achirica@ttd.net.
+ LLC SAP support for FDDI/token ring/RFC-1483 style ATM
+ BXXP protocol was replaced by the BEEP protocol;
+ improvements to SNAP demux.
+ Changes to "any" interface documentation.
+ Documentation on pcap_stats() counters.
+ Fix a memory leak found by Miklos Szeredi - pcap_ether_aton().
+ Added MPLS encapsulation decoding per RFC3032.
+ DNS dissector handles TKEY, TSIG and IXFR.
+ adaptive SLIP interface patch from Igor Khristophorov <igor@atdot.org>
+ SMB printing has much improved bounds checks
+ OUI 0x0000f8 decoded as encapsulated ethernet for Cisco-custom bridging
+ Zephyr support, from Nickolai Zeldovich <kolya@MIT.EDU>.
+ Solaris - devices with digits in them. Stefan Hudson <hudson@mbay.net>
+ IPX socket 0x85be is for Cisco EIGRP over IPX.
+ Improvements to fragmented ESP handling.
+ SCTP support from Armando L. Caro Jr. <acaro@mail.eecis.udel.edu>
+ Linux ARPHDR_ATM support fixed.
+ Added a "netbeui" keyword, which selects NetBEUI packets.
+ IPv6 ND improvements, MobileIP dissector, 2292bis-02 for RA option.
+ Handle ARPHDR_HDLC from Marcus Felipe Pereira <marcus@task.com.br>.
+ Handle IPX socket 0x553 -> NetBIOS-over-IPX socket, "nwlink-dgm"
+ Better Linux libc5 compat.
+ BIND9 lwres dissector added.
+ MIPS and SPARC get strict alignment macros (affects print-bgp.c)
+ Apple LocalTalk LINKTYPE_ reserved.
+ New time stamp formats documented.
+ DHCP6 updated to draft-22.txt spec.
+ ICMP types/codes now accept symbolic names.
+ Add SIGINFO handler from LBL
+ encrypted CIPE tunnels in IRIX, from Franz Schaefer <schaefer@mond.at>.
+ now we are -Wstrict-prototype clean.
+ NetBSD DLT_PPP_ETHER; adapted from Martin Husemann <martin@netbsd.org>.
+ PPPoE dissector cleaned up.
+ Support for LocalTalk hardware, from Uns Lider <unslider@miranda.org>.
+ In dissector, now the caller prints the IP addresses rather than proto.
+ cjclark@alum.mit.edu: print the IP proto for non-initial fragments.
+ LLC frames with a DSAP and LSAP of 0xe0 are IPX frames.
+ Linux cooked frames with a type value of LINUX_SLL_P_802_3 are IPX.
+ captures on the "any" device won't be done in promiscuous mode
+ Token Ring support on DLPI - Onno van der Linden <onno@simplex.nl>
+ ARCNet support, from NetBSD.
+ HSRP dissector, from Julian Cowley <julian@lava.net>.
+ Handle (GRE-encapsulated) PPTP
+ added -C option to rotate save file every optarg * 1,000,000 bytes.
+ support for "vrrp" name - NetBSD, by Klaus Klein <kleink@netbsd.org>.
+ PPTP support, from Motonori Shindo <mshindo@mshindo.net>.
+ IS-IS over PPP support, from Hannes Gredler <hannes@juniper.net>.
+ CNFP support for IPv6,format. Harry Raaymakers <harryr@connect.com.au>.
+ ESP printing updated to RFC2406.
+ HP-UX can now handle large number of PPAs.
+ MSDP printer added.
+ L2TP dissector improvements from Motonori Shindo.
+
+Tuesday January 9, 2001. mcr@sandelman.ottawa.on.ca. Summary for 3.6 release
+ Cleaned up documentation.
+ Promisc mode fixes for Linux
+ IPsec changes/cleanups.
+ Alignment fixes for picky architectures
+
+ Removed dependency on native headers for packet dissectors.
+ Removed Linux specific headers that were shipped
+
+ libpcap changes provide for exchanging capture files between
+ systems. Save files now have well known PACKET_ values instead of
+ depending upon system dependant mappings of DLT_* types.
+
+ Support for computing/checking IP and UDP/TCP checksums.
+
+ Updated autoconf stock files.
+
+ IPv6 improvements: dhcp (draft-15), mobile-ip6, ppp, ospf6,
+
+ Added dissector support for: ISOCLNS, Token Ring, IGMPv3, bxxp,
+ timed, vrrp, radius, chdlc, cnfp, cdp, IEEE802.1d, raw-AppleTalk
+
+ Added filtering support for: VLANs, ESIS, ISIS
+
+ Improvements to: print-telnet, IPTalk, bootp/dhcp, ECN, PPP,
+ L2TP, PPPoE
+
+ HP-UX 11.0 -- find the right dlpi device.
+ Solaris 8 - IPv6 works
+ Linux - Added support for an "any" device to capture on all interfaces
+
+ Security fixes: buffer overrun audit done. Strcpy replaced with
+ strlcpy, sprintf replaced with snprintf.
+ Look for lex problems, and warn about them.
+
+
+v3.5 Fri Jan 28 18:00:00 PST 2000
+
+Bill Fenner <fenner@research.att.com>
+- switch to config.h for autoconf
+- unify RCSID strings
+- Updated PIMv1, PIMv2, DVMRP, IGMP parsers, add Cisco Auto-RP parser
+- Really fix the RIP printer
+- Fix MAC address -> name translation.
+- some -Wall -Wformat fixes
+- update makemib to parse much of SMIv2
+- Print TCP sequence # with -vv even if you normally wouldn't
+- Print as much of IP/TCP/UDP headers as possible even if truncated.
+
+itojun@iijlab.net
+- -X will make a ascii dump. from netbsd.
+- telnet command sequence decoder (ff xx xx). from netbsd.
+- print-bgp.c: improve options printing. ugly code exists for
+ unaligned option parsing (need some fix).
+- const poisoning in SMB decoder.
+- -Wall -Werror clean checks.
+- bring in KAME IPv6/IPsec decoding code.
+
+Assar Westerlund <assar@sics.se>
+- SNMPv2 and SNMPv3 printer
+- If compiled with libsmi, tcpdump can load MIBs on the fly to decode
+ SNMP packets.
+- Incorporate NFS parsing code from NetBSD. Adds support for nfsv3.
+- portability fixes
+- permit building in different directories.
+
+Ken Hornstein <kenh@cmf.nrl.navy.mil>
+- bring in code at
+ /afs/transarc.com/public/afs-contrib/tools/tcpdump for parsing
+ AFS3 packets
+
+Andrew Tridgell <tridge@linuxcare.com>
+- SMB printing code
+
+Love <lha@stacken.kth.se>
+- print-rx.c: add code for printing MakeDir and StoreStatus. Also
+ change date format to the right one.
+
+Michael C. Richardson <mcr@sandelman.ottawa.on.ca>
+- Created tcpdump.org repository
+
+v3.4 Sat Jul 25 12:40:55 PDT 1998
+
+- Hardwire Linux slip support since it's too hard to detect.
+
+- Redo configuration of "network" libraries (-lsocket and -lnsl) to
+ deal with IRIX. Thanks to John Hawkinson (jhawk@mit.edu)
+
+- Added -a which tries to translate network and broadcast addresses to
+ names. Suggested by Rob van Nieuwkerk (robn@verdi.et.tudelft.nl)
+
+- Added a configure option to disable gcc.
+
+- Added a "raw" packet printer.
+
+- Not having an interface address is no longer fatal. Requested by John
+ Hawkinson.
+
+- Rework signal setup to accommodate Linux.
+
+- OSPF truncation check fix. Also display the type of OSPF packets
+ using MD5 authentication. Thanks to Brian Wellington
+ (bwelling@tis.com)
+
+- Fix truncation check bugs in the Kerberos printer. Reported by Ezra
+ Peisach (epeisach@mit.edu)
+
+- Don't catch SIGHUP when invoked with nohup(1). Thanks to Dave Plonka
+ (plonka@mfa.com)
+
+- Specify full install target as a way of detecting if install
+ directory does not exist. Thanks to Dave Plonka.
+
+- Bit-swap FDDI addresses for BSD/OS too. Thanks to Paul Vixie
+ (paul@vix.com)
+
+- Fix off-by-one bug when testing size of ethernet packets. Thanks to
+ Marty Leisner (leisner@sdsp.mc.xerox.com)
+
+- Add a local autoconf macro to check for routines in libraries; the
+ autoconf version is broken (it only puts the library name in the
+ cache variable name). Thanks to John Hawkinson.
+
+- Add a local autoconf macro to check for types; the autoconf version
+ is broken (it uses grep instead of actually compiling a code fragment).
+
+- Modified to support the new BSD/OS 2.1 PPP and SLIP link layer header
+ formats.
+
+- Extend OSF ip header workaround to versions 1 and 2.
+
+- Fix some signed problems in the nfs printer. As reported by David
+ Sacerdote (davids@silence.secnet.com)
+
+- Detect group wheel and use it as the default since BSD/OS' install
+ can't hack numeric groups. Reported by David Sacerdote.
+
+- AIX needs special loader options. Thanks to Jonathan I. Kamens
+ (jik@cam.ov.com)
+
+- Fixed the nfs printer to print port numbers in decimal. Thanks to
+ Kent Vander Velden (graphix@iastate.edu)
+
+- Find installed libpcap in /usr/local/lib when not using gcc.
+
+- Disallow network masks with non-network bits set.
+
+- Attempt to detect "egcs" versions of gcc.
+
+- Add missing closing double quotes when displaying bootp strings.
+ Reported by Viet-Trung Luu (vluu@picard.math.uwaterloo.ca)
+
+v3.3 Sat Nov 30 20:56:27 PST 1996
+
+- Added Linux support.
+
+- GRE encapsulated packet printer thanks to John Hawkinson
+ (jhawk@mit.edu)
+
+- Rewrite gmt2local() to avoid problematic os dependencies.
+
+- Suppress nfs truncation message on errors.
+
+- Add missing m4 quoting in AC_LBL_UNALIGNED_ACCESS autoconf macro.
+ Reported by Joachim Ott (ott@ardala.han.de)
+
+- Enable "ip_hl vs. ip_vhl" workaround for OSF4 too.
+
+- Print arp hardware type in host order. Thanks to Onno van der Linden
+ (onno@simplex.nl)
+
+- Avoid solaris compiler warnings. Thanks to Bruce Barnett
+ (barnett@grymoire.crd.ge.com)
+
+- Fix rip printer to not print one more route than is actually in the
+ packet. Thanks to Jean-Luc Richier (Jean-Luc.Richier@imag.fr) and
+ Bill Fenner (fenner@parc.xerox.com)
+
+- Use autoconf endian detection since BYTE_ORDER isn't defined on all systems.
+
+- Fix dvmrp printer truncation checks and add a dvmrp probe printer.
+ Thanks to Danny J. Mitzel (mitzel@ipsilon.com)
+
+- Rewrite ospf printer to improve truncation checks.
+
+- Don't parse tcp options past the EOL. As noted by David Sacerdote
+ (davids@secnet.com). Also, check tcp options to make sure they ar
+ actually in the tcp header (in addition to the normal truncation
+ checks). Fix the SACK code to print the N blocks (instead of the
+ first block N times).
+
+- Don't say really small UDP packets are truncated just because they
+ aren't big enough to be a RPC. As noted by David Sacerdote.
+
+v3.2.1 Sun Jul 14 03:02:26 PDT 1996
+
+- Added rfc1716 icmp codes as suggested by Martin Fredriksson
+ (martin@msp.se)
+
+- Print mtu for icmp unreach need frag packets. Thanks to John
+ Hawkinson (jhawk@mit.edu)
+
+- Decode icmp router discovery messages. Thanks to Jeffrey Honig
+ (jch@bsdi.com)
+
+- Added a printer entry for DLT_IEEE802 as suggested by Tak Kushida
+ (kushida@trl.ibm.co.jp)
+
+- Check igmp checksum if possible. Thanks to John Hawkinson.
+
+- Made changes for SINIX. Thanks to Andrej Borsenkow
+ (borsenkow.msk@sni.de)
+
+- Use autoconf's idea of the top level directory in install targets.
+ Thanks to John Hawkinson.
+
+- Avoid infinite loop in tcp options printing code. Thanks to Jeffrey
+ Mogul (mogul@pa.dec.com)
+
+- Avoid using -lsocket in IRIX 5.2 and earlier since it breaks snoop.
+ Thanks to John Hawkinson.
+
+- Added some more packet truncation checks.
+
+- On systems that have it, use sigset() instead of signal() since
+ signal() has different semantics on these systems.
+
+- Fixed some more alignment problems on the alpha.
+
+- Add code to massage unprintable characters in the domain and ipx
+ printers. Thanks to John Hawkinson.
+
+- Added explicit netmask support. Thanks to Steve Nuchia
+ (steve@research.oknet.com)
+
+- Add "sca" keyword (for DEC cluster services) as suggested by Terry
+ Kennedy (terry@spcvxa.spc.edu)
+
+- Add "atalk" keyword as suggested by John Hawkinson.
+
+- Added an igrp printer. Thanks to Francis Dupont
+ (francis.dupont@inria.fr)
+
+- Print IPX net numbers in hex a la Novell Netware. Thanks to Terry
+ Kennedy (terry@spcvxa.spc.edu)
+
+- Fixed snmp extended tag field parsing bug. Thanks to Pascal Hennequin
+ (pascal.hennequin@hugo.int-evry.fr)
+
+- Added some ETHERTYPEs missing on some systems.
+
+- Added truncated packet macros and various checks.
+
+- Fixed endian problems with the DECnet printer.
+
+- Use $CC when checking gcc version. Thanks to Carl Lindberg
+ (carl_lindberg@blacksmith.com)
+
+- Fixes for AIX (although this system is not yet supported). Thanks to
+ John Hawkinson.
+
+- Fix bugs in the autoconf misaligned accesses code fragment.
+
+- Include sys/param.h to get BYTE_ORDER in a few places. Thanks to
+ Pavlin Ivanov Radoslavov (pavlin@cs.titech.ac.jp)
+
+v3.2 Sun Jun 23 02:28:10 PDT 1996
+
+- Print new icmp unreachable codes as suggested by Martin Fredriksson
+ (martin@msp.se). Also print code value when unknown for icmp redirect
+ and time exceeded.
+
+- Fix an alignment endian bug in getname(). Thanks to John Hawkinson.
+
+- Define "new" domain record types if not found in arpa/nameserv.h.
+ Resulted from a suggestion from John Hawkinson (jhawk@mit.edu). Also
+ fixed an endian bug when printing mx record and added some new record
+ types.
+
+- Added RIP V2 support. Thanks to Jeffrey Honig (jch@bsdi.com)
+
+- Added T/TCP options printing. As suggested by Richard Stevens
+ (rstevens@noao.edu)
+
+- Use autoconf to detect architectures that can't handle misaligned
+ accesses.
+
+v3.1 Thu Jun 13 20:59:32 PDT 1996
+
+- Changed u_int32/int32 to u_int32_t/int32_t to be consistent with bsd
+ and bind (as suggested by Charles Hannum).
+
+- Port to GNU autoconf.
+
+- Add support for printing DVMRP and PIM traffic thanks to
+ Havard Eidnes (Havard.Eidnes@runit.sintef.no).
+
+- Fix AppleTalk, IPX and DECnet byte order problems due to wrong endian
+ define being referenced. Reported by Terry Kennedy.
+
+- Minor fixes to the man page thanks to Mark Andrews.
+
+- Endian fixes to RTP and vat packet dumpers, thanks to Bruce Mah
+ (bmah@cs.berkeley.edu).
+
+- Added support for new dns types, thanks to Rainer Orth.
+
+- Fixed tftp_print() to print the block number for ACKs.
+
+- Document -dd and -ddd. Resulted from a bug report from Charlie Slater
+ (cslater@imatek.com).
+
+- Check return status from malloc/calloc/etc.
+
+- Check return status from pcap_loop() so we can print an error and
+ exit with a bad status if there were problems.
+
+- Bail if ip option length is <= 0. Resulted from a bug report from
+ Darren Reed (darrenr@vitruvius.arbld.unimelb.edu.au).
+
+- Print out a little more information for sun rpc packets.
+
+- Add suport for Kerberos 4 thanks to John Hawkinson (jhawk@mit.edu).
+
+- Fixed the Fix EXTRACT_SHORT() and EXTRACT_LONG() macros (which were
+ wrong on little endian machines).
+
+- Fixed alignment bug in ipx_decode(). Thanks to Matt Crawford
+ (crawdad@fnal.gov).
+
+- Fix ntp_print() to not print garbage when the stratum is
+ "unspecified." Thanks to Deus Ex Machina (root@belle.bork.com).
+
+- Rewrote tcp options printer code to check for truncation. Added
+ selective acknowledgment case.
+
+- Fixed an endian bug in the ospf printer. Thanks to Jeffrey C Honig
+ (jch@bsdi.com)
+
+- Fix rip printer to handle 4.4 BSD sockaddr struct which only uses one
+ octet for the sa_family member. Thanks to Yoshitaka Tokugawa
+ (toku@dit.co.jp)
+
+- Don't checksum ip header if we don't have all of it. Thanks to John
+ Hawkinson (jhawk@mit.edu).
+
+- Print out hostnames if possible in egp printer. Thanks to Jeffrey
+ Honig (jhc@bsdi.com)
+
+
+v3.1a1 Wed May 3 19:21:11 PDT 1995
+
+- Include time.h when SVR4 is defined to avoid problems under Solaris
+ 2.3.
+
+- Fix etheraddr_string() in the ETHER_SERVICE to return the saved
+ strings, not the local buffer. Thanks to Stefan Petri
+ (petri@ibr.cs.tu-bs.de).
+
+- Detect when pcap raises the snaplen (e.g. with snit). Print a warning
+ that the selected value was not used. Thanks to Pascal Hennequin
+ (Pascal.Hennequin@hugo.int-evry.fr).
+
+- Add a truncated packet test to print-nfs.c. Thanks to Pascal Hennequin.
+
+- BYTEORDER -> BYTE_ORDER Thanks to Terry Kennedy (terry@spcvxa.spc.edu).
+
+v3.0.3 Sun Oct 1 18:35:00 GMT 1995
+
+- Although there never was a 3.0.3 release, the linux boys cleverly
+ "released" one in late 1995.
+
+v3.0.2 Thu Apr 20 21:28:16 PDT 1995
+
+- Change configuration to not use gcc v2 flags with gcc v1.
+
+- Redo gmt2local() so that it works under BSDI (which seems to return
+ an empty timezone struct from gettimeofday()). Based on report from
+ Terry Kennedy (terry@spcvxa.spc.edu).
+
+- Change configure to recognize IP[0-9]* as "mips" SGI hardware. Based
+ on report from Mark Andrews (mandrews@alias.com).
+
+- Don't pass cc flags to gcc. Resulted from a bug report from Rainer
+ Orth (ro@techfak.uni-bielefeld.de).
+
+- Fixed printout of connection id for uncompressed tcp slip packets.
+ Resulted from a bug report from Richard Stevens (rstevens@noao.edu).
+
+- Hack around deficiency in Ultrix's make.
+
+- Add ETHERTYPE_TRAIL define which is missing from irix5.
+
+v3.0.1 Wed Aug 31 22:42:26 PDT 1994
+
+- Fix problems with gcc2 vs. malloc() and read() prototypes under SunOS 4.
+
+v3.0 Mon Jun 20 19:23:27 PDT 1994
+
+- Added support for printing tcp option timestamps thanks to
+ Mark Andrews (mandrews@alias.com).
+
+- Reorganize protocol dumpers to take const pointers to packets so they
+ never change the contents (i.e., they used to do endian conversions
+ in place). Previously, whenever more than one pass was taken over
+ the packet, the packet contents would be dumped incorrectly (i.e.,
+ the output form -x would be wrong on little endian machines because
+ the protocol dumpers would modify the data). Thanks to Charles Hannum
+ (mycroft@gnu.ai.mit.edu) for reporting this problem.
+
+- Added support for decnet protocol dumping thanks to Jeff Mogul
+ (mogul@pa.dec.com).
+
+- Fix bug that caused length of packet to be incorrectly printed
+ (off by ether header size) for unknown ethernet types thanks
+ to Greg Miller (gmiller@kayak.mitre.org).
+
+- Added support for IPX protocol dumping thanks to Brad Parker
+ (brad@fcr.com).
+
+- Added check to verify IP header checksum under -v thanks to
+ Brad Parker (brad@fcr.com).
+
+- Move packet capture code to new libpcap library (which is
+ packaged separately).
+
+- Prototype everything and assume an ansi compiler.
+
+- print-arp.c: Print hardware ethernet addresses if they're not
+ what we expect.
+
+- print-bootp.c: Decode the cmu vendor field. Add RFC1497 tags.
+ Many helpful suggestions from Gordon Ross (gwr@jericho.mc.com).
+
+- print-fddi.c: Improvements. Thanks to Jeffrey Mogul
+ (mogul@pa.dec.com).
+
+- print-icmp.c: Byte swap netmask before printing. Thanks to
+ Richard Stevens (rstevens@noao.edu). Print icmp type when unknown.
+
+- print-ip.c: Print the inner ip datagram of ip-in-ip encapsulated packets.
+ By default, only the inner packet is dumped, appended with the token
+ "(encap)". Under -v, both the inner and output packets are dumped
+ (on the same line). Note that the filter applies to the original packet,
+ not the encapsulated packet. So if you run tcpdump on a net with an
+ IP Multicast tunnel, you cannot filter out the datagrams using the
+ conventional syntax. (You can filter away all the ip-in-ip traffic
+ with "not ip proto 4".)
+
+- print-nfs.c: Keep pending rpc's in circular table. Add generic
+ nfs header and remove os dependences. Thanks to Jeffrey Mogul.
+
+- print-ospf.c: Improvements. Thanks to Jeffrey Mogul.
+
+- tcpdump.c: Add -T flag allows interpretation of "vat", "wb", "rpc"
+ (sunrpc) and rtp packets. Added "inbound" and "outbound" keywords
+ Add && and || operators
+
+v2.2.1 Tue Jun 6 17:57:22 PDT 1992
+
+- Fix bug with -c flag.
+
+v2.2 Fri May 22 17:19:41 PDT 1992
+
+- savefile.c: Remove hack that shouldn't have been exported. Add
+ truncate checks.
+
+- Added the 'icmp' keyword. For example, 'icmp[0] != 8 and icmp[0] != 0'
+ matches non-echo/reply ICMP packets.
+
+- Many improvements to filter code optimizer.
+
+- Added 'multicast' keyword and extended the 'broadcast' keyword can now be
+ so that protocol qualifications are allowed. For example, "ip broadcast"
+ and "ether multicast" are valid filters.
+
+- Added support for monitoring the loopback interface (i.e. 'tcpdump -i lo').
+ Jeffrey Honig (jch@MITCHELL.CIT.CORNELL.EDU) contributed the kernel
+ patches to netinet/if_loop.c.
+
+- Added support for the Ungermann-Bass Ethernet on IBM/PC-RTs running AOS.
+ Contact Jeffrey Honig (jch@MITCHELL.CIT.CORNELL.EDU) for the diffs.
+
+- Added EGP and OSPF printers, thanks to Jeffrey Honig.
+
+v2.1 Tue Jan 28 11:00:14 PST 1992
+
+- Internal release (never publically exported).
+
+v2.0.1 Sun Jan 26 21:10:10 PDT
+
+- Various byte ordering fixes.
+
+- Add truncation checks.
+
+- inet.c: Support BSD style SIOCGIFCONF.
+
+- nametoaddr.c: Handle multi addresses for single host.
+
+- optimize.c: Rewritten.
+
+- pcap-bpf.c: don't choke when we get ptraced. only set promiscuous
+ for broadcast nets.
+
+- print-atal.c: Fix an alignment bug (thanks to
+ stanonik@nprdc.navy.mil) Add missing printf() argument.
+
+- print-bootp.c: First attempt at decoding the vendor buffer.
+
+- print-domain.c: Fix truncation checks.
+
+- print-icmp.c: Calculate length of packets from the ip header.
+
+- print-ip.c: Print frag id in decimal (so it's easier to match up
+ with non-frags). Add support for ospf, egp and igmp.
+
+- print-nfs.c: Lots of changes.
+
+- print-ntp.c: Make some verbose output depend on -v.
+
+- print-snmp.c: New version from John LoVerso.
+
+- print-tcp.c: Print rfc1072 tcp options.
+
+- tcpdump.c: Print "0x" prefix for %x formats. Always print 6 digits
+ (microseconds) worth of precision. Fix uid bugs.
+
+- A packet dumper has been added (thanks to Jeff Mogul of DECWRL).
+ With this option, you can create an architecture independent binary
+ trace file in real time, without the overhead of the packet printer.
+ At a later time, the packets can be filtered (again) and printed.
+
+- BSD is supported. You must have BPF in your kernel.
+ Since the filtering is now done in the kernel, fewer packets are
+ dropped. In fact, with BPF and the packet dumper option, a measly
+ Sun 3/50 can keep up with a busy network.
+
+- Compressed SLIP packets can now be dumped, provided you use our
+ SLIP software and BPF. These packets are dumped as any other IP
+ packet; the compressed headers are dumped with the '-e' option.
+
+- Machines with little-endian byte ordering are supported (thanks to
+ Jeff Mogul).
+
+- Ultrix 4.0 is supported (also thanks to Jeff Mogul).
+
+- IBM RT and Stanford Enetfilter support has been added by
+ Rayan Zachariassen <rayan@canet.ca>. Tcpdump has been tested under
+ both the vanilla Enetfilter interface, and the extended interface
+ (#ifdef'd by IBMRTPC) present in the MERIT version of the Enetfilter.
+
+- TFTP packets are now printed (requests only).
+
+- BOOTP packets are now printed.
+
+- SNMP packets are now printed. (thanks to John LoVerso of Xylogics).
+
+- Sparc architectures, including the Sparcstation-1, are now
+ supported thanks to Steve McCanne and Craig Leres.
+
+- SunOS 4 is now supported thanks to Micky Liu of Columbia
+ University (micky@cunixc.cc.columbia.edu).
+
+- IP options are now printed.
+
+- RIP packets are now printed.
+
+- There's a -v flag that prints out more information than the
+ default (e.g., it will enable printing of IP ttl, tos and id)
+ and -q flag that prints out less (e.g., it will disable
+ interpretation of AppleTalk-in-UDP).
+
+- The grammar has undergone substantial changes (if you have an
+ earlier version of tcpdump, you should re-read the manual
+ entry).
+
+ The most useful change is the addition of an expression
+ syntax that lets you filter on arbitrary fields or values in the
+ packet. E.g., "ip[0] > 0x45" would print only packets with IP
+ options, "tcp[13] & 3 != 0" would print only TCP SYN and FIN
+ packets.
+
+ The most painful change is that concatenation no longer means
+ "and" -- e.g., you have to say "host foo and port bar" instead
+ of "host foo port bar". The up side to this down is that
+ repeated qualifiers can be omitted, making most filter
+ expressions shorter. E.g., you can now say "ip host foo and
+ (bar or baz)" to look at ip traffic between hosts foo and bar or
+ between hosts foo and baz. [The old way of saying this was "ip
+ host foo and (ip host bar or ip host baz)".]
+
+v2.0 Sun Jan 13 12:20:40 PST 1991
+
+- Initial public release.
--- /dev/null
+This file lists people who have contributed to tcpdump:
+
+The current maintainers:
+ Bill Fenner <fenner at research dot att dot com>
+ Denis Ovsienko <denis at ovsienko dot info>
+ Fulvio Risso <risso at polito dot it>
+ Guy Harris <guy at alum dot mit dot edu>
+ Hannes Gredler <hannes at juniper dot net>
+ Michael Richardson <mcr at sandelman dot ottawa dot on dot ca>
+ Francois-Xavier Le Bail <fx dot lebail at yahoo dot com>
+
+Additional people who have contributed patches:
+
+ Aaron Campbell <aaron at arbor dot net>
+ A Costa <agcosta at gis dot net>
+ Albert Chin <china at thewrittenword dot com>
+ Alexandra Kossovsky <alexandra1975 at sourceforge dot net>
+ Alfredo Andres <aandres at s21sec dot com>
+ Ananth Suryanarayana <anantha at juniper dot net>
+ Andrea Bittau <a dot bittau at cs dot ucl dot ac dot uk>
+ 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 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>
+ Atsushi Onoe <onoe at netbsd dot org>
+ Baptiste Jonglez <baptiste dot jonglez at ens-lyon dot org>
+ Ben Byer <bushing at sourceforge dot net>
+ Ben Smithurst <ben at scientia dot demon dot co dot uk>
+ Bert Vermeulen <bert at biot dot com>
+ Bjoern A. Zeeb <bzeeb at Zabbadoz dot NeT>
+ Bram <tcpdump at mail dot wizbit dot be>
+ Brent L. Bates <blbates at vigyan dot com>
+ Brian Ginsbach <ginsbach at cray dot com>
+ Bruce M. Simpson <bms at spc dot org>
+ Carles Kishimoto Bisbe <ckishimo at ac dot upc dot es>
+ Charles M. Hannum <mycroft at netbsd dot org>
+ Charlie Lenahan <clenahan at fortresstech dot com>
+ Chris Cogdon <chris at cogdon dot org>
+ Chris G. Demetriou <cgd at netbsd dot org>
+ 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>
+ Cliff Frey <cliff at meraki dot com>
+ 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>
+ Darren Reed <darrenr at reed dot wattle dot id dot au>
+ David Binderman <d dot binderman at virgin dot net>
+ David Horn <dhorn2000 at gmail dot com>
+ David Smith <dsmith at redhat dot com>
+ David Young <dyoung at ojctech dot com>
+ Dmitrij Tejblum <tejblum at yandex-team dot ru>
+ 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>
+ Fang Wang <fangwang at sourceforge dot net>
+ Florent Drouin <Florent dot Drouin at alcatel-lucent dot fr>
+ Florian Forster <octo at verplant dot org>
+ fra <foo at bar dot baz>
+ Francesco Fondelli <francesco dot fondelli at gmail dot com>
+ Francisco Matias Cuenca-Acuna <mcuenca at george dot rutgers dot edu>
+ Francis Dupont <Francis dot Dupont at enst-bretagne dot fr>
+ Frank Volf <volf at oasis dot IAEhv dot nl>
+ Fulvio Risso <risso at polito dot it>
+ George Bakos <gbakos at ists dot dartmouth dot edu>
+ Gerald Combs <gerald at ethereal dot com>
+ Gerrit Renker <gerrit at erg dot abdn dot ac dot uk>
+ Gert Doering <gert at greenie dot muc dot de>
+ Gilbert Ramirez Jr. <gram at xiexie dot org>
+ Gisle Vanem <gvanem at yahoo dot no>
+ Greg Minshall <minshall at acm dot org>
+ Grégoire Henry <henry at pps dot jussieu dot fr>
+ Gregory Detal <gregory dot detal at uclouvain dot be>
+ Greg Stark <gsstark at mit dot edu>
+ Hank Leininger <tcpdump-workers at progressive-comp dot com>
+ Hannes Viertel <hviertel at juniper dot net>
+ Harry Raaymakers <harryr at connect dot com dot au>
+ Heinz-Ado Arnolds <Ado dot Arnolds at dhm-systems dot de>
+ Hendrik Scholz <hendrik at scholz dot net>
+ Herwin Weststrate <herwin at quarantainenet dot nl>
+ Ian McDonald <imcdnzl at gmail dot com>
+ Ilpo Järvinen <ilpo dot jarvinen at helsinki dot fi>
+ Jacek Tobiasz <Jacek dot Tobiasz at atm dot com dot pl>
+ Jakob Schlyter <jakob at openbsd dot org>
+ Jamal Hadi Salim <hadi at cyberus dot ca>
+ Jan Oravec <wsx at wsx6 dot net>
+ Jason R. Thorpe <thorpej at netbsd dot org>
+ Jefferson Ogata <jogata at nodc dot noaa dot gov>
+ Jeffrey Hutzelman <jhutz at cmu dot edu>
+ Jesper Peterson <jesper at endace dot com>
+ Jesse Gross <jesse at nicira dot com>
+ Jim Hutchins <jim at ca dot sandia dot gov>
+ João Medeiros <ignotus21 at sourceforge dot net>
+ Joerg Mayer <jmayer at loplof dot de>
+ Jonathan Heusser <jonny at drugphish dot ch>
+ Jorge Boncompte [DTI2] <jorge at dti2 dot net>
+ Jørgen Thomsen <jth at jth dot net>
+ Julian Cowley <julian at lava dot net>
+ Juliusz Chroboczek <jch at pps dot jussieu dot 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>
+ Ken Hornstein <kenh at cmf dot nrl dot navy dot mil>
+ Kenichi Maehashi <webmaster at kenichimaehashi dot com>
+ Kevin Steves <stevesk at pobox dot com>
+ Klaus Klein <kleink at reziprozitaet dot de>
+ Kris Kennaway <kris at freebsd dot org>
+ Krzysztof Halasa <khc at pm dot waw dot pl>
+ Larry Lile <lile at stdio dot com>
+ Lennert Buytenhek <buytenh at gnu dot org>
+ Loganaden Velvindron <logan at elandsys dot com>
+ Longinus00 <Longinus00 at gmail dot com>
+ Loris Degioanni <loris at netgroup-serv dot polito dot it>
+ Love Hörnquist-Åstrand <lha at stacken dot kth dot se>
+ Lucas C. Villa Real <lucasvr at us dot ibm dot com>
+ Luis MartinGarcia <luis dot mgarc at gmail dot com>
+ Maciej W. Rozycki <macro at ds2 dot pg dot gda dot pl>
+ Manu Pathak <mapathak at cisco dot com>
+ Marc Abramowitz <marc at marc-abramowitz dot com>
+ Marc A. Lehmann <pcg at goof dot com>
+ Marc Binderberger <mbind at sourceforge dot net>
+ Mark Ellzey Thomas <mark at ackers dot net>
+ Marko Kiiskila <carnil at cs dot tut dot fi>
+ Markus Schöpflin <schoepflin at sourceforge dot net>
+ Marshall Rose <mrose at dbc dot mtview dot ca dot us>
+ Martin Husemann <martin at netbsd dot org>
+ Max Laier <max at love2party dot net>
+ Michael A. Meffie III <meffie at sourceforge dot net>
+ Michael Madore <mmadore at turbolinux dot com>
+ Michael Riepe <too-tired at sourceforge dot net>
+ 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>
+ Nathaniel Couper-Noles <Nathaniel at isi1 dot tccisi dot com>
+ Nathan J. Williams <nathanw at MIT dot EDU>
+ Neil T. Spring <bluehal at users dot sourceforge dot net>
+ Nickolai Zeldovich <kolya at MIT dot EDU>
+ Nicolas Ferrero <toorop at babylo dot net>
+ Niels Provos <provos at openbsd dot org>
+ Noritoshi Demizu <demizu at users dot sourceforge dot net>
+ Olaf Kirch <okir at caldera dot de>
+ Ola Martin Lykkja <ola dot lykkja at q-free dot com>
+ Oleksij Rempel <linux at rempel-privat dot de>
+ Onno van der Linden <onno at simplex dot nl>
+ 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>
+ Petar Alilovic <petar dot alilovic at gmail dot com>
+ Peter Fales <peter at fales-lorenz dot net>
+ Peter Jeremy <peter dot jeremy at alcatel dot com dot au>
+ Peter Volkov <pva at gentoo dot org>
+ <pfhunt at users dot sourceforge dot net>
+ Phil Wood <cpw at lanl dot gov>
+ Rafal Maszkowski <rzm at icm dot edu dot pl>
+ Randy Sofia <rsofia at users dot sourceforge dot net>
+ Raphael Raimbault <raphael dot raimbault at netasq dot com>
+ Rick Cheng <rcheng at juniper dot net>
+ Rick Jones <rick dot jones2 at hp dot com>
+ Rick Watson <watsonrick at users dot sourceforge dot net>
+ 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>
+ Ruben Kerkhof <ruben at rubenkerkhof dot com>
+ Sagun Shakya <sagun dot shakya at sun dot com>
+ Sami Farin <safari at iki dot fi>
+ Scott Mcmillan <scott dot a dot 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>
+ Sebastien Vincent <svincent at idems dot fr>
+ Sepherosa Ziehau <sepherosa at gmail dot com>
+ Seth Webster <swebster at sst dot ll dot mit dot edu>
+ Shinsuke Suzuki <suz at kame dot net>
+ Simon Ruderich <simon at ruderich dot org>
+ Steinar Haug <sthaug at nethelp dot no>
+ Stephane Bortzmeyer <stephane+github at bortzmeyer dot org>
+ Swaminathan Chandrasekaran <chander at juniper dot net>
+ Swaathi Vetrivel <swaathiv at juniper dot net>
+ Takashi Yamamoto <yamt at mwd dot biglobe dot ne dot jp>
+ Tatuya Jinmei <jinmei at kame dot net>
+ Terry Kennedy <terry at tmk dot com>
+ Thomas Jacob <jacob at internet24 dot de>
+ Timo Koskiahde
+ Tony Li <tli at procket dot com>
+ Toshihiro Kanda <candy at fct dot kgc dot co dot jp>
+ Udayakumar <udaya011 at gmail dot com>
+ Uns Lider <unslider at miranda dot org>
+ Victor Oppleman <oppleman at users dot sourceforge dot net>
+ Vyacheslav Trushkin <dogonthesun at gmail dot com>
+ 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>
+ Will Drewry <will at alum dot bu dot edu>
+ William J. Hulley <bill dot hulley at gmail dot com>
+ Wim Torfs <wtorfs at gmail dot com>
+ Yen Yen Lim
+ Yoshifumi Nishida
+
+The original LBL crew:
+ Steve McCanne
+ Craig Leres
+ Van Jacobson
+
+Past maintainers:
+ Jun-ichiro itojun Hagino <itojun at iijlab dot net> Also see: http://www.wide.ad.jp/itojun-award/
--- /dev/null
+If you have not built libpcap, and your system does not have libpcap
+installed, install libpcap first. Your system might provide a version
+of libpcap that can be installed; if so, to compile tcpdump you might
+need to install a "developer" version of libpcap as well as the
+"run-time" version. You can also install tcpdump.org's version of
+libpcap; see the README file in this directory for the ftp location.
+
+You will need an ANSI C compiler to build tcpdump. The configure script
+will abort if your compiler is not ANSI compliant. If this happens, use
+the generally available GNU C compiler (GCC).
+
+After libpcap has been built (either install it with "make install" or
+make sure both the libpcap and tcpdump source trees are in the same
+directory), run ./configure (a shell script). "configure" will
+determine your system attributes and generate an appropriate Makefile
+from Makefile.in. Now build tcpdump by running "make".
+
+If everything builds ok, su and type "make install". This will install
+tcpdump and the manual entry. Any user will be able to use tcpdump to
+read saved captures. Whether a user will be able to capture traffic
+depends on the OS and the configuration of the system; see the tcpdump
+man page for details. DO NOT give untrusted users the ability to
+capture traffic. If a user can capture traffic, he or she could use
+utilities such as tcpdump to capture any traffic on your net, including
+passwords.
+
+Note that most systems ship tcpdump, but usually an older version.
+Remember to remove or rename the installed binary when upgrading.
+
+If your system is not one which we have tested tcpdump on, you may have
+to modify the configure script and Makefile.in. Please send us patches
+for any modifications you need to make.
+
+Please see "PLATFORMS" for notes about tested platforms.
+
+
+FILES
+-----
+CHANGES - description of differences between releases
+CREDITS - people that have helped tcpdump along
+INSTALL.txt - this file
+LICENSE - the license under which tcpdump is distributed
+Makefile.in - compilation rules (input to the configure script)
+README - description of distribution
+Readme.Win32 - notes on building tcpdump on Win32 systems (with WinPcap)
+VERSION - version of this release
+aclocal.m4 - autoconf macros
+addrtoname.c - address to hostname routines
+addrtoname.h - address to hostname definitions
+ah.h - IPSEC Authentication Header definitions
+appletalk.h - AppleTalk definitions
+atime.awk - TCP ack awk script
+atm.h - ATM traffic type definitions
+atmuni31.h - ATM Q.2931 definitions
+bpf_dump.c - BPF program printing routines, in case libpcap doesn't
+ have them
+chdlc.h - Cisco HDLC definitions
+cpack.c - functions to extract packed data
+cpack.h - declarations of functions to extract packed data
+config.guess - autoconf support
+config.h.in - autoconf input
+config.sub - autoconf support
+configure - configure script (run this first)
+configure.in - configure script source
+ether.h - Ethernet definitions
+ethertype.h - Ethernet type value definitions
+extract.h - alignment definitions
+gmpls.c - GMPLS definitions
+gmpls.h - GMPLS declarations
+gmt2local.c - time conversion routines
+gmt2local.h - time conversion prototypes
+install-sh - BSD style install script
+interface.h - globals, prototypes and definitions
+ip.h - IP definitions
+ip6.h - IPv6 definitions
+ipproto.c - IP protocol type value-to-name table
+ipproto.h - IP protocol type value definitions
+l2vpn.c - L2VPN encapsulation value-to-name table
+l2vpn.h - L2VPN encapsulation definitions
+lbl/os-*.h - OS-dependent defines and prototypes
+llc.h - LLC definitions
+machdep.c - machine dependent routines
+machdep.h - machine dependent definitions
+makemib - mib to header script
+mib.h - mib definitions
+missing/* - replacements for missing library functions
+mkdep - construct Makefile dependency list
+mpls.h - MPLS definitions
+nameser.h - DNS definitions
+netdissect.h - definitions and declarations for tcpdump-as-library
+ (under development)
+nfs.h - Network File System V2 definitions
+nfsfh.h - Network File System file handle definitions
+nlpid.c - OSI NLPID value-to-name table
+nlpid.h - OSI NLPID definitions
+ospf.h - Open Shortest Path First definitions
+packetdat.awk - TCP chunk summary awk script
+parsenfsfh.c - Network File System file parser routines
+pcap_dump_ftell.c - pcap_dump_ftell() implementation, in case libpcap
+ doesn't have it
+pcap-missing.h - declarations of functions possibly missing from libpcap
+ppp.h - Point to Point Protocol definitions
+print-802_11.c - IEEE 802.11 printer routines
+print-ap1394.c - Apple IP-over-IEEE 1394 printer routines
+print-ah.c - IPSEC Authentication Header printer routines
+print-aodv.c - AODV printer routines
+print-arcnet.c - ARCNET printer routines
+print-arp.c - Address Resolution Protocol printer routines
+print-ascii.c - ASCII packet dump routines
+print-atalk.c - AppleTalk printer routines
+print-atm.c - ATM printer routines
+print-beep.c - BEEP printer routines
+print-bgp.c - Border Gateway Protocol printer routines
+print-bootp.c - BOOTP and IPv4 DHCP printer routines
+print-bt.c - Bluetooth printer routines
+print-cdp.c - Cisco Discovery Protocol printer routines
+print-chdlc.c - Cisco HDLC printer routines
+print-cip.c - Classical-IP over ATM routines
+print-cnfp.c - Cisco NetFlow printer routines
+print-dccp.c - DCCP printer routines
+print-decnet.c - DECnet printer routines
+print-dhcp6.c - IPv6 DHCP printer routines
+print-domain.c - Domain Name System printer routines
+print-dvmrp.c - Distance Vector Multicast Routing Protocol printer routines
+print-eap.c - EAP printer routines
+print-enc.c - OpenBSD IPsec encapsulation BPF layer printer routines
+print-egp.c - External Gateway Protocol printer routines
+print-esp.c - IPSEC Encapsulating Security Payload printer routines
+print-ether.c - Ethernet printer routines
+print-fddi.c - Fiber Distributed Data Interface printer routines
+print-fr.c - Frame Relay printer routines
+print-frag6.c - IPv6 fragmentation header printer routines
+print-gre.c - Generic Routing Encapsulation printer routines
+print-hsrp.c - Cisco Hot Standby Router Protocol printer routines
+print-icmp.c - Internet Control Message Protocol printer routines
+print-icmp6.c - IPv6 Internet Control Message Protocol printer routines
+print-igmp.c - Internet Group Management Protocol printer routines
+print-igrp.c - Interior Gateway Routing Protocol printer routines
+print-ip.c - IP printer routines
+print-ip6.c - IPv6 printer routines
+print-ip6opts.c - IPv6 header option printer routines
+print-ipcomp.c - IP Payload Compression Protocol printer routines
+print-ipx.c - IPX printer routines
+print-isakmp.c - Internet Security Association and Key Management Protocol
+print-isoclns.c - ISO CLNS, ESIS, and ISIS printer routines
+print-krb.c - Kerberos printer routines
+print-l2tp.c - Layer Two Tunneling Protocol printer routines
+print-lane.c - ATM LANE printer routines
+print-llc.c - IEEE 802.2 LLC printer routines
+print-lspping.c - LSPPING printer routines
+print-lwres.c - Lightweight Resolver protocol printer routines
+print-mobile.c - IPv4 mobility printer routines
+print-mobility.c - IPv6 mobility printer routines
+print-mpls.c - Multi-Protocol Label Switching printer routines
+print-msdp.c - Multicast Source Discovery Protocol printer routines
+print-nfs.c - Network File System printer routines
+print-ntp.c - Network Time Protocol printer routines
+print-null.c - BSD loopback device printer routines
+print-ospf.c - Open Shortest Path First printer routines
+print-ospf6.c - IPv6 Open Shortest Path First printer routines
+print-pflog.c - OpenBSD packet filter log file printer routines
+print-pgm.c - Pragmatic General Multicast printer routines
+print-pim.c - Protocol Independent Multicast printer routines
+print-ppp.c - Point to Point Protocol printer routines
+print-pppoe.c - PPP-over-Ethernet printer routines
+print-pptp.c - Point-to-Point Tunnelling Protocol printer routines
+print-radius.c - Radius protocol printer routines
+print-raw.c - Raw IP printer routines
+print-rip.c - Routing Information Protocol printer routines
+print-ripng.c - IPv6 Routing Information Protocol printer routines
+print-rrcp.c - Realtek Remote Control Protocol routines
+print-rsvp.c - Resource reSerVation Protocol (RSVP) printer routines
+print-rt6.c - IPv6 routing header printer routines
+print-rx.c - AFS RX printer routines
+print-sctp.c - Stream Control Transmission Protocol printer routines
+print-sip.c - SIP printer routines
+print-sl.c - Compressed Serial Line Internet Protocol printer routines
+print-sll.c - Linux "cooked" capture printer routines
+print-slow.c - IEEE "slow protocol" (802.3ad) printer routines
+print-smb.c - SMB/CIFS printer routines
+print-snmp.c - Simple Network Management Protocol printer routines
+print-stp.c - IEEE 802.1d spanning tree protocol printer routines
+print-sunatm.c - SunATM DLPI capture printer routines
+print-sunrpc.c - Sun Remote Procedure Call printer routines
+print-symantec.c - Symantec Enterprise Firewall printer routines
+print-tcp.c - TCP printer routines
+print-telnet.c - Telnet option printer routines
+print-tftp.c - Trivial File Transfer Protocol printer routines
+print-timed.c - BSD time daemon protocol printer routines
+print-token.c - Token Ring printer routines
+print-udp.c - UDP printer routines
+print-usb.c - USB printer routines
+print-vjc.c - PPP Van Jacobson compression (RFC1144) printer routines
+print-vrrp.c - Virtual Router Redundancy Protocol
+print-wb.c - White Board printer routines
+print-zephyr.c - Zephyr printer routines
+rpc_auth.h - definitions for ONC RPC authentication
+rpc_msg.h - definitions for ONC RPC messages
+send-ack.awk - unidirectional tcp send/ack awk script
+setsignal.c - OS-independent signal routines
+setsignal.h - OS-independent signal prototypes
+slcompress.h - SLIP/PPP Van Jacobson compression (RFC1144) definitions
+smb.h - SMB/CIFS definitions
+smbutil.c - SMB/CIFS utility routines
+stime.awk - TCP send awk script
+strcasecmp.c - missing routine
+tcp.h - TCP definitions
+tcpdump.1 - manual entry
+tcpdump.c - main program
+udp.h - UDP definitions
+util.c - utility routines
+vfprintf.c - emulation routine
+win32 - headers and routines for building on Win32 systems
--- /dev/null
+License: BSD
+
+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. The names of the authors 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.
--- /dev/null
+#
+# Auto-regenerate configure script or Makefile when things change.
+# From autoconf.info . Works best with GNU Make.
+#
+${srcdir}/configure: configure.in aclocal.m4
+ cd ${srcdir} && autoconf
+
+# autoheader might not change config.h.in, so touch a stamp file.
+${srcdir}/config.h.in: ${srcdir}/stamp-h.in
+${srcdir}/stamp-h.in: configure.in aclocal.m4
+ cd ${srcdir} && autoheader
+ echo timestamp > ${srcdir}/stamp-h.in
+
+config.h: stamp-h
+stamp-h: ${srcdir}/config.h.in config.status
+ ./config.status
+
+Makefile: Makefile.in config.status
+ ./config.status
+
+config.status: ${srcdir}/configure
+ ./config.status --recheck
--- /dev/null
+# Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+# 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: (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.
+
+#
+# Various configurable paths (remember to edit Makefile.in, not Makefile)
+#
+
+# 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
+mandir = @mandir@
+
+# VPATH
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+#
+# You shouldn't need to edit anything below here.
+#
+
+CC = @CC@
+AR = @AR@
+MKDEP = @MKDEP@
+PROG = tcpdump
+CCOPT = @V_CCOPT@
+INCLS = -I. @V_INCLS@
+DEFS = @DEFS@ @CPPFLAGS@ @V_DEFS@
+
+# Standard CFLAGS
+CFLAGS = @CFLAGS@
+FULL_CFLAGS = $(CCOPT) $(DEFS) $(INCLS) $(CFLAGS)
+
+# Standard LDFLAGS
+LDFLAGS = @LDFLAGS@
+
+# Standard LIBS
+LIBS = @LIBS@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+RANLIB = @RANLIB@
+
+DEPENDENCY_CFLAG = @DEPENDENCY_CFLAG@
+
+# Explicitly define compilation rule since SunOS 4's make doesn't like gcc.
+# Also, gcc does not remove the .o before forking 'as', which can be a
+# problem if you don't own the file but can write to the directory.
+.c.o:
+ @rm -f $@
+ $(CC) $(FULL_CFLAGS) -c $(srcdir)/$*.c
+
+CSRC = setsignal.c tcpdump.c
+
+LIBNETDISSECT_SRC=\
+ addrtoname.c \
+ af.c \
+ checksum.c \
+ cpack.c \
+ gmpls.c \
+ gmt2local.c \
+ in_cksum.c \
+ ipproto.c \
+ l2vpn.c \
+ machdep.c \
+ nlpid.c \
+ oui.c \
+ parsenfsfh.c \
+ print-802_11.c \
+ print-802_15_4.c \
+ print-ah.c \
+ print-ahcp.c \
+ print-aodv.c \
+ print-aoe.c \
+ print-ap1394.c \
+ print-arcnet.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-calm-fast.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-eap.c \
+ print-egp.c \
+ print-eigrp.c \
+ print-enc.c \
+ print-esp.c \
+ print-ether.c \
+ print-fddi.c \
+ print-forces.c \
+ print-fr.c \
+ print-ftp.c \
+ print-geneve.c \
+ print-geonet.c \
+ print-gre.c \
+ print-hsrp.c \
+ print-http.c \
+ print-icmp.c \
+ print-igmp.c \
+ print-igrp.c \
+ print-ip.c \
+ print-ip6.c \
+ print-ipcomp.c \
+ print-ipfc.c \
+ print-ipnet.c \
+ print-ipx.c \
+ print-isakmp.c \
+ print-isoclns.c \
+ print-juniper.c \
+ print-krb.c \
+ print-l2tp.c \
+ print-lane.c \
+ print-ldp.c \
+ print-llc.c \
+ print-lldp.c \
+ print-lmp.c \
+ print-loopback.c \
+ print-lspping.c \
+ print-lwapp.c \
+ print-lwres.c \
+ print-m3ua.c \
+ print-mobile.c \
+ print-mpcp.c \
+ print-mpls.c \
+ print-mptcp.c \
+ print-msdp.c \
+ print-msnlb.c \
+ print-nflog.c \
+ print-nfs.c \
+ print-ntp.c \
+ print-null.c \
+ print-olsr.c \
+ print-openflow-1.0.c \
+ print-openflow.c \
+ print-ospf.c \
+ print-otv.c \
+ print-pgm.c \
+ print-pim.c \
+ print-pktap.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-rtsp.c \
+ print-rx.c \
+ print-sctp.c \
+ print-sflow.c \
+ print-sip.c \
+ print-sl.c \
+ print-sll.c \
+ print-slow.c \
+ print-smtp.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 \
+ print-timed.c \
+ print-tipc.c \
+ print-token.c \
+ print-udld.c \
+ print-udp.c \
+ print-usb.c \
+ print-vjc.c \
+ print-vqp.c \
+ print-vrrp.c \
+ print-vtp.c \
+ print-vxlan.c \
+ print-wb.c \
+ print-zephyr.c \
+ print-zeromq.c \
+ signature.c \
+ util.c
+
+LOCALSRC = @LOCALSRC@
+GENSRC = version.c
+LIBOBJS = @LIBOBJS@
+
+LIBNETDISSECT_OBJ=$(LIBNETDISSECT_SRC:.c=.o) ${LOCALSRC:.c=.o} ${LIBOBJS}
+LIBNETDISSECT=libnetdissect.a
+
+
+SRC = $(CSRC) $(GENSRC) $(LOCALSRC) $(LIBNETDISSECT_SRC)
+
+# We would like to say "OBJ = $(SRC:.c=.o)" but Ultrix's make cannot
+# hack the extra indirection
+OBJ = $(CSRC:.c=.o) $(GENSRC:.c=.o) $(LIBNETDISSECT_OBJ)
+HDR = \
+ addrtoname.h \
+ af.h \
+ ah.h \
+ appletalk.h \
+ atm.h \
+ atmuni31.h \
+ chdlc.h \
+ cpack.h \
+ ether.h \
+ ethertype.h \
+ extract.h \
+ getopt_long.h \
+ gmpls.h \
+ gmt2local.h \
+ interface.h \
+ ip.h \
+ ip6.h \
+ ipproto.h \
+ l2vpn.h \
+ llc.h \
+ machdep.h \
+ mib.h \
+ mpls.h \
+ nameser.h \
+ netdissect.h \
+ nfs.h \
+ nfsfh.h \
+ nlpid.h \
+ openflow.h \
+ ospf.h \
+ oui.h \
+ pcap-missing.h \
+ ppp.h \
+ rpc_auth.h \
+ rpc_msg.h \
+ rpl.h \
+ setsignal.h \
+ signature.h \
+ slcompress.h \
+ smb.h \
+ tcp.h \
+ tcpdump-stdinc.h \
+ udp.h
+
+TAGHDR = \
+ /usr/include/arpa/tftp.h \
+ /usr/include/net/if_arp.h \
+ /usr/include/net/slip.h \
+ /usr/include/netinet/if_ether.h \
+ /usr/include/netinet/in.h \
+ /usr/include/netinet/ip_icmp.h \
+ /usr/include/netinet/tcp.h \
+ /usr/include/netinet/udp.h \
+ /usr/include/protocols/routed.h
+
+TAGFILES = $(SRC) $(HDR) $(TAGHDR)
+
+CLEANFILES = $(PROG) $(OBJ) $(GENSRC)
+
+EXTRA_DIST = \
+ CHANGES \
+ CREDITS \
+ INSTALL.txt \
+ LICENSE \
+ Makefile.in \
+ Makefile-devel-adds \
+ README.md \
+ Readme.Win32 \
+ VERSION \
+ aclocal.m4 \
+ atime.awk \
+ bpf_dump.c \
+ config.guess \
+ config.h.in \
+ config.sub \
+ configure \
+ configure.in \
+ install-sh \
+ lbl/os-osf4.h \
+ lbl/os-solaris2.h \
+ lbl/os-sunos4.h \
+ lbl/os-ultrix4.h \
+ makemib \
+ missing/addrinfo.h \
+ missing/dlnames.c \
+ missing/datalinks.c \
+ missing/getnameinfo.c \
+ missing/getopt_long.c \
+ missing/inet_aton.c \
+ missing/inet_ntop.c \
+ missing/inet_pton.c \
+ missing/snprintf.c \
+ missing/strdup.c \
+ missing/strlcat.c \
+ missing/strlcpy.c \
+ missing/strsep.c \
+ mkdep \
+ packetdat.awk \
+ pcap_dump_ftell.c \
+ print-babel.c \
+ print-dhcp6.c \
+ print-frag6.c \
+ print-icmp6.c \
+ print-ip6opts.c \
+ print-mobility.c \
+ print-ospf6.c \
+ print-pflog.c \
+ print-ripng.c \
+ print-rt6.c \
+ print-smb.c \
+ send-ack.awk \
+ smbutil.c \
+ stime.awk \
+ strcasecmp.c \
+ tcpdump.1.in \
+ vfprintf.c \
+ win32/Include/w32_fzs.h \
+ win32/prj/GNUmakefile \
+ win32/prj/WinDump.dsp \
+ win32/prj/WinDump.dsw
+
+TEST_DIST= `find tests \( -name 'DIFF' -prune \) -o \( -name NEW -prune \) -o -type f \! -name '.*' \! -name '*~' -print`
+
+all: $(PROG) $(LIBNETDISSECT)
+
+$(PROG): $(OBJ) @V_PCAPDEP@
+ @rm -f $@
+ $(CC) $(FULL_CFLAGS) $(LDFLAGS) -o $@ $(OBJ) $(LIBS)
+
+$(LIBNETDISSECT): $(LIBNETDISSECT_OBJ)
+ @rm -f $@
+ $(AR) cr $@ $(LIBNETDISSECT_OBJ)
+ $(RANLIB) $@
+
+datalinks.o: $(srcdir)/missing/datalinks.c
+ $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/datalinks.c
+dlnames.o: $(srcdir)/missing/dlnames.c
+ $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/dlnames.c
+getnameinfo.o: $(srcdir)/missing/getnameinfo.c
+ $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/getnameinfo.c
+getopt_long.o: $(srcdir)/missing/getopt_long.c
+ $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/getopt_long.c
+inet_pton.o: $(srcdir)/missing/inet_pton.c
+ $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/inet_pton.c
+inet_ntop.o: $(srcdir)/missing/inet_ntop.c
+ $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/inet_ntop.c
+inet_aton.o: $(srcdir)/missing/inet_aton.c
+ $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/inet_aton.c
+snprintf.o: $(srcdir)/missing/snprintf.c
+ $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/snprintf.c
+strdup.o: $(srcdir)/missing/strdup.c
+ $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/strdup.c
+strlcat.o: $(srcdir)/missing/strlcat.c
+ $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/strlcat.c
+strlcpy.o: $(srcdir)/missing/strlcpy.c
+ $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/strlcpy.c
+strsep.o: $(srcdir)/missing/strsep.c
+ $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/strsep.c
+
+version.o: version.c
+ $(CC) $(FULL_CFLAGS) -c version.c
+
+version.c: $(srcdir)/VERSION
+ @rm -f $@
+ if grep GIT ${srcdir}/VERSION >/dev/null; then \
+ read ver <${srcdir}/VERSION; \
+ echo $$ver | tr -d '\012'; \
+ date +_%Y_%m_%d; \
+ else \
+ cat ${srcdir}/VERSION; \
+ fi | sed -e 's/.*/const char version[] = "&";/' > $@
+
+install: all
+ [ -d $(DESTDIR)$(sbindir) ] || \
+ (mkdir -p $(DESTDIR)$(sbindir); chmod 755 $(DESTDIR)$(sbindir))
+ $(INSTALL_PROGRAM) $(PROG) $(DESTDIR)$(sbindir)/$(PROG)
+ $(INSTALL_PROGRAM) $(PROG) $(DESTDIR)$(sbindir)/$(PROG).`cat ${srcdir}/VERSION`
+ [ -d $(DESTDIR)$(mandir)/man1 ] || \
+ (mkdir -p $(DESTDIR)$(mandir)/man1; chmod 755 $(DESTDIR)$(mandir)/man1)
+ $(INSTALL_DATA) $(PROG).1 $(DESTDIR)$(mandir)/man1/$(PROG).1
+
+uninstall:
+ rm -f $(DESTDIR)$(sbindir)/$(PROG)
+ rm -f $(DESTDIR)$(mandir)/man1/$(PROG).1
+
+lint: $(GENSRC)
+ lint -hbxn $(SRC) | \
+ grep -v 'struct/union .* never defined' | \
+ grep -v 'possible pointer alignment problem'
+
+clean:
+ rm -f $(CLEANFILES) $(PROG)-`cat VERSION`.tar.gz
+
+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 \
+ libnetdissect.a tests/.failed tests/.passed \
+ tests/failure-outputs.txt
+ rm -rf autom4te.cache tests/DIFF tests/NEW
+
+check: tcpdump
+ (cd tests && ./TESTrun.sh)
+
+tags: $(TAGFILES)
+ ctags -wtd $(TAGFILES)
+
+TAGS: $(TAGFILES)
+ etags $(TAGFILES)
+
+releasetar:
+ @cwd=`pwd` ; dir=`basename $$cwd` ; name=$(PROG)-`cat VERSION` ; \
+ mkdir $$name; \
+ tar cf - $(CSRC) $(HDR) $(LIBNETDISSECT_SRC) $(EXTRA_DIST) $(TEST_DIST) | (cd $$name; tar xf -); \
+ tar -c -z -f $$name.tar.gz $$name; \
+ rm -rf $$name
+
+testlist:
+ echo $(TEST_DIST)
+
+depend: $(GENSRC)
+ $(MKDEP) -c $(CC) -m $(DEPENDENCY_CFLAG) $(DEFS) $(INCLS) $(SRC)
--- /dev/null
+# tcpdump
+
+[![Build
+Status](https://travis-ci.org/the-tcpdump-group/tcpdump.png)](https://travis-ci.org/the-tcpdump-group/tcpdump)
+
+TCPDUMP 4.x.y
+Now maintained by "The Tcpdump Group"
+See www.tcpdump.org
+
+Please send inquiries/comments/reports to:
+
+* tcpdump-workers@lists.tcpdump.org
+
+Anonymous Git is available via:
+
+ git clone git://bpf.tcpdump.org/tcpdump
+
+Please submit patches by forking the branch on GitHub at:
+
+* http://github.com/the-tcpdump-group/tcpdump/tree/master
+
+and issuing a pull request.
+
+formerly from Lawrence Berkeley National Laboratory
+ Network Research Group <tcpdump@ee.lbl.gov>
+ ftp://ftp.ee.lbl.gov/old/tcpdump.tar.Z (3.4)
+
+This directory contains source code for tcpdump, a tool for network
+monitoring and data acquisition. This software was originally
+developed by the Network Research Group at the Lawrence Berkeley
+National Laboratory. The original distribution is available via
+anonymous ftp to `ftp.ee.lbl.gov`, in `tcpdump.tar.Z`. More recent
+development is performed at tcpdump.org, http://www.tcpdump.org/
+
+Tcpdump uses libpcap, a system-independent interface for user-level
+packet capture. Before building tcpdump, you must first retrieve and
+build libpcap, also originally from LBL and now being maintained by
+tcpdump.org; see http://www.tcpdump.org/ .
+
+Once libpcap is built (either install it or make sure it's in
+`../libpcap`), you can build tcpdump using the procedure in the `INSTALL.txt`
+file.
+
+The program is loosely based on SMI's "etherfind" although none of the
+etherfind code remains. It was originally written by Van Jacobson as
+part of an ongoing research project to investigate and improve tcp and
+internet gateway performance. The parts of the program originally
+taken from Sun's etherfind were later re-written by Steven McCanne of
+LBL. To insure that there would be no vestige of proprietary code in
+tcpdump, Steve wrote these pieces from the specification given by the
+manual entry, with no access to the source of tcpdump or etherfind.
+
+Over the past few years, tcpdump has been steadily improved by the
+excellent contributions from the Internet community (just browse
+through the `CHANGES` file). We are grateful for all the input.
+
+Richard Stevens gives an excellent treatment of the Internet protocols
+in his book *"TCP/IP Illustrated, Volume 1"*. If you want to learn more
+about tcpdump and how to interpret its output, pick up this book.
+
+Some tools for viewing and analyzing tcpdump trace files are available
+from the Internet Traffic Archive:
+
+* http://www.sigcomm.org/ITA/
+
+Another tool that tcpdump users might find useful is tcpslice:
+
+* https://github.com/the-tcpdump-group/tcpslice
+
+It is a program that can be used to extract portions of tcpdump binary
+trace files. See the above distribution for further details and
+documentation.
+
+Problems, bugs, questions, desirable enhancements, etc. should be sent
+to the address "tcpdump-workers@lists.tcpdump.org". Bugs, support
+requests, and feature requests may also be submitted on the GitHub issue
+tracker for tcpdump at:
+
+* https://github.com/the-tcpdump-group/tcpdump/issues
+
+Source code contributions, etc. should be sent to the email address
+above or submitted by forking the branch on GitHub at:
+
+* http://github.com/the-tcpdump-group/tcpdump/tree/master
+
+and issuing a pull request.
+
+Current versions can be found at www.tcpdump.org.
+
+ - The TCPdump team
+
+original text by: Steve McCanne, Craig Leres, Van Jacobson
+
+-------------------------------------
+```
+This directory also contains some short awk programs intended as
+examples of ways to reduce tcpdump data when you're tracking
+particular network problems:
+
+send-ack.awk
+ Simplifies the tcpdump trace for an ftp (or other unidirectional
+ tcp transfer). Since we assume that one host only sends and
+ the other only acks, all address information is left off and
+ we just note if the packet is a "send" or an "ack".
+
+ There is one output line per line of the original trace.
+ Field 1 is the packet time in decimal seconds, relative
+ to the start of the conversation. Field 2 is delta-time
+ from last packet. Field 3 is packet type/direction.
+ "Send" means data going from sender to receiver, "ack"
+ means an ack going from the receiver to the sender. A
+ preceding "*" indicates that the data is a retransmission.
+ A preceding "-" indicates a hole in the sequence space
+ (i.e., missing packet(s)), a "#" means an odd-size (not max
+ seg size) packet. Field 4 has the packet flags
+ (same format as raw trace). Field 5 is the sequence
+ number (start seq. num for sender, next expected seq number
+ for acks). The number in parens following an ack is
+ the delta-time from the first send of the packet to the
+ ack. A number in parens following a send is the
+ delta-time from the first send of the packet to the
+ current send (on duplicate packets only). Duplicate
+ sends or acks have a number in square brackets showing
+ the number of duplicates so far.
+
+ Here is a short sample from near the start of an ftp:
+ 3.00 0.20 send . 512
+ 3.20 0.20 ack . 1024 (0.20)
+ 3.20 0.00 send P 1024
+ 3.40 0.20 ack . 1536 (0.20)
+ 3.80 0.40 * send . 0 (3.80) [2]
+ 3.82 0.02 * ack . 1536 (0.62) [2]
+ Three seconds into the conversation, bytes 512 through 1023
+ were sent. 200ms later they were acked. Shortly thereafter
+ bytes 1024-1535 were sent and again acked after 200ms.
+ Then, for no apparent reason, 0-511 is retransmitted, 3.8
+ seconds after its initial send (the round trip time for this
+ ftp was 1sec, +-500ms). Since the receiver is expecting
+ 1536, 1536 is re-acked when 0 arrives.
+
+packetdat.awk
+ Computes chunk summary data for an ftp (or similar
+ unidirectional tcp transfer). [A "chunk" refers to
+ a chunk of the sequence space -- essentially the packet
+ sequence number divided by the max segment size.]
+
+ A summary line is printed showing the number of chunks,
+ the number of packets it took to send that many chunks
+ (if there are no lost or duplicated packets, the number
+ of packets should equal the number of chunks) and the
+ number of acks.
+
+ Following the summary line is one line of information
+ per chunk. The line contains eight fields:
+ 1 - the chunk number
+ 2 - the start sequence number for this chunk
+ 3 - time of first send
+ 4 - time of last send
+ 5 - time of first ack
+ 6 - time of last ack
+ 7 - number of times chunk was sent
+ 8 - number of times chunk was acked
+ (all times are in decimal seconds, relative to the start
+ of the conversation.)
+
+ As an example, here is the first part of the output for
+ an ftp trace:
+
+ # 134 chunks. 536 packets sent. 508 acks.
+ 1 1 0.00 5.80 0.20 0.20 4 1
+ 2 513 0.28 6.20 0.40 0.40 4 1
+ 3 1025 1.16 6.32 1.20 1.20 4 1
+ 4 1561 1.86 15.00 2.00 2.00 6 1
+ 5 2049 2.16 15.44 2.20 2.20 5 1
+ 6 2585 2.64 16.44 2.80 2.80 5 1
+ 7 3073 3.00 16.66 3.20 3.20 4 1
+ 8 3609 3.20 17.24 3.40 5.82 4 11
+ 9 4097 6.02 6.58 6.20 6.80 2 5
+
+ This says that 134 chunks were transferred (about 70K
+ since the average packet size was 512 bytes). It took
+ 536 packets to transfer the data (i.e., on the average
+ each chunk was transmitted four times). Looking at,
+ say, chunk 4, we see it represents the 512 bytes of
+ sequence space from 1561 to 2048. It was first sent
+ 1.86 seconds into the conversation. It was last
+ sent 15 seconds into the conversation and was sent
+ a total of 6 times (i.e., it was retransmitted every
+ 2 seconds on the average). It was acked once, 140ms
+ after it first arrived.
+
+stime.awk
+atime.awk
+ Output one line per send or ack, respectively, in the form
+ <time> <seq. number>
+ where <time> is the time in seconds since the start of the
+ transfer and <seq. number> is the sequence number being sent
+ or acked. I typically plot this data looking for suspicious
+ patterns.
+
+
+The problem I was looking at was the bulk-data-transfer
+throughput of medium delay network paths (1-6 sec. round trip
+time) under typical DARPA Internet conditions. The trace of the
+ftp transfer of a large file was used as the raw data source.
+The method was:
+
+ - On a local host (but not the Sun running tcpdump), connect to
+ the remote ftp.
+
+ - On the monitor Sun, start the trace going. E.g.,
+ tcpdump host local-host and remote-host and port ftp-data >tracefile
+
+ - On local, do either a get or put of a large file (~500KB),
+ preferably to the null device (to minimize effects like
+ closing the receive window while waiting for a disk write).
+
+ - When transfer is finished, stop tcpdump. Use awk to make up
+ two files of summary data (maxsize is the maximum packet size,
+ tracedata is the file of tcpdump tracedata):
+ awk -f send-ack.awk packetsize=avgsize tracedata >sa
+ awk -f packetdat.awk packetsize=avgsize tracedata >pd
+
+ - While the summary data files are printing, take a look at
+ how the transfer behaved:
+ awk -f stime.awk tracedata | xgraph
+ (90% of what you learn seems to happen in this step).
+
+ - Do all of the above steps several times, both directions,
+ at different times of day, with different protocol
+ implementations on the other end.
+
+ - Using one of the Unix data analysis packages (in my case,
+ S and Gary Perlman's Unix|Stat), spend a few months staring
+ at the data.
+
+ - Change something in the local protocol implementation and
+ redo the steps above.
+
+ - Once a week, tell your funding agent that you're discovering
+ wonderful things and you'll write up that research report
+ "real soon now".
+```
--- /dev/null
+To build tcpdump under Windows, you need:
+
+- version 6 (or higher) of Microsoft Visual Studio or the Cygnus gnu
+C compiler.
+- The November 2001 (or later) edition of Microsoft Platform
+Software Development Kit (SDK), that contains some necessary includes
+for IPv6 support. You can download it from http://www.microsoft.com/sdk
+- the WinPcap source code, that includes libpcap for win32. Download it
+from http://winpcap.polito.it or download libpcap sources from
+http://www.tcpdump.org and follow the instructions in the README.Win32
+file.
+
+First, extract tcpdump and WinPcap in the same folder, and build WinPcap.
+
+The Visual Studio project and the cygwin makefile are in the Win32\prj
+folder.
+
+From Visual Studio, open windump.dsw and build the program. The release
+version of the WinDump.exe executable file will be created in the
+windump\win32\prj\release directory . The debug version will be generated
+in windump\win32\prj\debug.
+
+From cygnus, go to windump\win32\prj\ and type "make". WinDump.exe will be
+created in the same directory.
\ No newline at end of file
--- /dev/null
+dnl Copyright (c) 1995, 1996, 1997, 1998
+dnl The Regents of the University of California. All rights reserved.
+dnl
+dnl Redistribution and use in source and binary forms, with or without
+dnl modification, are permitted provided that: (1) source code distributions
+dnl retain the above copyright notice and this paragraph in its entirety, (2)
+dnl distributions including binary code include the above copyright notice and
+dnl this paragraph in its entirety in the documentation or other materials
+dnl provided with the distribution, and (3) all advertising materials mentioning
+dnl features or use of this software display the following acknowledgement:
+dnl ``This product includes software developed by the University of California,
+dnl Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
+dnl the University nor the names of its contributors may be used to endorse
+dnl or promote products derived from this software without specific prior
+dnl written permission.
+dnl THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+dnl WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+dnl
+dnl LBL autoconf macros
+dnl
+
+dnl
+dnl Do whatever AC_LBL_C_INIT work is necessary before using AC_PROG_CC.
+dnl
+dnl It appears that newer versions of autoconf (2.64 and later) will,
+dnl if you use AC_TRY_COMPILE in a macro, stick AC_PROG_CC at the
+dnl beginning of the macro, even if the macro itself calls AC_PROG_CC.
+dnl See the "Prerequisite Macros" and "Expanded Before Required" sections
+dnl in the Autoconf documentation.
+dnl
+dnl This causes a steaming heap of fail in our case, as we were, in
+dnl AC_LBL_C_INIT, doing the tests we now do in AC_LBL_C_INIT_BEFORE_CC,
+dnl calling AC_PROG_CC, and then doing the tests we now do in
+dnl AC_LBL_C_INIT. Now, we run AC_LBL_C_INIT_BEFORE_CC, AC_PROG_CC,
+dnl and AC_LBL_C_INIT at the top level.
+dnl
+AC_DEFUN(AC_LBL_C_INIT_BEFORE_CC,
+[
+ AC_BEFORE([$0], [AC_LBL_C_INIT])
+ AC_BEFORE([$0], [AC_PROG_CC])
+ AC_BEFORE([$0], [AC_LBL_FIXINCLUDES])
+ AC_BEFORE([$0], [AC_LBL_DEVEL])
+ AC_ARG_WITH(gcc, [ --without-gcc don't use gcc])
+ $1=""
+ if test "${srcdir}" != "." ; then
+ $1="-I$srcdir"
+ fi
+ if test "${CFLAGS+set}" = set; then
+ LBL_CFLAGS="$CFLAGS"
+ fi
+ if test -z "$CC" ; then
+ case "$host_os" in
+
+ bsdi*)
+ AC_CHECK_PROG(SHLICC2, shlicc2, yes, no)
+ if test $SHLICC2 = yes ; then
+ CC=shlicc2
+ export CC
+ fi
+ ;;
+ esac
+ fi
+ if test -z "$CC" -a "$with_gcc" = no ; then
+ CC=cc
+ export CC
+ fi
+])
+
+dnl
+dnl Determine which compiler we're using (cc or gcc)
+dnl If using gcc, determine the version number
+dnl If using cc:
+dnl require that it support ansi prototypes
+dnl use -O (AC_PROG_CC will use -g -O2 on gcc, so we don't need to
+dnl do that ourselves for gcc)
+dnl add -g flags, as appropriate
+dnl explicitly specify /usr/local/include
+dnl
+dnl NOTE WELL: with newer versions of autoconf, "gcc" means any compiler
+dnl that defines __GNUC__, which means clang, for example, counts as "gcc".
+dnl
+dnl usage:
+dnl
+dnl AC_LBL_C_INIT(copt, incls)
+dnl
+dnl results:
+dnl
+dnl $1 (copt set)
+dnl $2 (incls set)
+dnl CC
+dnl LDFLAGS
+dnl LBL_CFLAGS
+dnl
+AC_DEFUN(AC_LBL_C_INIT,
+[
+ AC_BEFORE([$0], [AC_LBL_FIXINCLUDES])
+ AC_BEFORE([$0], [AC_LBL_DEVEL])
+ AC_BEFORE([$0], [AC_LBL_SHLIBS_INIT])
+ if test "$GCC" = yes ; then
+ #
+ # -Werror forces warnings to be errors.
+ #
+ ac_lbl_cc_force_warning_errors=-Werror
+
+ #
+ # Use -ffloat-store so that, on 32-bit x86, we don't
+ # do 80-bit arithmetic with the FPU; that way we should
+ # get the same results for floating-point calculations
+ # on x86-32 and x86-64.
+ #
+ AC_LBL_CHECK_COMPILER_OPT($1, -ffloat-store)
+ else
+ $2="$$2 -I/usr/local/include"
+ LDFLAGS="$LDFLAGS -L/usr/local/lib"
+
+ case "$host_os" in
+
+ darwin*)
+ #
+ # This is assumed either to be GCC or clang, both
+ # of which use -Werror to force warnings to be errors.
+ #
+ ac_lbl_cc_force_warning_errors=-Werror
+ ;;
+
+ hpux*)
+ #
+ # HP C, which is what we presume we're using, doesn't
+ # exit with a non-zero exit status if we hand it an
+ # invalid -W flag, can't be forced to do so even with
+ # +We, and doesn't handle GCC-style -W flags, so we
+ # don't want to try using GCC-style -W flags.
+ #
+ ac_lbl_cc_dont_try_gcc_dashW=yes
+ ;;
+
+ irix*)
+ #
+ # MIPS C, which is what we presume we're using, doesn't
+ # necessarily exit with a non-zero exit status if we
+ # hand it an invalid -W flag, can't be forced to do
+ # so, and doesn't handle GCC-style -W flags, so we
+ # don't want to try using GCC-style -W flags.
+ #
+ ac_lbl_cc_dont_try_gcc_dashW=yes
+ #
+ # It also, apparently, defaults to "char" being
+ # unsigned, unlike most other C implementations;
+ # I suppose we could say "signed char" whenever
+ # we want to guarantee a signed "char", but let's
+ # just force signed chars.
+ #
+ # -xansi is normally the default, but the
+ # configure script was setting it; perhaps -cckr
+ # was the default in the Old Days. (Then again,
+ # that would probably be for backwards compatibility
+ # in the days when ANSI C was Shiny and New, i.e.
+ # 1989 and the early '90's, so maybe we can just
+ # drop support for those compilers.)
+ #
+ # -g is equivalent to -g2, which turns off
+ # optimization; we choose -g3, which generates
+ # debugging information but doesn't turn off
+ # optimization (even if the optimization would
+ # cause inaccuracies in debugging).
+ #
+ $1="$$1 -xansi -signed -g3"
+ ;;
+
+ osf*)
+ #
+ # Presumed to be DEC OSF/1, Digital UNIX, or
+ # Tru64 UNIX.
+ #
+ # The DEC C compiler, which is what we presume we're
+ # using, doesn't exit with a non-zero exit status if we
+ # hand it an invalid -W flag, can't be forced to do
+ # so, and doesn't handle GCC-style -W flags, so we
+ # don't want to try using GCC-style -W flags.
+ #
+ ac_lbl_cc_dont_try_gcc_dashW=yes
+ #
+ # -g is equivalent to -g2, which turns off
+ # optimization; we choose -g3, which generates
+ # debugging information but doesn't turn off
+ # optimization (even if the optimization would
+ # cause inaccuracies in debugging).
+ #
+ $1="$$1 -g3"
+ ;;
+
+ solaris*)
+ #
+ # Assumed to be Sun C, which requires -errwarn to force
+ # warnings to be treated as errors.
+ #
+ ac_lbl_cc_force_warning_errors=-errwarn
+ ;;
+
+ ultrix*)
+ AC_MSG_CHECKING(that Ultrix $CC hacks const in prototypes)
+ AC_CACHE_VAL(ac_cv_lbl_cc_const_proto,
+ AC_TRY_COMPILE(
+ [#include <sys/types.h>],
+ [struct a { int b; };
+ void c(const struct a *)],
+ ac_cv_lbl_cc_const_proto=yes,
+ ac_cv_lbl_cc_const_proto=no))
+ AC_MSG_RESULT($ac_cv_lbl_cc_const_proto)
+ if test $ac_cv_lbl_cc_const_proto = no ; then
+ AC_DEFINE(const,[],
+ [to handle Ultrix compilers that don't support const in prototypes])
+ fi
+ ;;
+ esac
+ $1="$$1 -O"
+ fi
+])
+
+dnl
+dnl Check whether the compiler option specified as the second argument
+dnl is supported by the compiler and, if so, add it to the macro
+dnl specified as the first argument
+dnl
+AC_DEFUN(AC_LBL_CHECK_COMPILER_OPT,
+ [
+ AC_MSG_CHECKING([whether the compiler supports the $2 option])
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors $2"
+ AC_TRY_COMPILE(
+ [],
+ [return 0],
+ [
+ AC_MSG_RESULT([yes])
+ CFLAGS="$save_CFLAGS"
+ $1="$$1 $2"
+ ],
+ [
+ AC_MSG_RESULT([no])
+ CFLAGS="$save_CFLAGS"
+ ])
+ ])
+
+dnl
+dnl Check whether the compiler supports an option to generate
+dnl Makefile-style dependency lines
+dnl
+dnl GCC uses -M for this. Non-GCC compilers that support this
+dnl use a variety of flags, including but not limited to -M.
+dnl
+dnl We test whether the flag in question is supported, as older
+dnl versions of compilers might not support it.
+dnl
+dnl We don't try all the possible flags, just in case some flag means
+dnl "generate dependencies" on one compiler but means something else
+dnl on another compiler.
+dnl
+dnl Most compilers that support this send the output to the standard
+dnl output by default. IBM's XLC, however, supports -M but sends
+dnl the output to {sourcefile-basename}.u, and AIX has no /dev/stdout
+dnl to work around that, so we don't bother with XLC.
+dnl
+AC_DEFUN(AC_LBL_CHECK_DEPENDENCY_GENERATION_OPT,
+ [
+ AC_MSG_CHECKING([whether the compiler supports generating dependencies])
+ if test "$GCC" = yes ; then
+ #
+ # GCC, or a compiler deemed to be GCC by AC_PROG_CC (even
+ # though it's not); we assume that, in this case, the flag
+ # would be -M.
+ #
+ ac_lbl_dependency_flag="-M"
+ else
+ #
+ # Not GCC or a compiler deemed to be GCC; what platform is
+ # this? (We're assuming that if the compiler isn't GCC
+ # it's the compiler from the vendor of the OS; that won't
+ # necessarily be true for x86 platforms, where it might be
+ # the Intel C compiler.)
+ #
+ case "$host_os" in
+
+ irix*|osf*|darwin*)
+ #
+ # MIPS C for IRIX, DEC C, and clang all use -M.
+ #
+ ac_lbl_dependency_flag="-M"
+ ;;
+
+ solaris*)
+ #
+ # Sun C uses -xM.
+ #
+ ac_lbl_dependency_flag="-xM"
+ ;;
+
+ hpux*)
+ #
+ # HP's older C compilers don't support this.
+ # HP's newer C compilers support this with
+ # either +M or +Make; the older compilers
+ # interpret +M as something completely
+ # different, so we use +Make so we don't
+ # think it works with the older compilers.
+ #
+ ac_lbl_dependency_flag="+Make"
+ ;;
+
+ *)
+ #
+ # Not one of the above; assume no support for
+ # generating dependencies.
+ #
+ ac_lbl_dependency_flag=""
+ ;;
+ esac
+ fi
+
+ #
+ # Is ac_lbl_dependency_flag defined and, if so, does the compiler
+ # complain about it?
+ #
+ # Note: clang doesn't seem to exit with an error status when handed
+ # an unknown non-warning error, even if you pass it
+ # -Werror=unknown-warning-option. However, it always supports
+ # -M, so the fact that this test always succeeds with clang
+ # isn't an issue.
+ #
+ if test ! -z "$ac_lbl_dependency_flag"; then
+ AC_LANG_CONFTEST(
+ [AC_LANG_SOURCE([[int main(void) { return 0; }]])])
+ echo "$CC" $ac_lbl_dependency_flag conftest.c >&5
+ if "$CC" $ac_lbl_dependency_flag conftest.c >/dev/null 2>&1; then
+ AC_MSG_RESULT([yes, with $ac_lbl_dependency_flag])
+ DEPENDENCY_CFLAG="$ac_lbl_dependency_flag"
+ MKDEP='${srcdir}/mkdep'
+ else
+ AC_MSG_RESULT([no])
+ #
+ # We can't run mkdep, so have "make depend" do
+ # nothing.
+ #
+ MKDEP=:
+ fi
+ rm -rf conftest*
+ else
+ AC_MSG_RESULT([no])
+ #
+ # We can't run mkdep, so have "make depend" do
+ # nothing.
+ #
+ MKDEP=:
+ fi
+ AC_SUBST(DEPENDENCY_CFLAG)
+ AC_SUBST(MKDEP)
+ ])
+
+#
+# Try compiling a sample of the type of code that appears in
+# gencode.c with "inline", "__inline__", and "__inline".
+#
+# Autoconf's AC_C_INLINE, at least in autoconf 2.13, isn't good enough,
+# as it just tests whether a function returning "int" can be inlined;
+# at least some versions of HP's C compiler can inline that, but can't
+# inline a function that returns a struct pointer.
+#
+# Make sure we use the V_CCOPT flags, because some of those might
+# disable inlining.
+#
+AC_DEFUN(AC_LBL_C_INLINE,
+ [AC_MSG_CHECKING(for inline)
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$V_CCOPT"
+ AC_CACHE_VAL(ac_cv_lbl_inline, [
+ ac_cv_lbl_inline=""
+ ac_lbl_cc_inline=no
+ for ac_lbl_inline in inline __inline__ __inline
+ do
+ AC_TRY_COMPILE(
+ [#define inline $ac_lbl_inline
+ static inline struct iltest *foo(void);
+ struct iltest {
+ int iltest1;
+ int iltest2;
+ };
+
+ static inline struct iltest *
+ foo()
+ {
+ static struct iltest xxx;
+
+ return &xxx;
+ }],,ac_lbl_cc_inline=yes,)
+ if test "$ac_lbl_cc_inline" = yes ; then
+ break;
+ fi
+ done
+ if test "$ac_lbl_cc_inline" = yes ; then
+ ac_cv_lbl_inline=$ac_lbl_inline
+ fi])
+ CFLAGS="$save_CFLAGS"
+ if test ! -z "$ac_cv_lbl_inline" ; then
+ AC_MSG_RESULT($ac_cv_lbl_inline)
+ else
+ AC_MSG_RESULT(no)
+ fi
+ AC_DEFINE_UNQUOTED(inline, $ac_cv_lbl_inline, [Define as token for inline if inlining supported])])
+
+dnl
+dnl Use pfopen.c if available and pfopen() not in standard libraries
+dnl Require libpcap
+dnl Look for libpcap in ..
+dnl Use the installed libpcap if there is no local version
+dnl
+dnl usage:
+dnl
+dnl AC_LBL_LIBPCAP(pcapdep, incls)
+dnl
+dnl results:
+dnl
+dnl $1 (pcapdep set)
+dnl $2 (incls appended)
+dnl LIBS
+dnl LBL_LIBS
+dnl
+AC_DEFUN(AC_LBL_LIBPCAP,
+ [AC_REQUIRE([AC_LBL_LIBRARY_NET])
+ dnl
+ dnl save a copy before locating libpcap.a
+ dnl
+ LBL_LIBS="$LIBS"
+ pfopen=/usr/examples/packetfilter/pfopen.c
+ if test -f $pfopen ; then
+ AC_CHECK_FUNCS(pfopen)
+ if test $ac_cv_func_pfopen = "no" ; then
+ AC_MSG_RESULT(Using $pfopen)
+ LIBS="$LIBS $pfopen"
+ fi
+ fi
+ libpcap=FAIL
+ AC_MSG_CHECKING(for local pcap library)
+ AC_ARG_WITH([system-libpcap],
+ [AS_HELP_STRING([--with-system-libpcap], [don't use local pcap library])])
+ if test "x$with_system_libpcap" != xyes ; then
+ lastdir=FAIL
+ places=`ls $srcdir/.. | sed -e 's,/$,,' -e "s,^,$srcdir/../," | \
+ egrep '/libpcap-[[0-9]]+\.[[0-9]]+(\.[[0-9]]*)?([[ab]][[0-9]]*|-PRE-GIT)?$'`
+ places2=`ls .. | sed -e 's,/$,,' -e "s,^,../," | \
+ egrep '/libpcap-[[0-9]]+\.[[0-9]]+(\.[[0-9]]*)?([[ab]][[0-9]]*|-PRE-GIT)?$'`
+ for dir in $places $srcdir/../libpcap ../libpcap $srcdir/libpcap $places2 ; do
+ basedir=`echo $dir | sed -e 's/[[ab]][[0-9]]*$//' | \
+ sed -e 's/-PRE-GIT$//' `
+ if test $lastdir = $basedir ; then
+ dnl skip alphas when an actual release is present
+ continue;
+ fi
+ lastdir=$dir
+ if test -r $dir/libpcap.a ; then
+ libpcap=$dir/libpcap.a
+ d=$dir
+ dnl continue and select the last one that exists
+ fi
+ done
+ fi
+ if test $libpcap = FAIL ; then
+ AC_MSG_RESULT(not found)
+
+ #
+ # Look for pcap-config.
+ #
+ AC_PATH_TOOL(PCAP_CONFIG, pcap-config)
+ if test -n "$PCAP_CONFIG" ; then
+ #
+ # Found - use it to get the include flags for
+ # libpcap and the flags to link with libpcap.
+ #
+ # Please read section 11.6 "Shell Substitutions"
+ # in the autoconf manual before doing anything
+ # to this that involves quoting. Especially note
+ # the statement "There is just no portable way to use
+ # double-quoted strings inside double-quoted back-quoted
+ # expressions (pfew!)."
+ #
+ cflags=`"$PCAP_CONFIG" --cflags`
+ $2="$cflags $$2"
+ libpcap=`"$PCAP_CONFIG" --libs`
+ else
+ #
+ # Not found; look for pcap.
+ #
+ AC_CHECK_LIB(pcap, main, libpcap="-lpcap")
+ if test $libpcap = FAIL ; then
+ AC_MSG_ERROR(see the INSTALL doc for more info)
+ fi
+ dnl
+ dnl Some versions of Red Hat Linux put "pcap.h" in
+ dnl "/usr/include/pcap"; had the LBL folks done so,
+ dnl that would have been a good idea, but for
+ dnl the Red Hat folks to do so just breaks source
+ dnl compatibility with other systems.
+ dnl
+ dnl We work around this by assuming that, as we didn't
+ dnl find a local libpcap, libpcap is in /usr/lib or
+ dnl /usr/local/lib and that the corresponding header
+ dnl file is under one of those directories; if we don't
+ dnl find it in either of those directories, we check to
+ dnl see if it's in a "pcap" subdirectory of them and,
+ dnl if so, add that subdirectory to the "-I" list.
+ dnl
+ dnl (We now also put pcap.h in /usr/include/pcap, but we
+ dnl leave behind a /usr/include/pcap.h that includes it,
+ dnl so you can still just include <pcap.h>.)
+ dnl
+ AC_MSG_CHECKING(for extraneous pcap header directories)
+ if test \( ! -r /usr/local/include/pcap.h \) -a \
+ \( ! -r /usr/include/pcap.h \); then
+ if test -r /usr/local/include/pcap/pcap.h; then
+ d="/usr/local/include/pcap"
+ elif test -r /usr/include/pcap/pcap.h; then
+ d="/usr/include/pcap"
+ fi
+ fi
+ if test -z "$d" ; then
+ AC_MSG_RESULT(not found)
+ else
+ $2="-I$d $$2"
+ AC_MSG_RESULT(found -- -I$d added)
+ fi
+ fi
+ else
+ $1=$libpcap
+ places=`ls $srcdir/.. | sed -e 's,/$,,' -e "s,^,$srcdir/../," | \
+ egrep '/libpcap-[[0-9]]*.[[0-9]]*(.[[0-9]]*)?([[ab]][[0-9]]*)?$'`
+ places2=`ls .. | sed -e 's,/$,,' -e "s,^,../," | \
+ egrep '/libpcap-[[0-9]]*.[[0-9]]*(.[[0-9]]*)?([[ab]][[0-9]]*)?$'`
+ pcapH=FAIL
+ if test -r $d/pcap.h; then
+ pcapH=$d
+ else
+ for dir in $places $srcdir/../libpcap ../libpcap $srcdir/libpcap $places2 ; do
+ if test -r $dir/pcap.h ; then
+ pcapH=$dir
+ fi
+ done
+ fi
+
+ if test $pcapH = FAIL ; then
+ AC_MSG_ERROR(cannot find pcap.h: see INSTALL)
+ fi
+ $2="-I$pcapH $$2"
+ AC_MSG_RESULT($libpcap)
+ AC_PATH_PROG(PCAP_CONFIG, pcap-config,, $d)
+ if test -n "$PCAP_CONFIG"; then
+ #
+ # The libpcap directory has a pcap-config script.
+ # Use it to get any additioal libraries needed
+ # to link with the libpcap archive library in
+ # that directory.
+ #
+ # Please read section 11.6 "Shell Substitutions"
+ # in the autoconf manual before doing anything
+ # to this that involves quoting. Especially note
+ # the statement "There is just no portable way to use
+ # double-quoted strings inside double-quoted back-quoted
+ # expressions (pfew!)."
+ #
+ additional_libs=`"$PCAP_CONFIG" --additional-libs --static`
+ libpcap="$libpcap $additional_libs"
+ fi
+ fi
+ LIBS="$libpcap $LIBS"
+ if ! test -n "$PCAP_CONFIG" ; then
+ #
+ # We don't have pcap-config; find out any additional link flags
+ # we need. (If we have pcap-config, we assume it tells us what
+ # we need.)
+ #
+ case "$host_os" in
+
+ aix*)
+ #
+ # If libpcap is DLPI-based, we have to use /lib/pse.exp if
+ # present, as we use the STREAMS routines.
+ #
+ # (XXX - true only if we're linking with a static libpcap?)
+ #
+ pseexe="/lib/pse.exp"
+ AC_MSG_CHECKING(for $pseexe)
+ if test -f $pseexe ; then
+ AC_MSG_RESULT(yes)
+ LIBS="$LIBS -I:$pseexe"
+ fi
+
+ #
+ # If libpcap is BPF-based, we need "-lodm" and "-lcfg", as
+ # we use them to load the BPF module.
+ #
+ # (XXX - true only if we're linking with a static libpcap?)
+ #
+ LIBS="$LIBS -lodm -lcfg"
+ ;;
+ esac
+ fi
+
+ dnl
+ dnl Check for "pcap_loop()", to make sure we found a working
+ dnl libpcap and have all the right other libraries with which
+ dnl to link. (Otherwise, the checks below will fail, not
+ dnl because the routines are missing from the library, but
+ dnl because we aren't linking properly with libpcap, and
+ dnl that will cause confusing errors at build time.)
+ dnl
+ AC_CHECK_FUNC(pcap_loop,,
+ [
+ AC_MSG_ERROR(
+[Report this to tcpdump-workers@lists.tcpdump.org, and include the
+config.log file in your report. If you have downloaded libpcap from
+tcpdump.org, and built it yourself, please also include the config.log
+file from the libpcap source directory, the Makefile from the libpcap
+source directory, and the output of the make process for libpcap, as
+this could be a problem with the libpcap that was built, and we will
+not be able to determine why this is happening, and thus will not be
+able to fix it, without that information, as we have not been able to
+reproduce this problem ourselves.])
+ ])
+])
+
+dnl
+dnl Define RETSIGTYPE and RETSIGVAL
+dnl
+dnl usage:
+dnl
+dnl AC_LBL_TYPE_SIGNAL
+dnl
+dnl results:
+dnl
+dnl RETSIGTYPE (defined)
+dnl RETSIGVAL (defined)
+dnl
+AC_DEFUN(AC_LBL_TYPE_SIGNAL,
+ [AC_BEFORE([$0], [AC_LBL_LIBPCAP])
+ AC_TYPE_SIGNAL
+ if test "$ac_cv_type_signal" = void ; then
+ AC_DEFINE(RETSIGVAL,[],[return value of signal handlers])
+ else
+ AC_DEFINE(RETSIGVAL,(0),[return value of signal handlers])
+ fi
+ case "$host_os" in
+
+ irix*)
+ AC_DEFINE(_BSD_SIGNALS,1,[get BSD semantics on Irix])
+ ;;
+
+ *)
+ dnl prefer sigaction() to sigset()
+ AC_CHECK_FUNCS(sigaction)
+ if test $ac_cv_func_sigaction = no ; then
+ AC_CHECK_FUNCS(sigset)
+ fi
+ ;;
+ esac])
+
+dnl
+dnl If using gcc, make sure we have ANSI ioctl definitions
+dnl
+dnl usage:
+dnl
+dnl AC_LBL_FIXINCLUDES
+dnl
+AC_DEFUN(AC_LBL_FIXINCLUDES,
+ [if test "$GCC" = yes ; then
+ AC_MSG_CHECKING(for ANSI ioctl definitions)
+ AC_CACHE_VAL(ac_cv_lbl_gcc_fixincludes,
+ AC_TRY_COMPILE(
+ [/*
+ * This generates a "duplicate case value" when fixincludes
+ * has not be run.
+ */
+# include <sys/types.h>
+# include <sys/time.h>
+# include <sys/ioctl.h>
+# ifdef HAVE_SYS_IOCCOM_H
+# include <sys/ioccom.h>
+# endif],
+ [switch (0) {
+ case _IO('A', 1):;
+ case _IO('B', 1):;
+ }],
+ ac_cv_lbl_gcc_fixincludes=yes,
+ ac_cv_lbl_gcc_fixincludes=no))
+ AC_MSG_RESULT($ac_cv_lbl_gcc_fixincludes)
+ if test $ac_cv_lbl_gcc_fixincludes = no ; then
+ # Don't cache failure
+ unset ac_cv_lbl_gcc_fixincludes
+ AC_MSG_ERROR(see the INSTALL for more info)
+ fi
+ fi])
+
+dnl
+dnl Checks to see if union wait is used with WEXITSTATUS()
+dnl
+dnl usage:
+dnl
+dnl AC_LBL_UNION_WAIT
+dnl
+dnl results:
+dnl
+dnl DECLWAITSTATUS (defined)
+dnl
+AC_DEFUN(AC_LBL_UNION_WAIT,
+ [AC_MSG_CHECKING(if union wait is used)
+ AC_CACHE_VAL(ac_cv_lbl_union_wait,
+ AC_TRY_COMPILE([
+# include <sys/types.h>
+# include <sys/wait.h>],
+ [int status;
+ u_int i = WEXITSTATUS(status);
+ u_int j = waitpid(0, &status, 0);],
+ ac_cv_lbl_union_wait=no,
+ ac_cv_lbl_union_wait=yes))
+ AC_MSG_RESULT($ac_cv_lbl_union_wait)
+ if test $ac_cv_lbl_union_wait = yes ; then
+ AC_DEFINE(DECLWAITSTATUS,union wait,[type for wait])
+ else
+ AC_DEFINE(DECLWAITSTATUS,int,[type for wait])
+ fi])
+
+dnl
+dnl Checks to see if the sockaddr struct has the 4.4 BSD sa_len member
+dnl
+dnl usage:
+dnl
+dnl AC_LBL_SOCKADDR_SA_LEN
+dnl
+dnl results:
+dnl
+dnl HAVE_SOCKADDR_SA_LEN (defined)
+dnl
+AC_DEFUN(AC_LBL_SOCKADDR_SA_LEN,
+ [AC_MSG_CHECKING(if sockaddr struct has the sa_len member)
+ AC_CACHE_VAL(ac_cv_lbl_sockaddr_has_sa_len,
+ AC_TRY_COMPILE([
+# include <sys/types.h>
+# include <sys/socket.h>],
+ [u_int i = sizeof(((struct sockaddr *)0)->sa_len)],
+ ac_cv_lbl_sockaddr_has_sa_len=yes,
+ ac_cv_lbl_sockaddr_has_sa_len=no))
+ AC_MSG_RESULT($ac_cv_lbl_sockaddr_has_sa_len)
+ if test $ac_cv_lbl_sockaddr_has_sa_len = yes ; then
+ AC_DEFINE(HAVE_SOCKADDR_SA_LEN,1,[if struct sockaddr has the sa_len member])
+ fi])
+
+dnl
+dnl Checks to see if -R is used
+dnl
+dnl usage:
+dnl
+dnl AC_LBL_HAVE_RUN_PATH
+dnl
+dnl results:
+dnl
+dnl ac_cv_lbl_have_run_path (yes or no)
+dnl
+AC_DEFUN(AC_LBL_HAVE_RUN_PATH,
+ [AC_MSG_CHECKING(for ${CC-cc} -R)
+ AC_CACHE_VAL(ac_cv_lbl_have_run_path,
+ [echo 'main(){}' > conftest.c
+ ${CC-cc} -o conftest conftest.c -R/a1/b2/c3 >conftest.out 2>&1
+ if test ! -s conftest.out ; then
+ ac_cv_lbl_have_run_path=yes
+ else
+ ac_cv_lbl_have_run_path=no
+ fi
+ rm -f -r conftest*])
+ AC_MSG_RESULT($ac_cv_lbl_have_run_path)
+ ])
+
+dnl
+dnl Check whether a given format can be used to print 64-bit integers
+dnl
+AC_DEFUN(AC_LBL_CHECK_64BIT_FORMAT,
+ [
+ AC_MSG_CHECKING([whether %$1x can be used to format 64-bit integers])
+ AC_RUN_IFELSE(
+ [
+ AC_LANG_SOURCE(
+ [[
+# ifdef HAVE_INTTYPES_H
+ #include <inttypes.h>
+# endif
+ #include <stdio.h>
+ #include <sys/types.h>
+
+ main()
+ {
+ uint64_t t = 1;
+ char strbuf[16+1];
+ sprintf(strbuf, "%016$1x", t << 32);
+ if (strcmp(strbuf, "0000000100000000") == 0)
+ exit(0);
+ else
+ exit(1);
+ }
+ ]])
+ ],
+ [
+ AC_DEFINE(PRId64, "$1d", [define if the platform doesn't define PRId64])
+ AC_DEFINE(PRIo64, "$1o", [define if the platform doesn't define PRIo64])
+ AC_DEFINE(PRIx64, "$1x", [define if the platform doesn't define PRIu64])
+ AC_DEFINE(PRIu64, "$1u", [define if the platform doesn't define PRIx64])
+ AC_MSG_RESULT(yes)
+ ],
+ [
+ AC_MSG_RESULT(no)
+ $2
+ ])
+ ])
+
+dnl
+dnl Checks to see if unaligned memory accesses fail
+dnl
+dnl usage:
+dnl
+dnl AC_LBL_UNALIGNED_ACCESS
+dnl
+dnl results:
+dnl
+dnl LBL_ALIGN (DEFINED)
+dnl
+AC_DEFUN(AC_LBL_UNALIGNED_ACCESS,
+ [AC_MSG_CHECKING(if unaligned accesses fail)
+ AC_CACHE_VAL(ac_cv_lbl_unaligned_fail,
+ [case "$host_cpu" in
+
+ #
+ # These are CPU types where:
+ #
+ # the CPU faults on an unaligned access, but at least some
+ # OSes that support that CPU catch the fault and simulate
+ # the unaligned access (e.g., Alpha/{Digital,Tru64} UNIX) -
+ # the simulation is slow, so we don't want to use it;
+ #
+ # the CPU, I infer (from the old
+ #
+ # XXX: should also check that they don't do weird things (like on arm)
+ #
+ # comment) doesn't fault on unaligned accesses, but doesn't
+ # do a normal unaligned fetch, either (e.g., presumably, ARM);
+ #
+ # for whatever reason, the test program doesn't work
+ # (this has been claimed to be the case for several of those
+ # CPUs - I don't know what the problem is; the problem
+ # was reported as "the test program dumps core" for SuperH,
+ # but that's what the test program is *supposed* to do -
+ # it dumps core before it writes anything, so the test
+ # for an empty output file should find an empty output
+ # file and conclude that unaligned accesses don't work).
+ #
+ # This run-time test won't work if you're cross-compiling, so
+ # in order to support cross-compiling for a particular CPU,
+ # we have to wire in the list of CPU types anyway, as far as
+ # I know, so perhaps we should just have a set of CPUs on
+ # which we know it doesn't work, a set of CPUs on which we
+ # know it does work, and have the script just fail on other
+ # cpu types and update it when such a failure occurs.
+ #
+ alpha*|arm*|bfin*|hp*|mips*|sh*|sparc*|ia64|nv1)
+ ac_cv_lbl_unaligned_fail=yes
+ ;;
+
+ *)
+ cat >conftest.c <<EOF
+# include <sys/types.h>
+# include <sys/wait.h>
+# include <stdio.h>
+ unsigned char a[[5]] = { 1, 2, 3, 4, 5 };
+ main() {
+ unsigned int i;
+ pid_t pid;
+ int status;
+ /* avoid "core dumped" message */
+ pid = fork();
+ if (pid < 0)
+ exit(2);
+ if (pid > 0) {
+ /* parent */
+ pid = waitpid(pid, &status, 0);
+ if (pid < 0)
+ exit(3);
+ exit(!WIFEXITED(status));
+ }
+ /* child */
+ i = *(unsigned int *)&a[[1]];
+ printf("%d\n", i);
+ exit(0);
+ }
+EOF
+ ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS \
+ conftest.c $LIBS >/dev/null 2>&1
+ if test ! -x conftest ; then
+ dnl failed to compile for some reason
+ ac_cv_lbl_unaligned_fail=yes
+ else
+ ./conftest >conftest.out
+ if test ! -s conftest.out ; then
+ ac_cv_lbl_unaligned_fail=yes
+ else
+ ac_cv_lbl_unaligned_fail=no
+ fi
+ fi
+ rm -f -r conftest* core core.conftest
+ ;;
+ esac])
+ AC_MSG_RESULT($ac_cv_lbl_unaligned_fail)
+ if test $ac_cv_lbl_unaligned_fail = yes ; then
+ AC_DEFINE(LBL_ALIGN,1,[if unaligned access fails])
+ fi])
+
+dnl
+dnl If the file .devel exists:
+dnl Add some warning flags if the compiler supports them
+dnl If an os prototype include exists, symlink os-proto.h to it
+dnl
+dnl usage:
+dnl
+dnl AC_LBL_DEVEL(copt)
+dnl
+dnl results:
+dnl
+dnl $1 (copt appended)
+dnl HAVE_OS_PROTO_H (defined)
+dnl os-proto.h (symlinked)
+dnl
+AC_DEFUN(AC_LBL_DEVEL,
+ [rm -f os-proto.h
+ if test "${LBL_CFLAGS+set}" = set; then
+ $1="$$1 ${LBL_CFLAGS}"
+ fi
+ if test -f .devel ; then
+ #
+ # Skip all the warning option stuff on some compilers.
+ #
+ if test "$ac_lbl_cc_dont_try_gcc_dashW" != yes; then
+ AC_LBL_CHECK_COMPILER_OPT($1, -Wall)
+ AC_LBL_CHECK_COMPILER_OPT($1, -Wmissing-prototypes)
+ AC_LBL_CHECK_COMPILER_OPT($1, -Wstrict-prototypes)
+ AC_LBL_CHECK_COMPILER_OPT($1, -Wwrite-strings)
+ AC_LBL_CHECK_COMPILER_OPT($1, -Wpointer-arith)
+ AC_LBL_CHECK_COMPILER_OPT($1, -W)
+ fi
+ AC_LBL_CHECK_DEPENDENCY_GENERATION_OPT()
+ #
+ # We used to set -n32 for IRIX 6 when not using GCC (presumed
+ # to mean that we're using MIPS C or MIPSpro C); it specified
+ # the "new" faster 32-bit ABI, introduced in IRIX 6.2. I'm
+ # not sure why that would be something to do *only* with a
+ # .devel file; why should the ABI for which we produce code
+ # depend on .devel?
+ #
+ os=`echo $host_os | sed -e 's/\([[0-9]][[0-9]]*\)[[^0-9]].*$/\1/'`
+ name="lbl/os-$os.h"
+ if test -f $name ; then
+ ln -s $name os-proto.h
+ AC_DEFINE(HAVE_OS_PROTO_H, 1,
+ [if there's an os_proto.h for this platform, to use additional prototypes])
+ else
+ AC_MSG_WARN(can't find $name)
+ fi
+ fi])
+
+dnl
+dnl Improved version of AC_CHECK_LIB
+dnl
+dnl Thanks to John Hawkinson (jhawk@mit.edu)
+dnl
+dnl usage:
+dnl
+dnl AC_LBL_CHECK_LIB(LIBRARY, FUNCTION [, ACTION-IF-FOUND [,
+dnl ACTION-IF-NOT-FOUND [, OTHER-LIBRARIES]]])
+dnl
+dnl results:
+dnl
+dnl LIBS
+dnl
+dnl XXX - "AC_LBL_LIBRARY_NET" was redone to use "AC_SEARCH_LIBS"
+dnl rather than "AC_LBL_CHECK_LIB", so this isn't used any more.
+dnl We keep it around for reference purposes in case it's ever
+dnl useful in the future.
+dnl
+
+define(AC_LBL_CHECK_LIB,
+[AC_MSG_CHECKING([for $2 in -l$1])
+dnl Use a cache variable name containing the library, function
+dnl name, and extra libraries to link with, because the test really is
+dnl for library $1 defining function $2, when linked with potinal
+dnl library $5, not just for library $1. Separate tests with the same
+dnl $1 and different $2's or $5's may have different results.
+ac_lib_var=`echo $1['_']$2['_']$5 | sed 'y%./+- %__p__%'`
+AC_CACHE_VAL(ac_cv_lbl_lib_$ac_lib_var,
+[ac_save_LIBS="$LIBS"
+LIBS="-l$1 $5 $LIBS"
+AC_TRY_LINK(dnl
+ifelse([$2], [main], , dnl Avoid conflicting decl of main.
+[/* Override any gcc2 internal prototype to avoid an error. */
+]ifelse(AC_LANG, CPLUSPLUS, [#ifdef __cplusplus
+extern "C"
+#endif
+])dnl
+[/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $2();
+]),
+ [$2()],
+ eval "ac_cv_lbl_lib_$ac_lib_var=yes",
+ eval "ac_cv_lbl_lib_$ac_lib_var=no")
+LIBS="$ac_save_LIBS"
+])dnl
+if eval "test \"`echo '$ac_cv_lbl_lib_'$ac_lib_var`\" = yes"; then
+ AC_MSG_RESULT(yes)
+ ifelse([$3], ,
+[changequote(, )dnl
+ ac_tr_lib=HAVE_LIB`echo $1 | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+changequote([, ])dnl
+ AC_DEFINE_UNQUOTED($ac_tr_lib)
+ LIBS="-l$1 $LIBS"
+], [$3])
+else
+ AC_MSG_RESULT(no)
+ifelse([$4], , , [$4
+])dnl
+fi
+])
+
+dnl
+dnl AC_LBL_LIBRARY_NET
+dnl
+dnl This test is for network applications that need socket() and
+dnl gethostbyname() -ish functions. Under Solaris, those applications
+dnl need to link with "-lsocket -lnsl". Under IRIX, they need to link
+dnl with "-lnsl" but should *not* link with "-lsocket" because
+dnl libsocket.a breaks a number of things (for instance:
+dnl gethostbyname() under IRIX 5.2, and snoop sockets under most
+dnl versions of IRIX).
+dnl
+dnl Unfortunately, many application developers are not aware of this,
+dnl and mistakenly write tests that cause -lsocket to be used under
+dnl IRIX. It is also easy to write tests that cause -lnsl to be used
+dnl under operating systems where neither are necessary (or useful),
+dnl such as SunOS 4.1.4, which uses -lnsl for TLI.
+dnl
+dnl This test exists so that every application developer does not test
+dnl this in a different, and subtly broken fashion.
+
+dnl It has been argued that this test should be broken up into two
+dnl seperate tests, one for the resolver libraries, and one for the
+dnl libraries necessary for using Sockets API. Unfortunately, the two
+dnl are carefully intertwined and allowing the autoconf user to use
+dnl them independantly potentially results in unfortunate ordering
+dnl dependancies -- as such, such component macros would have to
+dnl carefully use indirection and be aware if the other components were
+dnl executed. Since other autoconf macros do not go to this trouble,
+dnl and almost no applications use sockets without the resolver, this
+dnl complexity has not been implemented.
+dnl
+dnl The check for libresolv is in case you are attempting to link
+dnl statically and happen to have a libresolv.a lying around (and no
+dnl libnsl.a).
+dnl
+AC_DEFUN(AC_LBL_LIBRARY_NET, [
+ # Most operating systems have gethostbyname() in the default searched
+ # libraries (i.e. libc):
+ # Some OSes (eg. Solaris) place it in libnsl
+ # Some strange OSes (SINIX) have it in libsocket:
+ AC_SEARCH_LIBS(gethostbyname, nsl socket resolv)
+ # Unfortunately libsocket sometimes depends on libnsl and
+ # AC_SEARCH_LIBS isn't up to the task of handling dependencies like this.
+ if test "$ac_cv_search_gethostbyname" = "no"
+ then
+ AC_CHECK_LIB(socket, gethostbyname,
+ LIBS="-lsocket -lnsl $LIBS", , -lnsl)
+ fi
+ AC_SEARCH_LIBS(socket, socket, ,
+ AC_CHECK_LIB(socket, socket, LIBS="-lsocket -lnsl $LIBS", , -lnsl))
+ # DLPI needs putmsg under HPUX so test for -lstr while we're at it
+ AC_SEARCH_LIBS(putmsg, str)
+ ])
+
+dnl Copyright (c) 1999 WIDE Project. All rights reserved.
+dnl
+dnl Redistribution and use in source and binary forms, with or without
+dnl modification, are permitted provided that the following conditions
+dnl are met:
+dnl 1. Redistributions of source code must retain the above copyright
+dnl notice, this list of conditions and the following disclaimer.
+dnl 2. Redistributions in binary form must reproduce the above copyright
+dnl notice, this list of conditions and the following disclaimer in the
+dnl documentation and/or other materials provided with the distribution.
+dnl 3. Neither the name of the project nor the names of its contributors
+dnl may be used to endorse or promote products derived from this software
+dnl without specific prior written permission.
+dnl
+dnl THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+dnl ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+dnl IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+dnl ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+dnl FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+dnl OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+dnl HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+dnl LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+dnl OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+dnl SUCH DAMAGE.
+
+dnl
+dnl Checks to see if AF_INET6 is defined
+AC_DEFUN(AC_CHECK_AF_INET6, [
+ AC_MSG_CHECKING(for AF_INET6)
+ AC_CACHE_VAL($1,
+ AC_TRY_COMPILE([
+# include <sys/types.h>
+# include <sys/socket.h>],
+ [int a = AF_INET6],
+ $1=yes,
+ $1=no))
+ AC_MSG_RESULT($$1)
+ if test $$1 = yes ; then
+ AC_DEFINE(HAVE_AF_INET6)
+ fi
+])
+
+dnl
+dnl Checks to see if the sockaddr struct has the 4.4 BSD sa_len member
+dnl borrowed from LBL libpcap
+AC_DEFUN(AC_CHECK_SA_LEN, [
+ AC_MSG_CHECKING(if sockaddr struct has sa_len member)
+ AC_CACHE_VAL($1,
+ AC_TRY_COMPILE([
+# include <sys/types.h>
+# include <sys/socket.h>],
+ [u_int i = sizeof(((struct sockaddr *)0)->sa_len)],
+ $1=yes,
+ $1=no))
+ AC_MSG_RESULT($$1)
+ if test $$1 = yes ; then
+ AC_DEFINE(HAVE_SOCKADDR_SA_LEN)
+ fi
+])
+
+dnl
+dnl Checks for addrinfo structure
+AC_DEFUN(AC_STRUCT_ADDRINFO, [
+ AC_MSG_CHECKING(for addrinfo)
+ AC_CACHE_VAL($1,
+ AC_TRY_COMPILE([
+# include <netdb.h>],
+ [struct addrinfo a],
+ $1=yes,
+ $1=no))
+ AC_MSG_RESULT($$1)
+ if test $$1 = yes; then
+ AC_DEFINE(HAVE_ADDRINFO, 1,
+ [define if you have the addrinfo function])
+ else
+ AC_DEFINE(NEED_ADDRINFO_H, 1,
+ [define if you need to include missing/addrinfo.h])
+ fi
+])
+
+dnl
+dnl Checks for NI_MAXSERV
+AC_DEFUN(AC_NI_MAXSERV, [
+ AC_MSG_CHECKING(for NI_MAXSERV)
+ AC_CACHE_VAL($1,
+ AC_EGREP_CPP(yes, [#include <netdb.h>
+#ifdef NI_MAXSERV
+yes
+#endif],
+ $1=yes,
+ $1=no))
+ AC_MSG_RESULT($$1)
+ if test $$1 != yes; then
+ AC_DEFINE(NEED_ADDRINFO_H)
+ fi
+])
+
+dnl
+dnl Checks for NI_NAMEREQD
+AC_DEFUN(AC_NI_NAMEREQD, [
+ AC_MSG_CHECKING(for NI_NAMEREQD)
+ AC_CACHE_VAL($1,
+ AC_EGREP_CPP(yes, [#include <netdb.h>
+#ifdef NI_NOFQDN
+yes
+#endif],
+ $1=yes,
+ $1=no))
+ AC_MSG_RESULT($$1)
+ if test $$1 != yes; then
+ AC_DEFINE(NEED_ADDRINFO_H)
+ fi
+])
+
+dnl
+dnl Checks for sockaddr_storage structure
+AC_DEFUN(AC_STRUCT_SA_STORAGE, [
+ AC_MSG_CHECKING(for sockaddr_storage)
+ AC_CACHE_VAL($1,
+ AC_TRY_COMPILE([
+# include <sys/types.h>
+# include <sys/socket.h>],
+ [struct sockaddr_storage s],
+ $1=yes,
+ $1=no))
+ AC_MSG_RESULT($$1)
+ if test $$1 = yes; then
+ AC_DEFINE(HAVE_SOCKADDR_STORAGE, 1,
+ [define if you have struct sockaddr_storage])
+ fi
+])
+
+dnl
+dnl check for h_errno
+AC_DEFUN(AC_VAR_H_ERRNO, [
+ AC_MSG_CHECKING(for h_errno)
+ AC_CACHE_VAL(ac_cv_var_h_errno,
+ AC_TRY_COMPILE([
+# include <sys/types.h>
+# include <netdb.h>],
+ [int foo = h_errno;],
+ ac_cv_var_h_errno=yes,
+ ac_cv_var_h_errno=no))
+ AC_MSG_RESULT($ac_cv_var_h_errno)
+ if test "$ac_cv_var_h_errno" = "yes"; then
+ AC_DEFINE(HAVE_H_ERRNO, 1,
+ [define if you have the h_errno variable])
+ fi
+])
+
+dnl
+dnl Test for __attribute__
+dnl
+
+AC_DEFUN(AC_C___ATTRIBUTE__, [
+AC_MSG_CHECKING(for __attribute__)
+AC_CACHE_VAL(ac_cv___attribute__, [
+AC_COMPILE_IFELSE([
+ AC_LANG_SOURCE([[
+#include <stdlib.h>
+
+static void foo(void) __attribute__ ((noreturn));
+
+static void
+foo(void)
+{
+ exit(1);
+}
+
+int
+main(int argc, char **argv)
+{
+ foo();
+}
+ ]])],
+ac_cv___attribute__=yes,
+ac_cv___attribute__=no)])
+if test "$ac_cv___attribute__" = "yes"; then
+ AC_DEFINE(HAVE___ATTRIBUTE__, 1, [define if your compiler has __attribute__])
+else
+ #
+ # We can't use __attribute__, so we can't use __attribute__((unused)),
+ # so we define _U_ to an empty string.
+ #
+ V_DEFS="$V_DEFS -D_U_=\"\""
+fi
+AC_MSG_RESULT($ac_cv___attribute__)
+])
+
+
+dnl
+dnl Test whether __attribute__((unused)) can be used without warnings
+dnl
+
+AC_DEFUN(AC_C___ATTRIBUTE___UNUSED, [
+AC_MSG_CHECKING([whether __attribute__((unused)) can be used without warnings])
+AC_CACHE_VAL(ac_cv___attribute___unused, [
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors"
+AC_COMPILE_IFELSE([
+ AC_LANG_SOURCE([[
+#include <stdlib.h>
+#include <stdio.h>
+
+int
+main(int argc __attribute((unused)), char **argv __attribute((unused)))
+{
+ printf("Hello, world!\n");
+ return 0;
+}
+ ]])],
+ac_cv___attribute___unused=yes,
+ac_cv___attribute___unused=no)])
+CFLAGS="$save_CFLAGS"
+if test "$ac_cv___attribute___unused" = "yes"; then
+ V_DEFS="$V_DEFS -D_U_=\"__attribute__((unused))\""
+else
+ V_DEFS="$V_DEFS -D_U_=\"\""
+fi
+AC_MSG_RESULT($ac_cv___attribute___unused)
+])
+
+dnl
+dnl Test whether __attribute__((format)) can be used without warnings
+dnl
+
+AC_DEFUN(AC_C___ATTRIBUTE___FORMAT, [
+AC_MSG_CHECKING([whether __attribute__((format)) can be used without warnings])
+AC_CACHE_VAL(ac_cv___attribute___format, [
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors"
+AC_COMPILE_IFELSE([
+ AC_LANG_SOURCE([[
+#include <stdlib.h>
+
+extern int foo(const char *fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+
+int
+main(int argc, char **argv)
+{
+ foo("%s", "test");
+}
+ ]])],
+ac_cv___attribute___format=yes,
+ac_cv___attribute___format=no)])
+CFLAGS="$save_CFLAGS"
+if test "$ac_cv___attribute___format" = "yes"; then
+ AC_DEFINE(__ATTRIBUTE___FORMAT_OK, 1,
+ [define if your compiler allows __attribute__((format)) without a warning])
+fi
+AC_MSG_RESULT($ac_cv___attribute___format)
+])
+
+dnl
+dnl Test whether __attribute__((format)) can be applied to function
+dnl pointers
+dnl
+
+AC_DEFUN(AC_C___ATTRIBUTE___FORMAT_FUNCTION_POINTER, [
+AC_MSG_CHECKING([whether __attribute__((format)) can be applied to function pointers])
+AC_CACHE_VAL(ac_cv___attribute___format_function_pointer, [
+AC_COMPILE_IFELSE([
+ AC_LANG_SOURCE([[
+#include <stdlib.h>
+
+extern int (*foo)(const char *fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+
+int
+main(int argc, char **argv)
+{
+ (*foo)("%s", "test");
+}
+ ]])],
+ac_cv___attribute___format_function_pointer=yes,
+ac_cv___attribute___format_function_pointer=no)])
+if test "$ac_cv___attribute___format_function_pointer" = "yes"; then
+ AC_DEFINE(__ATTRIBUTE___FORMAT_OK_FOR_FUNCTION_POINTERS, 1,
+ [define if your compiler allows __attribute__((format)) to be applied to function pointers])
+fi
+AC_MSG_RESULT($ac_cv___attribute___format_function_pointer)
+])
+
+AC_DEFUN(AC_C___ATTRIBUTE___NORETURN_FUNCTION_POINTER, [
+AC_MSG_CHECKING([whether __attribute__((noreturn)) can be applied to function pointers without warnings])
+AC_CACHE_VAL(ac_cv___attribute___noreturn_function_pointer, [
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors"
+AC_COMPILE_IFELSE([
+ AC_LANG_SOURCE([[
+#include <stdlib.h>
+
+extern int (*foo)(int i)
+ __attribute__ ((noreturn));
+
+int
+main(int argc, char **argv)
+{
+ (*foo)(1);
+}
+ ]])],
+ac_cv___attribute___noreturn_function_pointer=yes,
+ac_cv___attribute___noreturn_function_pointer=no)])
+CFLAGS="$save_CFLAGS"
+if test "$ac_cv___attribute___noreturn_function_pointer" = "yes"; then
+ AC_DEFINE(__ATTRIBUTE___NORETURN_OK_FOR_FUNCTION_POINTERS, 1,
+ [define if your compiler allows __attribute__((noreturn)) to be applied to function pointers])
+fi
+AC_MSG_RESULT($ac_cv___attribute___noreturn_function_pointer)
+])
+
+AC_DEFUN(AC_LBL_SSLEAY,
+ [
+ #
+ # Find the last component of $libdir; it's not necessarily
+ # "lib" - it might be "lib64" on, for example, x86-64
+ # Linux systems.
+ #
+ # We assume the directory in which we're looking for
+ # libcrypto has a subdirectory with that as its name.
+ #
+ tmplib=`echo "$libdir" | sed 's,.*/,,'`
+
+ #
+ # XXX - is there a better way to check if a given library is
+ # in a given directory than checking each of the possible
+ # shared library suffixes?
+ #
+ # Are there any other suffixes we need to look for? Do we
+ # have to worry about ".so.{version}"?
+ #
+ # Or should we just look for "libcrypto.*"?
+ #
+ if test -d "$1/$tmplib" -a \( -f "$1/$tmplib/libcrypto.a" -o \
+ -f "$1/$tmplib/libcrypto.so" -o \
+ -f "$1/$tmplib/libcrypto.sl" -o \
+ -f "$1/$tmplib/libcrypto.dylib" \); then
+ ac_cv_ssleay_path="$1"
+ fi
+
+ #
+ # Make sure we have the headers as well.
+ #
+ if test -d "$1/include/openssl" -a -f "$1/include/openssl/des.h"; then
+ incdir="-I$1/include"
+ fi
+])
--- /dev/null
+/*
+ * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * Internet, ethernet, port, and protocol string to address
+ * and address to string conversion routines
+ */
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: addrtoname.c,v 1.7 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#ifdef USE_ETHER_NTOHOST
+#ifdef HAVE_NETINET_IF_ETHER_H
+struct mbuf; /* Squelch compiler warnings on some platforms for */
+struct rtentry; /* declarations in <net/if.h> */
+#include <net/if.h> /* for "struct ifnet" in "struct arpcom" on Solaris */
+#include <netinet/if_ether.h>
+#endif /* HAVE_NETINET_IF_ETHER_H */
+#ifdef NETINET_ETHER_H_DECLARES_ETHER_NTOHOST
+#include <netinet/ether.h>
+#endif /* NETINET_ETHER_H_DECLARES_ETHER_NTOHOST */
+
+#if !defined(HAVE_DECL_ETHER_NTOHOST) || !HAVE_DECL_ETHER_NTOHOST
+#ifndef HAVE_STRUCT_ETHER_ADDR
+struct ether_addr {
+ unsigned char ether_addr_octet[6];
+};
+#endif
+extern int ether_ntohost(char *, const struct ether_addr *);
+#endif
+
+#endif /* USE_ETHER_NTOHOST */
+
+#include <pcap.h>
+#include <pcap-namedb.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "llc.h"
+#include "setsignal.h"
+#include "extract.h"
+#include "oui.h"
+
+#ifndef ETHER_ADDR_LEN
+#define ETHER_ADDR_LEN 6
+#endif
+
+/*
+ * hash tables for whatever-to-name translations
+ *
+ * XXX there has to be error checks against strdup(3) failure
+ */
+
+#define HASHNAMESIZE 4096
+
+struct hnamemem {
+ uint32_t addr;
+ const char *name;
+ struct hnamemem *nxt;
+};
+
+static struct hnamemem hnametable[HASHNAMESIZE];
+static struct hnamemem tporttable[HASHNAMESIZE];
+static struct hnamemem uporttable[HASHNAMESIZE];
+static struct hnamemem eprototable[HASHNAMESIZE];
+static struct hnamemem dnaddrtable[HASHNAMESIZE];
+static struct hnamemem ipxsaptable[HASHNAMESIZE];
+
+#if defined(INET6) && defined(WIN32)
+/*
+ * fake gethostbyaddr for Win2k/XP
+ * gethostbyaddr() returns incorrect value when AF_INET6 is passed
+ * to 3rd argument.
+ *
+ * h_name in struct hostent is only valid.
+ */
+static struct hostent *
+win32_gethostbyaddr(const char *addr, int len, int type)
+{
+ static struct hostent host;
+ static char hostbuf[NI_MAXHOST];
+ char hname[NI_MAXHOST];
+ struct sockaddr_in6 addr6;
+
+ host.h_name = hostbuf;
+ switch (type) {
+ case AF_INET:
+ return gethostbyaddr(addr, len, type);
+ break;
+ case AF_INET6:
+ memset(&addr6, 0, sizeof(addr6));
+ addr6.sin6_family = AF_INET6;
+ memcpy(&addr6.sin6_addr, addr, len);
+ if (getnameinfo((struct sockaddr *)&addr6, sizeof(addr6),
+ hname, sizeof(hname), NULL, 0, 0)) {
+ return NULL;
+ } else {
+ strcpy(host.h_name, hname);
+ return &host;
+ }
+ break;
+ default:
+ return NULL;
+ }
+}
+#define gethostbyaddr win32_gethostbyaddr
+#endif /* INET6 & WIN32 */
+
+#ifdef INET6
+struct h6namemem {
+ struct in6_addr addr;
+ char *name;
+ struct h6namemem *nxt;
+};
+
+static struct h6namemem h6nametable[HASHNAMESIZE];
+#endif /* INET6 */
+
+struct enamemem {
+ u_short e_addr0;
+ u_short e_addr1;
+ u_short e_addr2;
+ const char *e_name;
+ u_char *e_nsap; /* used only for nsaptable[] */
+#define e_bs e_nsap /* for bytestringtable */
+ struct enamemem *e_nxt;
+};
+
+static struct enamemem enametable[HASHNAMESIZE];
+static struct enamemem nsaptable[HASHNAMESIZE];
+static struct enamemem bytestringtable[HASHNAMESIZE];
+
+struct protoidmem {
+ uint32_t p_oui;
+ u_short p_proto;
+ const char *p_name;
+ struct protoidmem *p_nxt;
+};
+
+static struct protoidmem protoidtable[HASHNAMESIZE];
+
+/*
+ * A faster replacement for inet_ntoa().
+ */
+const char *
+intoa(uint32_t addr)
+{
+ register char *cp;
+ register u_int byte;
+ register int n;
+ static char buf[sizeof(".xxx.xxx.xxx.xxx")];
+
+ NTOHL(addr);
+ cp = buf + sizeof(buf);
+ *--cp = '\0';
+
+ n = 4;
+ do {
+ byte = addr & 0xff;
+ *--cp = byte % 10 + '0';
+ byte /= 10;
+ if (byte > 0) {
+ *--cp = byte % 10 + '0';
+ byte /= 10;
+ if (byte > 0)
+ *--cp = byte + '0';
+ }
+ *--cp = '.';
+ addr >>= 8;
+ } while (--n > 0);
+
+ return cp + 1;
+}
+
+static uint32_t f_netmask;
+static uint32_t f_localnet;
+
+/*
+ * Return a name for the IP address pointed to by ap. This address
+ * is assumed to be in network byte order.
+ *
+ * NOTE: ap is *NOT* necessarily part of the packet data (not even if
+ * this is being called with the "ipaddr_string()" macro), so you
+ * *CANNOT* use the TCHECK{2}/TTEST{2} macros on it. Furthermore,
+ * even in cases where it *is* part of the packet data, the caller
+ * would still have to check for a null return value, even if it's
+ * just printing the return value with "%s" - not all versions of
+ * printf print "(null)" with "%s" and a null pointer, some of them
+ * don't check for a null pointer and crash in that case.
+ *
+ * The callers of this routine should, before handing this routine
+ * a pointer to packet data, be sure that the data is present in
+ * the packet buffer. They should probably do those checks anyway,
+ * as other data at that layer might not be IP addresses, and it
+ * also needs to check whether they're present in the packet buffer.
+ */
+const char *
+getname(netdissect_options *ndo, const u_char *ap)
+{
+ register struct hostent *hp;
+ uint32_t addr;
+ static struct hnamemem *p; /* static for longjmp() */
+
+ memcpy(&addr, ap, sizeof(addr));
+ p = &hnametable[addr & (HASHNAMESIZE-1)];
+ for (; p->nxt; p = p->nxt) {
+ if (p->addr == addr)
+ return (p->name);
+ }
+ p->addr = addr;
+ p->nxt = newhnamemem();
+
+ /*
+ * Print names unless:
+ * (1) -n was given.
+ * (2) Address is foreign and -f was given. (If -f was not
+ * given, f_netmask and f_localnet are 0 and the test
+ * evaluates to true)
+ */
+ if (!ndo->ndo_nflag &&
+ (addr & f_netmask) == f_localnet) {
+ hp = gethostbyaddr((char *)&addr, 4, AF_INET);
+ if (hp) {
+ char *dotp;
+
+ p->name = strdup(hp->h_name);
+ if (ndo->ndo_Nflag) {
+ /* Remove domain qualifications */
+ dotp = strchr(p->name, '.');
+ if (dotp)
+ *dotp = '\0';
+ }
+ return (p->name);
+ }
+ }
+ p->name = strdup(intoa(addr));
+ return (p->name);
+}
+
+#ifdef INET6
+/*
+ * Return a name for the IP6 address pointed to by ap. This address
+ * is assumed to be in network byte order.
+ */
+const char *
+getname6(netdissect_options *ndo, const u_char *ap)
+{
+ register struct hostent *hp;
+ union {
+ struct in6_addr addr;
+ struct for_hash_addr {
+ char fill[14];
+ uint16_t d;
+ } addra;
+ } addr;
+ static struct h6namemem *p; /* static for longjmp() */
+ register const char *cp;
+ char ntop_buf[INET6_ADDRSTRLEN];
+
+ memcpy(&addr, ap, sizeof(addr));
+ p = &h6nametable[addr.addra.d & (HASHNAMESIZE-1)];
+ for (; p->nxt; p = p->nxt) {
+ if (memcmp(&p->addr, &addr, sizeof(addr)) == 0)
+ return (p->name);
+ }
+ p->addr = addr.addr;
+ p->nxt = newh6namemem();
+
+ /*
+ * Do not print names if -n was given.
+ */
+ if (!ndo->ndo_nflag) {
+ hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET6);
+ if (hp) {
+ char *dotp;
+
+ p->name = strdup(hp->h_name);
+ if (ndo->ndo_Nflag) {
+ /* Remove domain qualifications */
+ dotp = strchr(p->name, '.');
+ if (dotp)
+ *dotp = '\0';
+ }
+ return (p->name);
+ }
+ }
+ cp = inet_ntop(AF_INET6, &addr, ntop_buf, sizeof(ntop_buf));
+ p->name = strdup(cp);
+ return (p->name);
+}
+#endif /* INET6 */
+
+static const char hex[] = "0123456789abcdef";
+
+
+/* Find the hash node that corresponds the ether address 'ep' */
+
+static inline struct enamemem *
+lookup_emem(const u_char *ep)
+{
+ register u_int i, j, k;
+ struct enamemem *tp;
+
+ k = (ep[0] << 8) | ep[1];
+ j = (ep[2] << 8) | ep[3];
+ i = (ep[4] << 8) | ep[5];
+
+ tp = &enametable[(i ^ j) & (HASHNAMESIZE-1)];
+ while (tp->e_nxt)
+ if (tp->e_addr0 == i &&
+ tp->e_addr1 == j &&
+ tp->e_addr2 == k)
+ return tp;
+ else
+ tp = tp->e_nxt;
+ tp->e_addr0 = i;
+ tp->e_addr1 = j;
+ tp->e_addr2 = k;
+ tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
+ if (tp->e_nxt == NULL)
+ error("lookup_emem: calloc");
+
+ return tp;
+}
+
+/*
+ * Find the hash node that corresponds to the bytestring 'bs'
+ * with length 'nlen'
+ */
+
+static inline struct enamemem *
+lookup_bytestring(register const u_char *bs, const unsigned int nlen)
+{
+ struct enamemem *tp;
+ register u_int i, j, k;
+
+ if (nlen >= 6) {
+ k = (bs[0] << 8) | bs[1];
+ j = (bs[2] << 8) | bs[3];
+ i = (bs[4] << 8) | bs[5];
+ } else if (nlen >= 4) {
+ k = (bs[0] << 8) | bs[1];
+ j = (bs[2] << 8) | bs[3];
+ i = 0;
+ } else
+ i = j = k = 0;
+
+ tp = &bytestringtable[(i ^ j) & (HASHNAMESIZE-1)];
+ while (tp->e_nxt)
+ if (tp->e_addr0 == i &&
+ tp->e_addr1 == j &&
+ tp->e_addr2 == k &&
+ memcmp((const char *)bs, (const char *)(tp->e_bs), nlen) == 0)
+ return tp;
+ else
+ tp = tp->e_nxt;
+
+ tp->e_addr0 = i;
+ tp->e_addr1 = j;
+ tp->e_addr2 = k;
+
+ tp->e_bs = (u_char *) calloc(1, nlen + 1);
+ if (tp->e_bs == NULL)
+ error("lookup_bytestring: calloc");
+
+ memcpy(tp->e_bs, bs, nlen);
+ tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
+ if (tp->e_nxt == NULL)
+ error("lookup_bytestring: calloc");
+
+ return tp;
+}
+
+/* Find the hash node that corresponds the NSAP 'nsap' */
+
+static inline struct enamemem *
+lookup_nsap(register const u_char *nsap)
+{
+ register u_int i, j, k;
+ unsigned int nlen = *nsap;
+ struct enamemem *tp;
+ const u_char *ensap = nsap + nlen - 6;
+
+ if (nlen > 6) {
+ k = (ensap[0] << 8) | ensap[1];
+ j = (ensap[2] << 8) | ensap[3];
+ i = (ensap[4] << 8) | ensap[5];
+ }
+ else
+ i = j = k = 0;
+
+ tp = &nsaptable[(i ^ j) & (HASHNAMESIZE-1)];
+ while (tp->e_nxt)
+ if (tp->e_addr0 == i &&
+ tp->e_addr1 == j &&
+ tp->e_addr2 == k &&
+ tp->e_nsap[0] == nlen &&
+ memcmp((const char *)&(nsap[1]),
+ (char *)&(tp->e_nsap[1]), nlen) == 0)
+ return tp;
+ else
+ tp = tp->e_nxt;
+ tp->e_addr0 = i;
+ tp->e_addr1 = j;
+ tp->e_addr2 = k;
+ tp->e_nsap = (u_char *)malloc(nlen + 1);
+ if (tp->e_nsap == NULL)
+ error("lookup_nsap: malloc");
+ memcpy((char *)tp->e_nsap, (const char *)nsap, nlen + 1);
+ tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
+ if (tp->e_nxt == NULL)
+ error("lookup_nsap: calloc");
+
+ return tp;
+}
+
+/* Find the hash node that corresponds the protoid 'pi'. */
+
+static inline struct protoidmem *
+lookup_protoid(const u_char *pi)
+{
+ register u_int i, j;
+ struct protoidmem *tp;
+
+ /* 5 octets won't be aligned */
+ i = (((pi[0] << 8) + pi[1]) << 8) + pi[2];
+ j = (pi[3] << 8) + pi[4];
+ /* XXX should be endian-insensitive, but do big-endian testing XXX */
+
+ tp = &protoidtable[(i ^ j) & (HASHNAMESIZE-1)];
+ while (tp->p_nxt)
+ if (tp->p_oui == i && tp->p_proto == j)
+ return tp;
+ else
+ tp = tp->p_nxt;
+ tp->p_oui = i;
+ tp->p_proto = j;
+ tp->p_nxt = (struct protoidmem *)calloc(1, sizeof(*tp));
+ if (tp->p_nxt == NULL)
+ error("lookup_protoid: calloc");
+
+ return tp;
+}
+
+const char *
+etheraddr_string(netdissect_options *ndo, register const u_char *ep)
+{
+ register int i;
+ register char *cp;
+ register struct enamemem *tp;
+ int oui;
+ char buf[BUFSIZE];
+
+ tp = lookup_emem(ep);
+ if (tp->e_name)
+ return (tp->e_name);
+#ifdef USE_ETHER_NTOHOST
+ if (!ndo->ndo_nflag) {
+ char buf2[BUFSIZE];
+
+ /*
+ * We don't cast it to "const struct ether_addr *"
+ * because some systems fail to declare the second
+ * argument as a "const" pointer, even though they
+ * don't modify what it points to.
+ */
+ if (ether_ntohost(buf2, (struct ether_addr *)ep) == 0) {
+ tp->e_name = strdup(buf2);
+ return (tp->e_name);
+ }
+ }
+#endif
+ cp = buf;
+ oui = EXTRACT_24BITS(ep);
+ *cp++ = hex[*ep >> 4 ];
+ *cp++ = hex[*ep++ & 0xf];
+ for (i = 5; --i >= 0;) {
+ *cp++ = ':';
+ *cp++ = hex[*ep >> 4 ];
+ *cp++ = hex[*ep++ & 0xf];
+ }
+
+ if (!ndo->ndo_nflag) {
+ snprintf(cp, BUFSIZE - (2 + 5*3), " (oui %s)",
+ tok2str(oui_values, "Unknown", oui));
+ } else
+ *cp = '\0';
+ tp->e_name = strdup(buf);
+ 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(netdissect_options *ndo, const u_char *ep, const unsigned int type, const unsigned int len)
+{
+ register u_int i;
+ register char *cp;
+ register struct enamemem *tp;
+
+ if (len == 0)
+ return ("<empty>");
+
+ if (type == LINKADDR_ETHER && len == ETHER_ADDR_LEN)
+ return (etheraddr_string(ndo, ep));
+
+ if (type == LINKADDR_FRELAY)
+ return (q922_string(ndo, ep, len));
+
+ tp = lookup_bytestring(ep, len);
+ if (tp->e_name)
+ return (tp->e_name);
+
+ tp->e_name = cp = (char *)malloc(len*3);
+ if (tp->e_name == NULL)
+ error("linkaddr_string: malloc");
+ *cp++ = hex[*ep >> 4];
+ *cp++ = hex[*ep++ & 0xf];
+ for (i = len-1; i > 0 ; --i) {
+ *cp++ = ':';
+ *cp++ = hex[*ep >> 4];
+ *cp++ = hex[*ep++ & 0xf];
+ }
+ *cp = '\0';
+ return (tp->e_name);
+}
+
+const char *
+etherproto_string(u_short port)
+{
+ register char *cp;
+ register struct hnamemem *tp;
+ register uint32_t i = port;
+ char buf[sizeof("0000")];
+
+ for (tp = &eprototable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
+ if (tp->addr == i)
+ return (tp->name);
+
+ tp->addr = i;
+ tp->nxt = newhnamemem();
+
+ cp = buf;
+ NTOHS(port);
+ *cp++ = hex[port >> 12 & 0xf];
+ *cp++ = hex[port >> 8 & 0xf];
+ *cp++ = hex[port >> 4 & 0xf];
+ *cp++ = hex[port & 0xf];
+ *cp++ = '\0';
+ tp->name = strdup(buf);
+ return (tp->name);
+}
+
+const char *
+protoid_string(register const u_char *pi)
+{
+ register u_int i, j;
+ register char *cp;
+ register struct protoidmem *tp;
+ char buf[sizeof("00:00:00:00:00")];
+
+ tp = lookup_protoid(pi);
+ if (tp->p_name)
+ return tp->p_name;
+
+ cp = buf;
+ if ((j = *pi >> 4) != 0)
+ *cp++ = hex[j];
+ *cp++ = hex[*pi++ & 0xf];
+ for (i = 4; (int)--i >= 0;) {
+ *cp++ = ':';
+ if ((j = *pi >> 4) != 0)
+ *cp++ = hex[j];
+ *cp++ = hex[*pi++ & 0xf];
+ }
+ *cp = '\0';
+ tp->p_name = strdup(buf);
+ return (tp->p_name);
+}
+
+#define ISONSAP_MAX_LENGTH 20
+const char *
+isonsap_string(const u_char *nsap, register u_int nsap_length)
+{
+ register u_int nsap_idx;
+ register char *cp;
+ register struct enamemem *tp;
+
+ if (nsap_length < 1 || nsap_length > ISONSAP_MAX_LENGTH)
+ return ("isonsap_string: illegal length");
+
+ tp = lookup_nsap(nsap);
+ if (tp->e_name)
+ return tp->e_name;
+
+ tp->e_name = cp = (char *)malloc(sizeof("xx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xx"));
+ if (cp == NULL)
+ error("isonsap_string: malloc");
+
+ for (nsap_idx = 0; nsap_idx < nsap_length; nsap_idx++) {
+ *cp++ = hex[*nsap >> 4];
+ *cp++ = hex[*nsap++ & 0xf];
+ if (((nsap_idx & 1) == 0) &&
+ (nsap_idx + 1 < nsap_length)) {
+ *cp++ = '.';
+ }
+ }
+ *cp = '\0';
+ return (tp->e_name);
+}
+
+const char *
+tcpport_string(u_short port)
+{
+ register struct hnamemem *tp;
+ register uint32_t i = port;
+ char buf[sizeof("00000")];
+
+ for (tp = &tporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
+ if (tp->addr == i)
+ return (tp->name);
+
+ tp->addr = i;
+ tp->nxt = newhnamemem();
+
+ (void)snprintf(buf, sizeof(buf), "%u", i);
+ tp->name = strdup(buf);
+ return (tp->name);
+}
+
+const char *
+udpport_string(register u_short port)
+{
+ register struct hnamemem *tp;
+ register uint32_t i = port;
+ char buf[sizeof("00000")];
+
+ for (tp = &uporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
+ if (tp->addr == i)
+ return (tp->name);
+
+ tp->addr = i;
+ tp->nxt = newhnamemem();
+
+ (void)snprintf(buf, sizeof(buf), "%u", i);
+ tp->name = strdup(buf);
+ return (tp->name);
+}
+
+const char *
+ipxsap_string(u_short port)
+{
+ register char *cp;
+ register struct hnamemem *tp;
+ register uint32_t i = port;
+ char buf[sizeof("0000")];
+
+ for (tp = &ipxsaptable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
+ if (tp->addr == i)
+ return (tp->name);
+
+ tp->addr = i;
+ tp->nxt = newhnamemem();
+
+ cp = buf;
+ NTOHS(port);
+ *cp++ = hex[port >> 12 & 0xf];
+ *cp++ = hex[port >> 8 & 0xf];
+ *cp++ = hex[port >> 4 & 0xf];
+ *cp++ = hex[port & 0xf];
+ *cp++ = '\0';
+ tp->name = strdup(buf);
+ return (tp->name);
+}
+
+static void
+init_servarray(netdissect_options *ndo)
+{
+ struct servent *sv;
+ register struct hnamemem *table;
+ register int i;
+ char buf[sizeof("0000000000")];
+
+ while ((sv = getservent()) != NULL) {
+ int port = ntohs(sv->s_port);
+ i = port & (HASHNAMESIZE-1);
+ if (strcmp(sv->s_proto, "tcp") == 0)
+ table = &tporttable[i];
+ else if (strcmp(sv->s_proto, "udp") == 0)
+ table = &uporttable[i];
+ else
+ continue;
+
+ while (table->name)
+ table = table->nxt;
+ if (ndo->ndo_nflag) {
+ (void)snprintf(buf, sizeof(buf), "%d", port);
+ table->name = strdup(buf);
+ } else
+ table->name = strdup(sv->s_name);
+ table->addr = port;
+ table->nxt = newhnamemem();
+ }
+ endservent();
+}
+
+/* in libpcap.a (nametoaddr.c) */
+#if defined(WIN32) && !defined(USE_STATIC_LIBPCAP)
+extern __declspec(dllimport)
+#else
+extern
+#endif
+const struct eproto {
+ const char *s;
+ u_short p;
+} eproto_db[];
+
+static void
+init_eprotoarray(void)
+{
+ register int i;
+ register struct hnamemem *table;
+
+ for (i = 0; eproto_db[i].s; i++) {
+ int j = htons(eproto_db[i].p) & (HASHNAMESIZE-1);
+ table = &eprototable[j];
+ while (table->name)
+ table = table->nxt;
+ table->name = eproto_db[i].s;
+ table->addr = htons(eproto_db[i].p);
+ table->nxt = newhnamemem();
+ }
+}
+
+static const struct protoidlist {
+ const u_char protoid[5];
+ const char *name;
+} protoidlist[] = {
+ {{ 0x00, 0x00, 0x0c, 0x01, 0x07 }, "CiscoMLS" },
+ {{ 0x00, 0x00, 0x0c, 0x20, 0x00 }, "CiscoCDP" },
+ {{ 0x00, 0x00, 0x0c, 0x20, 0x01 }, "CiscoCGMP" },
+ {{ 0x00, 0x00, 0x0c, 0x20, 0x03 }, "CiscoVTP" },
+ {{ 0x00, 0xe0, 0x2b, 0x00, 0xbb }, "ExtremeEDP" },
+ {{ 0x00, 0x00, 0x00, 0x00, 0x00 }, NULL }
+};
+
+/*
+ * SNAP proto IDs with org code 0:0:0 are actually encapsulated Ethernet
+ * types.
+ */
+static void
+init_protoidarray(void)
+{
+ register int i;
+ register struct protoidmem *tp;
+ const struct protoidlist *pl;
+ u_char protoid[5];
+
+ protoid[0] = 0;
+ protoid[1] = 0;
+ protoid[2] = 0;
+ for (i = 0; eproto_db[i].s; i++) {
+ u_short etype = htons(eproto_db[i].p);
+
+ memcpy((char *)&protoid[3], (char *)&etype, 2);
+ tp = lookup_protoid(protoid);
+ tp->p_name = strdup(eproto_db[i].s);
+ }
+ /* Hardwire some SNAP proto ID names */
+ for (pl = protoidlist; pl->name != NULL; ++pl) {
+ tp = lookup_protoid(pl->protoid);
+ /* Don't override existing name */
+ if (tp->p_name != NULL)
+ continue;
+
+ tp->p_name = pl->name;
+ }
+}
+
+static const struct etherlist {
+ const u_char addr[6];
+ const char *name;
+} etherlist[] = {
+ {{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, "Broadcast" },
+ {{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, NULL }
+};
+
+/*
+ * Initialize the ethers hash table. We take two different approaches
+ * depending on whether or not the system provides the ethers name
+ * service. If it does, we just wire in a few names at startup,
+ * and etheraddr_string() fills in the table on demand. If it doesn't,
+ * then we suck in the entire /etc/ethers file at startup. The idea
+ * is that parsing the local file will be fast, but spinning through
+ * all the ethers entries via NIS & next_etherent might be very slow.
+ *
+ * XXX pcap_next_etherent doesn't belong in the pcap interface, but
+ * since the pcap module already does name-to-address translation,
+ * it's already does most of the work for the ethernet address-to-name
+ * translation, so we just pcap_next_etherent as a convenience.
+ */
+static void
+init_etherarray(void)
+{
+ register const struct etherlist *el;
+ register struct enamemem *tp;
+#ifdef USE_ETHER_NTOHOST
+ char name[256];
+#else
+ register struct pcap_etherent *ep;
+ register FILE *fp;
+
+ /* Suck in entire ethers file */
+ fp = fopen(PCAP_ETHERS_FILE, "r");
+ if (fp != NULL) {
+ while ((ep = pcap_next_etherent(fp)) != NULL) {
+ tp = lookup_emem(ep->addr);
+ tp->e_name = strdup(ep->name);
+ }
+ (void)fclose(fp);
+ }
+#endif
+
+ /* Hardwire some ethernet names */
+ for (el = etherlist; el->name != NULL; ++el) {
+ tp = lookup_emem(el->addr);
+ /* Don't override existing name */
+ if (tp->e_name != NULL)
+ continue;
+
+#ifdef USE_ETHER_NTOHOST
+ /*
+ * Use YP/NIS version of name if available.
+ *
+ * We don't cast it to "const struct ether_addr *"
+ * because some systems don't modify the Ethernet
+ * address but fail to declare the second argument
+ * as a "const" pointer.
+ */
+ if (ether_ntohost(name, (struct ether_addr *)el->addr) == 0) {
+ tp->e_name = strdup(name);
+ continue;
+ }
+#endif
+ tp->e_name = el->name;
+ }
+}
+
+static const struct tok ipxsap_db[] = {
+ { 0x0000, "Unknown" },
+ { 0x0001, "User" },
+ { 0x0002, "User Group" },
+ { 0x0003, "PrintQueue" },
+ { 0x0004, "FileServer" },
+ { 0x0005, "JobServer" },
+ { 0x0006, "Gateway" },
+ { 0x0007, "PrintServer" },
+ { 0x0008, "ArchiveQueue" },
+ { 0x0009, "ArchiveServer" },
+ { 0x000a, "JobQueue" },
+ { 0x000b, "Administration" },
+ { 0x000F, "Novell TI-RPC" },
+ { 0x0017, "Diagnostics" },
+ { 0x0020, "NetBIOS" },
+ { 0x0021, "NAS SNA Gateway" },
+ { 0x0023, "NACS AsyncGateway" },
+ { 0x0024, "RemoteBridge/RoutingService" },
+ { 0x0026, "BridgeServer" },
+ { 0x0027, "TCP/IP Gateway" },
+ { 0x0028, "Point-to-point X.25 BridgeServer" },
+ { 0x0029, "3270 Gateway" },
+ { 0x002a, "CHI Corp" },
+ { 0x002c, "PC Chalkboard" },
+ { 0x002d, "TimeSynchServer" },
+ { 0x002e, "ARCserve5.0/PalindromeBackup" },
+ { 0x0045, "DI3270 Gateway" },
+ { 0x0047, "AdvertisingPrintServer" },
+ { 0x004a, "NetBlazerModems" },
+ { 0x004b, "BtrieveVAP" },
+ { 0x004c, "NetwareSQL" },
+ { 0x004d, "XtreeNetwork" },
+ { 0x0050, "BtrieveVAP4.11" },
+ { 0x0052, "QuickLink" },
+ { 0x0053, "PrintQueueUser" },
+ { 0x0058, "Multipoint X.25 Router" },
+ { 0x0060, "STLB/NLM" },
+ { 0x0064, "ARCserve" },
+ { 0x0066, "ARCserve3.0" },
+ { 0x0072, "WAN CopyUtility" },
+ { 0x007a, "TES-NetwareVMS" },
+ { 0x0092, "WATCOM Debugger/EmeraldTapeBackupServer" },
+ { 0x0095, "DDA OBGYN" },
+ { 0x0098, "NetwareAccessServer" },
+ { 0x009a, "Netware for VMS II/NamedPipeServer" },
+ { 0x009b, "NetwareAccessServer" },
+ { 0x009e, "PortableNetwareServer/SunLinkNVT" },
+ { 0x00a1, "PowerchuteAPC UPS" },
+ { 0x00aa, "LAWserve" },
+ { 0x00ac, "CompaqIDA StatusMonitor" },
+ { 0x0100, "PIPE STAIL" },
+ { 0x0102, "LAN ProtectBindery" },
+ { 0x0103, "OracleDataBaseServer" },
+ { 0x0107, "Netware386/RSPX RemoteConsole" },
+ { 0x010f, "NovellSNA Gateway" },
+ { 0x0111, "TestServer" },
+ { 0x0112, "HP PrintServer" },
+ { 0x0114, "CSA MUX" },
+ { 0x0115, "CSA LCA" },
+ { 0x0116, "CSA CM" },
+ { 0x0117, "CSA SMA" },
+ { 0x0118, "CSA DBA" },
+ { 0x0119, "CSA NMA" },
+ { 0x011a, "CSA SSA" },
+ { 0x011b, "CSA STATUS" },
+ { 0x011e, "CSA APPC" },
+ { 0x0126, "SNA TEST SSA Profile" },
+ { 0x012a, "CSA TRACE" },
+ { 0x012b, "NetwareSAA" },
+ { 0x012e, "IKARUS VirusScan" },
+ { 0x0130, "CommunicationsExecutive" },
+ { 0x0133, "NNS DomainServer/NetwareNamingServicesDomain" },
+ { 0x0135, "NetwareNamingServicesProfile" },
+ { 0x0137, "Netware386 PrintQueue/NNS PrintQueue" },
+ { 0x0141, "LAN SpoolServer" },
+ { 0x0152, "IRMALAN Gateway" },
+ { 0x0154, "NamedPipeServer" },
+ { 0x0166, "NetWareManagement" },
+ { 0x0168, "Intel PICKIT CommServer/Intel CAS TalkServer" },
+ { 0x0173, "Compaq" },
+ { 0x0174, "Compaq SNMP Agent" },
+ { 0x0175, "Compaq" },
+ { 0x0180, "XTreeServer/XTreeTools" },
+ { 0x018A, "NASI ServicesBroadcastServer" },
+ { 0x01b0, "GARP Gateway" },
+ { 0x01b1, "Binfview" },
+ { 0x01bf, "IntelLanDeskManager" },
+ { 0x01ca, "AXTEC" },
+ { 0x01cb, "ShivaNetModem/E" },
+ { 0x01cc, "ShivaLanRover/E" },
+ { 0x01cd, "ShivaLanRover/T" },
+ { 0x01ce, "ShivaUniversal" },
+ { 0x01d8, "CastelleFAXPressServer" },
+ { 0x01da, "CastelleLANPressPrintServer" },
+ { 0x01dc, "CastelleFAX/Xerox7033 FaxServer/ExcelLanFax" },
+ { 0x01f0, "LEGATO" },
+ { 0x01f5, "LEGATO" },
+ { 0x0233, "NMS Agent/NetwareManagementAgent" },
+ { 0x0237, "NMS IPX Discovery/LANternReadWriteChannel" },
+ { 0x0238, "NMS IP Discovery/LANternTrapAlarmChannel" },
+ { 0x023a, "LANtern" },
+ { 0x023c, "MAVERICK" },
+ { 0x023f, "NovellSMDR" },
+ { 0x024e, "NetwareConnect" },
+ { 0x024f, "NASI ServerBroadcast Cisco" },
+ { 0x026a, "NMS ServiceConsole" },
+ { 0x026b, "TimeSynchronizationServer Netware 4.x" },
+ { 0x0278, "DirectoryServer Netware 4.x" },
+ { 0x027b, "NetwareManagementAgent" },
+ { 0x0280, "Novell File and Printer Sharing Service for PC" },
+ { 0x0304, "NovellSAA Gateway" },
+ { 0x0308, "COM/VERMED" },
+ { 0x030a, "GalacticommWorldgroupServer" },
+ { 0x030c, "IntelNetport2/HP JetDirect/HP Quicksilver" },
+ { 0x0320, "AttachmateGateway" },
+ { 0x0327, "MicrosoftDiagnostiocs" },
+ { 0x0328, "WATCOM SQL Server" },
+ { 0x0335, "MultiTechSystems MultisynchCommServer" },
+ { 0x0343, "Xylogics RemoteAccessServer/LANModem" },
+ { 0x0355, "ArcadaBackupExec" },
+ { 0x0358, "MSLCD1" },
+ { 0x0361, "NETINELO" },
+ { 0x037e, "Powerchute UPS Monitoring" },
+ { 0x037f, "ViruSafeNotify" },
+ { 0x0386, "HP Bridge" },
+ { 0x0387, "HP Hub" },
+ { 0x0394, "NetWare SAA Gateway" },
+ { 0x039b, "LotusNotes" },
+ { 0x03b7, "CertusAntiVirus" },
+ { 0x03c4, "ARCserve4.0" },
+ { 0x03c7, "LANspool3.5" },
+ { 0x03d7, "LexmarkPrinterServer" },
+ { 0x03d8, "LexmarkXLE PrinterServer" },
+ { 0x03dd, "BanyanENS NetwareClient" },
+ { 0x03de, "GuptaSequelBaseServer/NetWareSQL" },
+ { 0x03e1, "UnivelUnixware" },
+ { 0x03e4, "UnivelUnixware" },
+ { 0x03fc, "IntelNetport" },
+ { 0x03fd, "PrintServerQueue" },
+ { 0x040A, "ipnServer" },
+ { 0x040D, "LVERRMAN" },
+ { 0x040E, "LVLIC" },
+ { 0x0414, "NET Silicon (DPI)/Kyocera" },
+ { 0x0429, "SiteLockVirus" },
+ { 0x0432, "UFHELPR???" },
+ { 0x0433, "Synoptics281xAdvancedSNMPAgent" },
+ { 0x0444, "MicrosoftNT SNA Server" },
+ { 0x0448, "Oracle" },
+ { 0x044c, "ARCserve5.01" },
+ { 0x0457, "CanonGP55" },
+ { 0x045a, "QMS Printers" },
+ { 0x045b, "DellSCSI Array" },
+ { 0x0491, "NetBlazerModems" },
+ { 0x04ac, "OnTimeScheduler" },
+ { 0x04b0, "CD-Net" },
+ { 0x0513, "EmulexNQA" },
+ { 0x0520, "SiteLockChecks" },
+ { 0x0529, "SiteLockChecks" },
+ { 0x052d, "CitrixOS2 AppServer" },
+ { 0x0535, "Tektronix" },
+ { 0x0536, "Milan" },
+ { 0x055d, "Attachmate SNA gateway" },
+ { 0x056b, "IBM8235 ModemServer" },
+ { 0x056c, "ShivaLanRover/E PLUS" },
+ { 0x056d, "ShivaLanRover/T PLUS" },
+ { 0x0580, "McAfeeNetShield" },
+ { 0x05B8, "NLM to workstation communication (Revelation Software)" },
+ { 0x05BA, "CompatibleSystemsRouters" },
+ { 0x05BE, "CheyenneHierarchicalStorageManager" },
+ { 0x0606, "JCWatermarkImaging" },
+ { 0x060c, "AXISNetworkPrinter" },
+ { 0x0610, "AdaptecSCSIManagement" },
+ { 0x0621, "IBM AntiVirus" },
+ { 0x0640, "Windows95 RemoteRegistryService" },
+ { 0x064e, "MicrosoftIIS" },
+ { 0x067b, "Microsoft Win95/98 File and Print Sharing for NetWare" },
+ { 0x067c, "Microsoft Win95/98 File and Print Sharing for NetWare" },
+ { 0x076C, "Xerox" },
+ { 0x079b, "ShivaLanRover/E 115" },
+ { 0x079c, "ShivaLanRover/T 115" },
+ { 0x07B4, "CubixWorldDesk" },
+ { 0x07c2, "Quarterdeck IWare Connect V2.x NLM" },
+ { 0x07c1, "Quarterdeck IWare Connect V3.x NLM" },
+ { 0x0810, "ELAN License Server Demo" },
+ { 0x0824, "ShivaLanRoverAccessSwitch/E" },
+ { 0x086a, "ISSC Collector" },
+ { 0x087f, "ISSC DAS AgentAIX" },
+ { 0x0880, "Intel Netport PRO" },
+ { 0x0881, "Intel Netport PRO" },
+ { 0x0b29, "SiteLock" },
+ { 0x0c29, "SiteLockApplications" },
+ { 0x0c2c, "LicensingServer" },
+ { 0x2101, "PerformanceTechnologyInstantInternet" },
+ { 0x2380, "LAI SiteLock" },
+ { 0x238c, "MeetingMaker" },
+ { 0x4808, "SiteLockServer/SiteLockMetering" },
+ { 0x5555, "SiteLockUser" },
+ { 0x6312, "Tapeware" },
+ { 0x6f00, "RabbitGateway" },
+ { 0x7703, "MODEM" },
+ { 0x8002, "NetPortPrinters" },
+ { 0x8008, "WordPerfectNetworkVersion" },
+ { 0x85BE, "Cisco EIGRP" },
+ { 0x8888, "WordPerfectNetworkVersion/QuickNetworkManagement" },
+ { 0x9000, "McAfeeNetShield" },
+ { 0x9604, "CSA-NT_MON" },
+ { 0xb6a8, "OceanIsleReachoutRemoteControl" },
+ { 0xf11f, "SiteLockMetering" },
+ { 0xf1ff, "SiteLock" },
+ { 0xf503, "Microsoft SQL Server" },
+ { 0xF905, "IBM TimeAndPlace" },
+ { 0xfbfb, "TopCallIII FaxServer" },
+ { 0xffff, "AnyService/Wildcard" },
+ { 0, (char *)0 }
+};
+
+static void
+init_ipxsaparray(void)
+{
+ register int i;
+ register struct hnamemem *table;
+
+ for (i = 0; ipxsap_db[i].s != NULL; i++) {
+ int j = htons(ipxsap_db[i].v) & (HASHNAMESIZE-1);
+ table = &ipxsaptable[j];
+ while (table->name)
+ table = table->nxt;
+ table->name = ipxsap_db[i].s;
+ table->addr = htons(ipxsap_db[i].v);
+ table->nxt = newhnamemem();
+ }
+}
+
+/*
+ * Initialize the address to name translation machinery. We map all
+ * non-local IP addresses to numeric addresses if ndo->ndo_fflag is true
+ * (i.e., to prevent blocking on the nameserver). localnet is the IP address
+ * of the local network. mask is its subnet mask.
+ */
+void
+init_addrtoname(netdissect_options *ndo, uint32_t localnet, uint32_t mask)
+{
+ if (ndo->ndo_fflag) {
+ f_localnet = localnet;
+ f_netmask = mask;
+ }
+ if (ndo->ndo_nflag)
+ /*
+ * Simplest way to suppress names.
+ */
+ return;
+
+ init_etherarray();
+ init_servarray(ndo);
+ init_eprotoarray();
+ init_protoidarray();
+ init_ipxsaparray();
+}
+
+const char *
+dnaddr_string(netdissect_options *ndo, u_short dnaddr)
+{
+ register struct hnamemem *tp;
+
+ for (tp = &dnaddrtable[dnaddr & (HASHNAMESIZE-1)]; tp->nxt != 0;
+ tp = tp->nxt)
+ if (tp->addr == dnaddr)
+ return (tp->name);
+
+ tp->addr = dnaddr;
+ tp->nxt = newhnamemem();
+ if (ndo->ndo_nflag)
+ tp->name = dnnum_string(dnaddr);
+ else
+ tp->name = dnname_string(dnaddr);
+
+ return(tp->name);
+}
+
+/* Return a zero'ed hnamemem struct and cuts down on calloc() overhead */
+struct hnamemem *
+newhnamemem(void)
+{
+ register struct hnamemem *p;
+ static struct hnamemem *ptr = NULL;
+ static u_int num = 0;
+
+ if (num <= 0) {
+ num = 64;
+ ptr = (struct hnamemem *)calloc(num, sizeof (*ptr));
+ if (ptr == NULL)
+ error("newhnamemem: calloc");
+ }
+ --num;
+ p = ptr++;
+ return (p);
+}
+
+#ifdef INET6
+/* Return a zero'ed h6namemem struct and cuts down on calloc() overhead */
+struct h6namemem *
+newh6namemem(void)
+{
+ register struct h6namemem *p;
+ static struct h6namemem *ptr = NULL;
+ static u_int num = 0;
+
+ if (num <= 0) {
+ num = 64;
+ ptr = (struct h6namemem *)calloc(num, sizeof (*ptr));
+ if (ptr == NULL)
+ error("newh6namemem: calloc");
+ }
+ --num;
+ p = ptr++;
+ return (p);
+}
+#endif /* INET6 */
+
+/* Represent TCI part of the 802.1Q 4-octet tag as text. */
+const char *
+ieee8021q_tci_string(const uint16_t tci)
+{
+ static char buf[128];
+ snprintf(buf, sizeof(buf), "vlan %u, p %u%s",
+ tci & 0xfff,
+ tci >> 13,
+ (tci & 0x1000) ? ", DEI" : "");
+ return buf;
+}
--- /dev/null
+/*
+ * Copyright (c) 1990, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+/* Name to address translation routines. */
+
+enum {
+ LINKADDR_ETHER,
+ LINKADDR_FRELAY,
+ LINKADDR_IEEE1394,
+ LINKADDR_ATM
+};
+
+#define BUFSIZE 128
+
+extern const char *linkaddr_string(netdissect_options *, const u_char *, const unsigned int, const unsigned int);
+extern const char *etheraddr_string(netdissect_options *, 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);
+extern const char *isonsap_string(const u_char *, register u_int);
+extern const char *dnaddr_string(netdissect_options *, u_short);
+extern const char *protoid_string(const u_char *);
+extern const char *ipxsap_string(u_short);
+extern const char *getname(netdissect_options *, const u_char *);
+#ifdef INET6
+extern const char *getname6(netdissect_options *, const u_char *);
+#endif
+extern const char *intoa(uint32_t);
+
+extern void init_addrtoname(netdissect_options *, uint32_t, uint32_t);
+extern struct hnamemem *newhnamemem(void);
+#ifdef INET6
+extern struct h6namemem *newh6namemem(void);
+#endif
+extern const char * ieee8021q_tci_string(const uint16_t);
+
+#define ipaddr_string(ndo, p) getname(ndo, (const u_char *)(p))
+#ifdef INET6
+#define ip6addr_string(ndo, p) getname6(ndo, (const u_char *)(p))
+#endif
--- /dev/null
+/*
+ * Copyright (c) 1998-2006 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: af.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+#include "interface.h"
+#include "af.h"
+
+const struct tok af_values[] = {
+ { 0, "Reserved"},
+ { AFNUM_INET, "IPv4"},
+ { AFNUM_INET6, "IPv6"},
+ { AFNUM_NSAP, "NSAP"},
+ { AFNUM_HDLC, "HDLC"},
+ { AFNUM_BBN1822, "BBN 1822"},
+ { AFNUM_802, "802"},
+ { AFNUM_E163, "E.163"},
+ { AFNUM_E164, "E.164"},
+ { AFNUM_F69, "F.69"},
+ { AFNUM_X121, "X.121"},
+ { AFNUM_IPX, "Novell IPX"},
+ { AFNUM_ATALK, "Appletalk"},
+ { AFNUM_DECNET, "Decnet IV"},
+ { AFNUM_BANYAN, "Banyan Vines"},
+ { AFNUM_E164NSAP, "E.164 with NSAP subaddress"},
+ { AFNUM_L2VPN, "Layer-2 VPN"},
+ { AFNUM_VPLS, "VPLS"},
+ { 0, NULL},
+};
+
+const struct tok bsd_af_values[] = {
+ { BSD_AFNUM_INET, "IPv4" },
+ { BSD_AFNUM_NS, "NS" },
+ { BSD_AFNUM_ISO, "ISO" },
+ { BSD_AFNUM_APPLETALK, "Appletalk" },
+ { BSD_AFNUM_IPX, "IPX" },
+ { BSD_AFNUM_INET6_BSD, "IPv6" },
+ { BSD_AFNUM_INET6_FREEBSD, "IPv6" },
+ { BSD_AFNUM_INET6_DARWIN, "IPv6" },
+ { 0, NULL}
+};
--- /dev/null
+/*
+ * Copyright (c) 1998-2006 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+extern const struct tok af_values[];
+extern const struct tok bsd_af_values[];
+
+/* RFC1700 address family numbers */
+#define AFNUM_INET 1
+#define AFNUM_INET6 2
+#define AFNUM_NSAP 3
+#define AFNUM_HDLC 4
+#define AFNUM_BBN1822 5
+#define AFNUM_802 6
+#define AFNUM_E163 7
+#define AFNUM_E164 8
+#define AFNUM_F69 9
+#define AFNUM_X121 10
+#define AFNUM_IPX 11
+#define AFNUM_ATALK 12
+#define AFNUM_DECNET 13
+#define AFNUM_BANYAN 14
+#define AFNUM_E164NSAP 15
+#define AFNUM_VPLS 25
+/* draft-kompella-ppvpn-l2vpn */
+#define AFNUM_L2VPN 196 /* still to be approved by IANA */
+
+/*
+ * BSD AF_ values.
+ *
+ * Unfortunately, the BSDs don't all use the same value for AF_INET6,
+ * so, because we want to be able to read captures from all of the BSDs,
+ * we check for all of them.
+ */
+#define BSD_AFNUM_INET 2
+#define BSD_AFNUM_NS 6 /* XEROX NS protocols */
+#define BSD_AFNUM_ISO 7
+#define BSD_AFNUM_APPLETALK 16
+#define BSD_AFNUM_IPX 23
+#define BSD_AFNUM_INET6_BSD 24 /* OpenBSD (and probably NetBSD), BSD/OS */
+#define BSD_AFNUM_INET6_FREEBSD 28
+#define BSD_AFNUM_INET6_DARWIN 30
--- /dev/null
+/* NetBSD: ah.h,v 1.12 2000/07/23 05:23:04 itojun Exp */
+/* $KAME: ah.h,v 1.12 2000/07/20 17:41:01 itojun Exp $ */
+
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 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.
+ */
+
+/*
+ * RFC1826/2402 authentication header.
+ */
+
+#ifndef _NETINET6_AH_H_
+#define _NETINET6_AH_H_
+
+struct ah {
+ uint8_t ah_nxt; /* Next Header */
+ uint8_t ah_len; /* Length of data, in 32bit */
+ uint16_t ah_reserve; /* Reserved for future use */
+ uint32_t ah_spi; /* Security parameter index */
+ /* variable size, 32bit bound*/ /* Authentication data */
+};
+
+struct newah {
+ uint8_t ah_nxt; /* Next Header */
+ uint8_t ah_len; /* Length of data + 1, in 32bit */
+ uint16_t ah_reserve; /* Reserved for future use */
+ uint32_t ah_spi; /* Security parameter index */
+ uint32_t ah_seq; /* Sequence number field */
+ /* variable size, 32bit bound*/ /* Authentication data */
+};
+
+#endif /*_NETINET6_AH_H_*/
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1993, 1994, 1995, 1996
+ * 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: (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.
+ *
+ * AppleTalk protocol formats (courtesy Bill Croft of Stanford/SUMEX).
+ */
+
+struct LAP {
+ uint8_t dst;
+ uint8_t src;
+ uint8_t type;
+};
+#define lapShortDDP 1 /* short DDP type */
+#define lapDDP 2 /* DDP type */
+#define lapKLAP 'K' /* Kinetics KLAP type */
+
+/* Datagram Delivery Protocol */
+
+struct atDDP {
+ uint16_t length;
+ uint16_t checksum;
+ uint16_t dstNet;
+ uint16_t srcNet;
+ uint8_t dstNode;
+ uint8_t srcNode;
+ uint8_t dstSkt;
+ uint8_t srcSkt;
+ uint8_t type;
+};
+
+struct atShortDDP {
+ uint16_t length;
+ uint8_t dstSkt;
+ uint8_t srcSkt;
+ uint8_t type;
+};
+
+#define ddpMaxWKS 0x7F
+#define ddpMaxData 586
+#define ddpLengthMask 0x3FF
+#define ddpHopShift 10
+#define ddpSize 13 /* size of DDP header (avoid struct padding) */
+#define ddpSSize 5
+#define ddpWKS 128 /* boundary of DDP well known sockets */
+#define ddpRTMP 1 /* RTMP type */
+#define ddpRTMPrequest 5 /* RTMP request type */
+#define ddpNBP 2 /* NBP type */
+#define ddpATP 3 /* ATP type */
+#define ddpECHO 4 /* ECHO type */
+#define ddpIP 22 /* IP type */
+#define ddpARP 23 /* ARP type */
+#define ddpEIGRP 88 /* EIGRP over Appletalk */
+#define ddpKLAP 0x4b /* Kinetics KLAP type */
+
+
+/* AppleTalk Transaction Protocol */
+
+struct atATP {
+ uint8_t control;
+ uint8_t bitmap;
+ uint16_t transID;
+ int32_t userData;
+};
+
+#define atpReqCode 0x40
+#define atpRspCode 0x80
+#define atpRelCode 0xC0
+#define atpXO 0x20
+#define atpEOM 0x10
+#define atpSTS 0x08
+#define atpFlagMask 0x3F
+#define atpControlMask 0xF8
+#define atpMaxNum 8
+#define atpMaxData 578
+
+
+/* AppleTalk Echo Protocol */
+
+struct atEcho {
+ uint8_t echoFunction;
+ uint8_t *echoData;
+};
+
+#define echoSkt 4 /* the echoer socket */
+#define echoSize 1 /* size of echo header */
+#define echoRequest 1 /* echo request */
+#define echoReply 2 /* echo request */
+
+
+/* Name Binding Protocol */
+
+struct atNBP {
+ uint8_t control;
+ uint8_t id;
+};
+
+struct atNBPtuple {
+ uint16_t net;
+ uint8_t node;
+ uint8_t skt;
+ uint8_t enumerator;
+};
+
+#define nbpBrRq 0x10
+#define nbpLkUp 0x20
+#define nbpLkUpReply 0x30
+
+#define nbpNIS 2
+#define nbpTupleMax 15
+
+#define nbpHeaderSize 2
+#define nbpTupleSize 5
+
+#define nbpSkt 2 /* NIS */
+
+
+/* Routing Table Maint. Protocol */
+
+#define rtmpSkt 1 /* number of RTMP socket */
+#define rtmpSize 4 /* minimum size */
+#define rtmpTupleSize 3
+
+
+/* Zone Information Protocol */
+
+struct zipHeader {
+ uint8_t command;
+ uint8_t netcount;
+};
+
+#define zipHeaderSize 2
+#define zipQuery 1
+#define zipReply 2
+#define zipTakedown 3
+#define zipBringup 4
+#define ddpZIP 6
+#define zipSkt 6
+#define GetMyZone 7
+#define GetZoneList 8
+
+/*
+ * UDP port range used for ddp-in-udp encapsulation is 16512-16639
+ * for client sockets (128-255) and 200-327 for server sockets
+ * (0-127). We also try to recognize the pre-April 88 server
+ * socket range of 768-895.
+ */
+#define atalk_port(p) \
+ (((unsigned)((p) - 16512) < 128) || \
+ ((unsigned)((p) - 200) < 128) || \
+ ((unsigned)((p) - 768) < 128))
--- /dev/null
+$6 ~ /^ack/ && $5 !~ /[SFR]/ {
+ # given a tcpdump ftp trace, output one line for each ack
+ # in the form
+ # <ack time> <seq no>
+ # where <ack time> is the time packet was acked (in seconds with
+ # zero at time of first packet) and <seq no> is the tcp sequence
+ # number of the ack divided by 1024 (i.e., Kbytes acked).
+ #
+ # convert time to seconds
+ n = split ($1,t,":")
+ tim = t[1]*3600 + t[2]*60 + t[3]
+ if (! tzero) {
+ tzero = tim
+ OFS = "\t"
+ }
+ # get packet sequence number
+ printf "%7.2f\t%g\n", tim-tzero, $7/1024
+ }
--- /dev/null
+/*
+ * Copyright (c) 2002 Guy Harris.
+ * All rights reserved.
+ *
+ * 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 Guy Harris 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.
+ */
+
+/*
+ * Traffic types for ATM.
+ */
+#define ATM_UNKNOWN 0 /* Unknown */
+#define ATM_LANE 1 /* LANE */
+#define ATM_LLC 2 /* LLC encapsulation */
+
+/*
+ * some OAM cell captures (most notably Juniper's)
+ * do not deliver a heading HEC byte
+ */
+#define ATM_OAM_NOHEC 0
+#define ATM_OAM_HEC 1
+#define ATM_HDR_LEN_NOHEC 4
--- /dev/null
+/*
+ * Copyright (c) 1997 Yen Yen Lim and North Dakota State University
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Yen Yen Lim and
+ North Dakota State University
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+/* Based on UNI3.1 standard by ATM Forum */
+
+/* ATM traffic types based on VPI=0 and (the following VCI */
+#define VCI_PPC 0x05 /* Point-to-point signal msg */
+#define VCI_BCC 0x02 /* Broadcast signal msg */
+#define VCI_OAMF4SC 0x03 /* Segment OAM F4 flow cell */
+#define VCI_OAMF4EC 0x04 /* End-to-end OAM F4 flow cell */
+#define VCI_METAC 0x01 /* Meta signal msg */
+#define VCI_ILMIC 0x10 /* ILMI msg */
+
+/* Q.2931 signalling messages */
+#define CALL_PROCEED 0x02 /* call proceeding */
+#define CONNECT 0x07 /* connect */
+#define CONNECT_ACK 0x0f /* connect_ack */
+#define SETUP 0x05 /* setup */
+#define RELEASE 0x4d /* release */
+#define RELEASE_DONE 0x5a /* release_done */
+#define RESTART 0x46 /* restart */
+#define RESTART_ACK 0x4e /* restart ack */
+#define STATUS 0x7d /* status */
+#define STATUS_ENQ 0x75 /* status ack */
+#define ADD_PARTY 0x80 /* add party */
+#define ADD_PARTY_ACK 0x81 /* add party ack */
+#define ADD_PARTY_REJ 0x82 /* add party rej */
+#define DROP_PARTY 0x83 /* drop party */
+#define DROP_PARTY_ACK 0x84 /* drop party ack */
+
+/* Information Element Parameters in the signalling messages */
+#define CAUSE 0x08 /* cause */
+#define ENDPT_REF 0x54 /* endpoint reference */
+#define AAL_PARA 0x58 /* ATM adaptation layer parameters */
+#define TRAFF_DESCRIP 0x59 /* atm traffic descriptors */
+#define CONNECT_ID 0x5a /* connection identifier */
+#define QOS_PARA 0x5c /* quality of service parameters */
+#define B_HIGHER 0x5d /* broadband higher layer information */
+#define B_BEARER 0x5e /* broadband bearer capability */
+#define B_LOWER 0x5f /* broadband lower information */
+#define CALLING_PARTY 0x6c /* calling party number */
+#define CALLED_PARTY 0x70 /* called party nmber */
+
+#define Q2931 0x09
+
+/* Q.2931 signalling general messages format */
+#define PROTO_POS 0 /* offset of protocol discriminator */
+#define CALL_REF_POS 2 /* offset of call reference value */
+#define MSG_TYPE_POS 5 /* offset of message type */
+#define MSG_LEN_POS 7 /* offset of mesage length */
+#define IE_BEGIN_POS 9 /* offset of first information element */
+
+/* format of signalling messages */
+#define TYPE_POS 0
+#define LEN_POS 2
+#define FIELD_BEGIN_POS 4
--- /dev/null
+/*
+ * Copyright (c) 1992, 1993, 1994, 1995, 1996
+ * 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: (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.
+ */
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: bpf_dump.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+
+#include "interface.h"
+
+void
+bpf_dump(const struct bpf_program *p, int option)
+{
+ struct bpf_insn *insn;
+ int i;
+ int n = p->bf_len;
+
+ insn = p->bf_insns;
+ if (option > 2) {
+ printf("%d\n", n);
+ for (i = 0; i < n; ++insn, ++i) {
+ printf("%u %u %u %u\n", insn->code,
+ insn->jt, insn->jf, insn->k);
+ }
+ return ;
+ }
+ if (option > 1) {
+ for (i = 0; i < n; ++insn, ++i)
+ printf("{ 0x%x, %d, %d, 0x%08x },\n",
+ insn->code, insn->jt, insn->jf, insn->k);
+ return;
+ }
+ for (i = 0; i < n; ++insn, ++i) {
+#ifdef BDEBUG
+ extern int bids[];
+ printf(bids[i] > 0 ? "[%02d]" : " -- ", bids[i] - 1);
+#endif
+ puts(bpf_image(insn, i));
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#define CHDLC_HDRLEN 4
+#define CHDLC_UNICAST 0x0f
+#define CHDLC_BCAST 0x8f
+#define CHDLC_TYPE_SLARP 0x8035
+#define CHDLC_TYPE_CDP 0x2000
--- /dev/null
+/*
+ * Copyright (c) 1998-2006 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.
+ *
+ * miscellaneous checksumming routines
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: checksum.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "interface.h"
+
+/*
+ * CRC-10 table generated using the following Python snippet:
+
+import sys
+
+crc_table = []
+for i in range(256):
+ accum = i << 2
+ for j in range(8):
+ accum <<= 1
+ if accum & 0x400:
+ accum ^= 0x633
+ crc_table.append(accum)
+
+for i in range(len(crc_table)/8):
+ for j in range(8):
+ sys.stdout.write("0x%04x, " % crc_table[i*8+j])
+ sys.stdout.write("\n")
+
+ */
+static const uint16_t crc10_table[256] =
+{
+ 0x0000, 0x0233, 0x0255, 0x0066, 0x0299, 0x00aa, 0x00cc, 0x02ff,
+ 0x0301, 0x0132, 0x0154, 0x0367, 0x0198, 0x03ab, 0x03cd, 0x01fe,
+ 0x0031, 0x0202, 0x0264, 0x0057, 0x02a8, 0x009b, 0x00fd, 0x02ce,
+ 0x0330, 0x0103, 0x0165, 0x0356, 0x01a9, 0x039a, 0x03fc, 0x01cf,
+ 0x0062, 0x0251, 0x0237, 0x0004, 0x02fb, 0x00c8, 0x00ae, 0x029d,
+ 0x0363, 0x0150, 0x0136, 0x0305, 0x01fa, 0x03c9, 0x03af, 0x019c,
+ 0x0053, 0x0260, 0x0206, 0x0035, 0x02ca, 0x00f9, 0x009f, 0x02ac,
+ 0x0352, 0x0161, 0x0107, 0x0334, 0x01cb, 0x03f8, 0x039e, 0x01ad,
+ 0x00c4, 0x02f7, 0x0291, 0x00a2, 0x025d, 0x006e, 0x0008, 0x023b,
+ 0x03c5, 0x01f6, 0x0190, 0x03a3, 0x015c, 0x036f, 0x0309, 0x013a,
+ 0x00f5, 0x02c6, 0x02a0, 0x0093, 0x026c, 0x005f, 0x0039, 0x020a,
+ 0x03f4, 0x01c7, 0x01a1, 0x0392, 0x016d, 0x035e, 0x0338, 0x010b,
+ 0x00a6, 0x0295, 0x02f3, 0x00c0, 0x023f, 0x000c, 0x006a, 0x0259,
+ 0x03a7, 0x0194, 0x01f2, 0x03c1, 0x013e, 0x030d, 0x036b, 0x0158,
+ 0x0097, 0x02a4, 0x02c2, 0x00f1, 0x020e, 0x003d, 0x005b, 0x0268,
+ 0x0396, 0x01a5, 0x01c3, 0x03f0, 0x010f, 0x033c, 0x035a, 0x0169,
+ 0x0188, 0x03bb, 0x03dd, 0x01ee, 0x0311, 0x0122, 0x0144, 0x0377,
+ 0x0289, 0x00ba, 0x00dc, 0x02ef, 0x0010, 0x0223, 0x0245, 0x0076,
+ 0x01b9, 0x038a, 0x03ec, 0x01df, 0x0320, 0x0113, 0x0175, 0x0346,
+ 0x02b8, 0x008b, 0x00ed, 0x02de, 0x0021, 0x0212, 0x0274, 0x0047,
+ 0x01ea, 0x03d9, 0x03bf, 0x018c, 0x0373, 0x0140, 0x0126, 0x0315,
+ 0x02eb, 0x00d8, 0x00be, 0x028d, 0x0072, 0x0241, 0x0227, 0x0014,
+ 0x01db, 0x03e8, 0x038e, 0x01bd, 0x0342, 0x0171, 0x0117, 0x0324,
+ 0x02da, 0x00e9, 0x008f, 0x02bc, 0x0043, 0x0270, 0x0216, 0x0025,
+ 0x014c, 0x037f, 0x0319, 0x012a, 0x03d5, 0x01e6, 0x0180, 0x03b3,
+ 0x024d, 0x007e, 0x0018, 0x022b, 0x00d4, 0x02e7, 0x0281, 0x00b2,
+ 0x017d, 0x034e, 0x0328, 0x011b, 0x03e4, 0x01d7, 0x01b1, 0x0382,
+ 0x027c, 0x004f, 0x0029, 0x021a, 0x00e5, 0x02d6, 0x02b0, 0x0083,
+ 0x012e, 0x031d, 0x037b, 0x0148, 0x03b7, 0x0184, 0x01e2, 0x03d1,
+ 0x022f, 0x001c, 0x007a, 0x0249, 0x00b6, 0x0285, 0x02e3, 0x00d0,
+ 0x011f, 0x032c, 0x034a, 0x0179, 0x0386, 0x01b5, 0x01d3, 0x03e0,
+ 0x021e, 0x002d, 0x004b, 0x0278, 0x0087, 0x02b4, 0x02d2, 0x00e1
+};
+
+static void
+init_crc10_table(void)
+{
+#define CRC10_POLYNOMIAL 0x633
+ register int i, j;
+ register uint16_t accum;
+ uint16_t verify_crc10_table[256];
+
+ for ( i = 0; i < 256; i++ )
+ {
+ accum = ((unsigned short) i << 2);
+ for ( j = 0; j < 8; j++ )
+ {
+ if ((accum <<= 1) & 0x400) accum ^= CRC10_POLYNOMIAL;
+ }
+ verify_crc10_table[i] = accum;
+ }
+ assert(memcmp(verify_crc10_table,
+ crc10_table,
+ sizeof(verify_crc10_table)) == 0);
+#undef CRC10_POLYNOMIAL
+}
+
+uint16_t
+verify_crc10_cksum(uint16_t accum, const u_char *p, int length)
+{
+ register int i;
+
+ for ( i = 0; i < length; i++ )
+ {
+ accum = ((accum << 8) & 0x3ff)
+ ^ crc10_table[( accum >> 2) & 0xff]
+ ^ *p++;
+ }
+ return accum;
+}
+
+/* precompute checksum tables */
+void
+init_checksum(void) {
+
+ init_crc10_table();
+
+}
+
+/*
+ * Creates the OSI Fletcher checksum. See 8473-1, Appendix C, section C.3.
+ * The checksum field of the passed PDU does not need to be reset to zero.
+ */
+uint16_t
+create_osi_cksum (const uint8_t *pptr, int checksum_offset, int length)
+{
+
+ int x;
+ int y;
+ uint32_t mul;
+ uint32_t c0;
+ uint32_t c1;
+ uint16_t checksum;
+ int index;
+
+ c0 = 0;
+ c1 = 0;
+
+ for (index = 0; index < length; index++) {
+ /*
+ * Ignore the contents of the checksum field.
+ */
+ if (index == checksum_offset ||
+ index == checksum_offset+1) {
+ c1 += c0;
+ pptr++;
+ } else {
+ c0 = c0 + *(pptr++);
+ c1 += c0;
+ }
+ }
+
+ c0 = c0 % 255;
+ c1 = c1 % 255;
+
+ mul = (length - checksum_offset)*(c0);
+
+ x = mul - c0 - c1;
+ y = c1 - mul - 1;
+
+ if ( y >= 0 ) y++;
+ if ( x < 0 ) x--;
+
+ x %= 255;
+ y %= 255;
+
+
+ if (x == 0) x = 255;
+ if (y == 0) y = 255;
+
+ y &= 0x00FF;
+ checksum = ((x << 8) | y);
+
+ return checksum;
+}
--- /dev/null
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright 1992-2015 Free Software Foundation, Inc.
+
+timestamp='2015-02-23'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2015 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+ # If the system lacks a compiler, then just pick glibc.
+ # We could probably try harder.
+ LIBC=gnu
+
+ eval $set_cc_for_build
+ cat <<-EOF > $dummy.c
+ #include <features.h>
+ #if defined(__UCLIBC__)
+ LIBC=uclibc
+ #elif defined(__dietlibc__)
+ LIBC=dietlibc
+ #else
+ LIBC=gnu
+ #endif
+ EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+ ;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+ /sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || \
+ echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ earmv*)
+ arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+ endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+ machine=${arch}${endian}-unknown
+ ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # Determine ABI tags.
+ case "${UNAME_MACHINE_ARCH}" in
+ earm*)
+ expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+ abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}${abi}"
+ exit ;;
+ *:Bitrig:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ *:SolidBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ exitcode=$?
+ trap '' 0
+ exit $exitcode ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm*:riscos:*:*|arm*:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ s390x:SunOS:*:*)
+ echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ echo i386-pc-auroraux${UNAME_RELEASE}
+ exit ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ eval $set_cc_for_build
+ SUN_ARCH="i386"
+ # If there is a compiler, see if it is configured for 64-bit objects.
+ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+ # This test works for both compilers.
+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ SUN_ARCH="x86_64"
+ fi
+ fi
+ echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[4567])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/lslpp ] ; then
+ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep -q __LP64__
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ case ${UNAME_PROCESSOR} in
+ amd64)
+ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ *)
+ echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ esac
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ *:MINGW64*:*)
+ echo ${UNAME_MACHINE}-pc-mingw64
+ exit ;;
+ *:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ *:MSYS*:*)
+ echo ${UNAME_MACHINE}-pc-msys
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ *:Interix*:*)
+ case ${UNAME_MACHINE} in
+ x86)
+ echo i586-pc-interix${UNAME_RELEASE}
+ exit ;;
+ authenticamd | genuineintel | EM64T)
+ echo x86_64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ IA64)
+ echo ia64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ esac ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ 8664:Windows_NT:*)
+ echo x86_64-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ aarch64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ aarch64_be:Linux:*:*)
+ UNAME_MACHINE=aarch64_be
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep -q ld.so.1
+ if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ arc:Linux:*:* | arceb:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ arm*:Linux:*:*)
+ eval $set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ else
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+ else
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+ fi
+ fi
+ exit ;;
+ avr32*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ cris:Linux:*:*)
+ echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ exit ;;
+ crisv32:Linux:*:*)
+ echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ exit ;;
+ frv:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ hexagon:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ i*86:Linux:*:*)
+ echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ mips:Linux:*:* | mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef ${UNAME_MACHINE}
+ #undef ${UNAME_MACHINE}el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=${UNAME_MACHINE}el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=${UNAME_MACHINE}
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+ ;;
+ openrisc*:Linux:*:*)
+ echo or1k-unknown-linux-${LIBC}
+ exit ;;
+ or32:Linux:*:* | or1k*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ padre:Linux:*:*)
+ echo sparc-unknown-linux-${LIBC}
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-${LIBC}
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+ PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+ *) echo hppa-unknown-linux-${LIBC} ;;
+ esac
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-${LIBC}
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-${LIBC}
+ exit ;;
+ ppc64le:Linux:*:*)
+ echo powerpc64le-unknown-linux-${LIBC}
+ exit ;;
+ ppcle:Linux:*:*)
+ echo powerpcle-unknown-linux-${LIBC}
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ tile*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+ exit ;;
+ x86_64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ xtensa*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
+ # Note: whatever this is, it MUST be the same as what config.sub
+ # prints for the "djgpp" host, or else GDB configury will decide that
+ # this is a cross-build.
+ echo i586-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+ OS_REL='.3'
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
+ echo i586-pc-haiku
+ exit ;;
+ x86_64:Haiku:*:*)
+ echo x86_64-unknown-haiku
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-7:SUPER-UX:*:*)
+ echo sx7-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8:SUPER-UX:*:*)
+ echo sx8-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8R:SUPER-UX:*:*)
+ echo sx8r-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ eval $set_cc_for_build
+ if test "$UNAME_PROCESSOR" = unknown ; then
+ UNAME_PROCESSOR=powerpc
+ fi
+ if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ case $UNAME_PROCESSOR in
+ i386) UNAME_PROCESSOR=x86_64 ;;
+ powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ esac
+ fi
+ fi
+ elif test "$UNAME_PROCESSOR" = i386 ; then
+ # Avoid executing cc on OS X 10.9, as it ships with a stub
+ # that puts up a graphical alert prompting to install
+ # developer tools. Any system running Mac OS X 10.7 or
+ # later (Darwin 11 and later) is required to have a 64-bit
+ # processor. This is not true of the ARM version of Darwin
+ # that Apple uses in portable devices.
+ UNAME_PROCESSOR=x86_64
+ fi
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NEO-?:NONSTOP_KERNEL:*:*)
+ echo neo-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSE-*:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+ i*86:rdos:*:*)
+ echo ${UNAME_MACHINE}-pc-rdos
+ exit ;;
+ i*86:AROS:*:*)
+ echo ${UNAME_MACHINE}-pc-aros
+ exit ;;
+ x86_64:VMkernel:*:*)
+ echo ${UNAME_MACHINE}-unknown-esx
+ exit ;;
+esac
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
--- /dev/null
+/* config.h.in. Generated from configure.in by autoheader. */
+
+/* define if you have the addrinfo function */
+#undef HAVE_ADDRINFO
+
+/* Define to 1 if you have the `alarm' function. */
+#undef HAVE_ALARM
+
+/* Define to 1 if you have the `bpf_dump' function. */
+#undef HAVE_BPF_DUMP
+
+/* capsicum support available */
+#undef HAVE_CAPSICUM
+
+/* Define to 1 if you have the `cap_enter' function. */
+#undef HAVE_CAP_ENTER
+
+/* Define to 1 if you have the `cap_ioctls_limit' function. */
+#undef HAVE_CAP_IOCTLS_LIMIT
+
+/* Define to 1 if you have the <cap-ng.h> header file. */
+#undef HAVE_CAP_NG_H
+
+/* Define to 1 if you have the `cap_rights_limit' function. */
+#undef HAVE_CAP_RIGHTS_LIMIT
+
+/* Define to 1 if you have the declaration of `ether_ntohost', and to 0 if you
+ don't. */
+#undef HAVE_DECL_ETHER_NTOHOST
+
+/* define if you have the dnet_htoa function */
+#undef HAVE_DNET_HTOA
+
+/* Define to 1 if you have the `ether_ntohost' function. */
+#undef HAVE_ETHER_NTOHOST
+
+/* 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
+
+/* Define to 1 if you have the `getopt_long' function. */
+#undef HAVE_GETOPT_LONG
+
+/* define if you have getrpcbynumber() */
+#undef HAVE_GETRPCBYNUMBER
+
+/* define if you have the h_errno variable */
+#undef HAVE_H_ERRNO
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `cap-ng' library (-lcap-ng). */
+#undef HAVE_LIBCAP_NG
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+#undef HAVE_LIBCRYPTO
+
+/* Define to 1 if you have the `rpc' library (-lrpc). */
+#undef HAVE_LIBRPC
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <netdnet/dnetdb.h> header file. */
+#undef HAVE_NETDNET_DNETDB_H
+
+/* define if you have a dnet_htoa declaration in <netdnet/dnetdb.h> */
+#undef HAVE_NETDNET_DNETDB_H_DNET_HTOA
+
+/* Define to 1 if you have the <netinet/ether.h> header file. */
+#undef HAVE_NETINET_ETHER_H
+
+/* Define to 1 if you have the <netinet/if_ether.h> header file. */
+#undef HAVE_NETINET_IF_ETHER_H
+
+/* Define to 1 if you have the <net/pfvar.h> header file. */
+#undef HAVE_NET_PFVAR_H
+
+/* Define to 1 if you have the `openat' function. */
+#undef HAVE_OPENAT
+
+/* Define to 1 if you have the <openssl/evp.h> header file. */
+#undef HAVE_OPENSSL_EVP_H
+
+/* if there's an os_proto.h for this platform, to use additional prototypes */
+#undef HAVE_OS_PROTO_H
+
+/* Define to 1 if you have the <pcap/bluetooth.h> header file. */
+#undef HAVE_PCAP_BLUETOOTH_H
+
+/* Define to 1 if you have the `pcap_breakloop' function. */
+#undef HAVE_PCAP_BREAKLOOP
+
+/* Define to 1 if you have the `pcap_create' function. */
+#undef HAVE_PCAP_CREATE
+
+/* define if libpcap has pcap_datalink_name_to_val() */
+#undef HAVE_PCAP_DATALINK_NAME_TO_VAL
+
+/* define if libpcap has pcap_datalink_val_to_description() */
+#undef HAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION
+
+/* define if libpcap has pcap_debug */
+#undef HAVE_PCAP_DEBUG
+
+/* Define to 1 if you have the `pcap_dump_flush' function. */
+#undef HAVE_PCAP_DUMP_FLUSH
+
+/* define if libpcap has pcap_dump_ftell() */
+#undef HAVE_PCAP_DUMP_FTELL
+
+/* Define to 1 if you have the `pcap_findalldevs' function. */
+#undef HAVE_PCAP_FINDALLDEVS
+
+/* Define to 1 if you have the `pcap_free_datalinks' function. */
+#undef HAVE_PCAP_FREE_DATALINKS
+
+/* Define to 1 if the system has the type `pcap_if_t'. */
+#undef HAVE_PCAP_IF_T
+
+/* Define to 1 if you have the `pcap_lib_version' function. */
+#undef HAVE_PCAP_LIB_VERSION
+
+/* define if libpcap has pcap_list_datalinks() */
+#undef HAVE_PCAP_LIST_DATALINKS
+
+/* Define to 1 if you have the <pcap/nflog.h> header file. */
+#undef HAVE_PCAP_NFLOG_H
+
+/* Define to 1 if you have the `pcap_setdirection' function. */
+#undef HAVE_PCAP_SETDIRECTION
+
+/* Define to 1 if you have the `pcap_set_datalink' function. */
+#undef HAVE_PCAP_SET_DATALINK
+
+/* Define to 1 if you have the `pcap_set_immediate_mode' function. */
+#undef HAVE_PCAP_SET_IMMEDIATE_MODE
+
+/* Define to 1 if you have the `pcap_set_tstamp_precision' function. */
+#undef HAVE_PCAP_SET_TSTAMP_PRECISION
+
+/* 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
+
+/* define if libpcap has pcap_version */
+#undef HAVE_PCAP_VERSION
+
+/* Define to 1 if you have the `pfopen' function. */
+#undef HAVE_PFOPEN
+
+/* 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
+
+/* Define to 1 if you have the `sigaction' function. */
+#undef HAVE_SIGACTION
+
+/* Define to 1 if you have the `sigset' function. */
+#undef HAVE_SIGSET
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* if struct sockaddr has the sa_len member */
+#undef HAVE_SOCKADDR_SA_LEN
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the `strftime' function. */
+#undef HAVE_STRFTIME
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strlcat' function. */
+#undef HAVE_STRLCAT
+
+/* Define to 1 if you have the `strlcpy' function. */
+#undef HAVE_STRLCPY
+
+/* Define to 1 if you have the `strsep' function. */
+#undef HAVE_STRSEP
+
+/* Define to 1 if the system has the type `struct ether_addr'. */
+#undef HAVE_STRUCT_ETHER_ADDR
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#undef HAVE_UINTPTR_T
+
+/* 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
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* define if libpcap has yydebug */
+#undef HAVE_YYDEBUG
+
+/* define if your compiler has __attribute__ */
+#undef HAVE___ATTRIBUTE__
+
+/* Define if you enable IPv6 support */
+#undef INET6
+
+/* if unaligned access fails */
+#undef LBL_ALIGN
+
+/* define if you need to include missing/addrinfo.h */
+#undef NEED_ADDRINFO_H
+
+/* Define to 1 if netinet/ether.h declares `ether_ntohost' */
+#undef NETINET_ETHER_H_DECLARES_ETHER_NTOHOST
+
+/* Define to 1 if netinet/if_ether.h declares `ether_ntohost' */
+#undef NETINET_IF_ETHER_H_DECLARES_ETHER_NTOHOST
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* define if the platform doesn't define PRId64 */
+#undef PRId64
+
+/* define if the platform doesn't define PRIo64 */
+#undef PRIo64
+
+/* define if the platform doesn't define PRIx64 */
+#undef PRIu64
+
+/* define if the platform doesn't define PRIu64 */
+#undef PRIx64
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#undef RETSIGTYPE
+
+/* return value of signal handlers */
+#undef RETSIGVAL
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* define if you want to build the possibly-buggy SMB printer */
+#undef TCPDUMP_DO_SMB
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* define if you have ether_ntohost() and it works */
+#undef USE_ETHER_NTOHOST
+
+/* Define if you enable support for libsmi */
+#undef USE_LIBSMI
+
+/* define if should chroot when dropping privileges */
+#undef WITH_CHROOT
+
+/* define if should drop privileges by default */
+#undef WITH_USER
+
+/* get BSD semantics on Irix */
+#undef _BSD_SIGNALS
+
+/* define on AIX to get certain functions */
+#undef _SUN
+
+/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+#undef _UINT32_T
+
+/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+#undef _UINT64_T
+
+/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+#undef _UINT8_T
+
+/* define if your compiler allows __attribute__((format)) without a warning */
+#undef __ATTRIBUTE___FORMAT_OK
+
+/* define if your compiler allows __attribute__((format)) to be applied to
+ function pointers */
+#undef __ATTRIBUTE___FORMAT_OK_FOR_FUNCTION_POINTERS
+
+/* define if your compiler allows __attribute__((noreturn)) to be applied to
+ function pointers */
+#undef __ATTRIBUTE___NORETURN_OK_FOR_FUNCTION_POINTERS
+
+/* to handle Ultrix compilers that don't support const in prototypes */
+#undef const
+
+/* Define as token for inline if inlining supported */
+#undef inline
+
+/* Define to the type of a signed integer type of width exactly 16 bits if
+ such a type exists and the standard includes do not define it. */
+#undef int16_t
+
+/* Define to the type of a signed integer type of width exactly 32 bits if
+ such a type exists and the standard includes do not define it. */
+#undef int32_t
+
+/* Define to the type of a signed integer type of width exactly 64 bits if
+ such a type exists and the standard includes do not define it. */
+#undef int64_t
+
+/* Define to the type of a signed integer type of width exactly 8 bits if such
+ a type exists and the standard includes do not define it. */
+#undef int8_t
+
+/* Define to `uint16_t' if u_int16_t not defined. */
+#undef u_int16_t
+
+/* Define to `uint32_t' if u_int32_t not defined. */
+#undef u_int32_t
+
+/* Define to `uint64_t' if u_int64_t not defined. */
+#undef u_int64_t
+
+/* Define to `uint8_t' if u_int8_t not defined. */
+#undef u_int8_t
+
+/* Define to the type of an unsigned integer type of width exactly 16 bits if
+ such a type exists and the standard includes do not define it. */
+#undef uint16_t
+
+/* Define to the type of an unsigned integer type of width exactly 32 bits if
+ such a type exists and the standard includes do not define it. */
+#undef uint32_t
+
+/* Define to the type of an unsigned integer type of width exactly 64 bits if
+ such a type exists and the standard includes do not define it. */
+#undef uint64_t
+
+/* Define to the type of an unsigned integer type of width exactly 8 bits if
+ such a type exists and the standard includes do not define it. */
+#undef uint8_t
+
+/* Define to the type of an unsigned integer type wide enough to hold a
+ pointer, if such a type exists, and if the system does not define it. */
+#undef uintptr_t
--- /dev/null
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright 1992-2015 Free Software Foundation, Inc.
+
+timestamp='2015-02-22'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2015 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
+ kopensolaris*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ android-linux)
+ os=-linux-android
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray | -microblaze*)
+ os=
+ basic_machine=$1
+ ;;
+ -bluegene*)
+ os=-cnk
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*178)
+ os=-lynxos178
+ ;;
+ -lynx*5)
+ os=-lynxos5
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arceb \
+ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+ | avr | avr32 \
+ | be32 | be64 \
+ | bfin \
+ | c4x | c8051 | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | epiphany \
+ | fido | fr30 | frv | ft32 \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | k1om \
+ | le32 | le64 \
+ | lm32 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nios | nios2 | nios2eb | nios2el \
+ | ns16k | ns32k \
+ | open8 | or1k | or1knd | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle \
+ | pyramid \
+ | riscv32 | riscv64 \
+ | rl78 | rx \
+ | score \
+ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu \
+ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+ | ubicom32 \
+ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+ | visium \
+ | we32k \
+ | x86 | xc16x | xstormy16 | xtensa \
+ | z8k | z80)
+ basic_machine=$basic_machine-unknown
+ ;;
+ c54x)
+ basic_machine=tic54x-unknown
+ ;;
+ c55x)
+ basic_machine=tic55x-unknown
+ ;;
+ c6x)
+ basic_machine=tic6x-unknown
+ ;;
+ leon|leon[3-9])
+ basic_machine=sparc-$basic_machine
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
+
+ strongarm | thumb | xscale)
+ basic_machine=arm-unknown
+ ;;
+ xgate)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ xscaleeb)
+ basic_machine=armeb-unknown
+ ;;
+
+ xscaleel)
+ basic_machine=armel-unknown
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | aarch64-* | aarch64_be-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | be32-* | be64-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* \
+ | c8051-* | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | hexagon-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | k1om-* \
+ | le32-* | le64-* \
+ | lm32-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+ | microblaze-* | microblazeel-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64octeon-* | mips64octeonel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64r5900-* | mips64r5900el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa32r6-* | mipsisa32r6el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64r6-* | mipsisa64r6el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipsr5900-* | mipsr5900el-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nds32-* | nds32le-* | nds32be-* \
+ | nios-* | nios2-* | nios2eb-* | nios2el-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | open8-* \
+ | or1k*-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+ | pyramid-* \
+ | rl78-* | romp-* | rs6000-* | rx-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+ | tahoe-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tile*-* \
+ | tron-* \
+ | ubicom32-* \
+ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+ | vax-* \
+ | visium-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* \
+ | xstormy16-* | xtensa*-* \
+ | ymp-* \
+ | z8k-* | z80-*)
+ ;;
+ # Recognize the basic CPU types without company name, with glob match.
+ xtensa*)
+ basic_machine=$basic_machine-unknown
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ os=-aros
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ os=-linux
+ ;;
+ blackfin-*)
+ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ bluegene*)
+ basic_machine=powerpc-ibm
+ os=-cnk
+ ;;
+ c54x-*)
+ basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c55x-*)
+ basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c6x-*)
+ basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ os=-cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16 | cr16-*)
+ basic_machine=cr16-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ os=-dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ leon-*|leon[3-9]-*)
+ basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ os=-linux
+ ;;
+ m68knommu-*)
+ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ microblaze*)
+ basic_machine=microblaze-xilinx
+ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ os=-mingw64
+ ;;
+ mingw32)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ os=-mingw32ce
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ os=-moxiebox
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ ms1-*)
+ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ ;;
+ msys)
+ basic_machine=i686-pc
+ os=-msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ os=-nacl
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ neo-tandem)
+ basic_machine=neo-tandem
+ ;;
+ nse-tandem)
+ basic_machine=nse-tandem
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ os=-linux
+ ;;
+ parisc-*)
+ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc | ppcbe) basic_machine=powerpc-unknown
+ ;;
+ ppc-* | ppcbe-*)
+ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ os=-rdos
+ ;;
+ rdos32)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sde)
+ basic_machine=mipsisa32-sde
+ os=-elf
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh5el)
+ basic_machine=sh5le-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ strongarm-* | thumb-*)
+ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tile*)
+ basic_machine=$basic_machine-unknown
+ os=-linux-gnu
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ xscale-* | xscalee[bl]-*)
+ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ z80-*-coff)
+ basic_machine=z80-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -auroraux)
+ os=-auroraux
+ ;;
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+ | -sym* | -kopensolaris* | -plan9* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* | -aros* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -bitrig* | -openbsd* | -solidbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* | -cegcc* \
+ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+ | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -dicos*)
+ os=-dicos
+ ;;
+ -nacl*)
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ score-*)
+ os=-elf
+ ;;
+ spu-*)
+ os=-elf
+ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ c8051-*)
+ os=-elf
+ ;;
+ hexagon-*)
+ os=-elf
+ ;;
+ tic54x-*)
+ os=-coff
+ ;;
+ tic55x-*)
+ os=-coff
+ ;;
+ tic6x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mep-*)
+ os=-elf
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -cnk*|-aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
--- /dev/null
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+PACKAGE_URL=
+
+ac_unique_file="tcpdump.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='LTLIBOBJS
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+MAN_MISC_INFO
+MAN_FILE_FORMATS
+LOCALSRC
+V_PCAPDEP
+V_INCLS
+V_GROUP
+V_DEFS
+V_CCOPT
+MKDEP
+DEPENDENCY_CFLAG
+AR
+RANLIB
+PCAP_CONFIG
+LIBOBJS
+EGREP
+GREP
+CPP
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+SHLICC2
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+with_gcc
+enable_universal
+with_smi
+enable_smb
+with_user
+with_chroot
+with_sandbox_capsicum
+enable_ipv6
+with_system_libpcap
+with_crypto
+with_cap_ng
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --disable-universal don't build universal on OS X
+ --enable-smb enable possibly-buggy SMB printer default=yes
+ --disable-smb disable possibly-buggy SMB printer
+ --enable-ipv6 enable ipv6 (with ipv4) support
+ --disable-ipv6 disable ipv6 support
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --without-gcc don't use gcc
+ --with-smi link with libsmi (allows to load MIBs on the fly to decode SNMP packets. default=yes
+ --without-smi don't link with libsmi
+ --with-user=USERNAME drop privileges by default to USERNAME
+ --with-chroot=DIRECTORY when dropping privileges, chroot to DIRECTORY
+ --with-sandbox-capsicum use Capsicum security functions [default=yes, if
+ available]
+ --with-system-libpcap don't use local pcap library
+ --with-crypto use OpenSSL libcrypto [default=yes, if available]
+ --with-cap-ng use libcap-ng [default=yes, if available]
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to the package provider.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_find_intX_t LINENO BITS VAR
+# -----------------------------------
+# Finds a signed integer type with width BITS, setting cache variable VAR
+# accordingly.
+ac_fn_c_find_intX_t ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5
+$as_echo_n "checking for int$2_t... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ # Order is important - never check a type that is potentially smaller
+ # than half of the expected target width.
+ for ac_type in int$2_t 'int' 'long int' \
+ 'long long int' 'short int' 'signed char'; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+ enum { N = $2 / 2 - 1 };
+int
+main ()
+{
+static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+ enum { N = $2 / 2 - 1 };
+int
+main ()
+{
+static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)
+ < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ case $ac_type in #(
+ int$2_t) :
+ eval "$3=yes" ;; #(
+ *) :
+ eval "$3=\$ac_type" ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if eval test \"x\$"$3"\" = x"no"; then :
+
+else
+ break
+fi
+ done
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_find_intX_t
+
+# ac_fn_c_find_uintX_t LINENO BITS VAR
+# ------------------------------------
+# Finds an unsigned integer type with width BITS, setting cache variable VAR
+# accordingly.
+ac_fn_c_find_uintX_t ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
+$as_echo_n "checking for uint$2_t... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ # Order is important - never check a type that is potentially smaller
+ # than half of the expected target width.
+ for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \
+ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ case $ac_type in #(
+ uint$2_t) :
+ eval "$3=yes" ;; #(
+ *) :
+ eval "$3=\$ac_type" ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if eval test \"x\$"$3"\" = x"no"; then :
+
+else
+ break
+fi
+ done
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_find_uintX_t
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+
+
+
+
+
+
+# Check whether --with-gcc was given.
+if test "${with_gcc+set}" = set; then :
+ withval=$with_gcc;
+fi
+
+ V_INCLS=""
+ if test "${srcdir}" != "." ; then
+ V_INCLS="-I$srcdir"
+ fi
+ if test "${CFLAGS+set}" = set; then
+ LBL_CFLAGS="$CFLAGS"
+ fi
+ if test -z "$CC" ; then
+ case "$host_os" in
+
+ bsdi*)
+ # Extract the first word of "shlicc2", so it can be a program name with args.
+set dummy shlicc2; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_SHLICC2+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$SHLICC2"; then
+ ac_cv_prog_SHLICC2="$SHLICC2" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_SHLICC2="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_SHLICC2" && ac_cv_prog_SHLICC2="no"
+fi
+fi
+SHLICC2=$ac_cv_prog_SHLICC2
+if test -n "$SHLICC2"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SHLICC2" >&5
+$as_echo "$SHLICC2" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test $SHLICC2 = yes ; then
+ CC=shlicc2
+ export CC
+ fi
+ ;;
+ esac
+ fi
+ if test -z "$CC" -a "$with_gcc" = no ; then
+ CC=cc
+ export CC
+ fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+ if test "$GCC" = yes ; then
+ #
+ # -Werror forces warnings to be errors.
+ #
+ ac_lbl_cc_force_warning_errors=-Werror
+
+ #
+ # Use -ffloat-store so that, on 32-bit x86, we don't
+ # do 80-bit arithmetic with the FPU; that way we should
+ # get the same results for floating-point calculations
+ # on x86-32 and x86-64.
+ #
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -ffloat-store option" >&5
+$as_echo_n "checking whether the compiler supports the -ffloat-store option... " >&6; }
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors -ffloat-store"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+return 0
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ CFLAGS="$save_CFLAGS"
+ V_CCOPT="$V_CCOPT -ffloat-store"
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ CFLAGS="$save_CFLAGS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+ else
+ V_INCLS="$V_INCLS -I/usr/local/include"
+ LDFLAGS="$LDFLAGS -L/usr/local/lib"
+
+ case "$host_os" in
+
+ darwin*)
+ #
+ # This is assumed either to be GCC or clang, both
+ # of which use -Werror to force warnings to be errors.
+ #
+ ac_lbl_cc_force_warning_errors=-Werror
+ ;;
+
+ hpux*)
+ #
+ # HP C, which is what we presume we're using, doesn't
+ # exit with a non-zero exit status if we hand it an
+ # invalid -W flag, can't be forced to do so even with
+ # +We, and doesn't handle GCC-style -W flags, so we
+ # don't want to try using GCC-style -W flags.
+ #
+ ac_lbl_cc_dont_try_gcc_dashW=yes
+ ;;
+
+ irix*)
+ #
+ # MIPS C, which is what we presume we're using, doesn't
+ # necessarily exit with a non-zero exit status if we
+ # hand it an invalid -W flag, can't be forced to do
+ # so, and doesn't handle GCC-style -W flags, so we
+ # don't want to try using GCC-style -W flags.
+ #
+ ac_lbl_cc_dont_try_gcc_dashW=yes
+ #
+ # It also, apparently, defaults to "char" being
+ # unsigned, unlike most other C implementations;
+ # I suppose we could say "signed char" whenever
+ # we want to guarantee a signed "char", but let's
+ # just force signed chars.
+ #
+ # -xansi is normally the default, but the
+ # configure script was setting it; perhaps -cckr
+ # was the default in the Old Days. (Then again,
+ # that would probably be for backwards compatibility
+ # in the days when ANSI C was Shiny and New, i.e.
+ # 1989 and the early '90's, so maybe we can just
+ # drop support for those compilers.)
+ #
+ # -g is equivalent to -g2, which turns off
+ # optimization; we choose -g3, which generates
+ # debugging information but doesn't turn off
+ # optimization (even if the optimization would
+ # cause inaccuracies in debugging).
+ #
+ V_CCOPT="$V_CCOPT -xansi -signed -g3"
+ ;;
+
+ osf*)
+ #
+ # Presumed to be DEC OSF/1, Digital UNIX, or
+ # Tru64 UNIX.
+ #
+ # The DEC C compiler, which is what we presume we're
+ # using, doesn't exit with a non-zero exit status if we
+ # hand it an invalid -W flag, can't be forced to do
+ # so, and doesn't handle GCC-style -W flags, so we
+ # don't want to try using GCC-style -W flags.
+ #
+ ac_lbl_cc_dont_try_gcc_dashW=yes
+ #
+ # -g is equivalent to -g2, which turns off
+ # optimization; we choose -g3, which generates
+ # debugging information but doesn't turn off
+ # optimization (even if the optimization would
+ # cause inaccuracies in debugging).
+ #
+ V_CCOPT="$V_CCOPT -g3"
+ ;;
+
+ solaris*)
+ #
+ # Assumed to be Sun C, which requires -errwarn to force
+ # warnings to be treated as errors.
+ #
+ ac_lbl_cc_force_warning_errors=-errwarn
+ ;;
+
+ ultrix*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking that Ultrix $CC hacks const in prototypes" >&5
+$as_echo_n "checking that Ultrix $CC hacks const in prototypes... " >&6; }
+ if ${ac_cv_lbl_cc_const_proto+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+int
+main ()
+{
+struct a { int b; };
+ void c(const struct a *)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_lbl_cc_const_proto=yes
+else
+ ac_cv_lbl_cc_const_proto=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_cc_const_proto" >&5
+$as_echo "$ac_cv_lbl_cc_const_proto" >&6; }
+ if test $ac_cv_lbl_cc_const_proto = no ; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+ fi
+ ;;
+ esac
+ V_CCOPT="$V_CCOPT -O"
+ fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$V_CCOPT"
+ if ${ac_cv_lbl_inline+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_cv_lbl_inline=""
+ ac_lbl_cc_inline=no
+ for ac_lbl_inline in inline __inline__ __inline
+ do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define inline $ac_lbl_inline
+ static inline struct iltest *foo(void);
+ struct iltest {
+ int iltest1;
+ int iltest2;
+ };
+
+ static inline struct iltest *
+ foo()
+ {
+ static struct iltest xxx;
+
+ return &xxx;
+ }
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_lbl_cc_inline=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test "$ac_lbl_cc_inline" = yes ; then
+ break;
+ fi
+ done
+ if test "$ac_lbl_cc_inline" = yes ; then
+ ac_cv_lbl_inline=$ac_lbl_inline
+ fi
+fi
+
+ CFLAGS="$save_CFLAGS"
+ if test ! -z "$ac_cv_lbl_inline" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_inline" >&5
+$as_echo "$ac_cv_lbl_inline" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+
+cat >>confdefs.h <<_ACEOF
+#define inline $ac_cv_lbl_inline
+_ACEOF
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__" >&5
+$as_echo_n "checking for __attribute__... " >&6; }
+if ${ac_cv___attribute__+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#include <stdlib.h>
+
+static void foo(void) __attribute__ ((noreturn));
+
+static void
+foo(void)
+{
+ exit(1);
+}
+
+int
+main(int argc, char **argv)
+{
+ foo();
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv___attribute__=yes
+else
+ ac_cv___attribute__=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+if test "$ac_cv___attribute__" = "yes"; then
+
+$as_echo "#define HAVE___ATTRIBUTE__ 1" >>confdefs.h
+
+else
+ #
+ # We can't use __attribute__, so we can't use __attribute__((unused)),
+ # so we define _U_ to an empty string.
+ #
+ V_DEFS="$V_DEFS -D_U_=\"\""
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv___attribute__" >&5
+$as_echo "$ac_cv___attribute__" >&6; }
+
+if test "$ac_cv___attribute__" = "yes"; then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __attribute__((unused)) can be used without warnings" >&5
+$as_echo_n "checking whether __attribute__((unused)) can be used without warnings... " >&6; }
+if ${ac_cv___attribute___unused+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+
+int
+main(int argc __attribute((unused)), char **argv __attribute((unused)))
+{
+ printf("Hello, world!\n");
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv___attribute___unused=yes
+else
+ ac_cv___attribute___unused=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+CFLAGS="$save_CFLAGS"
+if test "$ac_cv___attribute___unused" = "yes"; then
+ V_DEFS="$V_DEFS -D_U_=\"__attribute__((unused))\""
+else
+ V_DEFS="$V_DEFS -D_U_=\"\""
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv___attribute___unused" >&5
+$as_echo "$ac_cv___attribute___unused" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __attribute__((noreturn)) can be applied to function pointers without warnings" >&5
+$as_echo_n "checking whether __attribute__((noreturn)) can be applied to function pointers without warnings... " >&6; }
+if ${ac_cv___attribute___noreturn_function_pointer+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#include <stdlib.h>
+
+extern int (*foo)(int i)
+ __attribute__ ((noreturn));
+
+int
+main(int argc, char **argv)
+{
+ (*foo)(1);
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv___attribute___noreturn_function_pointer=yes
+else
+ ac_cv___attribute___noreturn_function_pointer=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+CFLAGS="$save_CFLAGS"
+if test "$ac_cv___attribute___noreturn_function_pointer" = "yes"; then
+
+$as_echo "#define __ATTRIBUTE___NORETURN_OK_FOR_FUNCTION_POINTERS 1" >>confdefs.h
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv___attribute___noreturn_function_pointer" >&5
+$as_echo "$ac_cv___attribute___noreturn_function_pointer" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __attribute__((format)) can be used without warnings" >&5
+$as_echo_n "checking whether __attribute__((format)) can be used without warnings... " >&6; }
+if ${ac_cv___attribute___format+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#include <stdlib.h>
+
+extern int foo(const char *fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+
+int
+main(int argc, char **argv)
+{
+ foo("%s", "test");
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv___attribute___format=yes
+else
+ ac_cv___attribute___format=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+CFLAGS="$save_CFLAGS"
+if test "$ac_cv___attribute___format" = "yes"; then
+
+$as_echo "#define __ATTRIBUTE___FORMAT_OK 1" >>confdefs.h
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv___attribute___format" >&5
+$as_echo "$ac_cv___attribute___format" >&6; }
+
+ if test "$ac_cv___attribute___format" = "yes"; then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __attribute__((format)) can be applied to function pointers" >&5
+$as_echo_n "checking whether __attribute__((format)) can be applied to function pointers... " >&6; }
+if ${ac_cv___attribute___format_function_pointer+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#include <stdlib.h>
+
+extern int (*foo)(const char *fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+
+int
+main(int argc, char **argv)
+{
+ (*foo)("%s", "test");
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv___attribute___format_function_pointer=yes
+else
+ ac_cv___attribute___format_function_pointer=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+if test "$ac_cv___attribute___format_function_pointer" = "yes"; then
+
+$as_echo "#define __ATTRIBUTE___FORMAT_OK_FOR_FUNCTION_POINTERS 1" >>confdefs.h
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv___attribute___format_function_pointer" >&5
+$as_echo "$ac_cv___attribute___format_function_pointer" >&6; }
+
+ fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in fcntl.h rpc/rpc.h rpc/rpcent.h netdnet/dnetdb.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in net/pfvar.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "net/pfvar.h" "ac_cv_header_net_pfvar_h" "#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if.h>
+"
+if test "x$ac_cv_header_net_pfvar_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_NET_PFVAR_H 1
+_ACEOF
+
+fi
+
+done
+
+if test "$ac_cv_header_net_pfvar_h" = yes; then
+ LOCALSRC="print-pflog.c $LOCALSRC"
+fi
+for ac_header in netinet/if_ether.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "netinet/if_ether.h" "ac_cv_header_netinet_if_ether_h" "#include <sys/types.h>
+#include <sys/socket.h>
+"
+if test "x$ac_cv_header_netinet_if_ether_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_NETINET_IF_ETHER_H 1
+_ACEOF
+
+fi
+
+done
+
+if test "$ac_cv_header_netinet_if_ether_h" != yes; then
+ #
+ # The simple test didn't work.
+ # Do we need to include <net/if.h> first?
+ # Unset ac_cv_header_netinet_if_ether_h so we don't
+ # treat the previous failure as a cached value and
+ # suppress the next test.
+ #
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Rechecking with some additional includes" >&5
+$as_echo "$as_me: Rechecking with some additional includes" >&6;}
+ unset ac_cv_header_netinet_if_ether_h
+ for ac_header in netinet/if_ether.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "netinet/if_ether.h" "ac_cv_header_netinet_if_ether_h" "#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+struct mbuf;
+struct rtentry;
+#include <net/if.h>
+"
+if test "x$ac_cv_header_netinet_if_ether_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_NETINET_IF_ETHER_H 1
+_ACEOF
+
+fi
+
+done
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
+$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
+if ${ac_cv_header_time+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_time=yes
+else
+ ac_cv_header_time=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
+$as_echo "$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
+
+$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
+
+fi
+
+
+case "$host_os" in
+
+darwin*)
+ # Check whether --enable-universal was given.
+if test "${enable_universal+set}" = set; then :
+ enableval=$enable_universal;
+fi
+
+ 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
+ ;;
+esac
+
+
+
+# Check whether --with-smi was given.
+if test "${with_smi+set}" = set; then :
+ withval=$with_smi;
+else
+ with_smi=yes
+fi
+
+
+if test "x$with_smi" != "xno" ; then
+ ac_fn_c_check_header_mongrel "$LINENO" "smi.h" "ac_cv_header_smi_h" "$ac_includes_default"
+if test "x$ac_cv_header_smi_h" = xyes; then :
+
+ #
+ # OK, we found smi.h. Do we have libsmi with smiInit?
+ #
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for smiInit in -lsmi" >&5
+$as_echo_n "checking for smiInit in -lsmi... " >&6; }
+if ${ac_cv_lib_smi_smiInit+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsmi $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char smiInit ();
+int
+main ()
+{
+return smiInit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_smi_smiInit=yes
+else
+ ac_cv_lib_smi_smiInit=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_smi_smiInit" >&5
+$as_echo "$ac_cv_lib_smi_smiInit" >&6; }
+if test "x$ac_cv_lib_smi_smiInit" = xyes; then :
+
+ #
+ # OK, we have libsmi with smiInit. Can we use it?
+ #
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable libsmi" >&5
+$as_echo_n "checking whether to enable libsmi... " >&6; }
+ savedlibs="$LIBS"
+ LIBS="-lsmi $LIBS"
+ if test "$cross_compiling" = yes; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not when cross-compiling" >&5
+$as_echo "not when cross-compiling" >&6; }
+ LIBS="$savedlibs"
+
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* libsmi available check */
+#include <smi.h>
+main()
+{
+ int current, revision, age, n;
+ const int required = 2;
+ if (smiInit(""))
+ exit(1);
+ if (strcmp(SMI_LIBRARY_VERSION, smi_library_version))
+ exit(2);
+ n = sscanf(smi_library_version, "%d:%d:%d", ¤t, &revision, &age);
+ if (n != 3)
+ exit(3);
+ if (required < current - age || required > current)
+ exit(4);
+ exit(0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define USE_LIBSMI 1" >>confdefs.h
+
+
+else
+
+ case $? in
+ 1) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no - smiInit failed" >&5
+$as_echo "no - smiInit failed" >&6; } ;;
+ 2) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no - header/library version mismatch" >&5
+$as_echo "no - header/library version mismatch" >&6; } ;;
+ 3) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no - can't determine library version" >&5
+$as_echo "no - can't determine library version" >&6; } ;;
+ 4) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no - too old" >&5
+$as_echo "no - too old" >&6; } ;;
+ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; } ;;
+ esac
+ LIBS="$savedlibs"
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable the possibly-buggy SMB printer" >&5
+$as_echo_n "checking whether to enable the possibly-buggy SMB printer... " >&6; }
+# Check whether --enable-smb was given.
+if test "${enable_smb+set}" = set; then :
+ enableval=$enable_smb;
+else
+ enableval=yes
+fi
+
+case "$enableval" in
+yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The SMB printer may have exploitable buffer overflows!!!" >&5
+$as_echo "$as_me: WARNING: The SMB printer may have exploitable buffer overflows!!!" >&2;}
+
+$as_echo "#define TCPDUMP_DO_SMB 1" >>confdefs.h
+
+ LOCALSRC="print-smb.c smbutil.c $LOCALSRC"
+ ;;
+*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+esac
+
+
+# Check whether --with-user was given.
+if test "${with_user+set}" = set; then :
+ withval=$with_user;
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to drop root privileges by default" >&5
+$as_echo_n "checking whether to drop root privileges by default... " >&6; }
+if test ! -z "$with_user" ; then
+
+cat >>confdefs.h <<_ACEOF
+#define WITH_USER "$withval"
+_ACEOF
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: to \"$withval\"" >&5
+$as_echo "to \"$withval\"" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Check whether --with-chroot was given.
+if test "${with_chroot+set}" = set; then :
+ withval=$with_chroot;
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to chroot" >&5
+$as_echo_n "checking whether to chroot... " >&6; }
+if test ! -z "$with_chroot" && test "$with_chroot" != "no" ; then
+
+cat >>confdefs.h <<_ACEOF
+#define WITH_CHROOT "$withval"
+_ACEOF
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: to \"$withval\"" >&5
+$as_echo "to \"$withval\"" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Check whether --with-sandbox-capsicum was given.
+if test "${with_sandbox_capsicum+set}" = set; then :
+ withval=$with_sandbox_capsicum;
+fi
+
+#
+# Check whether various functions are available. If any are, set
+# ac_lbl_capsicum_function_seen to yes; if any are not, set
+# ac_lbl_capsicum_function_not_seen to yes.
+#
+# We don't check cap_rights_init(), as it's a macro, wrapping another
+# function, in at least some versions of FreeBSD, and AC_CHECK_FUNCS()
+# doesn't handle that.
+#
+# All of the ones we check for must be available in order to enable
+# capsicum sandboxing.
+#
+# XXX - do we need to check for all of them, or are there some that, if
+# present, imply others are present?
+#
+if test ! -z "$with_sandbox-capsicum" && test "$with_sandbox-capsicum" != "no" ; then
+ for ac_func in cap_enter cap_rights_limit cap_ioctls_limit openat
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ ac_lbl_capsicum_function_seen=yes
+else
+ ac_lbl_capsicum_function_not_seen=yes
+fi
+done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to sandbox using capsicum" >&5
+$as_echo_n "checking whether to sandbox using capsicum... " >&6; }
+if test "x$ac_lbl_capsicum_function_seen" = "xyes" -a "x$ac_lbl_capsicum_function_not_seen" != "xyes"; then
+
+$as_echo "#define HAVE_CAPSICUM 1" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+#
+# We must check this before checking whether to enable IPv6, because,
+# on some platforms (such as SunOS 5.x), the test program requires
+# the extra networking libraries.
+#
+
+ # Most operating systems have gethostbyname() in the default searched
+ # libraries (i.e. libc):
+ # Some OSes (eg. Solaris) place it in libnsl
+ # Some strange OSes (SINIX) have it in libsocket:
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5
+$as_echo_n "checking for library containing gethostbyname... " >&6; }
+if ${ac_cv_search_gethostbyname+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' nsl socket resolv; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_gethostbyname=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_gethostbyname+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_gethostbyname+:} false; then :
+
+else
+ ac_cv_search_gethostbyname=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5
+$as_echo "$ac_cv_search_gethostbyname" >&6; }
+ac_res=$ac_cv_search_gethostbyname
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+ # Unfortunately libsocket sometimes depends on libnsl and
+ # AC_SEARCH_LIBS isn't up to the task of handling dependencies like this.
+ if test "$ac_cv_search_gethostbyname" = "no"
+ then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lsocket" >&5
+$as_echo_n "checking for gethostbyname in -lsocket... " >&6; }
+if ${ac_cv_lib_socket_gethostbyname+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket -lnsl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_socket_gethostbyname=yes
+else
+ ac_cv_lib_socket_gethostbyname=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_gethostbyname" >&5
+$as_echo "$ac_cv_lib_socket_gethostbyname" >&6; }
+if test "x$ac_cv_lib_socket_gethostbyname" = xyes; then :
+ LIBS="-lsocket -lnsl $LIBS"
+fi
+
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5
+$as_echo_n "checking for library containing socket... " >&6; }
+if ${ac_cv_search_socket+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char socket ();
+int
+main ()
+{
+return socket ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' socket; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_socket=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_socket+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_socket+:} false; then :
+
+else
+ ac_cv_search_socket=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5
+$as_echo "$ac_cv_search_socket" >&6; }
+ac_res=$ac_cv_search_socket
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5
+$as_echo_n "checking for socket in -lsocket... " >&6; }
+if ${ac_cv_lib_socket_socket+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket -lnsl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char socket ();
+int
+main ()
+{
+return socket ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_socket_socket=yes
+else
+ ac_cv_lib_socket_socket=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5
+$as_echo "$ac_cv_lib_socket_socket" >&6; }
+if test "x$ac_cv_lib_socket_socket" = xyes; then :
+ LIBS="-lsocket -lnsl $LIBS"
+fi
+
+fi
+
+ # DLPI needs putmsg under HPUX so test for -lstr while we're at it
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing putmsg" >&5
+$as_echo_n "checking for library containing putmsg... " >&6; }
+if ${ac_cv_search_putmsg+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char putmsg ();
+int
+main ()
+{
+return putmsg ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' str; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_putmsg=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_putmsg+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_putmsg+:} false; then :
+
+else
+ ac_cv_search_putmsg=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_putmsg" >&5
+$as_echo "$ac_cv_search_putmsg" >&6; }
+ac_res=$ac_cv_search_putmsg
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ipv6" >&5
+$as_echo_n "checking whether to enable ipv6... " >&6; }
+# Check whether --enable-ipv6 was given.
+if test "${enable_ipv6+set}" = set; then :
+ enableval=$enable_ipv6; case "$enableval" in
+yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ LOCALSRC="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"
+
+$as_echo "#define INET6 1" >>confdefs.h
+
+ ipv6=yes
+ ;;
+*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ipv6=no
+ ;;
+ esac
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ /* AF_INET6 available check */
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#ifdef AF_INET6
+void
+foo(struct in6_addr *addr)
+{
+ memset(addr, 0, sizeof (struct in6_addr));
+}
+#else
+#error "AF_INET6 not defined"
+#endif
+
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ LOCALSRC="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"
+
+$as_echo "#define INET6 1" >>confdefs.h
+
+ ipv6=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ipv6=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+ipv6type=unknown
+ipv6lib=none
+ipv6trylibc=no
+
+if test "$ipv6" = "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking ipv6 stack type" >&5
+$as_echo_n "checking ipv6 stack type... " >&6; }
+ for i in inria kame linux-glibc linux-libinet6 toshiba v6d zeta; do
+ case $i in
+ inria)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <netinet/in.h>
+#ifdef IPV6_INRIA_VERSION
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ ipv6type=$i;
+ CFLAGS="-DINET6 $CFLAGS"
+fi
+rm -f conftest*
+
+ ;;
+ kame)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <netinet/in.h>
+#ifdef __KAME__
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ ipv6type=$i;
+ ipv6lib=inet6;
+ ipv6libdir=/usr/local/v6/lib;
+ ipv6trylibc=yes;
+ CFLAGS="-DINET6 $CFLAGS"
+fi
+rm -f conftest*
+
+ ;;
+ linux-glibc)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <features.h>
+#if defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ ipv6type=$i;
+ CFLAGS="-DINET6 $CFLAGS"
+fi
+rm -f conftest*
+
+ ;;
+ linux-libinet6)
+ if test -d /usr/inet6 -o -f /usr/include/netinet/ip6.h; then
+ ipv6type=$i
+ ipv6lib=inet6
+ ipv6libdir=/usr/inet6/lib
+ ipv6trylibc=yes;
+ CFLAGS="-DINET6 -I/usr/inet6/include $CFLAGS"
+ fi
+ ;;
+ toshiba)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/param.h>
+#ifdef _TOSHIBA_INET6
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ ipv6type=$i;
+ ipv6lib=inet6;
+ ipv6libdir=/usr/local/v6/lib;
+ CFLAGS="-DINET6 $CFLAGS"
+fi
+rm -f conftest*
+
+ ;;
+ v6d)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include </usr/local/v6/include/sys/v6config.h>
+#ifdef __V6D__
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ ipv6type=$i;
+ ipv6lib=v6;
+ ipv6libdir=/usr/local/v6/lib;
+ CFLAGS="-I/usr/local/v6/include $CFLAGS"
+fi
+rm -f conftest*
+
+ ;;
+ zeta)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/param.h>
+#ifdef _ZETA_MINAMI_INET6
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ ipv6type=$i;
+ ipv6lib=inet6;
+ ipv6libdir=/usr/local/v6/lib;
+ CFLAGS="-DINET6 $CFLAGS"
+fi
+rm -f conftest*
+
+ ;;
+ esac
+ if test "$ipv6type" != "unknown"; then
+ break
+ fi
+ done
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ipv6type" >&5
+$as_echo "$ipv6type" >&6; }
+fi
+
+if test "$ipv6" = "yes" -a "$ipv6lib" != "none"; then
+ if test -d $ipv6libdir -a -f $ipv6libdir/lib$ipv6lib.a; then
+ LIBS="-L$ipv6libdir -l$ipv6lib $LIBS"
+ echo "You have $ipv6lib library, using it"
+ else
+ if test "$ipv6trylibc" = "yes"; then
+ echo "You do not have $ipv6lib library, using libc"
+ else
+ echo 'Fatal: no $ipv6lib library found. cannot continue.'
+ echo "You need to fetch lib$ipv6lib.a from appropriate"
+ echo 'ipv6 kit and compile beforehand.'
+ exit 1
+ fi
+ fi
+fi
+
+
+if test "$ipv6" = "yes"; then
+ #
+ # XXX - on Tru64 UNIX 5.1, there is no "getaddrinfo()"
+ # function in libc; there are "ngetaddrinfo()" and
+ # "ogetaddrinfo()" functions, and <netdb.h> #defines
+ # "getaddrinfo" to be either "ngetaddrinfo" or
+ # "ogetaddrinfo", depending on whether _SOCKADDR_LEN
+ # or _XOPEN_SOURCE_EXTENDED are defined or not.
+ #
+ # So this test doesn't work on Tru64 5.1, and possibly
+ # on other 5.x releases. This causes the configure
+ # script to become confused, and results in libpcap
+ # being unbuildable.
+ #
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getaddrinfo" >&5
+$as_echo_n "checking for library containing getaddrinfo... " >&6; }
+if ${ac_cv_search_getaddrinfo+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getaddrinfo ();
+int
+main ()
+{
+return getaddrinfo ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' socket; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_getaddrinfo=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_getaddrinfo+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_getaddrinfo+:} false; then :
+
+else
+ ac_cv_search_getaddrinfo=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getaddrinfo" >&5
+$as_echo "$ac_cv_search_getaddrinfo" >&6; }
+ac_res=$ac_cv_search_getaddrinfo
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking getaddrinfo bug" >&5
+$as_echo_n "checking getaddrinfo bug... " >&6; }
+ if ${td_cv_buggygetaddrinfo+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ td_cv_buggygetaddrinfo=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <netdb.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+main()
+{
+ int passive, gaierr, inet4 = 0, inet6 = 0;
+ struct addrinfo hints, *ai, *aitop;
+ char straddr[INET6_ADDRSTRLEN], strport[16];
+
+ for (passive = 0; passive <= 1; passive++) {
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_flags = passive ? AI_PASSIVE : 0;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = IPPROTO_TCP;
+ if ((gaierr = getaddrinfo(NULL, "54321", &hints, &aitop)) != 0) {
+ (void)gai_strerror(gaierr);
+ goto bad;
+ }
+ for (ai = aitop; ai; ai = ai->ai_next) {
+ if (ai->ai_addr == NULL ||
+ ai->ai_addrlen == 0 ||
+ getnameinfo(ai->ai_addr, ai->ai_addrlen,
+ straddr, sizeof(straddr), strport, sizeof(strport),
+ NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
+ goto bad;
+ }
+ switch (ai->ai_family) {
+ case AF_INET:
+ if (strcmp(strport, "54321") != 0) {
+ goto bad;
+ }
+ if (passive) {
+ if (strcmp(straddr, "0.0.0.0") != 0) {
+ goto bad;
+ }
+ } else {
+ if (strcmp(straddr, "127.0.0.1") != 0) {
+ goto bad;
+ }
+ }
+ inet4++;
+ break;
+ case AF_INET6:
+ if (strcmp(strport, "54321") != 0) {
+ goto bad;
+ }
+ if (passive) {
+ if (strcmp(straddr, "::") != 0) {
+ goto bad;
+ }
+ } else {
+ if (strcmp(straddr, "::1") != 0) {
+ goto bad;
+ }
+ }
+ inet6++;
+ break;
+ case AF_UNSPEC:
+ goto bad;
+ break;
+#ifdef AF_UNIX
+ case AF_UNIX:
+#else
+#ifdef AF_LOCAL
+ case AF_LOCAL:
+#endif
+#endif
+ default:
+ /* another family support? */
+ break;
+ }
+ }
+ }
+
+ /* supported family should be 2, unsupported family should be 0 */
+ if (!(inet4 == 0 || inet4 == 2))
+ goto bad;
+ if (!(inet6 == 0 || inet6 == 2))
+ goto bad;
+
+ if (aitop)
+ freeaddrinfo(aitop);
+ exit(0);
+
+ bad:
+ if (aitop)
+ freeaddrinfo(aitop);
+ exit(1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ td_cv_buggygetaddrinfo=no
+else
+ td_cv_buggygetaddrinfo=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+
+ if test "$td_cv_buggygetaddrinfo" = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: good" >&5
+$as_echo "good" >&6; }
+ elif test "$td_cv_buggygetaddrinfo" = unknown; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown (cross-compiling)" >&5
+$as_echo "unknown (cross-compiling)" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: buggy" >&5
+$as_echo "buggy" >&6; }
+ fi
+
+ if test "$td_cv_buggygetaddrinfo" = "yes"; then
+ #
+ # XXX - it doesn't appear that "ipv6type" can ever be
+ # set to "linux". Should this be testing for
+ # "linux-glibc", or for that *or* "linux-libinet6"?
+ # If the latter, note that "linux-libinet6" is also
+ # the type given to some non-Linux OSes.
+ #
+ if test "$ipv6type" != "linux"; then
+ echo 'Fatal: You must get working getaddrinfo() function.'
+ echo ' or you can specify "--disable-ipv6"'.
+ exit 1
+ else
+ echo 'Warning: getaddrinfo() implementation on your system seems be buggy.'
+ echo ' Better upgrade your system library to newest version'
+ echo ' of GNU C library (aka glibc).'
+ fi
+ fi
+
+fi
+
+ ac_fn_c_check_func "$LINENO" "getnameinfo" "ac_cv_func_getnameinfo"
+if test "x$ac_cv_func_getnameinfo" = xyes; then :
+ $as_echo "#define HAVE_GETNAMEINFO 1" >>confdefs.h
+
+else
+ case " $LIBOBJS " in
+ *" getnameinfo.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS getnameinfo.$ac_objext"
+ ;;
+esac
+
+fi
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_htoa declaration in netdnet/dnetdb.h" >&5
+$as_echo_n "checking for dnet_htoa declaration in netdnet/dnetdb.h... " >&6; }
+if ${td_cv_decl_netdnet_dnetdb_h_dnet_htoa+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <netdnet/dnetdb.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "dnet_htoa" >/dev/null 2>&1; then :
+ td_cv_decl_netdnet_dnetdb_h_dnet_htoa=yes
+else
+ td_cv_decl_netdnet_dnetdb_h_dnet_htoa=no
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $td_cv_decl_netdnet_dnetdb_h_dnet_htoa" >&5
+$as_echo "$td_cv_decl_netdnet_dnetdb_h_dnet_htoa" >&6; }
+if test "$td_cv_decl_netdnet_dnetdb_h_dnet_htoa" = yes; then
+
+$as_echo "#define HAVE_NETDNET_DNETDB_H_DNET_HTOA 1" >>confdefs.h
+
+fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for addrinfo" >&5
+$as_echo_n "checking for addrinfo... " >&6; }
+ if ${ac_cv_addrinfo+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# include <netdb.h>
+int
+main ()
+{
+struct addrinfo a
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_addrinfo=yes
+else
+ ac_cv_addrinfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_addrinfo" >&5
+$as_echo "$ac_cv_addrinfo" >&6; }
+ if test $ac_cv_addrinfo = yes; then
+
+$as_echo "#define HAVE_ADDRINFO 1" >>confdefs.h
+
+ else
+
+$as_echo "#define NEED_ADDRINFO_H 1" >>confdefs.h
+
+ fi
+
+if test "$ac_cv_addrinfo" = no; then
+ missing_includes=yes
+fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NI_MAXSERV" >&5
+$as_echo_n "checking for NI_MAXSERV... " >&6; }
+ if ${ac_cv_maxserv+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <netdb.h>
+#ifdef NI_MAXSERV
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ ac_cv_maxserv=yes
+else
+ ac_cv_maxserv=no
+fi
+rm -f conftest*
+
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_maxserv" >&5
+$as_echo "$ac_cv_maxserv" >&6; }
+ if test $ac_cv_maxserv != yes; then
+ $as_echo "#define NEED_ADDRINFO_H 1" >>confdefs.h
+
+ fi
+
+if test "$ac_cv_maxserv" = no; then
+ missing_includes=yes
+fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NI_NAMEREQD" >&5
+$as_echo_n "checking for NI_NAMEREQD... " >&6; }
+ if ${ac_cv_namereqd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <netdb.h>
+#ifdef NI_NOFQDN
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ ac_cv_namereqd=yes
+else
+ ac_cv_namereqd=no
+fi
+rm -f conftest*
+
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_namereqd" >&5
+$as_echo "$ac_cv_namereqd" >&6; }
+ if test $ac_cv_namereqd != yes; then
+ $as_echo "#define NEED_ADDRINFO_H 1" >>confdefs.h
+
+ fi
+
+if test "$ac_cv_namereqd" = no; then
+ missing_includes=yes
+fi
+
+ac_fn_c_check_func "$LINENO" "vfprintf" "ac_cv_func_vfprintf"
+if test "x$ac_cv_func_vfprintf" = xyes; then :
+ $as_echo "#define HAVE_VFPRINTF 1" >>confdefs.h
+
+else
+ case " $LIBOBJS " in
+ *" vfprintf.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS vfprintf.$ac_objext"
+ ;;
+esac
+
+fi
+
+ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp"
+if test "x$ac_cv_func_strcasecmp" = xyes; then :
+ $as_echo "#define HAVE_STRCASECMP 1" >>confdefs.h
+
+else
+ case " $LIBOBJS " in
+ *" strcasecmp.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS strcasecmp.$ac_objext"
+ ;;
+esac
+
+fi
+
+ac_fn_c_check_func "$LINENO" "strlcat" "ac_cv_func_strlcat"
+if test "x$ac_cv_func_strlcat" = xyes; then :
+ $as_echo "#define HAVE_STRLCAT 1" >>confdefs.h
+
+else
+ case " $LIBOBJS " in
+ *" strlcat.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS strlcat.$ac_objext"
+ ;;
+esac
+
+fi
+
+ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy"
+if test "x$ac_cv_func_strlcpy" = xyes; then :
+ $as_echo "#define HAVE_STRLCPY 1" >>confdefs.h
+
+else
+ case " $LIBOBJS " in
+ *" strlcpy.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS strlcpy.$ac_objext"
+ ;;
+esac
+
+fi
+
+ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup"
+if test "x$ac_cv_func_strdup" = xyes; then :
+ $as_echo "#define HAVE_STRDUP 1" >>confdefs.h
+
+else
+ case " $LIBOBJS " in
+ *" strdup.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS strdup.$ac_objext"
+ ;;
+esac
+
+fi
+
+ac_fn_c_check_func "$LINENO" "strsep" "ac_cv_func_strsep"
+if test "x$ac_cv_func_strsep" = xyes; then :
+ $as_echo "#define HAVE_STRSEP 1" >>confdefs.h
+
+else
+ case " $LIBOBJS " in
+ *" strsep.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS strsep.$ac_objext"
+ ;;
+esac
+
+fi
+
+ac_fn_c_check_func "$LINENO" "getopt_long" "ac_cv_func_getopt_long"
+if test "x$ac_cv_func_getopt_long" = xyes; then :
+ $as_echo "#define HAVE_GETOPT_LONG 1" >>confdefs.h
+
+else
+ case " $LIBOBJS " in
+ *" getopt_long.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS getopt_long.$ac_objext"
+ ;;
+esac
+
+fi
+
+
+for ac_func in fork vfork strftime
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+for ac_func in setlinebuf alarm
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+needsnprintf=no
+for ac_func in vsnprintf snprintf
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ needsnprintf=yes
+fi
+done
+
+if test $needsnprintf = yes; then
+ case " $LIBOBJS " in
+ *" snprintf.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS snprintf.$ac_objext"
+ ;;
+esac
+
+fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5
+$as_echo_n "checking return type of signal handlers... " >&6; }
+if ${ac_cv_type_signal+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <signal.h>
+
+int
+main ()
+{
+return *(signal (0, 0)) (0) == 1;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_type_signal=int
+else
+ ac_cv_type_signal=void
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5
+$as_echo "$ac_cv_type_signal" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define RETSIGTYPE $ac_cv_type_signal
+_ACEOF
+
+
+ if test "$ac_cv_type_signal" = void ; then
+
+$as_echo "#define RETSIGVAL /**/" >>confdefs.h
+
+ else
+
+$as_echo "#define RETSIGVAL (0)" >>confdefs.h
+
+ fi
+ case "$host_os" in
+
+ irix*)
+
+$as_echo "#define _BSD_SIGNALS 1" >>confdefs.h
+
+ ;;
+
+ *)
+ for ac_func in sigaction
+do :
+ ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction"
+if test "x$ac_cv_func_sigaction" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SIGACTION 1
+_ACEOF
+
+fi
+done
+
+ if test $ac_cv_func_sigaction = no ; then
+ for ac_func in sigset
+do :
+ ac_fn_c_check_func "$LINENO" "sigset" "ac_cv_func_sigset"
+if test "x$ac_cv_func_sigset" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SIGSET 1
+_ACEOF
+
+fi
+done
+
+ fi
+ ;;
+ esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dnet_htoa" >&5
+$as_echo_n "checking for library containing dnet_htoa... " >&6; }
+if ${ac_cv_search_dnet_htoa+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dnet_htoa ();
+int
+main ()
+{
+return dnet_htoa ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' dnet; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_dnet_htoa=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_dnet_htoa+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_dnet_htoa+:} false; then :
+
+else
+ ac_cv_search_dnet_htoa=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dnet_htoa" >&5
+$as_echo "$ac_cv_search_dnet_htoa" >&6; }
+ac_res=$ac_cv_search_dnet_htoa
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_DNET_HTOA 1" >>confdefs.h
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lrpc" >&5
+$as_echo_n "checking for main in -lrpc... " >&6; }
+if ${ac_cv_lib_rpc_main+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrpc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_rpc_main=yes
+else
+ ac_cv_lib_rpc_main=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rpc_main" >&5
+$as_echo "$ac_cv_lib_rpc_main" >&6; }
+if test "x$ac_cv_lib_rpc_main" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBRPC 1
+_ACEOF
+
+ LIBS="-lrpc $LIBS"
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getrpcbynumber" >&5
+$as_echo_n "checking for library containing getrpcbynumber... " >&6; }
+if ${ac_cv_search_getrpcbynumber+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getrpcbynumber ();
+int
+main ()
+{
+return getrpcbynumber ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' nsl; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_getrpcbynumber=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_getrpcbynumber+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_getrpcbynumber+:} false; then :
+
+else
+ ac_cv_search_getrpcbynumber=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getrpcbynumber" >&5
+$as_echo "$ac_cv_search_getrpcbynumber" >&6; }
+ac_res=$ac_cv_search_getrpcbynumber
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_GETRPCBYNUMBER 1" >>confdefs.h
+
+fi
+
+
+
+
+ LBL_LIBS="$LIBS"
+ pfopen=/usr/examples/packetfilter/pfopen.c
+ if test -f $pfopen ; then
+ for ac_func in pfopen
+do :
+ ac_fn_c_check_func "$LINENO" "pfopen" "ac_cv_func_pfopen"
+if test "x$ac_cv_func_pfopen" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PFOPEN 1
+_ACEOF
+
+fi
+done
+
+ if test $ac_cv_func_pfopen = "no" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $pfopen" >&5
+$as_echo "Using $pfopen" >&6; }
+ LIBS="$LIBS $pfopen"
+ fi
+ fi
+ libpcap=FAIL
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for local pcap library" >&5
+$as_echo_n "checking for local pcap library... " >&6; }
+
+# Check whether --with-system-libpcap was given.
+if test "${with_system_libpcap+set}" = set; then :
+ withval=$with_system_libpcap;
+fi
+
+ if test "x$with_system_libpcap" != xyes ; then
+ lastdir=FAIL
+ places=`ls $srcdir/.. | sed -e 's,/$,,' -e "s,^,$srcdir/../," | \
+ egrep '/libpcap-[0-9]+\.[0-9]+(\.[0-9]*)?([ab][0-9]*|-PRE-GIT)?$'`
+ places2=`ls .. | sed -e 's,/$,,' -e "s,^,../," | \
+ egrep '/libpcap-[0-9]+\.[0-9]+(\.[0-9]*)?([ab][0-9]*|-PRE-GIT)?$'`
+ for dir in $places $srcdir/../libpcap ../libpcap $srcdir/libpcap $places2 ; do
+ basedir=`echo $dir | sed -e 's/[ab][0-9]*$//' | \
+ sed -e 's/-PRE-GIT$//' `
+ if test $lastdir = $basedir ; then
+ continue;
+ fi
+ lastdir=$dir
+ if test -r $dir/libpcap.a ; then
+ libpcap=$dir/libpcap.a
+ d=$dir
+ fi
+ done
+ fi
+ if test $libpcap = FAIL ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+
+ #
+ # Look for pcap-config.
+ #
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pcap-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pcap-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PCAP_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PCAP_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PCAP_CONFIG="$PCAP_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PCAP_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PCAP_CONFIG=$ac_cv_path_PCAP_CONFIG
+if test -n "$PCAP_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PCAP_CONFIG" >&5
+$as_echo "$PCAP_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PCAP_CONFIG"; then
+ ac_pt_PCAP_CONFIG=$PCAP_CONFIG
+ # Extract the first word of "pcap-config", so it can be a program name with args.
+set dummy pcap-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PCAP_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PCAP_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PCAP_CONFIG="$ac_pt_PCAP_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PCAP_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PCAP_CONFIG=$ac_cv_path_ac_pt_PCAP_CONFIG
+if test -n "$ac_pt_PCAP_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PCAP_CONFIG" >&5
+$as_echo "$ac_pt_PCAP_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PCAP_CONFIG" = x; then
+ PCAP_CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PCAP_CONFIG=$ac_pt_PCAP_CONFIG
+ fi
+else
+ PCAP_CONFIG="$ac_cv_path_PCAP_CONFIG"
+fi
+
+ if test -n "$PCAP_CONFIG" ; then
+ #
+ # Found - use it to get the include flags for
+ # libpcap and the flags to link with libpcap.
+ #
+ # Please read section 11.6 "Shell Substitutions"
+ # in the autoconf manual before doing anything
+ # to this that involves quoting. Especially note
+ # the statement "There is just no portable way to use
+ # double-quoted strings inside double-quoted back-quoted
+ # expressions (pfew!)."
+ #
+ cflags=`"$PCAP_CONFIG" --cflags`
+ V_INCLS="$cflags $V_INCLS"
+ libpcap=`"$PCAP_CONFIG" --libs`
+ else
+ #
+ # Not found; look for pcap.
+ #
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lpcap" >&5
+$as_echo_n "checking for main in -lpcap... " >&6; }
+if ${ac_cv_lib_pcap_main+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpcap $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pcap_main=yes
+else
+ ac_cv_lib_pcap_main=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcap_main" >&5
+$as_echo "$ac_cv_lib_pcap_main" >&6; }
+if test "x$ac_cv_lib_pcap_main" = xyes; then :
+ libpcap="-lpcap"
+fi
+
+ if test $libpcap = FAIL ; then
+ as_fn_error $? "see the INSTALL doc for more info" "$LINENO" 5
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extraneous pcap header directories" >&5
+$as_echo_n "checking for extraneous pcap header directories... " >&6; }
+ if test \( ! -r /usr/local/include/pcap.h \) -a \
+ \( ! -r /usr/include/pcap.h \); then
+ if test -r /usr/local/include/pcap/pcap.h; then
+ d="/usr/local/include/pcap"
+ elif test -r /usr/include/pcap/pcap.h; then
+ d="/usr/include/pcap"
+ fi
+ fi
+ if test -z "$d" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+ else
+ V_INCLS="-I$d $V_INCLS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found -- -I$d added" >&5
+$as_echo "found -- -I$d added" >&6; }
+ fi
+ fi
+ else
+ V_PCAPDEP=$libpcap
+ places=`ls $srcdir/.. | sed -e 's,/$,,' -e "s,^,$srcdir/../," | \
+ egrep '/libpcap-[0-9]*.[0-9]*(.[0-9]*)?([ab][0-9]*)?$'`
+ places2=`ls .. | sed -e 's,/$,,' -e "s,^,../," | \
+ egrep '/libpcap-[0-9]*.[0-9]*(.[0-9]*)?([ab][0-9]*)?$'`
+ pcapH=FAIL
+ if test -r $d/pcap.h; then
+ pcapH=$d
+ else
+ for dir in $places $srcdir/../libpcap ../libpcap $srcdir/libpcap $places2 ; do
+ if test -r $dir/pcap.h ; then
+ pcapH=$dir
+ fi
+ done
+ fi
+
+ if test $pcapH = FAIL ; then
+ as_fn_error $? "cannot find pcap.h: see INSTALL" "$LINENO" 5
+ fi
+ V_INCLS="-I$pcapH $V_INCLS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libpcap" >&5
+$as_echo "$libpcap" >&6; }
+ # Extract the first word of "pcap-config", so it can be a program name with args.
+set dummy pcap-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PCAP_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PCAP_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PCAP_CONFIG="$PCAP_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $d
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PCAP_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PCAP_CONFIG=$ac_cv_path_PCAP_CONFIG
+if test -n "$PCAP_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PCAP_CONFIG" >&5
+$as_echo "$PCAP_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test -n "$PCAP_CONFIG"; then
+ #
+ # The libpcap directory has a pcap-config script.
+ # Use it to get any additioal libraries needed
+ # to link with the libpcap archive library in
+ # that directory.
+ #
+ # Please read section 11.6 "Shell Substitutions"
+ # in the autoconf manual before doing anything
+ # to this that involves quoting. Especially note
+ # the statement "There is just no portable way to use
+ # double-quoted strings inside double-quoted back-quoted
+ # expressions (pfew!)."
+ #
+ additional_libs=`"$PCAP_CONFIG" --additional-libs --static`
+ libpcap="$libpcap $additional_libs"
+ fi
+ fi
+ LIBS="$libpcap $LIBS"
+ if ! test -n "$PCAP_CONFIG" ; then
+ #
+ # We don't have pcap-config; find out any additional link flags
+ # we need. (If we have pcap-config, we assume it tells us what
+ # we need.)
+ #
+ case "$host_os" in
+
+ aix*)
+ #
+ # If libpcap is DLPI-based, we have to use /lib/pse.exp if
+ # present, as we use the STREAMS routines.
+ #
+ # (XXX - true only if we're linking with a static libpcap?)
+ #
+ pseexe="/lib/pse.exp"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $pseexe" >&5
+$as_echo_n "checking for $pseexe... " >&6; }
+ if test -f $pseexe ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ LIBS="$LIBS -I:$pseexe"
+ fi
+
+ #
+ # If libpcap is BPF-based, we need "-lodm" and "-lcfg", as
+ # we use them to load the BPF module.
+ #
+ # (XXX - true only if we're linking with a static libpcap?)
+ #
+ LIBS="$LIBS -lodm -lcfg"
+ ;;
+ esac
+ fi
+
+ ac_fn_c_check_func "$LINENO" "pcap_loop" "ac_cv_func_pcap_loop"
+if test "x$ac_cv_func_pcap_loop" = xyes; then :
+
+else
+
+ as_fn_error $? "Report this to tcpdump-workers@lists.tcpdump.org, and include the
+config.log file in your report. If you have downloaded libpcap from
+tcpdump.org, and built it yourself, please also include the config.log
+file from the libpcap source directory, the Makefile from the libpcap
+source directory, and the output of the make process for libpcap, as
+this could be a problem with the libpcap that was built, and we will
+not be able to determine why this is happening, and thus will not be
+able to fix it, without that information, as we have not been able to
+reproduce this problem ourselves." "$LINENO" 5
+
+fi
+
+
+
+#
+# Check for these after AC_LBL_LIBPCAP, so we link with the appropriate
+# libraries (e.g., "-lsocket -lnsl" on Solaris).
+#
+# We don't use AC_REPLACE_FUNCS because that uses AC_CHECK_FUNCS which
+# use AC_CHECK_FUNC which doesn't let us specify the right #includes
+# to make this work on BSD/OS 4.x. BSD/OS 4.x ships with the BIND8
+# resolver, and the way it defines inet_{ntop,pton} is rather strange;
+# it does not ship with a libc symbol "inet_ntop()", it ships with
+# "_inet_ntop()", and has a #define macro in one of the system headers
+# to rename it.
+#
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntop" >&5
+$as_echo_n "checking for inet_ntop... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+int
+main ()
+{
+char src[4], dst[128];
+inet_ntop(AF_INET, src, dst, sizeof(dst));
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ case " $LIBOBJS " in
+ *" inet_ntop.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS inet_ntop.$ac_objext"
+ ;;
+esac
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_pton" >&5
+$as_echo_n "checking for inet_pton... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+int
+main ()
+{
+char src[128], dst[4];
+inet_pton(AF_INET, src, dst);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ case " $LIBOBJS " in
+ *" inet_pton.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS inet_pton.$ac_objext"
+ ;;
+esac
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton" >&5
+$as_echo_n "checking for inet_aton... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+int
+main ()
+{
+char src[128];
+struct in_addr dst;
+inet_aton(src, &dst);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ case " $LIBOBJS " in
+ *" inet_aton.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS inet_aton.$ac_objext"
+ ;;
+esac
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+#
+# Check for these after AC_LBL_LIBPCAP, for the same reason.
+#
+# You are in a twisty little maze of UN*Xes, all different.
+# Some might not have ether_ntohost().
+# Some might have it, but not declare it in any header file.
+# Some might have it, but declare it in <netinet/if_ether.h>.
+# Some might have it, but declare it in <netinet/ether.h>
+# (And some might have it but document it as something declared in
+# <netinet/ethernet.h>, although <netinet/if_ether.h> appears to work.)
+#
+# Before you is a C compiler.
+#
+for ac_func in ether_ntohost
+do :
+ ac_fn_c_check_func "$LINENO" "ether_ntohost" "ac_cv_func_ether_ntohost"
+if test "x$ac_cv_func_ether_ntohost" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_ETHER_NTOHOST 1
+_ACEOF
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for buggy ether_ntohost" >&5
+$as_echo_n "checking for buggy ether_ntohost... " >&6; }
+if ${ac_cv_buggy_ether_ntohost+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ if test "$cross_compiling" = yes; then :
+ ac_cv_buggy_ether_ntohost="not while cross-compiling"
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <netdb.h>
+ #include <sys/types.h>
+ #include <sys/param.h>
+ #include <sys/socket.h>
+
+ int
+ main(int argc, char **argv)
+ {
+ u_char ea[6] = { 0xff, 0xff, 0xff, 0xff, 0xff };
+ char name[MAXHOSTNAMELEN];
+
+ ether_ntohost(name, (struct ether_addr *)ea);
+ exit(0);
+ }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_buggy_ether_ntohost=no
+else
+ ac_cv_buggy_ether_ntohost=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_buggy_ether_ntohost" >&5
+$as_echo "$ac_cv_buggy_ether_ntohost" >&6; }
+ if test "$ac_cv_buggy_ether_ntohost" = "no"; then
+
+$as_echo "#define USE_ETHER_NTOHOST 1" >>confdefs.h
+
+ fi
+
+fi
+done
+
+if test "$ac_cv_func_ether_ntohost" = yes -a \
+ "$ac_cv_buggy_ether_ntohost" = "no"; then
+ #
+ # OK, we have ether_ntohost(). Do we have <netinet/if_ether.h>?
+ #
+ if test "$ac_cv_header_netinet_if_ether_h" = yes; then
+ #
+ # Yes. Does it declare ether_ntohost()?
+ #
+ ac_fn_c_check_decl "$LINENO" "ether_ntohost" "ac_cv_have_decl_ether_ntohost" "
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+struct mbuf;
+struct rtentry;
+#include <net/if.h>
+#include <netinet/if_ether.h>
+
+"
+if test "x$ac_cv_have_decl_ether_ntohost" = xyes; then :
+
+
+$as_echo "#define NETINET_IF_ETHER_H_DECLARES_ETHER_NTOHOST /**/" >>confdefs.h
+
+
+fi
+
+ fi
+ #
+ # Did that succeed?
+ #
+ if test "$ac_cv_have_decl_ether_ntohost" != yes; then
+ #
+ # No, how about <netinet/ether.h>, as on Linux?
+ #
+ for ac_header in netinet/ether.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "netinet/ether.h" "ac_cv_header_netinet_ether_h" "$ac_includes_default"
+if test "x$ac_cv_header_netinet_ether_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_NETINET_ETHER_H 1
+_ACEOF
+
+fi
+
+done
+
+ if test "$ac_cv_header_netinet_ether_h" = yes; then
+ #
+ # We have it - does it declare ether_ntohost()?
+ # Unset ac_cv_have_decl_ether_ntohost so we don't
+ # treat the previous failure as a cached value and
+ # suppress the next test.
+ #
+ unset ac_cv_have_decl_ether_ntohost
+ ac_fn_c_check_decl "$LINENO" "ether_ntohost" "ac_cv_have_decl_ether_ntohost" "
+#include <netinet/ether.h>
+
+"
+if test "x$ac_cv_have_decl_ether_ntohost" = xyes; then :
+
+
+$as_echo "#define NETINET_ETHER_H_DECLARES_ETHER_NTOHOST /**/" >>confdefs.h
+
+
+fi
+
+ fi
+ fi
+ #
+ # Is ether_ntohost() declared?
+ #
+ if test "$ac_cv_have_decl_ether_ntohost" != yes; then
+ #
+ # No, we'll have to declare it ourselves.
+ # Do we have "struct ether_addr"?
+ #
+ ac_fn_c_check_type "$LINENO" "struct ether_addr" "ac_cv_type_struct_ether_addr" "
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+struct mbuf;
+struct rtentry;
+#include <net/if.h>
+#include <netinet/if_ether.h>
+
+"
+if test "x$ac_cv_type_struct_ether_addr" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_ETHER_ADDR 1
+_ACEOF
+
+
+fi
+
+
+$as_echo "#define HAVE_DECL_ETHER_NTOHOST 0" >>confdefs.h
+
+ else
+
+$as_echo "#define HAVE_DECL_ETHER_NTOHOST 1" >>confdefs.h
+
+ fi
+fi
+
+# libdlpi is needed for Solaris 11 and later.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlpi_walk in -ldlpi" >&5
+$as_echo_n "checking for dlpi_walk in -ldlpi... " >&6; }
+if ${ac_cv_lib_dlpi_dlpi_walk+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldlpi -L/lib $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlpi_walk ();
+int
+main ()
+{
+return dlpi_walk ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dlpi_dlpi_walk=yes
+else
+ ac_cv_lib_dlpi_dlpi_walk=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dlpi_dlpi_walk" >&5
+$as_echo "$ac_cv_lib_dlpi_dlpi_walk" >&6; }
+if test "x$ac_cv_lib_dlpi_dlpi_walk" = xyes; then :
+ LIBS="$LIBS -ldlpi" LDFLAGS="-L/lib $LDFLAGS"
+fi
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sockaddr struct has sa_len member" >&5
+$as_echo_n "checking if sockaddr struct has sa_len member... " >&6; }
+ if ${ac_cv_sockaddr_has_sa_len+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# include <sys/types.h>
+# include <sys/socket.h>
+int
+main ()
+{
+u_int i = sizeof(((struct sockaddr *)0)->sa_len)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sockaddr_has_sa_len=yes
+else
+ ac_cv_sockaddr_has_sa_len=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sockaddr_has_sa_len" >&5
+$as_echo "$ac_cv_sockaddr_has_sa_len" >&6; }
+ if test $ac_cv_sockaddr_has_sa_len = yes ; then
+ $as_echo "#define HAVE_SOCKADDR_SA_LEN 1" >>confdefs.h
+
+ fi
+
+if test "$ac_cv_sockaddr_has_sa_len" = no; then
+ missing_includes=yes
+fi
+
+ac_fn_c_check_func "$LINENO" "pcap_list_datalinks" "ac_cv_func_pcap_list_datalinks"
+if test "x$ac_cv_func_pcap_list_datalinks" = xyes; then :
+
+
+$as_echo "#define HAVE_PCAP_LIST_DATALINKS 1" >>confdefs.h
+
+ for ac_func in pcap_free_datalinks
+do :
+ ac_fn_c_check_func "$LINENO" "pcap_free_datalinks" "ac_cv_func_pcap_free_datalinks"
+if test "x$ac_cv_func_pcap_free_datalinks" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PCAP_FREE_DATALINKS 1
+_ACEOF
+
+fi
+done
+
+
+else
+
+ case " $LIBOBJS " in
+ *" datalinks.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS datalinks.$ac_objext"
+ ;;
+esac
+
+
+fi
+
+for ac_func in pcap_set_datalink
+do :
+ ac_fn_c_check_func "$LINENO" "pcap_set_datalink" "ac_cv_func_pcap_set_datalink"
+if test "x$ac_cv_func_pcap_set_datalink" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PCAP_SET_DATALINK 1
+_ACEOF
+
+fi
+done
+
+ac_fn_c_check_func "$LINENO" "pcap_datalink_name_to_val" "ac_cv_func_pcap_datalink_name_to_val"
+if test "x$ac_cv_func_pcap_datalink_name_to_val" = xyes; then :
+
+
+$as_echo "#define HAVE_PCAP_DATALINK_NAME_TO_VAL 1" >>confdefs.h
+
+ ac_fn_c_check_func "$LINENO" "pcap_datalink_val_to_description" "ac_cv_func_pcap_datalink_val_to_description"
+if test "x$ac_cv_func_pcap_datalink_val_to_description" = xyes; then :
+
+$as_echo "#define HAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION 1" >>confdefs.h
+
+else
+
+ case " $LIBOBJS " in
+ *" dlnames.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS dlnames.$ac_objext"
+ ;;
+esac
+
+
+fi
+
+
+else
+
+ case " $LIBOBJS " in
+ *" dlnames.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS dlnames.$ac_objext"
+ ;;
+esac
+
+
+fi
+
+
+for ac_func in pcap_breakloop
+do :
+ ac_fn_c_check_func "$LINENO" "pcap_breakloop" "ac_cv_func_pcap_breakloop"
+if test "x$ac_cv_func_pcap_breakloop" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PCAP_BREAKLOOP 1
+_ACEOF
+
+fi
+done
+
+
+ac_fn_c_check_func "$LINENO" "pcap_dump_ftell" "ac_cv_func_pcap_dump_ftell"
+if test "x$ac_cv_func_pcap_dump_ftell" = xyes; then :
+
+$as_echo "#define HAVE_PCAP_DUMP_FTELL 1" >>confdefs.h
+
+else
+
+ case " $LIBOBJS " in
+ *" pcap_dump_ftell.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS pcap_dump_ftell.$ac_objext"
+ ;;
+esac
+
+
+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
+# introduced in libpcap 1.0.0.
+#
+for ac_func in pcap_create
+do :
+ ac_fn_c_check_func "$LINENO" "pcap_create" "ac_cv_func_pcap_create"
+if test "x$ac_cv_func_pcap_create" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PCAP_CREATE 1
+_ACEOF
+
+fi
+done
+
+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.
+ #
+ for ac_func in pcap_set_tstamp_type
+do :
+ ac_fn_c_check_func "$LINENO" "pcap_set_tstamp_type" "ac_cv_func_pcap_set_tstamp_type"
+if test "x$ac_cv_func_pcap_set_tstamp_type" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PCAP_SET_TSTAMP_TYPE 1
+_ACEOF
+
+fi
+done
+
+ #
+ # And do we have pcap_set_tstamp_precision? If so, we assume
+ # we also have pcap_open_offline_with_tstamp_precision.
+ #
+ for ac_func in pcap_set_tstamp_precision
+do :
+ ac_fn_c_check_func "$LINENO" "pcap_set_tstamp_precision" "ac_cv_func_pcap_set_tstamp_precision"
+if test "x$ac_cv_func_pcap_set_tstamp_precision" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PCAP_SET_TSTAMP_PRECISION 1
+_ACEOF
+
+fi
+done
+
+fi
+
+#
+# Check for a miscellaneous collection of functions which we use
+# if we have them.
+#
+for ac_func in pcap_findalldevs pcap_dump_flush pcap_lib_version pcap_setdirection pcap_set_immediate_mode
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+if test $ac_cv_func_pcap_findalldevs = "yes" ; then
+ savedcppflags="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $V_INCLS"
+ ac_fn_c_check_type "$LINENO" "pcap_if_t" "ac_cv_type_pcap_if_t" "#include <pcap.h>
+"
+if test "x$ac_cv_type_pcap_if_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_PCAP_IF_T 1
+_ACEOF
+
+
+fi
+
+ CPPFLAGS="$savedcppflags"
+fi
+
+if test $ac_cv_func_pcap_lib_version = "no" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pcap_version is defined by libpcap" >&5
+$as_echo_n "checking whether pcap_version is defined by libpcap... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ extern char pcap_version[];
+
+ return (int)pcap_version;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_lbl_cv_pcap_version_defined=yes
+else
+ ac_lbl_cv_pcap_version_defined=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "$ac_lbl_cv_pcap_version_defined" = yes ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_PCAP_VERSION 1" >>confdefs.h
+
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pcap_debug is defined by libpcap" >&5
+$as_echo_n "checking whether pcap_debug is defined by libpcap... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ extern int pcap_debug;
+
+ return pcap_debug;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_lbl_cv_pcap_debug_defined=yes
+else
+ ac_lbl_cv_pcap_debug_defined=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test "$ac_lbl_cv_pcap_debug_defined" = yes ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_PCAP_DEBUG 1" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ #
+ # OK, what about "yydebug"?
+ #
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yydebug is defined by libpcap" >&5
+$as_echo_n "checking whether yydebug is defined by libpcap... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ extern int yydebug;
+
+ return yydebug;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_lbl_cv_yydebug_defined=yes
+else
+ ac_lbl_cv_yydebug_defined=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "$ac_lbl_cv_yydebug_defined" = yes ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_YYDEBUG 1" >>confdefs.h
+
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+fi
+ac_fn_c_check_func "$LINENO" "bpf_dump" "ac_cv_func_bpf_dump"
+if test "x$ac_cv_func_bpf_dump" = xyes; then :
+ $as_echo "#define HAVE_BPF_DUMP 1" >>confdefs.h
+
+else
+ case " $LIBOBJS " in
+ *" bpf_dump.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS bpf_dump.$ac_objext"
+ ;;
+esac
+
+fi
+
+
+V_GROUP=0
+if test -f /etc/group -a ! -z "`grep '^wheel:' /etc/group`" ; then
+ V_GROUP=wheel
+fi
+#
+# Assume V7/BSD convention for man pages (file formats in section 5,
+# miscellaneous info in section 7).
+#
+MAN_FILE_FORMATS=5
+MAN_MISC_INFO=7
+case "$host_os" in
+
+aix*)
+
+$as_echo "#define _SUN 1" >>confdefs.h
+
+ ;;
+
+hpux*)
+ #
+ # Use System V conventions for man pages.
+ #
+ MAN_FILE_FORMATS=4
+ MAN_MISC_INFO=5
+ ;;
+
+irix*)
+ V_GROUP=sys
+
+ #
+ # Use System V conventions for man pages.
+ #
+ MAN_FILE_FORMATS=4
+ MAN_MISC_INFO=5
+ ;;
+
+osf*)
+ V_GROUP=system
+
+ #
+ # Use System V conventions for man pages.
+ #
+ MAN_FILE_FORMATS=4
+ MAN_MISC_INFO=5
+ ;;
+
+solaris*)
+ V_GROUP=sys
+
+ #
+ # Use System V conventions for man pages.
+ #
+ MAN_FILE_FORMATS=4
+ MAN_MISC_INFO=5
+ ;;
+esac
+
+if test -f /dev/bpf0 ; then
+ V_GROUP=bpf
+fi
+
+#
+# Make sure we have definitions for all the C99 specified-width types
+# (regardless of whether the environment is a C99 environment or not).
+#
+ac_fn_c_find_intX_t "$LINENO" "8" "ac_cv_c_int8_t"
+case $ac_cv_c_int8_t in #(
+ no|yes) ;; #(
+ *)
+
+cat >>confdefs.h <<_ACEOF
+#define int8_t $ac_cv_c_int8_t
+_ACEOF
+;;
+esac
+
+ac_fn_c_find_intX_t "$LINENO" "16" "ac_cv_c_int16_t"
+case $ac_cv_c_int16_t in #(
+ no|yes) ;; #(
+ *)
+
+cat >>confdefs.h <<_ACEOF
+#define int16_t $ac_cv_c_int16_t
+_ACEOF
+;;
+esac
+
+ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t"
+case $ac_cv_c_int32_t in #(
+ no|yes) ;; #(
+ *)
+
+cat >>confdefs.h <<_ACEOF
+#define int32_t $ac_cv_c_int32_t
+_ACEOF
+;;
+esac
+
+ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t"
+case $ac_cv_c_int64_t in #(
+ no|yes) ;; #(
+ *)
+
+cat >>confdefs.h <<_ACEOF
+#define int64_t $ac_cv_c_int64_t
+_ACEOF
+;;
+esac
+
+ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t"
+case $ac_cv_c_uint8_t in #(
+ no|yes) ;; #(
+ *)
+
+$as_echo "#define _UINT8_T 1" >>confdefs.h
+
+
+cat >>confdefs.h <<_ACEOF
+#define uint8_t $ac_cv_c_uint8_t
+_ACEOF
+;;
+ esac
+
+ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t"
+case $ac_cv_c_uint16_t in #(
+ no|yes) ;; #(
+ *)
+
+
+cat >>confdefs.h <<_ACEOF
+#define uint16_t $ac_cv_c_uint16_t
+_ACEOF
+;;
+ esac
+
+ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t"
+case $ac_cv_c_uint32_t in #(
+ no|yes) ;; #(
+ *)
+
+$as_echo "#define _UINT32_T 1" >>confdefs.h
+
+
+cat >>confdefs.h <<_ACEOF
+#define uint32_t $ac_cv_c_uint32_t
+_ACEOF
+;;
+ esac
+
+ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t"
+case $ac_cv_c_uint64_t in #(
+ no|yes) ;; #(
+ *)
+
+$as_echo "#define _UINT64_T 1" >>confdefs.h
+
+
+cat >>confdefs.h <<_ACEOF
+#define uint64_t $ac_cv_c_uint64_t
+_ACEOF
+;;
+ esac
+
+
+#
+# Make sure we have a definition for C99's uintptr_t (regardless of
+# whether the environment is a C99 environment or not).
+#
+
+ ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default"
+if test "x$ac_cv_type_uintptr_t" = xyes; then :
+
+$as_echo "#define HAVE_UINTPTR_T 1" >>confdefs.h
+
+else
+ for ac_type in 'unsigned int' 'unsigned long int' \
+ 'unsigned long long int'; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(sizeof (void *) <= sizeof ($ac_type))];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define uintptr_t $ac_type
+_ACEOF
+
+ ac_type=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test -z "$ac_type" && break
+ done
+fi
+
+
+
+#
+# Define the old BSD specified-width types in terms of the C99 types;
+# we may need them with libpcap include files.
+#
+ac_fn_c_check_type "$LINENO" "u_int8_t" "ac_cv_type_u_int8_t" "$ac_includes_default
+#include <sys/types.h>
+
+"
+if test "x$ac_cv_type_u_int8_t" = xyes; then :
+
+else
+
+$as_echo "#define u_int8_t uint8_t" >>confdefs.h
+
+fi
+
+ac_fn_c_check_type "$LINENO" "u_int16_t" "ac_cv_type_u_int16_t" "$ac_includes_default
+#include <sys/types.h>
+
+"
+if test "x$ac_cv_type_u_int16_t" = xyes; then :
+
+else
+
+$as_echo "#define u_int16_t uint16_t" >>confdefs.h
+
+fi
+
+ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "$ac_includes_default
+#include <sys/types.h>
+
+"
+if test "x$ac_cv_type_u_int32_t" = xyes; then :
+
+else
+
+$as_echo "#define u_int32_t uint32_t" >>confdefs.h
+
+fi
+
+ac_fn_c_check_type "$LINENO" "u_int64_t" "ac_cv_type_u_int64_t" "$ac_includes_default
+#include <sys/types.h>
+
+"
+if test "x$ac_cv_type_u_int64_t" = xyes; then :
+
+else
+
+$as_echo "#define u_int64_t uint64_t" >>confdefs.h
+
+fi
+
+
+#
+# Check for <inttypes.h>
+#
+for ac_header in inttypes.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default"
+if test "x$ac_cv_header_inttypes_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_INTTYPES_H 1
+_ACEOF
+
+ #
+ # OK, we have inttypes.h, but does it define all the PRI[doxu]64 macros?
+ # Some systems have an inttypes.h that doesn't define all of them.
+ #
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether inttypes.h defines the PRI[doxu]64 macros" >&5
+$as_echo_n "checking whether inttypes.h defines the PRI[doxu]64 macros... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+ #include <inttypes.h>
+ #include <stdio.h>
+ #include <sys/types.h>
+
+ main()
+ {
+ printf("%" PRId64 "\n", (uint64_t)1);
+ printf("%" PRIo64 "\n", (uint64_t)1);
+ printf("%" PRIx64 "\n", (uint64_t)1);
+ printf("%" PRIu64 "\n", (uint64_t)1);
+ }
+
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_lbl_inttypes_h_defines_formats=yes
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ac_lbl_inttypes_h_defines_formats=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+else
+
+ #
+ # We don't have inttypes.h, so it obviously can't define those
+ # macros.
+ #
+ ac_lbl_inttypes_h_defines_formats=no
+
+fi
+
+done
+
+if test "$ac_lbl_inttypes_h_defines_formats" = no; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether %lx can be used to format 64-bit integers" >&5
+$as_echo_n "checking whether %lx can be used to format 64-bit integers... " >&6; }
+ if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+# ifdef HAVE_INTTYPES_H
+ #include <inttypes.h>
+# endif
+ #include <stdio.h>
+ #include <sys/types.h>
+
+ main()
+ {
+ uint64_t t = 1;
+ char strbuf[16+1];
+ sprintf(strbuf, "%016lx", t << 32);
+ if (strcmp(strbuf, "0000000100000000") == 0)
+ exit(0);
+ else
+ exit(1);
+ }
+
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+
+$as_echo "#define PRId64 \"ld\"" >>confdefs.h
+
+
+$as_echo "#define PRIo64 \"lo\"" >>confdefs.h
+
+
+$as_echo "#define PRIx64 \"lx\"" >>confdefs.h
+
+
+$as_echo "#define PRIu64 \"lu\"" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether %llx can be used to format 64-bit integers" >&5
+$as_echo_n "checking whether %llx can be used to format 64-bit integers... " >&6; }
+ if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+# ifdef HAVE_INTTYPES_H
+ #include <inttypes.h>
+# endif
+ #include <stdio.h>
+ #include <sys/types.h>
+
+ main()
+ {
+ uint64_t t = 1;
+ char strbuf[16+1];
+ sprintf(strbuf, "%016llx", t << 32);
+ if (strcmp(strbuf, "0000000100000000") == 0)
+ exit(0);
+ else
+ exit(1);
+ }
+
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+
+$as_echo "#define PRId64 \"lld\"" >>confdefs.h
+
+
+$as_echo "#define PRIo64 \"llo\"" >>confdefs.h
+
+
+$as_echo "#define PRIx64 \"llx\"" >>confdefs.h
+
+
+$as_echo "#define PRIu64 \"llu\"" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether %Lx can be used to format 64-bit integers" >&5
+$as_echo_n "checking whether %Lx can be used to format 64-bit integers... " >&6; }
+ if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+# ifdef HAVE_INTTYPES_H
+ #include <inttypes.h>
+# endif
+ #include <stdio.h>
+ #include <sys/types.h>
+
+ main()
+ {
+ uint64_t t = 1;
+ char strbuf[16+1];
+ sprintf(strbuf, "%016Lx", t << 32);
+ if (strcmp(strbuf, "0000000100000000") == 0)
+ exit(0);
+ else
+ exit(1);
+ }
+
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+
+$as_echo "#define PRId64 \"Ld\"" >>confdefs.h
+
+
+$as_echo "#define PRIo64 \"Lo\"" >>confdefs.h
+
+
+$as_echo "#define PRIx64 \"Lx\"" >>confdefs.h
+
+
+$as_echo "#define PRIu64 \"Lu\"" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether %qx can be used to format 64-bit integers" >&5
+$as_echo_n "checking whether %qx can be used to format 64-bit integers... " >&6; }
+ if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+# ifdef HAVE_INTTYPES_H
+ #include <inttypes.h>
+# endif
+ #include <stdio.h>
+ #include <sys/types.h>
+
+ main()
+ {
+ uint64_t t = 1;
+ char strbuf[16+1];
+ sprintf(strbuf, "%016qx", t << 32);
+ if (strcmp(strbuf, "0000000100000000") == 0)
+ exit(0);
+ else
+ exit(1);
+ }
+
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+
+$as_echo "#define PRId64 \"qd\"" >>confdefs.h
+
+
+$as_echo "#define PRIo64 \"qo\"" >>confdefs.h
+
+
+$as_echo "#define PRIx64 \"qx\"" >>confdefs.h
+
+
+$as_echo "#define PRIu64 \"qu\"" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ as_fn_error $? "neither %llx nor %Lx nor %qx worked on a 64-bit integer" "$LINENO" 5
+
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+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"
+for ac_header in pcap/bluetooth.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "pcap/bluetooth.h" "ac_cv_header_pcap_bluetooth_h" "#include \"tcpdump-stdinc.h\"
+"
+if test "x$ac_cv_header_pcap_bluetooth_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PCAP_BLUETOOTH_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in pcap/nflog.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "pcap/nflog.h" "ac_cv_header_pcap_nflog_h" "#include \"tcpdump-stdinc.h\"
+"
+if test "x$ac_cv_header_pcap_nflog_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PCAP_NFLOG_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in pcap/usb.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "pcap/usb.h" "ac_cv_header_pcap_usb_h" "#include \"tcpdump-stdinc.h\"
+"
+if test "x$ac_cv_header_pcap_usb_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PCAP_USB_H 1
+_ACEOF
+
+fi
+
+done
+
+CPPFLAGS="$savedcppflags"
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+ ac_ct_AR=$AR
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="ar"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_AR" = x; then
+ AR=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+else
+ AR="$ac_cv_prog_AR"
+fi
+
+
+rm -f os-proto.h
+ if test "${LBL_CFLAGS+set}" = set; then
+ V_CCOPT="$V_CCOPT ${LBL_CFLAGS}"
+ fi
+ if test -f .devel ; then
+ #
+ # Skip all the warning option stuff on some compilers.
+ #
+ if test "$ac_lbl_cc_dont_try_gcc_dashW" != yes; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wall option" >&5
+$as_echo_n "checking whether the compiler supports the -Wall option... " >&6; }
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors -Wall"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+return 0
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ CFLAGS="$save_CFLAGS"
+ V_CCOPT="$V_CCOPT -Wall"
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ CFLAGS="$save_CFLAGS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wmissing-prototypes option" >&5
+$as_echo_n "checking whether the compiler supports the -Wmissing-prototypes option... " >&6; }
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors -Wmissing-prototypes"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+return 0
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ CFLAGS="$save_CFLAGS"
+ V_CCOPT="$V_CCOPT -Wmissing-prototypes"
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ CFLAGS="$save_CFLAGS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wstrict-prototypes option" >&5
+$as_echo_n "checking whether the compiler supports the -Wstrict-prototypes option... " >&6; }
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors -Wstrict-prototypes"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+return 0
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ CFLAGS="$save_CFLAGS"
+ V_CCOPT="$V_CCOPT -Wstrict-prototypes"
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ CFLAGS="$save_CFLAGS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wwrite-strings option" >&5
+$as_echo_n "checking whether the compiler supports the -Wwrite-strings option... " >&6; }
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors -Wwrite-strings"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+return 0
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ CFLAGS="$save_CFLAGS"
+ V_CCOPT="$V_CCOPT -Wwrite-strings"
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ CFLAGS="$save_CFLAGS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wpointer-arith option" >&5
+$as_echo_n "checking whether the compiler supports the -Wpointer-arith option... " >&6; }
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors -Wpointer-arith"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+return 0
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ CFLAGS="$save_CFLAGS"
+ V_CCOPT="$V_CCOPT -Wpointer-arith"
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ CFLAGS="$save_CFLAGS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -W option" >&5
+$as_echo_n "checking whether the compiler supports the -W option... " >&6; }
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors -W"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+return 0
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ CFLAGS="$save_CFLAGS"
+ V_CCOPT="$V_CCOPT -W"
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ CFLAGS="$save_CFLAGS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports generating dependencies" >&5
+$as_echo_n "checking whether the compiler supports generating dependencies... " >&6; }
+ if test "$GCC" = yes ; then
+ #
+ # GCC, or a compiler deemed to be GCC by AC_PROG_CC (even
+ # though it's not); we assume that, in this case, the flag
+ # would be -M.
+ #
+ ac_lbl_dependency_flag="-M"
+ else
+ #
+ # Not GCC or a compiler deemed to be GCC; what platform is
+ # this? (We're assuming that if the compiler isn't GCC
+ # it's the compiler from the vendor of the OS; that won't
+ # necessarily be true for x86 platforms, where it might be
+ # the Intel C compiler.)
+ #
+ case "$host_os" in
+
+ irix*|osf*|darwin*)
+ #
+ # MIPS C for IRIX, DEC C, and clang all use -M.
+ #
+ ac_lbl_dependency_flag="-M"
+ ;;
+
+ solaris*)
+ #
+ # Sun C uses -xM.
+ #
+ ac_lbl_dependency_flag="-xM"
+ ;;
+
+ hpux*)
+ #
+ # HP's older C compilers don't support this.
+ # HP's newer C compilers support this with
+ # either +M or +Make; the older compilers
+ # interpret +M as something completely
+ # different, so we use +Make so we don't
+ # think it works with the older compilers.
+ #
+ ac_lbl_dependency_flag="+Make"
+ ;;
+
+ *)
+ #
+ # Not one of the above; assume no support for
+ # generating dependencies.
+ #
+ ac_lbl_dependency_flag=""
+ ;;
+ esac
+ fi
+
+ #
+ # Is ac_lbl_dependency_flag defined and, if so, does the compiler
+ # complain about it?
+ #
+ # Note: clang doesn't seem to exit with an error status when handed
+ # an unknown non-warning error, even if you pass it
+ # -Werror=unknown-warning-option. However, it always supports
+ # -M, so the fact that this test always succeeds with clang
+ # isn't an issue.
+ #
+ if test ! -z "$ac_lbl_dependency_flag"; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int main(void) { return 0; }
+_ACEOF
+ echo "$CC" $ac_lbl_dependency_flag conftest.c >&5
+ if "$CC" $ac_lbl_dependency_flag conftest.c >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, with $ac_lbl_dependency_flag" >&5
+$as_echo "yes, with $ac_lbl_dependency_flag" >&6; }
+ DEPENDENCY_CFLAG="$ac_lbl_dependency_flag"
+ MKDEP='${srcdir}/mkdep'
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ #
+ # We can't run mkdep, so have "make depend" do
+ # nothing.
+ #
+ MKDEP=:
+ fi
+ rm -rf conftest*
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ #
+ # We can't run mkdep, so have "make depend" do
+ # nothing.
+ #
+ MKDEP=:
+ fi
+
+
+
+ #
+ # We used to set -n32 for IRIX 6 when not using GCC (presumed
+ # to mean that we're using MIPS C or MIPSpro C); it specified
+ # the "new" faster 32-bit ABI, introduced in IRIX 6.2. I'm
+ # not sure why that would be something to do *only* with a
+ # .devel file; why should the ABI for which we produce code
+ # depend on .devel?
+ #
+ os=`echo $host_os | sed -e 's/\([0-9][0-9]*\)[^0-9].*$/\1/'`
+ name="lbl/os-$os.h"
+ if test -f $name ; then
+ ln -s $name os-proto.h
+
+$as_echo "#define HAVE_OS_PROTO_H 1" >>confdefs.h
+
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find $name" >&5
+$as_echo "$as_me: WARNING: can't find $name" >&2;}
+ fi
+ fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if sockaddr struct has the sa_len member" >&5
+$as_echo_n "checking if sockaddr struct has the sa_len member... " >&6; }
+ if ${ac_cv_lbl_sockaddr_has_sa_len+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# include <sys/types.h>
+# include <sys/socket.h>
+int
+main ()
+{
+u_int i = sizeof(((struct sockaddr *)0)->sa_len)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_lbl_sockaddr_has_sa_len=yes
+else
+ ac_cv_lbl_sockaddr_has_sa_len=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_sockaddr_has_sa_len" >&5
+$as_echo "$ac_cv_lbl_sockaddr_has_sa_len" >&6; }
+ if test $ac_cv_lbl_sockaddr_has_sa_len = yes ; then
+
+$as_echo "#define HAVE_SOCKADDR_SA_LEN 1" >>confdefs.h
+
+ fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if unaligned accesses fail" >&5
+$as_echo_n "checking if unaligned accesses fail... " >&6; }
+ if ${ac_cv_lbl_unaligned_fail+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case "$host_cpu" in
+
+ #
+ # These are CPU types where:
+ #
+ # the CPU faults on an unaligned access, but at least some
+ # OSes that support that CPU catch the fault and simulate
+ # the unaligned access (e.g., Alpha/{Digital,Tru64} UNIX) -
+ # the simulation is slow, so we don't want to use it;
+ #
+ # the CPU, I infer (from the old
+ #
+ # XXX: should also check that they don't do weird things (like on arm)
+ #
+ # comment) doesn't fault on unaligned accesses, but doesn't
+ # do a normal unaligned fetch, either (e.g., presumably, ARM);
+ #
+ # for whatever reason, the test program doesn't work
+ # (this has been claimed to be the case for several of those
+ # CPUs - I don't know what the problem is; the problem
+ # was reported as "the test program dumps core" for SuperH,
+ # but that's what the test program is *supposed* to do -
+ # it dumps core before it writes anything, so the test
+ # for an empty output file should find an empty output
+ # file and conclude that unaligned accesses don't work).
+ #
+ # This run-time test won't work if you're cross-compiling, so
+ # in order to support cross-compiling for a particular CPU,
+ # we have to wire in the list of CPU types anyway, as far as
+ # I know, so perhaps we should just have a set of CPUs on
+ # which we know it doesn't work, a set of CPUs on which we
+ # know it does work, and have the script just fail on other
+ # cpu types and update it when such a failure occurs.
+ #
+ alpha*|arm*|bfin*|hp*|mips*|sh*|sparc*|ia64|nv1)
+ ac_cv_lbl_unaligned_fail=yes
+ ;;
+
+ *)
+ cat >conftest.c <<EOF
+# include <sys/types.h>
+# include <sys/wait.h>
+# include <stdio.h>
+ unsigned char a[5] = { 1, 2, 3, 4, 5 };
+ main() {
+ unsigned int i;
+ pid_t pid;
+ int status;
+ /* avoid "core dumped" message */
+ pid = fork();
+ if (pid < 0)
+ exit(2);
+ if (pid > 0) {
+ /* parent */
+ pid = waitpid(pid, &status, 0);
+ if (pid < 0)
+ exit(3);
+ exit(!WIFEXITED(status));
+ }
+ /* child */
+ i = *(unsigned int *)&a[1];
+ printf("%d\n", i);
+ exit(0);
+ }
+EOF
+ ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS \
+ conftest.c $LIBS >/dev/null 2>&1
+ if test ! -x conftest ; then
+ ac_cv_lbl_unaligned_fail=yes
+ else
+ ./conftest >conftest.out
+ if test ! -s conftest.out ; then
+ ac_cv_lbl_unaligned_fail=yes
+ else
+ ac_cv_lbl_unaligned_fail=no
+ fi
+ fi
+ rm -f -r conftest* core core.conftest
+ ;;
+ esac
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_unaligned_fail" >&5
+$as_echo "$ac_cv_lbl_unaligned_fail" >&6; }
+ if test $ac_cv_lbl_unaligned_fail = yes ; then
+
+$as_echo "#define LBL_ALIGN 1" >>confdefs.h
+
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for h_errno" >&5
+$as_echo_n "checking for h_errno... " >&6; }
+ if ${ac_cv_var_h_errno+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# include <sys/types.h>
+# include <netdb.h>
+int
+main ()
+{
+int foo = h_errno;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_var_h_errno=yes
+else
+ ac_cv_var_h_errno=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_h_errno" >&5
+$as_echo "$ac_cv_var_h_errno" >&6; }
+ if test "$ac_cv_var_h_errno" = "yes"; then
+
+$as_echo "#define HAVE_H_ERRNO 1" >>confdefs.h
+
+ fi
+
+
+# Check for OpenSSL libcrypto
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use OpenSSL libcrypto" >&5
+$as_echo_n "checking whether to use OpenSSL libcrypto... " >&6; }
+# Specify location for both includes and libraries.
+want_libcrypto=ifavailable
+
+# Check whether --with-crypto was given.
+if test "${with_crypto+set}" = set; then :
+ withval=$with_crypto;
+ if test $withval = no
+ then
+ want_libcrypto=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ elif test $withval = yes
+ then
+ want_libcrypto=yes
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ fi
+
+else
+
+ #
+ # Use libcrypto if it's present, otherwise don't.
+ #
+ want_libcrypto=ifavailable
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, if available" >&5
+$as_echo "yes, if available" >&6; }
+
+fi
+
+if test "$want_libcrypto" != "no"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DES_cbc_encrypt in -lcrypto" >&5
+$as_echo_n "checking for DES_cbc_encrypt in -lcrypto... " >&6; }
+if ${ac_cv_lib_crypto_DES_cbc_encrypt+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypto $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char DES_cbc_encrypt ();
+int
+main ()
+{
+return DES_cbc_encrypt ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_crypto_DES_cbc_encrypt=yes
+else
+ ac_cv_lib_crypto_DES_cbc_encrypt=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_DES_cbc_encrypt" >&5
+$as_echo "$ac_cv_lib_crypto_DES_cbc_encrypt" >&6; }
+if test "x$ac_cv_lib_crypto_DES_cbc_encrypt" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBCRYPTO 1
+_ACEOF
+
+ LIBS="-lcrypto $LIBS"
+
+fi
+
+ for ac_header in openssl/evp.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "openssl/evp.h" "ac_cv_header_openssl_evp_h" "$ac_includes_default"
+if test "x$ac_cv_header_openssl_evp_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_OPENSSL_EVP_H 1
+_ACEOF
+
+fi
+
+done
+
+fi
+
+# Check for libcap-ng
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use libcap-ng" >&5
+$as_echo_n "checking whether to use libcap-ng... " >&6; }
+# Specify location for both includes and libraries.
+want_libcap_ng=ifavailable
+
+# Check whether --with-cap_ng was given.
+if test "${with_cap_ng+set}" = set; then :
+ withval=$with_cap_ng;
+ if test $withval = no
+ then
+ want_libcap_ng=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ elif test $withval = yes
+ then
+ want_libcap_ng=yes
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ fi
+
+else
+
+ #
+ # Use libcap-ng if it's present, otherwise don't.
+ #
+ want_libcap_ng=ifavailable
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, if available" >&5
+$as_echo "yes, if available" >&6; }
+
+fi
+
+if test "$want_libcap_ng" != "no"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for capng_change_id in -lcap-ng" >&5
+$as_echo_n "checking for capng_change_id in -lcap-ng... " >&6; }
+if ${ac_cv_lib_cap_ng_capng_change_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcap-ng $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char capng_change_id ();
+int
+main ()
+{
+return capng_change_id ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_cap_ng_capng_change_id=yes
+else
+ ac_cv_lib_cap_ng_capng_change_id=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cap_ng_capng_change_id" >&5
+$as_echo "$ac_cv_lib_cap_ng_capng_change_id" >&6; }
+if test "x$ac_cv_lib_cap_ng_capng_change_id" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBCAP_NG 1
+_ACEOF
+
+ LIBS="-lcap-ng $LIBS"
+
+fi
+
+ for ac_header in cap-ng.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "cap-ng.h" "ac_cv_header_cap_ng_h" "$ac_includes_default"
+if test "x$ac_cv_header_cap_ng_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_CAP_NG_H 1
+_ACEOF
+
+fi
+
+done
+
+fi
+
+if test "$missing_includes" = "yes"; then
+ CPPFLAGS="$CPPFLAGS -I$srcdir/missing"
+ V_INCLS="$V_INCLS -I$srcdir/missing"
+fi
+
+
+
+
+
+
+
+
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+ ./ | .// | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+ac_config_commands="$ac_config_commands default-1"
+
+ac_config_files="$ac_config_files Makefile tcpdump.1"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to the package provider."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "tcpdump.1") CONFIG_FILES="$CONFIG_FILES tcpdump.1" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = "\a"
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = "\a"
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+ ;;
+
+ :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "default-1":C) if test -f .devel; then
+ echo timestamp > stamp-h
+ cat Makefile-devel-adds >> Makefile
+ make depend
+fi ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+exit 0
--- /dev/null
+dnl Copyright (c) 1994, 1995, 1996, 1997
+dnl The Regents of the University of California. All rights reserved.
+dnl
+dnl Process this file with autoconf to produce a configure script.
+dnl
+
+#
+# See
+#
+# http://ftp.gnu.org/gnu/config/README
+#
+# for the URLs to use to fetch new versions of config.guess and
+# config.sub.
+#
+
+AC_PREREQ(2.61)
+AC_INIT(tcpdump.c)
+
+AC_CANONICAL_HOST
+
+AC_LBL_C_INIT_BEFORE_CC(V_INCLS)
+AC_PROG_CC
+AC_LBL_C_INIT(V_CCOPT, V_INCLS)
+AC_LBL_C_INLINE
+AC_C___ATTRIBUTE__
+if test "$ac_cv___attribute__" = "yes"; then
+ AC_C___ATTRIBUTE___UNUSED
+ AC_C___ATTRIBUTE___NORETURN_FUNCTION_POINTER
+ AC_C___ATTRIBUTE___FORMAT
+ if test "$ac_cv___attribute___format" = "yes"; then
+ AC_C___ATTRIBUTE___FORMAT_FUNCTION_POINTER
+ fi
+fi
+
+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>])
+if test "$ac_cv_header_net_pfvar_h" = yes; then
+ LOCALSRC="print-pflog.c $LOCALSRC"
+fi
+AC_CHECK_HEADERS(netinet/if_ether.h, , , [#include <sys/types.h>
+#include <sys/socket.h>])
+if test "$ac_cv_header_netinet_if_ether_h" != yes; then
+ #
+ # The simple test didn't work.
+ # Do we need to include <net/if.h> first?
+ # Unset ac_cv_header_netinet_if_ether_h so we don't
+ # treat the previous failure as a cached value and
+ # suppress the next test.
+ #
+ AC_MSG_NOTICE([Rechecking with some additional includes])
+ unset ac_cv_header_netinet_if_ether_h
+ AC_CHECK_HEADERS(netinet/if_ether.h, , , [#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+struct mbuf;
+struct rtentry;
+#include <net/if.h>])
+fi
+
+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
+ ;;
+esac
+
+
+AC_ARG_WITH(smi,
+[ --with-smi link with libsmi (allows to load MIBs on the fly to decode SNMP packets. [default=yes]
+ --without-smi don't link with libsmi],,
+ with_smi=yes)
+
+if test "x$with_smi" != "xno" ; then
+ AC_CHECK_HEADER(smi.h,
+ [
+ #
+ # OK, we found smi.h. Do we have libsmi with smiInit?
+ #
+ AC_CHECK_LIB(smi, smiInit,
+ [
+ #
+ # OK, we have libsmi with smiInit. Can we use it?
+ #
+ AC_MSG_CHECKING([whether to enable libsmi])
+ savedlibs="$LIBS"
+ LIBS="-lsmi $LIBS"
+ AC_TRY_RUN(
+ [
+/* libsmi available check */
+#include <smi.h>
+main()
+{
+ int current, revision, age, n;
+ const int required = 2;
+ if (smiInit(""))
+ exit(1);
+ if (strcmp(SMI_LIBRARY_VERSION, smi_library_version))
+ exit(2);
+ n = sscanf(smi_library_version, "%d:%d:%d", ¤t, &revision, &age);
+ if (n != 3)
+ exit(3);
+ if (required < current - age || required > current)
+ exit(4);
+ exit(0);
+}
+ ],
+ [
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(USE_LIBSMI, 1,
+ [Define if you enable support for libsmi])
+ ],
+ [
+ dnl autoconf documentation says that
+ dnl $? contains the exit value.
+ dnl reality is that it does not.
+ dnl We leave this in just in case
+ dnl autoconf ever comes back to
+ dnl match the documentation.
+ case $? in
+ 1) AC_MSG_RESULT(no - smiInit failed) ;;
+ 2) AC_MSG_RESULT(no - header/library version mismatch) ;;
+ 3) AC_MSG_RESULT(no - can't determine library version) ;;
+ 4) AC_MSG_RESULT(no - too old) ;;
+ *) AC_MSG_RESULT(no) ;;
+ esac
+ LIBS="$savedlibs"
+ ],
+ [
+ AC_MSG_RESULT(not when cross-compiling)
+ LIBS="$savedlibs"
+ ]
+ )
+ ])
+ ])
+fi
+
+AC_MSG_CHECKING([whether to enable the possibly-buggy SMB printer])
+AC_ARG_ENABLE(smb,
+[ --enable-smb enable possibly-buggy SMB printer [default=yes]
+ --disable-smb disable possibly-buggy SMB printer],,
+ enableval=yes)
+case "$enableval" in
+yes) AC_MSG_RESULT(yes)
+ AC_WARN([The SMB printer may have exploitable buffer overflows!!!])
+ AC_DEFINE(TCPDUMP_DO_SMB, 1,
+ [define if you want to build the possibly-buggy SMB printer])
+ LOCALSRC="print-smb.c smbutil.c $LOCALSRC"
+ ;;
+*) AC_MSG_RESULT(no)
+ ;;
+esac
+
+AC_ARG_WITH(user, [ --with-user=USERNAME drop privileges by default to USERNAME])
+AC_MSG_CHECKING([whether to drop root privileges by default])
+if test ! -z "$with_user" ; then
+ AC_DEFINE_UNQUOTED(WITH_USER, "$withval",
+ [define if should drop privileges by default])
+ AC_MSG_RESULT(to \"$withval\")
+else
+ AC_MSG_RESULT(no)
+fi
+
+AC_ARG_WITH(chroot, [ --with-chroot=DIRECTORY when dropping privileges, chroot to DIRECTORY])
+AC_MSG_CHECKING([whether to chroot])
+if test ! -z "$with_chroot" && test "$with_chroot" != "no" ; then
+ AC_DEFINE_UNQUOTED(WITH_CHROOT, "$withval",
+ [define if should chroot when dropping privileges])
+ AC_MSG_RESULT(to \"$withval\")
+else
+ AC_MSG_RESULT(no)
+fi
+
+AC_ARG_WITH(sandbox-capsicum,
+ AS_HELP_STRING([--with-sandbox-capsicum],
+ [use Capsicum security functions @<:@default=yes, if available@:>@]))
+#
+# Check whether various functions are available. If any are, set
+# ac_lbl_capsicum_function_seen to yes; if any are not, set
+# ac_lbl_capsicum_function_not_seen to yes.
+#
+# We don't check cap_rights_init(), as it's a macro, wrapping another
+# function, in at least some versions of FreeBSD, and AC_CHECK_FUNCS()
+# doesn't handle that.
+#
+# All of the ones we check for must be available in order to enable
+# capsicum sandboxing.
+#
+# XXX - do we need to check for all of them, or are there some that, if
+# present, imply others are present?
+#
+if test ! -z "$with_sandbox-capsicum" && test "$with_sandbox-capsicum" != "no" ; then
+ AC_CHECK_FUNCS(cap_enter cap_rights_limit cap_ioctls_limit openat,
+ ac_lbl_capsicum_function_seen=yes,
+ ac_lbl_capsicum_function_not_seen=yes)
+fi
+AC_MSG_CHECKING([whether to sandbox using capsicum])
+if test "x$ac_lbl_capsicum_function_seen" = "xyes" -a "x$ac_lbl_capsicum_function_not_seen" != "xyes"; then
+ AC_DEFINE(HAVE_CAPSICUM, 1, [capsicum support available])
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+#
+# We must check this before checking whether to enable IPv6, because,
+# on some platforms (such as SunOS 5.x), the test program requires
+# the extra networking libraries.
+#
+AC_LBL_LIBRARY_NET
+
+AC_MSG_CHECKING([whether to enable ipv6])
+AC_ARG_ENABLE(ipv6,
+[ --enable-ipv6 enable ipv6 (with ipv4) support
+ --disable-ipv6 disable ipv6 support],
+[ case "$enableval" in
+yes) AC_MSG_RESULT(yes)
+ LOCALSRC="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, 1, [Define if you enable IPv6 support])
+ ipv6=yes
+ ;;
+*)
+ AC_MSG_RESULT(no)
+ ipv6=no
+ ;;
+ esac ],
+
+ AC_COMPILE_IFELSE(
+ [
+ AC_LANG_SOURCE(
+ [[/* AF_INET6 available check */
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#ifdef AF_INET6
+void
+foo(struct in6_addr *addr)
+{
+ memset(addr, 0, sizeof (struct in6_addr));
+}
+#else
+#error "AF_INET6 not defined"
+#endif
+ ]])
+ ],
+[ AC_MSG_RESULT(yes)
+ LOCALSRC="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, 1, [Define if you enable IPv6 support])
+ ipv6=yes],
+[ AC_MSG_RESULT(no)
+ ipv6=no],
+[ AC_MSG_RESULT(no)
+ ipv6=no]
+))
+
+ipv6type=unknown
+ipv6lib=none
+ipv6trylibc=no
+
+if test "$ipv6" = "yes"; then
+ AC_MSG_CHECKING([ipv6 stack type])
+ for i in inria kame linux-glibc linux-libinet6 toshiba v6d zeta; do
+ case $i in
+ inria)
+ dnl http://www.kame.net/
+ AC_EGREP_CPP(yes,
+[#include <netinet/in.h>
+#ifdef IPV6_INRIA_VERSION
+yes
+#endif],
+ [ipv6type=$i;
+ CFLAGS="-DINET6 $CFLAGS"])
+ ;;
+ kame)
+ dnl http://www.kame.net/
+ AC_EGREP_CPP(yes,
+[#include <netinet/in.h>
+#ifdef __KAME__
+yes
+#endif],
+ [ipv6type=$i;
+ ipv6lib=inet6;
+ ipv6libdir=/usr/local/v6/lib;
+ ipv6trylibc=yes;
+ CFLAGS="-DINET6 $CFLAGS"])
+ ;;
+ linux-glibc)
+ dnl http://www.v6.linux.or.jp/
+ AC_EGREP_CPP(yes,
+[#include <features.h>
+#if defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
+yes
+#endif],
+ [ipv6type=$i;
+ CFLAGS="-DINET6 $CFLAGS"])
+ ;;
+ linux-libinet6)
+ dnl http://www.v6.linux.or.jp/
+ dnl
+ dnl This also matches Solaris 8 and Tru64 UNIX 5.1,
+ dnl and possibly other versions of those OSes
+ dnl
+ if test -d /usr/inet6 -o -f /usr/include/netinet/ip6.h; then
+ ipv6type=$i
+ ipv6lib=inet6
+ ipv6libdir=/usr/inet6/lib
+ ipv6trylibc=yes;
+ CFLAGS="-DINET6 -I/usr/inet6/include $CFLAGS"
+ fi
+ ;;
+ toshiba)
+ AC_EGREP_CPP(yes,
+[#include <sys/param.h>
+#ifdef _TOSHIBA_INET6
+yes
+#endif],
+ [ipv6type=$i;
+ ipv6lib=inet6;
+ ipv6libdir=/usr/local/v6/lib;
+ CFLAGS="-DINET6 $CFLAGS"])
+ ;;
+ v6d)
+ AC_EGREP_CPP(yes,
+[#include </usr/local/v6/include/sys/v6config.h>
+#ifdef __V6D__
+yes
+#endif],
+ [ipv6type=$i;
+ ipv6lib=v6;
+ ipv6libdir=/usr/local/v6/lib;
+ CFLAGS="-I/usr/local/v6/include $CFLAGS"])
+ ;;
+ zeta)
+ AC_EGREP_CPP(yes,
+[#include <sys/param.h>
+#ifdef _ZETA_MINAMI_INET6
+yes
+#endif],
+ [ipv6type=$i;
+ ipv6lib=inet6;
+ ipv6libdir=/usr/local/v6/lib;
+ CFLAGS="-DINET6 $CFLAGS"])
+ ;;
+ esac
+ if test "$ipv6type" != "unknown"; then
+ break
+ fi
+ done
+ AC_MSG_RESULT($ipv6type)
+fi
+
+if test "$ipv6" = "yes" -a "$ipv6lib" != "none"; then
+ if test -d $ipv6libdir -a -f $ipv6libdir/lib$ipv6lib.a; then
+ LIBS="-L$ipv6libdir -l$ipv6lib $LIBS"
+ echo "You have $ipv6lib library, using it"
+ else
+ if test "$ipv6trylibc" = "yes"; then
+ echo "You do not have $ipv6lib library, using libc"
+ else
+ echo 'Fatal: no $ipv6lib library found. cannot continue.'
+ echo "You need to fetch lib$ipv6lib.a from appropriate"
+ echo 'ipv6 kit and compile beforehand.'
+ exit 1
+ fi
+ fi
+fi
+
+
+if test "$ipv6" = "yes"; then
+ #
+ # XXX - on Tru64 UNIX 5.1, there is no "getaddrinfo()"
+ # function in libc; there are "ngetaddrinfo()" and
+ # "ogetaddrinfo()" functions, and <netdb.h> #defines
+ # "getaddrinfo" to be either "ngetaddrinfo" or
+ # "ogetaddrinfo", depending on whether _SOCKADDR_LEN
+ # or _XOPEN_SOURCE_EXTENDED are defined or not.
+ #
+ # So this test doesn't work on Tru64 5.1, and possibly
+ # on other 5.x releases. This causes the configure
+ # script to become confused, and results in libpcap
+ # being unbuildable.
+ #
+ AC_SEARCH_LIBS(getaddrinfo, socket, [dnl
+ AC_MSG_CHECKING(getaddrinfo bug)
+ AC_CACHE_VAL(td_cv_buggygetaddrinfo, [AC_TRY_RUN([
+#include <sys/types.h>
+#include <netdb.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+main()
+{
+ int passive, gaierr, inet4 = 0, inet6 = 0;
+ struct addrinfo hints, *ai, *aitop;
+ char straddr[INET6_ADDRSTRLEN], strport[16];
+
+ for (passive = 0; passive <= 1; passive++) {
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_flags = passive ? AI_PASSIVE : 0;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = IPPROTO_TCP;
+ if ((gaierr = getaddrinfo(NULL, "54321", &hints, &aitop)) != 0) {
+ (void)gai_strerror(gaierr);
+ goto bad;
+ }
+ for (ai = aitop; ai; ai = ai->ai_next) {
+ if (ai->ai_addr == NULL ||
+ ai->ai_addrlen == 0 ||
+ getnameinfo(ai->ai_addr, ai->ai_addrlen,
+ straddr, sizeof(straddr), strport, sizeof(strport),
+ NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
+ goto bad;
+ }
+ switch (ai->ai_family) {
+ case AF_INET:
+ if (strcmp(strport, "54321") != 0) {
+ goto bad;
+ }
+ if (passive) {
+ if (strcmp(straddr, "0.0.0.0") != 0) {
+ goto bad;
+ }
+ } else {
+ if (strcmp(straddr, "127.0.0.1") != 0) {
+ goto bad;
+ }
+ }
+ inet4++;
+ break;
+ case AF_INET6:
+ if (strcmp(strport, "54321") != 0) {
+ goto bad;
+ }
+ if (passive) {
+ if (strcmp(straddr, "::") != 0) {
+ goto bad;
+ }
+ } else {
+ if (strcmp(straddr, "::1") != 0) {
+ goto bad;
+ }
+ }
+ inet6++;
+ break;
+ case AF_UNSPEC:
+ goto bad;
+ break;
+#ifdef AF_UNIX
+ case AF_UNIX:
+#else
+#ifdef AF_LOCAL
+ case AF_LOCAL:
+#endif
+#endif
+ default:
+ /* another family support? */
+ break;
+ }
+ }
+ }
+
+ /* supported family should be 2, unsupported family should be 0 */
+ if (!(inet4 == 0 || inet4 == 2))
+ goto bad;
+ if (!(inet6 == 0 || inet6 == 2))
+ goto bad;
+
+ if (aitop)
+ freeaddrinfo(aitop);
+ exit(0);
+
+ bad:
+ if (aitop)
+ freeaddrinfo(aitop);
+ exit(1);
+}
+],
+ td_cv_buggygetaddrinfo=no,
+ td_cv_buggygetaddrinfo=yes,
+ td_cv_buggygetaddrinfo=unknown)])
+ if test "$td_cv_buggygetaddrinfo" = no; then
+ AC_MSG_RESULT(good)
+ elif test "$td_cv_buggygetaddrinfo" = unknown; then
+ AC_MSG_RESULT([unknown (cross-compiling)])
+ else
+ AC_MSG_RESULT(buggy)
+ fi
+
+ if test "$td_cv_buggygetaddrinfo" = "yes"; then
+ #
+ # XXX - it doesn't appear that "ipv6type" can ever be
+ # set to "linux". Should this be testing for
+ # "linux-glibc", or for that *or* "linux-libinet6"?
+ # If the latter, note that "linux-libinet6" is also
+ # the type given to some non-Linux OSes.
+ #
+ if test "$ipv6type" != "linux"; then
+ echo 'Fatal: You must get working getaddrinfo() function.'
+ echo ' or you can specify "--disable-ipv6"'.
+ exit 1
+ else
+ echo 'Warning: getaddrinfo() implementation on your system seems be buggy.'
+ echo ' Better upgrade your system library to newest version'
+ echo ' of GNU C library (aka glibc).'
+ fi
+ fi
+ ])
+ AC_REPLACE_FUNCS(getnameinfo)
+fi
+
+AC_CACHE_CHECK([for dnet_htoa declaration in netdnet/dnetdb.h],
+[td_cv_decl_netdnet_dnetdb_h_dnet_htoa],
+[AC_EGREP_HEADER(dnet_htoa, netdnet/dnetdb.h,
+ td_cv_decl_netdnet_dnetdb_h_dnet_htoa=yes,
+ td_cv_decl_netdnet_dnetdb_h_dnet_htoa=no)])
+if test "$td_cv_decl_netdnet_dnetdb_h_dnet_htoa" = yes; then
+ AC_DEFINE(HAVE_NETDNET_DNETDB_H_DNET_HTOA, 1,
+ [define if you have a dnet_htoa declaration in <netdnet/dnetdb.h>])
+fi
+
+dnl
+dnl Checks for addrinfo structure
+AC_STRUCT_ADDRINFO(ac_cv_addrinfo)
+if test "$ac_cv_addrinfo" = no; then
+ missing_includes=yes
+fi
+
+dnl
+dnl Checks for NI_MAXSERV
+AC_NI_MAXSERV(ac_cv_maxserv)
+if test "$ac_cv_maxserv" = no; then
+ missing_includes=yes
+fi
+
+dnl
+dnl Checks for NI_NAMEREQD
+AC_NI_NAMEREQD(ac_cv_namereqd)
+if test "$ac_cv_namereqd" = no; then
+ missing_includes=yes
+fi
+
+AC_REPLACE_FUNCS(vfprintf strcasecmp strlcat strlcpy strdup strsep getopt_long)
+AC_CHECK_FUNCS(fork vfork strftime)
+AC_CHECK_FUNCS(setlinebuf alarm)
+
+needsnprintf=no
+AC_CHECK_FUNCS(vsnprintf snprintf,,
+ [needsnprintf=yes])
+if test $needsnprintf = yes; then
+ AC_LIBOBJ(snprintf)
+fi
+
+AC_LBL_TYPE_SIGNAL
+
+AC_SEARCH_LIBS(dnet_htoa, dnet,
+ AC_DEFINE(HAVE_DNET_HTOA, 1, [define if you have the dnet_htoa function]))
+
+AC_CHECK_LIB(rpc, main) dnl It's unclear why we might need -lrpc
+
+dnl Some platforms may need -lnsl for getrpcbynumber.
+AC_SEARCH_LIBS(getrpcbynumber, nsl,
+ AC_DEFINE(HAVE_GETRPCBYNUMBER, 1, [define if you have getrpcbynumber()]))
+
+dnl AC_CHECK_LIB(z, uncompress)
+dnl AC_CHECK_HEADERS(zlib.h)
+
+AC_LBL_LIBPCAP(V_PCAPDEP, V_INCLS)
+
+#
+# Check for these after AC_LBL_LIBPCAP, so we link with the appropriate
+# libraries (e.g., "-lsocket -lnsl" on Solaris).
+#
+# We don't use AC_REPLACE_FUNCS because that uses AC_CHECK_FUNCS which
+# use AC_CHECK_FUNC which doesn't let us specify the right #includes
+# to make this work on BSD/OS 4.x. BSD/OS 4.x ships with the BIND8
+# resolver, and the way it defines inet_{ntop,pton} is rather strange;
+# it does not ship with a libc symbol "inet_ntop()", it ships with
+# "_inet_ntop()", and has a #define macro in one of the system headers
+# to rename it.
+#
+dnl AC_TRY_COMPILE(inet_ntop inet_pton inet_aton)
+AC_MSG_CHECKING(for inet_ntop)
+AC_TRY_LINK([#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>], [char src[4], dst[128];
+inet_ntop(AF_INET, src, dst, sizeof(dst));],
+ [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
+ AC_LIBOBJ(inet_ntop)])
+AC_MSG_CHECKING(for inet_pton)
+AC_TRY_LINK([#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>], [char src[128], dst[4];
+inet_pton(AF_INET, src, dst);],
+ [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
+ AC_LIBOBJ(inet_pton)])
+AC_MSG_CHECKING(for inet_aton)
+AC_TRY_LINK([#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>], [char src[128];
+struct in_addr dst;
+inet_aton(src, &dst);],
+ [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
+ AC_LIBOBJ(inet_aton)])
+
+#
+# Check for these after AC_LBL_LIBPCAP, for the same reason.
+#
+# You are in a twisty little maze of UN*Xes, all different.
+# Some might not have ether_ntohost().
+# Some might have it, but not declare it in any header file.
+# Some might have it, but declare it in <netinet/if_ether.h>.
+# Some might have it, but declare it in <netinet/ether.h>
+# (And some might have it but document it as something declared in
+# <netinet/ethernet.h>, although <netinet/if_ether.h> appears to work.)
+#
+# Before you is a C compiler.
+#
+AC_CHECK_FUNCS(ether_ntohost, [
+ AC_CACHE_CHECK(for buggy ether_ntohost, ac_cv_buggy_ether_ntohost, [
+ AC_TRY_RUN([
+ #include <netdb.h>
+ #include <sys/types.h>
+ #include <sys/param.h>
+ #include <sys/socket.h>
+
+ int
+ main(int argc, char **argv)
+ {
+ u_char ea[6] = { 0xff, 0xff, 0xff, 0xff, 0xff };
+ char name[MAXHOSTNAMELEN];
+
+ ether_ntohost(name, (struct ether_addr *)ea);
+ exit(0);
+ }
+ ], [ac_cv_buggy_ether_ntohost=no],
+ [ac_cv_buggy_ether_ntohost=yes],
+ [ac_cv_buggy_ether_ntohost="not while cross-compiling"])])
+ if test "$ac_cv_buggy_ether_ntohost" = "no"; then
+ AC_DEFINE(USE_ETHER_NTOHOST, 1,
+ [define if you have ether_ntohost() and it works])
+ fi
+])
+if test "$ac_cv_func_ether_ntohost" = yes -a \
+ "$ac_cv_buggy_ether_ntohost" = "no"; then
+ #
+ # OK, we have ether_ntohost(). Do we have <netinet/if_ether.h>?
+ #
+ if test "$ac_cv_header_netinet_if_ether_h" = yes; then
+ #
+ # Yes. Does it declare ether_ntohost()?
+ #
+ AC_CHECK_DECL(ether_ntohost,
+ [
+ AC_DEFINE(NETINET_IF_ETHER_H_DECLARES_ETHER_NTOHOST,,
+ [Define to 1 if netinet/if_ether.h declares `ether_ntohost'])
+ ],,
+ [
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+struct mbuf;
+struct rtentry;
+#include <net/if.h>
+#include <netinet/if_ether.h>
+ ])
+ fi
+ #
+ # Did that succeed?
+ #
+ if test "$ac_cv_have_decl_ether_ntohost" != yes; then
+ #
+ # No, how about <netinet/ether.h>, as on Linux?
+ #
+ AC_CHECK_HEADERS(netinet/ether.h)
+ if test "$ac_cv_header_netinet_ether_h" = yes; then
+ #
+ # We have it - does it declare ether_ntohost()?
+ # Unset ac_cv_have_decl_ether_ntohost so we don't
+ # treat the previous failure as a cached value and
+ # suppress the next test.
+ #
+ unset ac_cv_have_decl_ether_ntohost
+ AC_CHECK_DECL(ether_ntohost,
+ [
+ AC_DEFINE(NETINET_ETHER_H_DECLARES_ETHER_NTOHOST,,
+ [Define to 1 if netinet/ether.h declares `ether_ntohost'])
+ ],,
+ [
+#include <netinet/ether.h>
+ ])
+ fi
+ fi
+ #
+ # Is ether_ntohost() declared?
+ #
+ if test "$ac_cv_have_decl_ether_ntohost" != yes; then
+ #
+ # No, we'll have to declare it ourselves.
+ # Do we have "struct ether_addr"?
+ #
+ AC_CHECK_TYPES(struct ether_addr,,,
+ [
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+struct mbuf;
+struct rtentry;
+#include <net/if.h>
+#include <netinet/if_ether.h>
+ ])
+ AC_DEFINE(HAVE_DECL_ETHER_NTOHOST, 0,
+ [Define to 1 if you have the declaration of `ether_ntohost', and to 0 if you
+don't.])
+ else
+ AC_DEFINE(HAVE_DECL_ETHER_NTOHOST, 1,
+ [Define to 1 if you have the declaration of `ether_ntohost', and to 0 if you
+don't.])
+ fi
+fi
+
+# libdlpi is needed for Solaris 11 and later.
+AC_CHECK_LIB(dlpi, dlpi_walk, LIBS="$LIBS -ldlpi" LDFLAGS="-L/lib $LDFLAGS", ,-L/lib)
+
+dnl portability macros for getaddrinfo/getnameinfo
+dnl
+dnl Check for sa_len
+AC_CHECK_SA_LEN(ac_cv_sockaddr_has_sa_len)
+if test "$ac_cv_sockaddr_has_sa_len" = no; then
+ missing_includes=yes
+fi
+
+dnl
+dnl Check for "pcap_list_datalinks()", "pcap_set_datalink()",
+dnl and "pcap_datalink_name_to_val()", and use substitute versions
+dnl if they're not present.
+dnl
+AC_CHECK_FUNC(pcap_list_datalinks,
+ [
+ AC_DEFINE(HAVE_PCAP_LIST_DATALINKS, 1,
+ [define if libpcap has pcap_list_datalinks()])
+ AC_CHECK_FUNCS(pcap_free_datalinks)
+ ],
+ [
+ AC_LIBOBJ(datalinks)
+ ])
+AC_CHECK_FUNCS(pcap_set_datalink)
+AC_CHECK_FUNC(pcap_datalink_name_to_val,
+ [
+ AC_DEFINE(HAVE_PCAP_DATALINK_NAME_TO_VAL, 1,
+ [define if libpcap has pcap_datalink_name_to_val()])
+ AC_CHECK_FUNC(pcap_datalink_val_to_description,
+ AC_DEFINE(HAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION, 1,
+ [define if libpcap has pcap_datalink_val_to_description()]),
+ [
+ AC_LIBOBJ(dlnames)
+ ])
+ ],
+ [
+ AC_LIBOBJ(dlnames)
+ ])
+
+dnl
+dnl Check for "pcap_breakloop()"; you can't substitute for it if
+dnl it's absent (it has hooks into the live capture routines),
+dnl so just define the HAVE_ value if it's there.
+dnl
+AC_CHECK_FUNCS(pcap_breakloop)
+
+dnl
+dnl Check for "pcap_dump_ftell()" and use a substitute version
+dnl if it's not present.
+dnl
+AC_CHECK_FUNC(pcap_dump_ftell,
+ AC_DEFINE(HAVE_PCAP_DUMP_FTELL, 1,
+ [define if libpcap has pcap_dump_ftell()]),
+ [
+ AC_LIBOBJ(pcap_dump_ftell)
+ ])
+
+#
+# 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
+# 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)
+ #
+ # And do we have pcap_set_tstamp_precision? If so, we assume
+ # we also have pcap_open_offline_with_tstamp_precision.
+ #
+ AC_CHECK_FUNCS(pcap_set_tstamp_precision)
+fi
+
+#
+# Check for a miscellaneous collection of functions which we use
+# if we have them.
+#
+AC_CHECK_FUNCS(pcap_findalldevs pcap_dump_flush pcap_lib_version pcap_setdirection pcap_set_immediate_mode)
+if test $ac_cv_func_pcap_findalldevs = "yes" ; then
+dnl Check for Mac OS X, which may ship pcap.h from 0.6 but libpcap may
+dnl be 0.8; this means that lib has pcap_findalldevs but header doesn't
+dnl have pcap_if_t.
+ savedcppflags="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $V_INCLS"
+ AC_CHECK_TYPES(pcap_if_t, , , [#include <pcap.h>])
+ CPPFLAGS="$savedcppflags"
+fi
+
+if test $ac_cv_func_pcap_lib_version = "no" ; then
+ AC_MSG_CHECKING(whether pcap_version is defined by libpcap)
+ AC_TRY_LINK([],
+ [
+ extern char pcap_version[];
+
+ return (int)pcap_version;
+ ],
+ ac_lbl_cv_pcap_version_defined=yes,
+ ac_lbl_cv_pcap_version_defined=no)
+ if test "$ac_lbl_cv_pcap_version_defined" = yes ; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_PCAP_VERSION, 1, [define if libpcap has pcap_version])
+ else
+ AC_MSG_RESULT(no)
+ fi
+fi
+AC_MSG_CHECKING(whether pcap_debug is defined by libpcap)
+AC_TRY_LINK([],
+ [
+ extern int pcap_debug;
+
+ return pcap_debug;
+ ],
+ ac_lbl_cv_pcap_debug_defined=yes,
+ ac_lbl_cv_pcap_debug_defined=no)
+if test "$ac_lbl_cv_pcap_debug_defined" = yes ; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_PCAP_DEBUG, 1, [define if libpcap has pcap_debug])
+else
+ AC_MSG_RESULT(no)
+ #
+ # OK, what about "yydebug"?
+ #
+ AC_MSG_CHECKING(whether yydebug is defined by libpcap)
+ AC_TRY_LINK([],
+ [
+ extern int yydebug;
+
+ return yydebug;
+ ],
+ ac_lbl_cv_yydebug_defined=yes,
+ ac_lbl_cv_yydebug_defined=no)
+ if test "$ac_lbl_cv_yydebug_defined" = yes ; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_YYDEBUG, 1, [define if libpcap has yydebug])
+ else
+ AC_MSG_RESULT(no)
+ fi
+fi
+AC_REPLACE_FUNCS(bpf_dump) dnl moved to libpcap in 0.6
+
+V_GROUP=0
+if test -f /etc/group -a ! -z "`grep '^wheel:' /etc/group`" ; then
+ V_GROUP=wheel
+fi
+#
+# Assume V7/BSD convention for man pages (file formats in section 5,
+# miscellaneous info in section 7).
+#
+MAN_FILE_FORMATS=5
+MAN_MISC_INFO=7
+case "$host_os" in
+
+aix*)
+ dnl Workaround to enable certain features
+ AC_DEFINE(_SUN,1,[define on AIX to get certain functions])
+ ;;
+
+hpux*)
+ #
+ # Use System V conventions for man pages.
+ #
+ MAN_FILE_FORMATS=4
+ MAN_MISC_INFO=5
+ ;;
+
+irix*)
+ V_GROUP=sys
+
+ #
+ # Use System V conventions for man pages.
+ #
+ MAN_FILE_FORMATS=4
+ MAN_MISC_INFO=5
+ ;;
+
+osf*)
+ V_GROUP=system
+
+ #
+ # Use System V conventions for man pages.
+ #
+ MAN_FILE_FORMATS=4
+ MAN_MISC_INFO=5
+ ;;
+
+solaris*)
+ V_GROUP=sys
+
+ #
+ # Use System V conventions for man pages.
+ #
+ MAN_FILE_FORMATS=4
+ MAN_MISC_INFO=5
+ ;;
+esac
+
+if test -f /dev/bpf -o -f /dev/bpf0; then
+ V_GROUP=bpf
+fi
+
+#
+# Make sure we have definitions for all the C99 specified-width types
+# (regardless of whether the environment is a C99 environment or not).
+#
+AC_TYPE_INT8_T
+AC_TYPE_INT16_T
+AC_TYPE_INT32_T
+AC_TYPE_INT64_T
+AC_TYPE_UINT8_T
+AC_TYPE_UINT16_T
+AC_TYPE_UINT32_T
+AC_TYPE_UINT64_T
+
+#
+# Make sure we have a definition for C99's uintptr_t (regardless of
+# whether the environment is a C99 environment or not).
+#
+AC_TYPE_UINTPTR_T
+
+#
+# Define the old BSD specified-width types in terms of the C99 types;
+# we may need them with libpcap include files.
+#
+AC_CHECK_TYPE([u_int8_t], ,
+ [AC_DEFINE([u_int8_t], [uint8_t],
+ [Define to `uint8_t' if u_int8_t not defined.])],
+ [AC_INCLUDES_DEFAULT
+#include <sys/types.h>
+])
+AC_CHECK_TYPE([u_int16_t], ,
+ [AC_DEFINE([u_int16_t], [uint16_t],
+ [Define to `uint16_t' if u_int16_t not defined.])],
+ [AC_INCLUDES_DEFAULT
+#include <sys/types.h>
+])
+AC_CHECK_TYPE([u_int32_t], ,
+ [AC_DEFINE([u_int32_t], [uint32_t],
+ [Define to `uint32_t' if u_int32_t not defined.])],
+ [AC_INCLUDES_DEFAULT
+#include <sys/types.h>
+])
+AC_CHECK_TYPE([u_int64_t], ,
+ [AC_DEFINE([u_int64_t], [uint64_t],
+ [Define to `uint64_t' if u_int64_t not defined.])],
+ [AC_INCLUDES_DEFAULT
+#include <sys/types.h>
+])
+
+#
+# Check for <inttypes.h>
+#
+AC_CHECK_HEADERS(inttypes.h,
+ [
+ #
+ # OK, we have inttypes.h, but does it define all the PRI[doxu]64 macros?
+ # Some systems have an inttypes.h that doesn't define all of them.
+ #
+ AC_MSG_CHECKING([[whether inttypes.h defines the PRI[doxu]64 macros]])
+ AC_COMPILE_IFELSE(
+ [
+ AC_LANG_SOURCE(
+ [[
+ #include <inttypes.h>
+ #include <stdio.h>
+ #include <sys/types.h>
+
+ main()
+ {
+ printf("%" PRId64 "\n", (uint64_t)1);
+ printf("%" PRIo64 "\n", (uint64_t)1);
+ printf("%" PRIx64 "\n", (uint64_t)1);
+ printf("%" PRIu64 "\n", (uint64_t)1);
+ }
+ ]])
+ ],
+ [
+ AC_MSG_RESULT(yes)
+ ac_lbl_inttypes_h_defines_formats=yes
+ ],
+ [
+ AC_MSG_RESULT(no)
+ ac_lbl_inttypes_h_defines_formats=no
+ ])
+ ],
+ [
+ #
+ # We don't have inttypes.h, so it obviously can't define those
+ # macros.
+ #
+ ac_lbl_inttypes_h_defines_formats=no
+ ])
+if test "$ac_lbl_inttypes_h_defines_formats" = no; then
+ AC_LBL_CHECK_64BIT_FORMAT(l,
+ [
+ AC_LBL_CHECK_64BIT_FORMAT(ll,
+ [
+ AC_LBL_CHECK_64BIT_FORMAT(L,
+ [
+ AC_LBL_CHECK_64BIT_FORMAT(q,
+ [
+ AC_MSG_ERROR([neither %llx nor %Lx nor %qx worked on a 64-bit integer])
+ ])
+ ])
+ ])
+ ])
+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/nflog.h,,,[#include "tcpdump-stdinc.h"])
+AC_CHECK_HEADERS(pcap/usb.h,,,[#include "tcpdump-stdinc.h"])
+CPPFLAGS="$savedcppflags"
+
+AC_PROG_RANLIB
+AC_CHECK_TOOL([AR], [ar])
+
+AC_LBL_DEVEL(V_CCOPT)
+
+AC_LBL_SOCKADDR_SA_LEN
+
+AC_LBL_UNALIGNED_ACCESS
+
+AC_VAR_H_ERRNO
+
+# Check for OpenSSL libcrypto
+AC_MSG_CHECKING(whether to use OpenSSL libcrypto)
+# Specify location for both includes and libraries.
+want_libcrypto=ifavailable
+AC_ARG_WITH(crypto,
+ AS_HELP_STRING([--with-crypto],
+ [use OpenSSL libcrypto @<:@default=yes, if available@:>@]),
+[
+ if test $withval = no
+ then
+ want_libcrypto=no
+ AC_MSG_RESULT(no)
+ elif test $withval = yes
+ then
+ want_libcrypto=yes
+ AC_MSG_RESULT(yes)
+ fi
+],[
+ #
+ # Use libcrypto if it's present, otherwise don't.
+ #
+ want_libcrypto=ifavailable
+ AC_MSG_RESULT([yes, if available])
+])
+if test "$want_libcrypto" != "no"; then
+ AC_CHECK_LIB(crypto, DES_cbc_encrypt)
+ AC_CHECK_HEADERS(openssl/evp.h)
+fi
+
+# Check for libcap-ng
+AC_MSG_CHECKING(whether to use libcap-ng)
+# Specify location for both includes and libraries.
+want_libcap_ng=ifavailable
+AC_ARG_WITH(cap_ng,
+ AS_HELP_STRING([--with-cap-ng],
+ [use libcap-ng @<:@default=yes, if available@:>@]),
+[
+ if test $withval = no
+ then
+ want_libcap_ng=no
+ AC_MSG_RESULT(no)
+ elif test $withval = yes
+ then
+ want_libcap_ng=yes
+ AC_MSG_RESULT(yes)
+ fi
+],[
+ #
+ # Use libcap-ng if it's present, otherwise don't.
+ #
+ want_libcap_ng=ifavailable
+ AC_MSG_RESULT([yes, if available])
+])
+if test "$want_libcap_ng" != "no"; then
+ AC_CHECK_LIB(cap-ng, capng_change_id)
+ AC_CHECK_HEADERS(cap-ng.h)
+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"
+fi
+
+AC_SUBST(V_CCOPT)
+AC_SUBST(V_DEFS)
+AC_SUBST(V_GROUP)
+AC_SUBST(V_INCLS)
+AC_SUBST(V_PCAPDEP)
+AC_SUBST(LOCALSRC)
+AC_SUBST(MAN_FILE_FORMATS)
+AC_SUBST(MAN_MISC_INFO)
+
+AC_PROG_INSTALL
+
+AC_CONFIG_HEADER(config.h)
+
+AC_OUTPUT_COMMANDS([if test -f .devel; then
+ echo timestamp > stamp-h
+ cat Makefile-devel-adds >> Makefile
+ make depend
+fi])
+AC_OUTPUT(Makefile tcpdump.1)
+exit 0
--- /dev/null
+/*-
+ * Copyright (c) 2003, 2004 David Young. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY DAVID YOUNG ``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 DAVID
+ * YOUNG 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.
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <tcpdump-stdinc.h>
+
+#include "cpack.h"
+#include "extract.h"
+
+uint8_t *
+cpack_next_boundary(uint8_t *buf, uint8_t *p, size_t alignment)
+{
+ size_t misalignment = (size_t)(p - buf) % alignment;
+
+ if (misalignment == 0)
+ return p;
+
+ return p + (alignment - misalignment);
+}
+
+/* Advance to the next wordsize boundary. Return NULL if fewer than
+ * wordsize bytes remain in the buffer after the boundary. Otherwise,
+ * return a pointer to the boundary.
+ */
+uint8_t *
+cpack_align_and_reserve(struct cpack_state *cs, size_t wordsize)
+{
+ uint8_t *next;
+
+ /* Ensure alignment. */
+ next = cpack_next_boundary(cs->c_buf, cs->c_next, wordsize);
+
+ /* Too little space for wordsize bytes? */
+ if (next - cs->c_buf + wordsize > cs->c_len)
+ return NULL;
+
+ return next;
+}
+
+/* Advance by N bytes without returning them. */
+int
+cpack_advance(struct cpack_state *cs, const size_t toskip)
+{
+ /* No space left? */
+ if (cs->c_next - cs->c_buf + toskip > cs->c_len)
+ return -1;
+ cs->c_next += toskip;
+ return 0;
+}
+
+int
+cpack_init(struct cpack_state *cs, uint8_t *buf, size_t buflen)
+{
+ memset(cs, 0, sizeof(*cs));
+
+ cs->c_buf = buf;
+ cs->c_len = buflen;
+ cs->c_next = cs->c_buf;
+
+ return 0;
+}
+
+/* Unpack a 64-bit unsigned integer. */
+int
+cpack_uint64(struct cpack_state *cs, uint64_t *u)
+{
+ uint8_t *next;
+
+ if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL)
+ return -1;
+
+ *u = EXTRACT_LE_64BITS(next);
+
+ /* Move pointer past the uint64_t. */
+ cs->c_next = next + sizeof(*u);
+ return 0;
+}
+
+/* Unpack a 32-bit unsigned integer. */
+int
+cpack_uint32(struct cpack_state *cs, uint32_t *u)
+{
+ uint8_t *next;
+
+ if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL)
+ return -1;
+
+ *u = EXTRACT_LE_32BITS(next);
+
+ /* Move pointer past the uint32_t. */
+ cs->c_next = next + sizeof(*u);
+ return 0;
+}
+
+/* Unpack a 16-bit unsigned integer. */
+int
+cpack_uint16(struct cpack_state *cs, uint16_t *u)
+{
+ uint8_t *next;
+
+ if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL)
+ return -1;
+
+ *u = EXTRACT_LE_16BITS(next);
+
+ /* Move pointer past the uint16_t. */
+ cs->c_next = next + sizeof(*u);
+ return 0;
+}
+
+/* Unpack an 8-bit unsigned integer. */
+int
+cpack_uint8(struct cpack_state *cs, uint8_t *u)
+{
+ /* No space left? */
+ if ((size_t)(cs->c_next - cs->c_buf) >= cs->c_len)
+ return -1;
+
+ *u = *cs->c_next;
+
+ /* Move pointer past the uint8_t. */
+ cs->c_next++;
+ return 0;
+}
--- /dev/null
+/*-
+ * Copyright (c) 2003, 2004 David Young. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY DAVID YOUNG ``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 DAVID
+ * YOUNG 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 _CPACK_H
+#define _CPACK_H
+
+struct cpack_state {
+ uint8_t *c_buf;
+ uint8_t *c_next;
+ size_t c_len;
+};
+
+int cpack_init(struct cpack_state *, uint8_t *, size_t);
+
+int cpack_uint8(struct cpack_state *, uint8_t *);
+int cpack_uint16(struct cpack_state *, uint16_t *);
+int cpack_uint32(struct cpack_state *, uint32_t *);
+int cpack_uint64(struct cpack_state *, uint64_t *);
+
+uint8_t *cpack_next_boundary(uint8_t *buf, uint8_t *p, size_t alignment);
+uint8_t *cpack_align_and_reserve(struct cpack_state *cs, size_t wordsize);
+
+#define cpack_int8(__s, __p) cpack_uint8((__s), (uint8_t*)(__p))
+#define cpack_int16(__s, __p) cpack_uint16((__s), (uint16_t*)(__p))
+#define cpack_int32(__s, __p) cpack_uint32((__s), (uint32_t*)(__p))
+#define cpack_int64(__s, __p) cpack_uint64((__s), (uint64_t*)(__p))
+
+extern int cpack_advance(struct cpack_state *, const size_t);
+
+#endif /* _CPACK_H */
--- /dev/null
+/*
+ * Copyright (c) 1982, 1986, 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.
+ *
+ * @(#)if_ether.h 8.3 (Berkeley) 5/2/95
+ */
+
+#define ETHERMTU 1500
+
+/*
+ * The number of bytes in an ethernet (MAC) address.
+ */
+#define ETHER_ADDR_LEN 6
+
+/*
+ * Structure of a DEC/Intel/Xerox or 802.3 Ethernet header.
+ */
+struct ether_header {
+ uint8_t ether_dhost[ETHER_ADDR_LEN];
+ uint8_t ether_shost[ETHER_ADDR_LEN];
+ uint16_t ether_type;
+};
+
+/*
+ * Length of a DEC/Intel/Xerox or 802.3 Ethernet header; note that some
+ * compilers may pad "struct ether_header" to a multiple of 4 bytes,
+ * for example, so "sizeof (struct ether_header)" may not give the right
+ * answer.
+ */
+#define ETHER_HDRLEN 14
--- /dev/null
+/*
+ * Copyright (c) 1993, 1994, 1996
+ * 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: (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.
+ */
+
+/*
+ * Ethernet types.
+ *
+ * We wrap the declarations with #ifdef, so that if a file includes
+ * <netinet/if_ether.h>, which may declare some of these, we don't
+ * get a bunch of complaints from the C compiler about redefinitions
+ * of these values.
+ *
+ * We declare all of them here so that no file has to include
+ * <netinet/if_ether.h> if all it needs are ETHERTYPE_ values.
+ */
+
+#ifndef ETHERTYPE_LEN
+#define ETHERTYPE_LEN 2
+#endif
+
+#ifndef ETHERTYPE_GRE_ISO
+#define ETHERTYPE_GRE_ISO 0x00FE /* not really an ethertype only used in GRE */
+#endif
+#ifndef ETHERTYPE_PUP
+#define ETHERTYPE_PUP 0x0200 /* PUP protocol */
+#endif
+#ifndef ETHERTYPE_IP
+#define ETHERTYPE_IP 0x0800 /* IP protocol */
+#endif
+#ifndef ETHERTYPE_ARP
+#define ETHERTYPE_ARP 0x0806 /* Addr. resolution protocol */
+#endif
+#ifndef ETHERTYPE_REVARP
+#define ETHERTYPE_REVARP 0x8035 /* reverse Addr. resolution protocol */
+#endif
+#ifndef ETHERTYPE_NS
+#define ETHERTYPE_NS 0x0600
+#endif
+#ifndef ETHERTYPE_SPRITE
+#define ETHERTYPE_SPRITE 0x0500
+#endif
+#ifndef ETHERTYPE_TRAIL
+#define ETHERTYPE_TRAIL 0x1000
+#endif
+#ifndef ETHERTYPE_MOPDL
+#define ETHERTYPE_MOPDL 0x6001
+#endif
+#ifndef ETHERTYPE_MOPRC
+#define ETHERTYPE_MOPRC 0x6002
+#endif
+#ifndef ETHERTYPE_DN
+#define ETHERTYPE_DN 0x6003
+#endif
+#ifndef ETHERTYPE_LAT
+#define ETHERTYPE_LAT 0x6004
+#endif
+#ifndef ETHERTYPE_SCA
+#define ETHERTYPE_SCA 0x6007
+#endif
+#ifndef ETHERTYPE_TEB
+#define ETHERTYPE_TEB 0x6558
+#endif
+#ifndef ETHERTYPE_LANBRIDGE
+#define ETHERTYPE_LANBRIDGE 0x8038
+#endif
+#ifndef ETHERTYPE_DECDNS
+#define ETHERTYPE_DECDNS 0x803c
+#endif
+#ifndef ETHERTYPE_DECDTS
+#define ETHERTYPE_DECDTS 0x803e
+#endif
+#ifndef ETHERTYPE_VEXP
+#define ETHERTYPE_VEXP 0x805b
+#endif
+#ifndef ETHERTYPE_VPROD
+#define ETHERTYPE_VPROD 0x805c
+#endif
+#ifndef ETHERTYPE_ATALK
+#define ETHERTYPE_ATALK 0x809b
+#endif
+#ifndef ETHERTYPE_AARP
+#define ETHERTYPE_AARP 0x80f3
+#endif
+#ifndef ETHERTYPE_TIPC
+#define ETHERTYPE_TIPC 0x88ca
+#endif
+#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
+#ifndef ETHERTYPE_IPV6
+#define ETHERTYPE_IPV6 0x86dd
+#endif
+#ifndef ETHERTYPE_PPP
+#define ETHERTYPE_PPP 0x880b
+#endif
+#ifndef ETHERTYPE_MPCP
+#define ETHERTYPE_MPCP 0x8808
+#endif
+#ifndef ETHERTYPE_SLOW
+#define ETHERTYPE_SLOW 0x8809
+#endif
+#ifndef ETHERTYPE_MPLS
+#define ETHERTYPE_MPLS 0x8847
+#endif
+#ifndef ETHERTYPE_MPLS_MULTI
+#define ETHERTYPE_MPLS_MULTI 0x8848
+#endif
+#ifndef ETHERTYPE_PPPOED
+#define ETHERTYPE_PPPOED 0x8863
+#endif
+#ifndef ETHERTYPE_PPPOES
+#define ETHERTYPE_PPPOES 0x8864
+#endif
+#ifndef ETHERTYPE_PPPOED2
+#define ETHERTYPE_PPPOED2 0x3c12
+#endif
+#ifndef ETHERTYPE_PPPOES2
+#define ETHERTYPE_PPPOES2 0x3c13
+#endif
+#ifndef ETHERTYPE_MS_NLB_HB
+#define ETHERTYPE_MS_NLB_HB 0x886f /* MS Network Load Balancing Heartbeat */
+#endif
+#ifndef ETHERTYPE_JUMBO
+#define ETHERTYPE_JUMBO 0x8870
+#endif
+#ifndef ETHERTYPE_LLDP
+#define ETHERTYPE_LLDP 0x88cc
+#endif
+#ifndef ETHERTYPE_EAPOL
+#define ETHERTYPE_EAPOL 0x888e
+#endif
+#ifndef ETHERTYPE_RRCP
+#define ETHERTYPE_RRCP 0x8899
+#endif
+#ifndef ETHERTYPE_AOE
+#define ETHERTYPE_AOE 0x88a2
+#endif
+#ifndef ETHERTYPE_LOOPBACK
+#define ETHERTYPE_LOOPBACK 0x9000
+#endif
+#ifndef ETHERTYPE_VMAN
+#define ETHERTYPE_VMAN 0x9100 /* Extreme VMAN Protocol */
+#endif
+#ifndef ETHERTYPE_CFM_OLD
+#define ETHERTYPE_CFM_OLD 0xabcd /* 802.1ag depreciated */
+#endif
+#ifndef ETHERTYPE_CFM
+#define ETHERTYPE_CFM 0x8902 /* 802.1ag */
+#endif
+#ifndef ETHERTYPE_IEEE1905_1
+#define ETHERTYPE_IEEE1905_1 0x893a /* IEEE 1905.1 */
+#endif
+#ifndef ETHERTYPE_ISO
+#define ETHERTYPE_ISO 0xfefe /* nonstandard - used in Cisco HDLC encapsulation */
+#endif
+#ifndef ETHERTYPE_CALM_FAST
+#define ETHERTYPE_CALM_FAST 0x1111 /* ISO CALM FAST */
+#endif
+#ifndef ETHERTYPE_GEONET_OLD
+#define ETHERTYPE_GEONET_OLD 0x0707 /* ETSI GeoNetworking (before Jan 2013) */
+#endif
+#ifndef ETHERTYPE_GEONET
+#define ETHERTYPE_GEONET 0x8947 /* ETSI GeoNetworking (Official IEEE registration from Jan 2013) */
+#endif
+
+extern const struct tok ethertype_values[];
--- /dev/null
+/*
+ * Copyright (c) 1992, 1993, 1994, 1995, 1996
+ * 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: (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 __NetBSD__
+#include <string.h>
+
+/*
+ * Do it the portable way and let the compiler optimize the code
+ */
+static inline uint16_t EXTRACT_16BITS(const void *p)
+{
+ uint16_t t;
+ memcpy(&t, p, sizeof(t));
+ return ntohs(t);
+}
+
+static inline uint32_t EXTRACT_24BITS(const void *p)
+{
+ uint8_t t[3];
+ memcpy(t, p, sizeof(t));
+ return
+ ((uint32_t)t[0] << 16) |
+ ((uint32_t)t[1] << 8) |
+ t[2];
+}
+
+static inline uint32_t EXTRACT_32BITS(const void *p)
+{
+ uint32_t t;
+ memcpy(&t, p, sizeof(t));
+ return ntohl(t);
+}
+
+
+static inline uint64_t EXTRACT_48BITS(const void *p)
+{
+ uint8_t t[6];
+ memcpy(t, p, sizeof(t));
+ return
+ ((uint64_t)t[0] << 40) |
+ ((uint64_t)t[1] << 32) |
+ ((uint64_t)t[2] << 24) |
+ ((uint64_t)t[3] << 16) |
+ ((uint64_t)t[4] << 8) |
+ t[5];
+}
+
+static inline uint64_t EXTRACT_64BITS(const void *p)
+{
+ uint32_t t[2];
+ memcpy(&t[0], p, sizeof(t[0]));
+ memcpy(&t[1], (const uint8_t *)p + sizeof(t[0]), sizeof(t[1]));
+ return ((uint64_t)ntohl(t[0]) << 32) | ntohl(t[1]);
+}
+
+static inline uint8_t EXTRACT_LE_8BITS(const void *p)
+{
+ uint8_t t[1];
+ memcpy(t, p, sizeof(t));
+ return t[0];
+}
+
+static inline uint16_t EXTRACT_LE_16BITS(const void *p)
+{
+ uint8_t t[2];
+ memcpy(t, p, sizeof(t));
+ return
+ ((uint16_t)t[1] << 8) |
+ t[0];
+}
+
+static inline uint32_t EXTRACT_LE_24BITS(const void *p)
+{
+ uint8_t t[3];
+ memcpy(t, p, sizeof(t));
+ return
+ ((uint32_t)t[2] << 16) |
+ ((uint32_t)t[1] << 8) |
+ t[0];
+}
+
+static inline uint32_t EXTRACT_LE_32BITS(const void *p)
+{
+ uint8_t t[4];
+ memcpy(t, p, sizeof(t));
+ return
+ ((uint32_t)t[3] << 24) |
+ ((uint32_t)t[2] << 16) |
+ ((uint32_t)t[1] << 8) |
+ t[0];
+}
+
+static inline uint64_t EXTRACT_LE_64BITS(const void *p)
+{
+ uint8_t t[8];
+ memcpy(&t, p, sizeof(t));
+ return
+ ((uint64_t)t[7] << 56) |
+ ((uint64_t)t[6] << 48) |
+ ((uint64_t)t[5] << 40) |
+ ((uint64_t)t[4] << 32) |
+ ((uint64_t)t[3] << 24) |
+ ((uint64_t)t[2] << 16) |
+ ((uint64_t)t[1] << 8) |
+ t[0];
+}
+
+#else /* Fast & Loose */
+/*
+ * Macros to extract possibly-unaligned big-endian integral values.
+ */
+#ifdef LBL_ALIGN
+/*
+ * The processor doesn't natively handle unaligned loads.
+ */
+#if defined(__GNUC__) && defined(HAVE___ATTRIBUTE__) && \
+ (defined(__alpha) || defined(__alpha__) || \
+ defined(__mips) || defined(__mips__))
+
+/*
+ * This is a GCC-compatible compiler and we have __attribute__, which
+ * we assume that mean we have __attribute__((packed)), and this is
+ * MIPS or Alpha, which has instructions that can help when doing
+ * unaligned loads.
+ *
+ * Declare packed structures containing a uint16_t and a uint32_t,
+ * cast the pointer to point to one of those, and fetch through it;
+ * the GCC manual doesn't appear to explicitly say that
+ * __attribute__((packed)) causes the compiler to generate unaligned-safe
+ * code, but it apppears to do so.
+ *
+ * We do this in case the compiler can generate code using those
+ * instructions to do an unaligned load and pass stuff to "ntohs()" or
+ * "ntohl()", which might be better than than the code to fetch the
+ * bytes one at a time and assemble them. (That might not be the
+ * case on a little-endian platform, such as DEC's MIPS machines and
+ * Alpha machines, where "ntohs()" and "ntohl()" might not be done
+ * inline.)
+ *
+ * We do this only for specific architectures because, for example,
+ * at least some versions of GCC, when compiling for 64-bit SPARC,
+ * generate code that assumes alignment if we do this.
+ *
+ * XXX - add other architectures and compilers as possible and
+ * appropriate.
+ *
+ * HP's C compiler, indicated by __HP_cc being defined, supports
+ * "#pragma unaligned N" in version A.05.50 and later, where "N"
+ * specifies a number of bytes at which the typedef on the next
+ * line is aligned, e.g.
+ *
+ * #pragma unalign 1
+ * typedef uint16_t unaligned_uint16_t;
+ *
+ * to define unaligned_uint16_t as a 16-bit unaligned data type.
+ * This could be presumably used, in sufficiently recent versions of
+ * the compiler, with macros similar to those below. This would be
+ * useful only if that compiler could generate better code for PA-RISC
+ * or Itanium than would be generated by a bunch of shifts-and-ORs.
+ *
+ * DEC C, indicated by __DECC being defined, has, at least on Alpha,
+ * an __unaligned qualifier that can be applied to pointers to get the
+ * compiler to generate code that does unaligned loads and stores when
+ * dereferencing the pointer in question.
+ *
+ * XXX - what if the native C compiler doesn't support
+ * __attribute__((packed))? How can we get it to generate unaligned
+ * accesses for *specific* items?
+ */
+typedef struct {
+ uint16_t val;
+} __attribute__((packed)) unaligned_uint16_t;
+
+typedef struct {
+ uint32_t val;
+} __attribute__((packed)) unaligned_uint32_t;
+
+static inline uint16_t
+EXTRACT_16BITS(const void *p)
+{
+ return ((uint16_t)ntohs(((const unaligned_uint16_t *)(p))->val));
+}
+
+static inline uint32_t
+EXTRACT_32BITS(const void *p)
+{
+ return ((uint32_t)ntohl(((const unaligned_uint32_t *)(p))->val));
+}
+
+static inline uint64_t
+EXTRACT_64BITS(const void *p)
+{
+ return ((uint64_t)(((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 0)->val)) << 32 | \
+ ((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 1)->val)) << 0));
+}
+
+#else /* have to do it a byte at a time */
+/*
+ * This isn't a GCC-compatible compiler, we don't have __attribute__,
+ * or we do but we don't know of any better way with this instruction
+ * set to do unaligned loads, so do unaligned loads of big-endian
+ * quantities the hard way - fetch the bytes one at a time and
+ * assemble them.
+ */
+#define EXTRACT_16BITS(p) \
+ ((uint16_t)(((uint16_t)(*((const uint8_t *)(p) + 0)) << 8) | \
+ ((uint16_t)(*((const uint8_t *)(p) + 1)) << 0)))
+#define EXTRACT_32BITS(p) \
+ ((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 24) | \
+ ((uint32_t)(*((const uint8_t *)(p) + 1)) << 16) | \
+ ((uint32_t)(*((const uint8_t *)(p) + 2)) << 8) | \
+ ((uint32_t)(*((const uint8_t *)(p) + 3)) << 0)))
+#define EXTRACT_64BITS(p) \
+ ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 56) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 1)) << 48) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 2)) << 40) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 3)) << 32) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 4)) << 24) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 5)) << 16) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 6)) << 8) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 7)) << 0)))
+#endif /* must special-case unaligned accesses */
+#else /* LBL_ALIGN */
+/*
+ * The processor natively handles unaligned loads, so we can just
+ * cast the pointer and fetch through it.
+ */
+static inline uint16_t
+EXTRACT_16BITS(const void *p)
+{
+ return ((uint16_t)ntohs(*(const uint16_t *)(p)));
+}
+
+static inline uint32_t
+EXTRACT_32BITS(const void *p)
+{
+ return ((uint32_t)ntohl(*(const uint32_t *)(p)));
+}
+
+static inline uint64_t
+EXTRACT_64BITS(const void *p)
+{
+ return ((uint64_t)(((uint64_t)ntohl(*((const uint32_t *)(p) + 0))) << 32 | \
+ ((uint64_t)ntohl(*((const uint32_t *)(p) + 1))) << 0));
+
+}
+
+#endif /* LBL_ALIGN */
+
+#define EXTRACT_24BITS(p) \
+ ((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 16) | \
+ ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
+ ((uint32_t)(*((const uint8_t *)(p) + 2)) << 0)))
+
+#define EXTRACT_40BITS(p) \
+ ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 32) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 1)) << 24) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 3)) << 8) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 4)) << 0)))
+
+#define EXTRACT_48BITS(p) \
+ ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 40) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 1)) << 32) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 2)) << 24) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 3)) << 16) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 4)) << 8) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 5)) << 0)))
+
+#define EXTRACT_56BITS(p) \
+ ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 48) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 1)) << 40) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 2)) << 32) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 4)) << 16) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 5)) << 8) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 6)) << 0)))
+
+/*
+ * Macros to extract possibly-unaligned little-endian integral values.
+ * XXX - do loads on little-endian machines that support unaligned loads?
+ */
+#define EXTRACT_LE_8BITS(p) (*(p))
+#define EXTRACT_LE_16BITS(p) \
+ ((uint16_t)(((uint16_t)(*((const uint8_t *)(p) + 1)) << 8) | \
+ ((uint16_t)(*((const uint8_t *)(p) + 0)) << 0)))
+#define EXTRACT_LE_32BITS(p) \
+ ((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 3)) << 24) | \
+ ((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
+ ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
+ ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
+#define EXTRACT_LE_24BITS(p) \
+ ((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
+ ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
+ ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
+#define EXTRACT_LE_64BITS(p) \
+ ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 7)) << 56) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 6)) << 48) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 5)) << 40) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) | \
+ ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))
+#endif /* __NetBSD__ */
--- /dev/null
+/* NetBSD: getopt.h,v 1.4 2000/07/07 10:43:54 ad Exp */
+/* $FreeBSD$ */
+
+/*-
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Dieter Baron and Thomas Klausner.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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 _GETOPT_LONG_H_
+#define _GETOPT_LONG_H_
+
+/*
+ * GNU-like getopt_long()/getopt_long_only() with 4.4BSD optreset extension.
+ * getopt() is declared here too for GNU programs.
+ */
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+struct option {
+ /* name of long option */
+ const char *name;
+ /*
+ * one of no_argument, required_argument, and optional_argument:
+ * whether option takes an argument
+ */
+ int has_arg;
+ /* if not NULL, set *flag to val when option found */
+ int *flag;
+ /* if flag not NULL, value to set *flag to; else return value */
+ int val;
+};
+
+int getopt_long(int, char * const *, const char *,
+ const struct option *, int *);
+int getopt_long_only(int, char * const *, const char *,
+ const struct option *, int *);
+
+extern char *optarg; /* getopt(3) external variables */
+extern int optind, opterr, optopt;
+
+#endif /* !_GETOPT_LONG_H_ */
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: gmpls.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "gmpls.h"
+
+/* rfc3471 */
+const struct tok gmpls_link_prot_values[] = {
+ { 0x01, "Extra Traffic"},
+ { 0x02, "Unprotected"},
+ { 0x04, "Shared"},
+ { 0x08, "Dedicated 1:1"},
+ { 0x10, "Dedicated 1+1"},
+ { 0x20, "Enhanced"},
+ { 0x40, "Reserved"},
+ { 0x80, "Reserved"},
+ { 0, NULL }
+};
+
+/* rfc3471 */
+const struct tok gmpls_switch_cap_values[] = {
+ { GMPLS_PSC1, "Packet-Switch Capable-1"},
+ { GMPLS_PSC2, "Packet-Switch Capable-2"},
+ { GMPLS_PSC3, "Packet-Switch Capable-3"},
+ { GMPLS_PSC4, "Packet-Switch Capable-4"},
+ { GMPLS_L2SC, "Layer-2 Switch Capable"},
+ { GMPLS_TSC, "Time-Division-Multiplex"},
+ { GMPLS_LSC, "Lambda-Switch Capable"},
+ { GMPLS_FSC, "Fiber-Switch Capable"},
+ { 0, NULL }
+};
+
+/* rfc4205 */
+const struct tok gmpls_switch_cap_tsc_indication_values[] = {
+ { 0, "Standard SONET/SDH" },
+ { 1, "Arbitrary SONET/SDH" },
+ { 0, NULL }
+};
+
+/* rfc3471 */
+const struct tok gmpls_encoding_values[] = {
+ { 1, "Packet"},
+ { 2, "Ethernet V2/DIX"},
+ { 3, "ANSI/ETSI PDH"},
+ { 4, "Reserved"},
+ { 5, "SDH ITU-T G.707/SONET ANSI T1.105"},
+ { 6, "Reserved"},
+ { 7, "Digital Wrapper"},
+ { 8, "Lambda (photonic)"},
+ { 9, "Fiber"},
+ { 10, "Reserved"},
+ { 11, "FiberChannel"},
+ { 0, NULL }
+};
+
+/* rfc3471 */
+const struct tok gmpls_payload_values[] = {
+ { 0, "Unknown"},
+ { 1, "Reserved"},
+ { 2, "Reserved"},
+ { 3, "Reserved"},
+ { 4, "Reserved"},
+ { 5, "Asynchronous mapping of E4"},
+ { 6, "Asynchronous mapping of DS3/T3"},
+ { 7, "Asynchronous mapping of E3"},
+ { 8, "Bit synchronous mapping of E3"},
+ { 9, "Byte synchronous mapping of E3"},
+ { 10, "Asynchronous mapping of DS2/T2"},
+ { 11, "Bit synchronous mapping of DS2/T2"},
+ { 12, "Reserved"},
+ { 13, "Asynchronous mapping of E1"},
+ { 14, "Byte synchronous mapping of E1"},
+ { 15, "Byte synchronous mapping of 31 * DS0"},
+ { 16, "Asynchronous mapping of DS1/T1"},
+ { 17, "Bit synchronous mapping of DS1/T1"},
+ { 18, "Byte synchronous mapping of DS1/T1"},
+ { 19, "VC-11 in VC-12"},
+ { 20, "Reserved"},
+ { 21, "Reserved"},
+ { 22, "DS1 SF Asynchronous"},
+ { 23, "DS1 ESF Asynchronous"},
+ { 24, "DS3 M23 Asynchronous"},
+ { 25, "DS3 C-Bit Parity Asynchronous"},
+ { 26, "VT/LOVC"},
+ { 27, "STS SPE/HOVC"},
+ { 28, "POS - No Scrambling, 16 bit CRC"},
+ { 29, "POS - No Scrambling, 32 bit CRC"},
+ { 30, "POS - Scrambling, 16 bit CRC"},
+ { 31, "POS - Scrambling, 32 bit CRC"},
+ { 32, "ATM mapping"},
+ { 33, "Ethernet PHY"},
+ { 34, "SONET/SDH"},
+ { 35, "Reserved (SONET deprecated)"},
+ { 36, "Digital Wrapper"},
+ { 37, "Lambda"},
+ { 38, "ANSI/ETSI PDH"},
+ { 39, "Reserved"},
+ { 40, "Link Access Protocol SDH (X.85 and X.86)"},
+ { 41, "FDDI"},
+ { 42, "DQDB (ETSI ETS 300 216)"},
+ { 43, "FiberChannel-3 (Services)"},
+ { 44, "HDLC"},
+ { 45, "Ethernet V2/DIX (only)"},
+ { 46, "Ethernet 802.3 (only)"},
+/* draft-ietf-ccamp-gmpls-g709-04.txt */
+ { 47, "G.709 ODUj"},
+ { 48, "G.709 OTUk(v)"},
+ { 49, "CBR/CBRa"},
+ { 50, "CBRb"},
+ { 51, "BSOT"},
+ { 52, "BSNT"},
+ { 53, "IP/PPP (GFP)"},
+ { 54, "Ethernet MAC (framed GFP)"},
+ { 55, "Ethernet PHY (transparent GFP)"},
+ { 56, "ESCON"},
+ { 57, "FICON"},
+ { 58, "Fiber Channel"},
+ { 0, NULL }
+};
+
+/*
+ * Link Type values used by LMP Service Discovery (specifically, the Client
+ * Port Service Attributes Object). See UNI 1.0 section 9.4.2 for details.
+ */
+const struct tok lmp_sd_service_config_cpsa_link_type_values[] = {
+ { 5, "SDH ITU-T G.707"},
+ { 6, "SONET ANSI T1.105"},
+ { 0, NULL}
+};
+
+/*
+ * Signal Type values for SDH links used by LMP Service Discovery (specifically,
+ * the Client Port Service Attributes Object). See UNI 1.0 section 9.4.2 for
+ * details.
+ */
+const struct tok lmp_sd_service_config_cpsa_signal_type_sdh_values[] = {
+ { 5, "VC-3"},
+ { 6, "VC-4"},
+ { 7, "STM-0"},
+ { 8, "STM-1"},
+ { 9, "STM-4"},
+ { 10, "STM-16"},
+ { 11, "STM-64"},
+ { 12, "STM-256"},
+ { 0, NULL}
+};
+
+/*
+ * Signal Type values for SONET links used by LMP Service Discovery (specifically,
+ * the Client Port Service Attributes Object). See UNI 1.0 section 9.4.2 for
+ * details.
+ */
+const struct tok lmp_sd_service_config_cpsa_signal_type_sonet_values[] = {
+ { 5, "STS-1 SPE"},
+ { 6, "STS-3c SPE"},
+ { 7, "STS-1"},
+ { 8, "STM-3"},
+ { 9, "STM-12"},
+ { 10, "STM-48"},
+ { 11, "STM-192"},
+ { 12, "STM-768"},
+ { 0, NULL}
+};
+
+#define DIFFSERV_BC_MODEL_RDM 0 /* draft-ietf-tewg-diff-te-proto-07 */
+#define DIFFSERV_BC_MODEL_MAM 1 /* draft-ietf-tewg-diff-te-proto-07 */
+#define DIFFSERV_BC_MODEL_EXTD_MAM 254 /* experimental */
+
+const struct tok diffserv_te_bc_values[] = {
+ { DIFFSERV_BC_MODEL_RDM, "Russian dolls"},
+ { DIFFSERV_BC_MODEL_MAM, "Maximum allocation"},
+ { DIFFSERV_BC_MODEL_EXTD_MAM, "Maximum allocation with E-LSP support"},
+ { 0, NULL }
+};
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#define GMPLS_PSC1 1
+#define GMPLS_PSC2 2
+#define GMPLS_PSC3 3
+#define GMPLS_PSC4 4
+#define GMPLS_L2SC 51
+#define GMPLS_TSC 100
+#define GMPLS_LSC 150
+#define GMPLS_FSC 200
+
+extern const struct tok gmpls_link_prot_values[];
+extern const struct tok gmpls_switch_cap_values[];
+extern const struct tok gmpls_switch_cap_tsc_indication_values[];
+extern const struct tok gmpls_encoding_values[];
+extern const struct tok gmpls_payload_values[];
+extern const struct tok diffserv_te_bc_values[];
+extern const struct tok lmp_sd_service_config_cpsa_link_type_values[];
+extern const struct tok lmp_sd_service_config_cpsa_signal_type_sdh_values[];
+extern const struct tok lmp_sd_service_config_cpsa_signal_type_sonet_values[];
--- /dev/null
+/*
+ * Copyright (c) 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: gmt2local.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+
+#ifdef HAVE_OS_PROTO_H
+#include "os-proto.h"
+#endif
+
+#include "gmt2local.h"
+
+/*
+ * Returns the difference between gmt and local time in seconds.
+ * Use gmtime() and localtime() to keep things simple.
+ */
+int32_t
+gmt2local(time_t t)
+{
+ register int dt, dir;
+ register struct tm *gmt, *loc;
+ struct tm sgmt;
+
+ if (t == 0)
+ t = time(NULL);
+ gmt = &sgmt;
+ *gmt = *gmtime(&t);
+ loc = localtime(&t);
+ dt = (loc->tm_hour - gmt->tm_hour) * 60 * 60 +
+ (loc->tm_min - gmt->tm_min) * 60;
+
+ /*
+ * If the year or julian day is different, we span 00:00 GMT
+ * and must add or subtract a day. Check the year first to
+ * avoid problems when the julian day wraps.
+ */
+ dir = loc->tm_year - gmt->tm_year;
+ if (dir == 0)
+ dir = loc->tm_yday - gmt->tm_yday;
+ dt += dir * 24 * 60 * 60;
+
+ return (dt);
+}
--- /dev/null
+/*
+ * Copyright (c) 1997
+ * 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: (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.
+ */
+#ifndef gmt2local_h
+#define gmt2local_h
+
+int32_t gmt2local(time_t);
+#endif
--- /dev/null
+/* 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
+ */
+
+#define NETDISSECT_REWORKED
+#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);}
+
+uint16_t
+in_cksum(const struct cksum_vec *vec, int veclen)
+{
+ register const uint16_t *w;
+ register int sum = 0;
+ register int mlen = 0;
+ int byte_swapped = 0;
+
+ union {
+ uint8_t c[2];
+ uint16_t s;
+ } s_util;
+ union {
+ uint16_t s[2];
+ uint32_t l;
+ } l_util;
+
+ for (; veclen != 0; vec++, veclen--) {
+ if (vec->len == 0)
+ continue;
+ w = (const uint16_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 uint8_t *)w;
+ sum += s_util.s;
+ w = (const uint16_t *)(void *)((const uint8_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 uint8_t *)w;
+ w = (const uint16_t *)(void *)((const uint8_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 uint8_t *)w;
+ sum += s_util.s;
+ mlen = 0;
+ } else
+ mlen = -1;
+ } else if (mlen == -1)
+ s_util.c[0] = *(const uint8_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.
+ */
+uint16_t
+in_cksum_shouldbe(uint16_t sum, uint16_t computed_sum)
+{
+ uint32_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;
+}
--- /dev/null
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
--- /dev/null
+/* $NetBSD: interface.h,v 1.6 2015/03/31 21:59:35 christos Exp $ */
+
+/*
+ * Copyright (c) 1988-2002
+ * 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: (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.
+ */
+
+#ifndef tcpdump_interface_h
+#define tcpdump_interface_h
+
+#ifdef HAVE_OS_PROTO_H
+#include "os-proto.h"
+#endif
+
+/* snprintf et al */
+
+#include <stdarg.h>
+
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+#if !defined(HAVE_SNPRINTF)
+int snprintf(char *, size_t, const char *, ...)
+#ifdef __ATTRIBUTE___FORMAT_OK
+ __attribute__((format(printf, 3, 4)))
+#endif /* __ATTRIBUTE___FORMAT_OK */
+ ;
+#endif /* !defined(HAVE_SNPRINTF) */
+
+#if !defined(HAVE_VSNPRINTF)
+int vsnprintf(char *, size_t, const char *, va_list)
+#ifdef __ATTRIBUTE___FORMAT_OK
+ __attribute__((format(printf, 3, 0)))
+#endif /* __ATTRIBUTE___FORMAT_OK */
+ ;
+#endif /* !defined(HAVE_VSNPRINTF) */
+
+#ifndef HAVE_STRLCAT
+extern size_t strlcat(char *, const char *, size_t);
+#endif
+#ifndef HAVE_STRLCPY
+extern size_t strlcpy(char *, const char *, size_t);
+#endif
+
+#ifndef HAVE_STRDUP
+extern char *strdup(const char *);
+#endif
+
+#ifndef HAVE_STRSEP
+extern char *strsep(char **, const char *);
+#endif
+
+#define PT_VAT 1 /* Visual Audio Tool */
+#define PT_WB 2 /* distributed White Board */
+#define PT_RPC 3 /* Remote Procedure Call */
+#define PT_RTP 4 /* Real-Time Applications protocol */
+#define PT_RTCP 5 /* Real-Time Applications control protocol */
+#define PT_SNMP 6 /* Simple Network Management Protocol */
+#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 */
+#define PT_RADIUS 11 /* RADIUS authentication Protocol */
+#define PT_ZMTP1 12 /* ZeroMQ Message Transport Protocol 1.0 */
+#define PT_VXLAN 13 /* Virtual eXtensible Local Area Network */
+#define PT_PGM 14 /* [UDP-encapsulated] Pragmatic General Multicast */
+#define PT_PGM_ZMTP1 15 /* ZMTP/1.0 inside PGM (native or UDP-encapsulated) */
+#define PT_LMP 16 /* Link Management Protocol */
+
+#define ESRC(ep) ((ep)->ether_shost)
+#define EDST(ep) ((ep)->ether_dhost)
+
+#ifndef NTOHL
+#define NTOHL(x) (x) = ntohl(x)
+#define NTOHS(x) (x) = ntohs(x)
+#define HTONL(x) (x) = htonl(x)
+#define HTONS(x) (x) = htons(x)
+#endif
+#endif
+
+extern char *program_name; /* used to generate self-identifying messages */
+
+extern int32_t thiszone; /* seconds offset from gmt to local time */
+
+/*
+ * True if "l" bytes of "var" were captured.
+ *
+ * The "snapend - (l) <= snapend" checks to make sure "l" isn't so large
+ * that "snapend - (l)" underflows.
+ *
+ * The check is for <= rather than < because "l" might be 0.
+ *
+ * We cast the pointers to uintptr_t to make sure that the compiler
+ * doesn't optimize away any of these tests (which it is allowed to
+ * do, as adding an integer to, or subtracting an integer from, a
+ * pointer assumes that the pointer is a pointer to an element of an
+ * array and that the result of the addition or subtraction yields a
+ * pointer to another member of the array, so that, for example, if
+ * you subtract a positive integer from a pointer, the result is
+ * guaranteed to be less than the original pointer value). See
+ *
+ * http://www.kb.cert.org/vuls/id/162289
+ */
+#define TTEST2(var, l) \
+ ((uintptr_t)snapend - (l) <= (uintptr_t)snapend && \
+ (uintptr_t)&(var) <= (uintptr_t)snapend - (l))
+
+/* True if "var" was captured */
+#define TTEST(var) TTEST2(var, sizeof(var))
+
+/* Bail if "l" bytes of "var" were not captured */
+#define TCHECK2(var, l) if (!TTEST2(var, l)) goto trunc
+
+/* Bail if "var" was not captured */
+#define TCHECK(var) TCHECK2(var, sizeof(var))
+
+extern int mask2plen(uint32_t);
+extern const char *tok2strary_internal(const char **, int, const char *, int);
+#define tok2strary(a,f,i) tok2strary_internal(a, sizeof(a)/sizeof(a[0]),f,i)
+
+extern void error(const char *, ...)
+ __attribute__((noreturn))
+#ifdef __ATTRIBUTE___FORMAT_OK
+ __attribute__((format (printf, 1, 2)))
+#endif /* __ATTRIBUTE___FORMAT_OK */
+ ;
+extern void warning(const char *, ...)
+#ifdef __ATTRIBUTE___FORMAT_OK
+ __attribute__((format (printf, 1, 2)))
+#endif /* __ATTRIBUTE___FORMAT_OK */
+ ;
+
+extern char *read_infile(char *);
+extern char *copy_argv(char **);
+
+extern const char *dnname_string(u_short);
+extern const char *dnnum_string(u_short);
+
+/* checksum routines */
+extern void init_checksum(void);
+extern uint16_t verify_crc10_cksum(uint16_t, const u_char *, int);
+extern uint16_t create_osi_cksum(const uint8_t *, int, int);
+
+/* The printer routines. */
+
+#include <pcap.h>
+
+extern char *smb_errstr(int, int);
+extern const char *nt_errstr(uint32_t);
+
+#ifdef INET6
+extern int mask62plen(const u_char *);
+#endif /*INET6*/
+
+struct cksum_vec {
+ const uint8_t *ptr;
+ int len;
+};
+extern uint16_t in_cksum(const struct cksum_vec *, int);
+extern uint16_t in_cksum_shouldbe(uint16_t, uint16_t);
+
+#ifndef HAVE_BPF_DUMP
+struct bpf_program;
+
+extern void bpf_dump(const struct bpf_program *, int);
+
+#endif
+
+#include "netdissect.h"
+
+/* forward compatibility */
+
+#ifndef NETDISSECT_REWORKED
+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
+#define Oflag gndo->ndo_Oflag
+#define pflag gndo->ndo_pflag
+#define qflag gndo->ndo_qflag
+#define Rflag gndo->ndo_Rflag
+#define sflag gndo->ndo_sflag
+#define Sflag gndo->ndo_Sflag
+#define tflag gndo->ndo_tflag
+#define Uflag gndo->ndo_Uflag
+#define uflag gndo->ndo_uflag
+#define vflag gndo->ndo_vflag
+#define xflag gndo->ndo_xflag
+#define Xflag gndo->ndo_Xflag
+#define Cflag gndo->ndo_Cflag
+#define Gflag gndo->ndo_Gflag
+#define Aflag gndo->ndo_Aflag
+#define Bflag gndo->ndo_Bflag
+#define Iflag gndo->ndo_Iflag
+#define suppress_default_print gndo->ndo_suppress_default_print
+#define packettype gndo->ndo_packettype
+#define sigsecret gndo->ndo_sigsecret
+#define Wflag gndo->ndo_Wflag
+#define WflagChars gndo->ndo_WflagChars
+#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
+
+extern void default_print(const u_char *, u_int);
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 1982, 1986, 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.
+ *
+ * @(#)ip.h 8.2 (Berkeley) 6/1/94
+ */
+
+#ifndef TCPDUMP_IP_H
+#define TCPDUMP_IP_H
+
+#include "tcpdump-stdinc.h"
+
+/*
+ * Definitions for internet protocol version 4.
+ * Per RFC 791, September 1981.
+ */
+#define IPVERSION 4
+
+/*
+ * Structure of an internet header, naked of options.
+ *
+ * We declare ip_len and ip_off to be short, rather than u_short
+ * pragmatically since otherwise unsigned comparisons can result
+ * against negative integers quite easily, and fail in subtle ways.
+ */
+struct ip {
+ uint8_t ip_vhl; /* header length, version */
+#define IP_V(ip) (((ip)->ip_vhl & 0xf0) >> 4)
+#define IP_HL(ip) ((ip)->ip_vhl & 0x0f)
+ uint8_t ip_tos; /* type of service */
+ uint16_t ip_len; /* total length */
+ uint16_t ip_id; /* identification */
+ uint16_t ip_off; /* fragment offset field */
+#define IP_DF 0x4000 /* dont fragment flag */
+#define IP_MF 0x2000 /* more fragments flag */
+#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
+ uint8_t ip_ttl; /* time to live */
+ uint8_t ip_p; /* protocol */
+ uint16_t ip_sum; /* checksum */
+ struct in_addr ip_src,ip_dst; /* source and dest address */
+} UNALIGNED;
+
+#define IP_MAXPACKET 65535 /* maximum packet size */
+
+/*
+ * Definitions for IP type of service (ip_tos)
+ */
+#define IPTOS_LOWDELAY 0x10
+#define IPTOS_THROUGHPUT 0x08
+#define IPTOS_RELIABILITY 0x04
+
+/*
+ * Definitions for IP precedence (also in ip_tos) (hopefully unused)
+ */
+#define IPTOS_PREC_NETCONTROL 0xe0
+#define IPTOS_PREC_INTERNETCONTROL 0xc0
+#define IPTOS_PREC_CRITIC_ECP 0xa0
+#define IPTOS_PREC_FLASHOVERRIDE 0x80
+#define IPTOS_PREC_FLASH 0x60
+#define IPTOS_PREC_IMMEDIATE 0x40
+#define IPTOS_PREC_PRIORITY 0x20
+#define IPTOS_PREC_ROUTINE 0x00
+
+/*
+ * Definitions for options.
+ */
+#define IPOPT_COPIED(o) ((o)&0x80)
+#define IPOPT_CLASS(o) ((o)&0x60)
+#define IPOPT_NUMBER(o) ((o)&0x1f)
+
+#define IPOPT_CONTROL 0x00
+#define IPOPT_RESERVED1 0x20
+#define IPOPT_DEBMEAS 0x40
+#define IPOPT_RESERVED2 0x60
+
+#define IPOPT_EOL 0 /* end of option list */
+#define IPOPT_NOP 1 /* no operation */
+
+#define IPOPT_RR 7 /* record packet route */
+#define IPOPT_TS 68 /* timestamp */
+#define IPOPT_RFC1393 82 /* traceroute RFC 1393 */
+#define IPOPT_SECURITY 130 /* provide s,c,h,tcc */
+#define IPOPT_LSRR 131 /* loose source route */
+#define IPOPT_SATID 136 /* satnet id */
+#define IPOPT_SSRR 137 /* strict source route */
+#define IPOPT_RA 148 /* router-alert, rfc2113 */
+
+/*
+ * Offsets to fields in options other than EOL and NOP.
+ */
+#define IPOPT_OPTVAL 0 /* option ID */
+#define IPOPT_OLEN 1 /* option length */
+#define IPOPT_OFFSET 2 /* offset within option */
+#define IPOPT_MINOFF 4 /* min value of above */
+
+/*
+ * Time stamp option structure.
+ */
+struct ip_timestamp {
+ uint8_t ipt_code; /* IPOPT_TS */
+ uint8_t ipt_len; /* size of structure (variable) */
+ uint8_t ipt_ptr; /* index of current entry */
+ uint8_t ipt_oflwflg; /* flags, overflow counter */
+#define IPTS_OFLW(ip) (((ipt)->ipt_oflwflg & 0xf0) >> 4)
+#define IPTS_FLG(ip) ((ipt)->ipt_oflwflg & 0x0f)
+ union ipt_timestamp {
+ uint32_t ipt_time[1];
+ struct ipt_ta {
+ struct in_addr ipt_addr;
+ uint32_t ipt_time;
+ } ipt_ta[1];
+ } ipt_timestamp;
+} UNALIGNED;
+
+/* flag bits for ipt_flg */
+#define IPOPT_TS_TSONLY 0 /* timestamps only */
+#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */
+#define IPOPT_TS_PRESPEC 3 /* specified modules only */
+
+/* bits for security (not byte swapped) */
+#define IPOPT_SECUR_UNCLASS 0x0000
+#define IPOPT_SECUR_CONFID 0xf135
+#define IPOPT_SECUR_EFTO 0x789a
+#define IPOPT_SECUR_MMMM 0xbc4d
+#define IPOPT_SECUR_RESTR 0xaf13
+#define IPOPT_SECUR_SECRET 0xd788
+#define IPOPT_SECUR_TOPSECRET 0x6bc5
+
+/*
+ * Internet implementation parameters.
+ */
+#define MAXTTL 255 /* maximum time to live (seconds) */
+#define IPDEFTTL 64 /* default ttl, from RFC 1340 */
+#define IPFRAGTTL 60 /* time to live for frags, slowhz */
+#define IPTTLDEC 1 /* subtracted when forwarding */
+
+#define IP_MSS 576 /* default maximum segment size */
+#endif /* TCPDUMP_IP_H */
--- /dev/null
+/* NetBSD: ip6.h,v 1.9 2000/07/13 05:34:21 itojun Exp */
+/* $KAME: ip6.h,v 1.9 2000/07/02 21:01:32 itojun Exp $ */
+
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 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.
+ */
+
+/*
+ * Copyright (c) 1982, 1986, 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.
+ *
+ * @(#)ip.h 8.1 (Berkeley) 6/10/93
+ */
+
+#ifndef _NETINET_IP6_H_
+#define _NETINET_IP6_H_
+
+/*
+ * Definition for internet protocol version 6.
+ * RFC 2460
+ */
+
+struct ip6_hdr {
+ union {
+ struct ip6_hdrctl {
+ uint32_t ip6_un1_flow; /* 20 bits of flow-ID */
+ uint16_t ip6_un1_plen; /* payload length */
+ uint8_t ip6_un1_nxt; /* next header */
+ uint8_t ip6_un1_hlim; /* hop limit */
+ } ip6_un1;
+ uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits class */
+ } ip6_ctlun;
+ struct in6_addr ip6_src; /* source address */
+ struct in6_addr ip6_dst; /* destination address */
+} UNALIGNED;
+
+#define ip6_vfc ip6_ctlun.ip6_un2_vfc
+#define IP6_VERSION(ip6_hdr) (((ip6_hdr)->ip6_vfc & 0xf0) >> 4)
+#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
+#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
+#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
+#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
+#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
+
+/* in network endian */
+#define IPV6_FLOWINFO_MASK ((uint32_t)htonl(0x0fffffff)) /* flow info (28 bits) */
+#define IPV6_FLOWLABEL_MASK ((uint32_t)htonl(0x000fffff)) /* flow label (20 bits) */
+#if 1
+/* ECN bits proposed by Sally Floyd */
+#define IP6TOS_CE 0x01 /* congestion experienced */
+#define IP6TOS_ECT 0x02 /* ECN-capable transport */
+#endif
+
+/*
+ * Extension Headers
+ */
+
+struct ip6_ext {
+ uint8_t ip6e_nxt;
+ uint8_t ip6e_len;
+} UNALIGNED;
+
+/* Hop-by-Hop options header */
+struct ip6_hbh {
+ uint8_t ip6h_nxt; /* next header */
+ uint8_t ip6h_len; /* length in units of 8 octets */
+ /* followed by options */
+} UNALIGNED;
+
+/* Destination options header */
+struct ip6_dest {
+ uint8_t ip6d_nxt; /* next header */
+ uint8_t ip6d_len; /* length in units of 8 octets */
+ /* followed by options */
+} UNALIGNED;
+
+/* http://www.iana.org/assignments/ipv6-parameters/ipv6-parameters.xhtml */
+
+/* Option types and related macros */
+#define IP6OPT_PAD1 0x00 /* 00 0 00000 */
+#define IP6OPT_PADN 0x01 /* 00 0 00001 */
+#define IP6OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */
+#define IP6OPT_JUMBO_LEN 6
+#define IP6OPT_RPL 0x63 /* 01 1 00011 */
+#define IP6OPT_TUN_ENC_LIMIT 0x04 /* 00 0 00100 */
+#define IP6OPT_ROUTER_ALERT 0x05 /* 00 0 00101 */
+
+#define IP6OPT_RTALERT_LEN 4
+#define IP6OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */
+#define IP6OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */
+#define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */
+#define IP6OPT_MINLEN 2
+
+#define IP6OPT_QUICK_START 0x26 /* 00 1 00110 */
+#define IP6OPT_CALIPSO 0x07 /* 00 0 00111 */
+#define IP6OPT_SMF_DPD 0x08 /* 00 0 01000 */
+#define IP6OPT_HOME_ADDRESS 0xc9 /* 11 0 01001 */
+#define IP6OPT_HOMEADDR_MINLEN 18
+#define IP6OPT_EID 0x8a /* 10 0 01010 */
+#define IP6OPT_ILNP_NOTICE 0x8b /* 10 0 01011 */
+#define IP6OPT_LINE_ID 0x8c /* 10 0 01100 */
+#define IP6OPT_MPL 0x6d /* 01 1 01101 */
+#define IP6OPT_IP_DFF 0xee /* 11 1 01110 */
+
+#define IP6OPT_TYPE(o) ((o) & 0xC0)
+#define IP6OPT_TYPE_SKIP 0x00
+#define IP6OPT_TYPE_DISCARD 0x40
+#define IP6OPT_TYPE_FORCEICMP 0x80
+#define IP6OPT_TYPE_ICMP 0xC0
+
+#define IP6OPT_MUTABLE 0x20
+
+/* Routing header */
+struct ip6_rthdr {
+ uint8_t ip6r_nxt; /* next header */
+ uint8_t ip6r_len; /* length in units of 8 octets */
+ uint8_t ip6r_type; /* routing type */
+ uint8_t ip6r_segleft; /* segments left */
+ /* followed by routing type specific data */
+} UNALIGNED;
+
+/* Type 0 Routing header */
+struct ip6_rthdr0 {
+ uint8_t ip6r0_nxt; /* next header */
+ uint8_t ip6r0_len; /* length in units of 8 octets */
+ uint8_t ip6r0_type; /* always zero */
+ uint8_t ip6r0_segleft; /* segments left */
+ uint8_t ip6r0_reserved; /* reserved field */
+ uint8_t ip6r0_slmap[3]; /* strict/loose bit map */
+ struct in6_addr ip6r0_addr[1]; /* up to 23 addresses */
+} UNALIGNED;
+
+/* Fragment header */
+struct ip6_frag {
+ uint8_t ip6f_nxt; /* next header */
+ uint8_t ip6f_reserved; /* reserved field */
+ uint16_t ip6f_offlg; /* offset, reserved, and flag */
+ uint32_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 uint8_t *, u_int, u_int, u_int);
+
+#endif /* not _NETINET_IP6_H_ */
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: ipproto.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "ipproto.h"
+
+const struct tok ipproto_values[] = {
+ { IPPROTO_HOPOPTS, "Options" },
+ { IPPROTO_ICMP, "ICMP" },
+ { IPPROTO_IGMP, "IGMP" },
+ { IPPROTO_IPV4, "IPIP" },
+ { IPPROTO_TCP, "TCP" },
+ { IPPROTO_EGP, "EGP" },
+ { IPPROTO_PIGP, "IGRP" },
+ { IPPROTO_UDP, "UDP" },
+ { IPPROTO_DCCP, "DCCP" },
+ { IPPROTO_IPV6, "IPv6" },
+ { IPPROTO_ROUTING, "Routing" },
+ { IPPROTO_FRAGMENT, "Fragment" },
+ { IPPROTO_RSVP, "RSVP" },
+ { IPPROTO_GRE, "GRE" },
+ { IPPROTO_ESP, "ESP" },
+ { IPPROTO_AH, "AH" },
+ { IPPROTO_MOBILE, "Mobile IP" },
+ { IPPROTO_ICMPV6, "ICMPv6" },
+ { IPPROTO_MOBILITY_OLD, "Mobile IP (old)" },
+ { IPPROTO_EIGRP, "EIGRP" },
+ { IPPROTO_OSPF, "OSPF" },
+ { IPPROTO_PIM, "PIM" },
+ { IPPROTO_IPCOMP, "Compressed IP" },
+ { IPPROTO_VRRP, "VRRP" },
+ { IPPROTO_PGM, "PGM" },
+ { IPPROTO_SCTP, "SCTP" },
+ { IPPROTO_MOBILITY, "Mobility" },
+ { IPPROTO_PFSYNC, "PFSYNC" },
+ { IPPROTO_CARP, "CARP" },
+ { 0, NULL }
+};
+
--- /dev/null
+/*
+ * Copyright (c) 1982, 1986, 1990, 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.
+ *
+ * From:
+ * @(#)in.h 8.3 (Berkeley) 1/3/94
+ * $FreeBSD: src/sys/netinet/in.h,v 1.38.2.3 1999/08/29 16:29:34 peter Exp $
+ */
+
+extern const struct tok ipproto_values[];
+
+#ifndef IPPROTO_IP
+#define IPPROTO_IP 0 /* dummy for IP */
+#endif
+#ifndef IPPROTO_HOPOPTS
+#define IPPROTO_HOPOPTS 0 /* IPv6 hop-by-hop options */
+#endif
+#ifndef IPPROTO_ICMP
+#define IPPROTO_ICMP 1 /* control message protocol */
+#endif
+#ifndef IPPROTO_IGMP
+#define IPPROTO_IGMP 2 /* group mgmt protocol */
+#endif
+#ifndef IPPROTO_IPV4
+#define IPPROTO_IPV4 4
+#endif
+#ifndef IPPROTO_TCP
+#define IPPROTO_TCP 6 /* tcp */
+#endif
+#ifndef IPPROTO_EGP
+#define IPPROTO_EGP 8 /* exterior gateway protocol */
+#endif
+#ifndef IPPROTO_PIGP
+#define IPPROTO_PIGP 9
+#endif
+#ifndef IPPROTO_UDP
+#define IPPROTO_UDP 17 /* user datagram protocol */
+#endif
+#ifndef IPPROTO_DCCP
+#define IPPROTO_DCCP 33 /* datagram congestion control protocol */
+#endif
+#ifndef IPPROTO_IPV6
+#define IPPROTO_IPV6 41
+#endif
+#ifndef IPPROTO_ROUTING
+#define IPPROTO_ROUTING 43 /* IPv6 routing header */
+#endif
+#ifndef IPPROTO_FRAGMENT
+#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */
+#endif
+#ifndef IPPROTO_RSVP
+#define IPPROTO_RSVP 46 /* resource reservation */
+#endif
+#ifndef IPPROTO_GRE
+#define IPPROTO_GRE 47 /* General Routing Encap. */
+#endif
+#ifndef IPPROTO_ESP
+#define IPPROTO_ESP 50 /* SIPP Encap Sec. Payload */
+#endif
+#ifndef IPPROTO_AH
+#define IPPROTO_AH 51 /* SIPP Auth Header */
+#endif
+#ifndef IPPROTO_MOBILE
+#define IPPROTO_MOBILE 55
+#endif
+#ifndef IPPROTO_ICMPV6
+#define IPPROTO_ICMPV6 58 /* ICMPv6 */
+#endif
+#ifndef IPPROTO_NONE
+#define IPPROTO_NONE 59 /* IPv6 no next header */
+#endif
+#ifndef IPPROTO_DSTOPTS
+#define IPPROTO_DSTOPTS 60 /* IPv6 destination options */
+#endif
+#ifndef IPPROTO_MOBILITY_OLD
+/*
+ * The current Protocol Numbers list says that the IP protocol number for
+ * mobility headers is 135; it cites draft-ietf-mobileip-ipv6-24, but
+ * that draft doesn't actually give a number.
+ *
+ * It appears that 62 used to be used, even though that's assigned to
+ * a protocol called CFTP; however, the only reference for CFTP is a
+ * Network Message from BBN back in 1982, so, for now, we support 62,
+ * aas well as 135, as a protocol number for mobility headers.
+ */
+#define IPPROTO_MOBILITY_OLD 62
+#endif
+#ifndef IPPROTO_ND
+#define IPPROTO_ND 77 /* Sun net disk proto (temp.) */
+#endif
+#ifndef IPPROTO_EIGRP
+#define IPPROTO_EIGRP 88 /* Cisco/GXS IGRP */
+#endif
+#ifndef IPPROTO_OSPF
+#define IPPROTO_OSPF 89
+#endif
+#ifndef IPPROTO_PIM
+#define IPPROTO_PIM 103
+#endif
+#ifndef IPPROTO_IPCOMP
+#define IPPROTO_IPCOMP 108
+#endif
+#ifndef IPPROTO_VRRP
+#define IPPROTO_VRRP 112
+#endif
+#ifndef IPPROTO_CARP
+#define IPPROTO_CARP 112
+#endif
+#ifndef IPPROTO_PGM
+#define IPPROTO_PGM 113
+#endif
+#ifndef IPPROTO_SCTP
+#define IPPROTO_SCTP 132
+#endif
+#ifndef IPPROTO_MOBILITY
+#define IPPROTO_MOBILITY 135
+#endif
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: l2vpn.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+#include "interface.h"
+#include "l2vpn.h"
+
+/* draft-ietf-pwe3-iana-allocation-04 */
+const struct tok l2vpn_encaps_values[] = {
+ { 0x00, "Reserved"},
+ { 0x01, "Frame Relay"},
+ { 0x02, "ATM AAL5 VCC transport"},
+ { 0x03, "ATM transparent cell transport"},
+ { 0x04, "Ethernet VLAN"},
+ { 0x05, "Ethernet"},
+ { 0x06, "Cisco-HDLC"},
+ { 0x07, "PPP"},
+ { 0x08, "SONET/SDH Circuit Emulation Service over MPLS"},
+ { 0x09, "ATM n-to-one VCC cell transport"},
+ { 0x0a, "ATM n-to-one VPC cell transport"},
+ { 0x0b, "IP Layer2 Transport"},
+ { 0x0c, "ATM one-to-one VCC Cell Mode"},
+ { 0x0d, "ATM one-to-one VPC Cell Mode"},
+ { 0x0e, "ATM AAL5 PDU VCC transport"},
+ { 0x0f, "Frame-Relay Port mode"},
+ { 0x10, "SONET/SDH Circuit Emulation over Packet"},
+ { 0x11, "Structure-agnostic E1 over Packet"},
+ { 0x12, "Structure-agnostic T1 (DS1) over Packet"},
+ { 0x13, "Structure-agnostic E3 over Packet"},
+ { 0x14, "Structure-agnostic T3 (DS3) over Packet"},
+ { 0x15, "CESoPSN basic mode"},
+ { 0x16, "TDMoIP basic mode"},
+ { 0x17, "CESoPSN TDM with CAS"},
+ { 0x18, "TDMoIP TDM with CAS"},
+ { 0x40, "IP-interworking"},
+ { 0, NULL}
+};
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+extern const struct tok l2vpn_encaps_values[];
--- /dev/null
+/*
+ * Copyright (c) 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+/* Prototypes missing in Digital UNIX 4.x */
+int snprintf(char *, size_t, const char *, ...);
+int vsnprintf(char *, size_t, const char *, va_list);
--- /dev/null
+/*
+ * Copyright (c) 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+/* Prototypes missing in SunOS 5 */
+#if defined(_STDIO_H) && defined(HAVE_SETLINEBUF)
+int setlinebuf(FILE *);
+#endif
+char *strerror(int);
+int snprintf(char *, size_t, const char *, ...);
+int strcasecmp(const char *, const char *);
--- /dev/null
+/*
+ * Copyright (c) 1989, 1990, 1993, 1994, 1995, 1996
+ * 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: (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.
+ */
+
+/* Prototypes missing in SunOS 4 */
+#ifdef FILE
+int _filbuf(FILE *);
+int _flsbuf(u_char, FILE *);
+int fclose(FILE *);
+int fflush(FILE *);
+int fgetc(FILE *);
+int fprintf(FILE *, const char *, ...);
+int fputc(int, FILE *);
+int fputs(const char *, FILE *);
+u_int fread(void *, u_int, u_int, FILE *);
+int fseek(FILE *, long, int);
+u_int fwrite(const void *, u_int, u_int, FILE *);
+int pclose(FILE *);
+void rewind(FILE *);
+void setbuf(FILE *, char *);
+int setlinebuf(FILE *);
+int ungetc(int, FILE *);
+int vfprintf(FILE *, const char *, ...);
+int vprintf(const char *, ...);
+#endif
+
+#if __GNUC__ <= 1
+int read(int, char *, u_int);
+int write(int, char *, u_int);
+#endif
+
+long a64l(const char *);
+#ifdef __STDC__
+struct sockaddr;
+#endif
+int accept(int, struct sockaddr *, int *);
+int bind(int, struct sockaddr *, int);
+int bcmp(const void *, const void *, u_int);
+void bcopy(const void *, void *, u_int);
+void bzero(void *, int);
+int chroot(const char *);
+int close(int);
+void closelog(void);
+int connect(int, struct sockaddr *, int);
+char *crypt(const char *, const char *);
+int daemon(int, int);
+int fchmod(int, int);
+int fchown(int, int, int);
+void endgrent(void);
+void endpwent(void);
+void endservent(void);
+#ifdef __STDC__
+struct ether_addr;
+#endif
+struct ether_addr *ether_aton(const char *);
+int flock(int, int);
+#ifdef __STDC__
+struct stat;
+#endif
+int fstat(int, struct stat *);
+#ifdef __STDC__
+struct statfs;
+#endif
+int fstatfs(int, struct statfs *);
+int fsync(int);
+#ifdef __STDC__
+struct timeb;
+#endif
+int ftime(struct timeb *);
+int ftruncate(int, off_t);
+int getdtablesize(void);
+long gethostid(void);
+int gethostname(char *, int);
+int getopt(int, char * const *, const char *);
+int getpagesize(void);
+char *getpass(char *);
+int getpeername(int, struct sockaddr *, int *);
+int getpriority(int, int);
+#ifdef __STDC__
+struct rlimit;
+#endif
+int getrlimit(int, struct rlimit *);
+int getsockname(int, struct sockaddr *, int *);
+int getsockopt(int, int, int, char *, int *);
+#ifdef __STDC__
+struct timeval;
+struct timezone;
+#endif
+int gettimeofday(struct timeval *, struct timezone *);
+char *getusershell(void);
+char *getwd(char *);
+int initgroups(const char *, int);
+int ioctl(int, int, caddr_t);
+int iruserok(u_long, int, char *, char *);
+int isatty(int);
+int killpg(int, int);
+int listen(int, int);
+#ifdef __STDC__
+struct utmp;
+#endif
+void login(struct utmp *);
+int logout(const char *);
+off_t lseek(int, off_t, int);
+int lstat(const char *, struct stat *);
+int mkstemp(char *);
+char *mktemp(char *);
+int munmap(caddr_t, int);
+void openlog(const char *, int, int);
+void perror(const char *);
+int printf(const char *, ...);
+int puts(const char *);
+long random(void);
+int readlink(const char *, char *, int);
+#ifdef __STDC__
+struct iovec;
+#endif
+int readv(int, struct iovec *, int);
+int recv(int, char *, u_int, int);
+int recvfrom(int, char *, u_int, int, struct sockaddr *, int *);
+int rename(const char *, const char *);
+int rcmd(char **, u_short, char *, char *, char *, int *);
+int rresvport(int *);
+int send(int, char *, u_int, int);
+int sendto(int, char *, u_int, int, struct sockaddr *, int);
+int setenv(const char *, const char *, int);
+int seteuid(int);
+int setpriority(int, int, int);
+int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
+int setpgrp(int, int);
+void setpwent(void);
+int setrlimit(int, struct rlimit *);
+void setservent(int);
+int setsockopt(int, int, int, char *, int);
+int shutdown(int, int);
+int sigblock(int);
+void (*signal (int, void (*) (int))) (int);
+int sigpause(int);
+int sigsetmask(int);
+#ifdef __STDC__
+struct sigvec;
+#endif
+int sigvec(int, struct sigvec *, struct sigvec*);
+int snprintf(char *, size_t, const char *, ...);
+int socket(int, int, int);
+int socketpair(int, int, int, int *);
+int symlink(const char *, const char *);
+void srandom(int);
+int sscanf(char *, const char *, ...);
+int stat(const char *, struct stat *);
+int statfs(char *, struct statfs *);
+char *strerror(int);
+int strcasecmp(const char *, const char *);
+#ifdef __STDC__
+struct tm;
+#endif
+int strftime(char *, int, char *, struct tm *);
+int strncasecmp(const char *, const char *, int);
+long strtol(const char *, char **, int);
+void sync(void);
+void syslog(int, const char *, ...);
+int system(const char *);
+long tell(int);
+time_t time(time_t *);
+char *timezone(int, int);
+int tolower(int);
+int toupper(int);
+int truncate(char *, off_t);
+void unsetenv(const char *);
+int vfork(void);
+int vsprintf(char *, const char *, ...);
+int writev(int, struct iovec *, int);
+#ifdef __STDC__
+struct rusage;
+#endif
+int utimes(const char *, struct timeval *);
+#if __GNUC__ <= 1
+int wait(int *);
+pid_t wait3(int *, int, struct rusage *);
+#endif
+
+/* Ugly signal hacking */
+#ifdef SIG_ERR
+#undef SIG_ERR
+#define SIG_ERR (void (*)(int))-1
+#undef SIG_DFL
+#define SIG_DFL (void (*)(int))0
+#undef SIG_IGN
+#define SIG_IGN (void (*)(int))1
+
+#ifdef KERNEL
+#undef SIG_CATCH
+#define SIG_CATCH (void (*)(int))2
+#endif
+#undef SIG_HOLD
+#define SIG_HOLD (void (*)(int))3
+#endif
--- /dev/null
+/*
+ * Copyright (c) 1990, 1993, 1994, 1995, 1996
+ * 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: (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.
+ */
+
+/* Prototypes missing in Ultrix 4 */
+int bcmp(const char *, const char *, u_int);
+void bcopy(const void *, void *, u_int);
+void bzero(void *, u_int);
+void endservent(void);
+int getopt(int, char * const *, const char *);
+#ifdef __STDC__
+struct timeval;
+struct timezone;
+#endif
+int gettimeofday(struct timeval *, struct timezone *);
+int ioctl(int, int, caddr_t);
+int pfopen(char *, int);
+int setlinebuf(FILE *);
+int socket(int, int, int);
+int strcasecmp(const char *, const char *);
--- /dev/null
+/*
+ * Copyright (c) 1993, 1994, 1997
+ * 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: (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.
+ */
+
+/*
+ * Definitions for information in the LLC header.
+ */
+
+#define LLC_U_FMT 3
+#define LLC_GSAP 1
+#define LLC_IG 1 /* Individual / Group */
+#define LLC_S_FMT 1
+
+#define LLC_U_POLL 0x10
+#define LLC_IS_POLL 0x0100
+#define LLC_XID_FI 0x81
+
+#define LLC_U_CMD(u) ((u) & 0xef)
+#define LLC_UI 0x03
+#define LLC_UA 0x63
+#define LLC_DISC 0x43
+#define LLC_DM 0x0f
+#define LLC_SABME 0x6f
+#define LLC_TEST 0xe3
+#define LLC_XID 0xaf
+#define LLC_FRMR 0x87
+
+#define LLC_S_CMD(is) (((is) >> 2) & 0x03)
+#define LLC_RR 0x0001
+#define LLC_RNR 0x0005
+#define LLC_REJ 0x0009
+
+#define LLC_IS_NR(is) (((is) >> 9) & 0x7f)
+#define LLC_I_NS(is) (((is) >> 1) & 0x7f)
+
+#ifndef LLCSAP_NULL
+#define LLCSAP_NULL 0x00
+#endif
+#ifndef LLCSAP_GLOBAL
+#define LLCSAP_GLOBAL 0xff
+#endif
+#ifndef LLCSAP_8021B_I
+#define LLCSAP_8021B_I 0x02
+#endif
+#ifndef LLCSAP_8021B_G
+#define LLCSAP_8021B_G 0x03
+#endif
+#ifndef LLCSAP_SNA
+#define LLCSAP_SNA 0x04
+#endif
+#ifndef LLCSAP_IP
+#define LLCSAP_IP 0x06
+#endif
+#ifndef LLCSAP_PROWAYNM
+#define LLCSAP_PROWAYNM 0x0e
+#endif
+#ifndef LLCSAP_8021D
+#define LLCSAP_8021D 0x42
+#endif
+#ifndef LLCSAP_RS511
+#define LLCSAP_RS511 0x4e
+#endif
+#ifndef LLCSAP_ISO8208
+#define LLCSAP_ISO8208 0x7e
+#endif
+#ifndef LLCSAP_PROWAY
+#define LLCSAP_PROWAY 0x8e
+#endif
+#ifndef LLCSAP_SNAP
+#define LLCSAP_SNAP 0xaa
+#endif
+#ifndef LLCSAP_IPX
+#define LLCSAP_IPX 0xe0
+#endif
+#ifndef LLCSAP_NETBEUI
+#define LLCSAP_NETBEUI 0xf0
+#endif
+#ifndef LLCSAP_ISONS
+#define LLCSAP_ISONS 0xfe
+#endif
+
+/*
+ * PIDs for use with OUI_CISCO.
+ */
+#define PID_CISCO_CDP 0x2000 /* Cisco Discovery Protocol */
+#define PID_CISCO_VTP 0x2003 /* Cisco VLAN Trunk Protocol */
+#define PID_CISCO_DTP 0x2004 /* Cisco Dynamic Trunk Protocol */
+#define PID_CISCO_UDLD 0x0111 /* Unidirectional Link Detection */
+#define PID_CISCO_PVST 0x010b /* Per VLAN Spanning Tree+ and RPVST+ */
+#define PID_CISCO_VLANBRIDGE 0x010c /* "VLAN Bridge", according to Wireshark */
+
+/*
+ * PIDs for use with OUI_RFC2684.
+ */
+#define PID_RFC2684_ETH_FCS 0x0001 /* Ethernet, with FCS */
+#define PID_RFC2684_ETH_NOFCS 0x0007 /* Ethernet, without FCS */
+#define PID_RFC2684_802_4_FCS 0x0002 /* 802.4, with FCS */
+#define PID_RFC2684_802_4_NOFCS 0x0008 /* 802.4, without FCS */
+#define PID_RFC2684_802_5_FCS 0x0003 /* 802.5, with FCS */
+#define PID_RFC2684_802_5_NOFCS 0x0009 /* 802.5, without FCS */
+#define PID_RFC2684_FDDI_FCS 0x0004 /* FDDI, with FCS */
+#define PID_RFC2684_FDDI_NOFCS 0x000a /* FDDI, without FCS */
+#define PID_RFC2684_802_6_FCS 0x0005 /* 802.6, with FCS */
+#define PID_RFC2684_802_6_NOFCS 0x000b /* 802.6, without FCS */
+#define PID_RFC2684_BPDU 0x000e /* BPDUs */
--- /dev/null
+/*
+ * Copyright (c) 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: machdep.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/*
+ * XXX - all we need, on platforms other than DEC OSF/1 (a/k/a Digital UNIX,
+ * a/k/a Tru64 UNIX), is "size_t", which is a standard C type; what do we
+ * need to do to get it defined? This is clearly wrong, as we shouldn't
+ * have to include UNIX or Windows system header files to get it.
+ */
+#include <tcpdump-stdinc.h>
+
+#ifndef HAVE___ATTRIBUTE__
+#define __attribute__(x)
+#endif /* HAVE___ATTRIBUTE__ */
+
+#ifdef __osf__
+#include <sys/sysinfo.h>
+#include <sys/proc.h>
+
+#if !defined(HAVE_SNPRINTF)
+int snprintf(char *, size_t, const char *, ...)
+#ifdef __ATTRIBUTE___FORMAT_OK
+ __attribute__((format(printf, 3, 4)))
+#endif /* __ATTRIBUTE___FORMAT_OK */
+ ;
+#endif /* !defined(HAVE_SNPRINTF) */
+#endif /* __osf__ */
+
+#include "machdep.h"
+
+/*
+ * On platforms where the CPU doesn't support unaligned loads, force
+ * unaligned accesses to abort with SIGBUS, rather than being fixed
+ * up (slowly) by the OS kernel; on those platforms, misaligned accesses
+ * are bugs, and we want tcpdump to crash so that the bugs are reported.
+ *
+ * The only OS on which this is necessary is DEC OSF/1^W^WDigital
+ * UNIX^W^WTru64 UNIX.
+ */
+int
+abort_on_misalignment(char *ebuf _U_, size_t ebufsiz _U_)
+{
+#ifdef __osf__
+ static int buf[2] = { SSIN_UACPROC, UAC_SIGBUS };
+
+ if (setsysinfo(SSI_NVPAIRS, (caddr_t)buf, 1, 0, 0) < 0) {
+ (void)snprintf(ebuf, ebufsiz, "setsysinfo: errno %d", errno);
+ return (-1);
+ }
+#endif
+ return (0);
+}
--- /dev/null
+/*
+ * Copyright (c) 1996
+ * 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: (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.
+ */
+#ifndef tcpdump_machdep_h
+#define tcpdump_machdep_h
+
+int abort_on_misalignment(char *, size_t);
+#endif
--- /dev/null
+#!/bin/sh
+#
+# Copyright (c) 1990, 1996
+# John Robert LoVerso. All rights reserved.
+# SMIv2 parsing copyright (c) 1999
+# William C. Fenner.
+#
+# 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
+# notices, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notices, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHORS 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.
+
+#
+# This script will read either ASN.1-style MIB files or the ".defs" files
+# created by the ISODE "mosy" program on such files.
+#
+# The output of this script is the "mib.h" file used by tcpdumps' ASN.1/SNMP
+# decoding code.
+#
+# This script needs to be run by "gawk" (GNU awk). "nawk" will work, but
+# dump will get a recursion error if you process LARGE mibs. While it would
+# by farily easy to rewrite this not to use recursion (and also easy to
+# eliminate use of gsub and functions to use classic "awk"), you have to
+# order the structure declarations in defined-first order for the compiler
+# not to barf; too bad tsort doesn't take arguments.
+#
+
+cat << EOF
+/*
+ * This file was generated by tcpdump/makemib on `date`
+ * You probably don't want to edit this by hand!
+ *
+ * struct mib somename = { desc, oid-octet, type, child-pointer, next-pointer
+};
+ */
+
+EOF
+
+awk '
+BEGIN {
+ debug=0;
+ # for sanity, we prep the namespace with objects from RFC-1155
+ # (we manually establish the root)
+ oid["iso"]=1
+ oidadd("org", "iso", 3)
+ oidadd("dod", "org", 6)
+ oidadd("internet", "dod", 1)
+ oidadd("directory", "internet", 1)
+ oidadd("mgmt", "internet", 2)
+#XXX oidadd("mib", "mgmt", 1)
+ oidadd("mib-2", "mgmt", 1)
+ oidadd("experimental", "internet", 3)
+ oidadd("private", "internet", 4)
+ oidadd("enterprises", "private", 1)
+ oidadd("ip", "mib-2", 4)
+ oidadd("transmission", "mib-2", 10)
+
+ holddesc="none"
+}
+
+#
+# Read mosy "*.defs" file. mosy does all the parsing work; we just read
+# its simple and straightforward output. It would not be too hard to make
+# tcpdump directly read mosy output, but...
+#
+# Ignore these unless the current file is called something.defs; false
+# positives are too common in DESCRIPTIONs.
+
+NF > 1 && index($2,".")>0 && FILENAME ~ /\.defs/ {
+ # currently ignore items of the form "{ iso.3.6.1 }"
+ if (split($2, p, ".") == 2) {
+ oidadd($1, p[1], p[2])
+ }
+ next
+}
+
+#
+# Must be a MIB file
+# Make it easier to parse - used to be done by sed
+{ sub(/--\*.*\*--/, ""); sub(/--.*/, ""); gsub(/[{}]/, " & "); }
+
+#
+# this next section is simple and naive, but does the job ok
+#
+
+# foo OBJECT IDENTIFIER ::= { baz 17 }
+# or
+# foo OBJECT IDENTIFIER ::=
+# { baz 17 }
+$2$3$4 == "OBJECTIDENTIFIER::=" {
+ holddesc="none"
+ if (NF == 8)
+ oidadd($1, $6, $7)
+ if (NF == 4)
+ holddesc=$1
+ next
+}
+$1 == "{" && holddesc != "none" && NF == 4 {
+ oidadd(holddesc, $2, $3)
+ holddesc="none"
+}
+#
+# foo OBJECT IDENTIFIER
+# ::= { bar 1 }
+$2$3 == "OBJECTIDENTIFIER" && $1 != "SYNTAX" && NF == 3 {
+ holddesc=$1
+}
+#
+# foo
+# OBJECT IDENTIFIER ::= { bar 1 }
+# a couple of heuristics to exclude single words in e.g. long
+# DESCRIPTION clauses
+NF == 1 && $1 ~ "[a-z][a-z]*[A-Z]" && $1 !~ /[(){}.,]/ && holddesc == "none" {
+ holddesc=$1
+}
+$1$2$3 == "OBJECTIDENTIFIER::=" && holddesc != "none" {
+ oidadd(holddesc, $5, $6)
+ holddesc="none"
+}
+#
+# "normal" style
+# foo OBJECT-TYPE ...
+# ...
+# ::= { baz 5 }
+$2 == "MODULE-IDENTITY" || $2 == "MODULE-COMPLIANCE" ||
+ $2 == "OBJECT-IDENTITY" || $2 == "OBJECT-TYPE" ||
+ $2 == "OBJECT-GROUP" ||
+ $2 == "NOTIFICATION-TYPE" || $2 == "NOTIFICATION-GROUP" {
+ holddesc=$1
+}
+$1 == "::=" && holddesc != "none" && NF == 5 {
+ oidadd(holddesc, $3, $4)
+ holddesc="none"
+}
+#
+# foo ::= { baz 17 }
+$2$3 == "::={" {
+ oidadd($1,$4,$5)
+ holddesc="none"
+}
+
+
+#
+# End of the road - output the data.
+#
+
+END {
+ print "struct obj"
+ dump("iso")
+ print "*mibroot = &_iso_obj;"
+}
+
+function inn(file) {
+ if (file == "" || file == "-")
+ return ""
+ return " in " file
+}
+
+#
+# add a new object to the tree
+#
+# new OBJECT IDENTIFIER ::= { parent value }
+#
+
+function oidadd(new, parent, value) {
+ # Ignore 0.0
+ if (parent == "0" && value == 0)
+ return
+ if (debug)
+ print "/* oidadd" inn(FILENAME) ":", new, "in", parent, "as", value, "line", $0, "*/"
+ # use safe C identifiers
+ gsub(/[-&\/]/,"",new)
+ gsub(/[-&\/]/,"",parent)
+ # check if parent missing
+ if (oid[parent] == "") {
+ printf "/* parse problem%s: no parent for %s.%s(%d) */\n", \
+ inn(FILENAME), parent, new, value
+ return
+ }
+ # check if parent.value already exists
+ if (oid[new] > 0 && oid[new] != value) {
+ printf "/* parse problem%s: dup %s.%s(%d) != old (%d) */\n", \
+ inn(FILENAME), parent, new, value, oid[new]
+ return
+ }
+ # check for new name for parent.value
+ if (child[parent] != "") {
+ for (sib = child[parent]; sib != ""; sib = sibling[sib])
+ if (oid[sib] == value) {
+ if (new != sib)
+ printf "/* parse problem%s: new name" \
+ " \"%s\"" \
+ " for %s.%s(%d) ignored */\n", \
+ inn(FILENAME), new, parent, \
+ sib, value
+ return
+ }
+ }
+
+ oid[new]=value
+ if (child[parent] == "") {
+ child[parent] = new
+ } else {
+ sibling[new] = child[parent]
+ child[parent] = new
+ }
+}
+
+#
+# old(?) routine to recurse down the tree (in postfix order for convenience)
+#
+
+function dump(item, c, s) {
+# newitem=sofar"."item"("oid[item]")"
+# printf "/* %s c=%s s=%s */\n", newitem, child[item], sibling[item]
+ c="NULL"
+ if (child[item] != "") {
+ dump(child[item])
+ c = "&_"child[item]"_obj"
+ }
+ s="NULL"
+ if (sibling[item] != "") {
+ dump(sibling[item])
+ s = "&_"sibling[item]"_obj"
+ }
+ printf "_%s_obj = {\n\t\"%s\", %d, 0,\n\t%s, %s\n},\n", \
+ item, item, oid[item], c, s
+}
+' $@
+exit 0
--- /dev/null
+/*
+ * This file was generated by tcpdump/makemib on Wed Sep 26 12:12:31 EDT 1990
+ * You probably don't want to edit this by hand!
+ *
+ * struct mib somename = { desc, oid-octet, type, child-pointer, next-pointer
+};
+ */
+
+/* parse problem: new name "mib" for mgmt.mib(1) ignored */
+/* parse problem: no parent for 0.nullSpecific(0) */
+struct obj
+_proteon_obj = {
+ "proteon", 1, 0,
+ NULL, NULL
+},
+_ibm_obj = {
+ "ibm", 2, 0,
+ NULL, &_proteon_obj
+},
+_cmu_obj = {
+ "cmu", 3, 0,
+ NULL, &_ibm_obj
+},
+_unix_obj = {
+ "unix", 4, 0,
+ NULL, &_cmu_obj
+},
+_acc_obj = {
+ "acc", 5, 0,
+ NULL, &_unix_obj
+},
+_twg_obj = {
+ "twg", 6, 0,
+ NULL, &_acc_obj
+},
+_cayman_obj = {
+ "cayman", 7, 0,
+ NULL, &_twg_obj
+},
+_nysernet_obj = {
+ "nysernet", 8, 0,
+ NULL, &_cayman_obj
+},
+_cisco_obj = {
+ "cisco", 9, 0,
+ NULL, &_nysernet_obj
+},
+_nsc_obj = {
+ "nsc", 10, 0,
+ NULL, &_cisco_obj
+},
+_hp_obj = {
+ "hp", 11, 0,
+ NULL, &_nsc_obj
+},
+_epilogue_obj = {
+ "epilogue", 12, 0,
+ NULL, &_hp_obj
+},
+_utennessee_obj = {
+ "utennessee", 13, 0,
+ NULL, &_epilogue_obj
+},
+_bbn_obj = {
+ "bbn", 14, 0,
+ NULL, &_utennessee_obj
+},
+_xylogics_obj = {
+ "xylogics", 15, 0,
+ NULL, &_bbn_obj
+},
+_unisys_obj = {
+ "unisys", 16, 0,
+ NULL, &_xylogics_obj
+},
+_canstar_obj = {
+ "canstar", 17, 0,
+ NULL, &_unisys_obj
+},
+_wellfleet_obj = {
+ "wellfleet", 18, 0,
+ NULL, &_canstar_obj
+},
+_trw_obj = {
+ "trw", 19, 0,
+ NULL, &_wellfleet_obj
+},
+_mit_obj = {
+ "mit", 20, 0,
+ NULL, &_trw_obj
+},
+_eon_obj = {
+ "eon", 21, 0,
+ NULL, &_mit_obj
+},
+_spartacus_obj = {
+ "spartacus", 22, 0,
+ NULL, &_eon_obj
+},
+_excelan_obj = {
+ "excelan", 23, 0,
+ NULL, &_spartacus_obj
+},
+_spider_obj = {
+ "spider", 24, 0,
+ NULL, &_excelan_obj
+},
+_nsfnet_obj = {
+ "nsfnet", 25, 0,
+ NULL, &_spider_obj
+},
+_sytek_obj = {
+ "sytek", 26, 0,
+ NULL, &_nsfnet_obj
+},
+_intergraph_obj = {
+ "intergraph", 27, 0,
+ NULL, &_sytek_obj
+},
+_interlan_obj = {
+ "interlan", 28, 0,
+ NULL, &_intergraph_obj
+},
+_vitalink_obj = {
+ "vitalink", 29, 0,
+ NULL, &_interlan_obj
+},
+_ulana_obj = {
+ "ulana", 30, 0,
+ NULL, &_vitalink_obj
+},
+_nswc_obj = {
+ "nswc", 31, 0,
+ NULL, &_ulana_obj
+},
+_santacruzoperation_obj = {
+ "santacruzoperation", 32, 0,
+ NULL, &_nswc_obj
+},
+_xyplex_obj = {
+ "xyplex", 33, 0,
+ NULL, &_santacruzoperation_obj
+},
+_cray_obj = {
+ "cray", 34, 0,
+ NULL, &_xyplex_obj
+},
+_bellnorthernresearch_obj = {
+ "bellnorthernresearch", 35, 0,
+ NULL, &_cray_obj
+},
+_dec_obj = {
+ "dec", 36, 0,
+ NULL, &_bellnorthernresearch_obj
+},
+_touch_obj = {
+ "touch", 37, 0,
+ NULL, &_dec_obj
+},
+_networkresearchcorp_obj = {
+ "networkresearchcorp", 38, 0,
+ NULL, &_touch_obj
+},
+_baylor_obj = {
+ "baylor", 39, 0,
+ NULL, &_networkresearchcorp_obj
+},
+_nmfeccllnl_obj = {
+ "nmfeccllnl", 40, 0,
+ NULL, &_baylor_obj
+},
+_sri_obj = {
+ "sri", 41, 0,
+ NULL, &_nmfeccllnl_obj
+},
+_sun_obj = {
+ "sun", 42, 0,
+ NULL, &_sri_obj
+},
+_3com_obj = {
+ "3com", 43, 0,
+ NULL, &_sun_obj
+},
+_cmc_obj = {
+ "cmc", 44, 0,
+ NULL, &_3com_obj
+},
+_synoptics_obj = {
+ "synoptics", 45, 0,
+ NULL, &_cmc_obj
+},
+_cheyenne_obj = {
+ "cheyenne", 46, 0,
+ NULL, &_synoptics_obj
+},
+_prime_obj = {
+ "prime", 47, 0,
+ NULL, &_cheyenne_obj
+},
+_mcnc_obj = {
+ "mcnc", 48, 0,
+ NULL, &_prime_obj
+},
+_chipcom_obj = {
+ "chipcom", 49, 0,
+ NULL, &_mcnc_obj
+},
+_opticaldatasystems_obj = {
+ "opticaldatasystems", 50, 0,
+ NULL, &_chipcom_obj
+},
+_gated_obj = {
+ "gated", 51, 0,
+ NULL, &_opticaldatasystems_obj
+},
+_cabletron_obj = {
+ "cabletron", 52, 0,
+ NULL, &_gated_obj
+},
+_apollo_obj = {
+ "apollo", 53, 0,
+ NULL, &_cabletron_obj
+},
+_desktalksystems_obj = {
+ "desktalksystems", 54, 0,
+ NULL, &_apollo_obj
+},
+_ssds_obj = {
+ "ssds", 55, 0,
+ NULL, &_desktalksystems_obj
+},
+_castlerock_obj = {
+ "castlerock", 56, 0,
+ NULL, &_ssds_obj
+},
+_mips_obj = {
+ "mips", 57, 0,
+ NULL, &_castlerock_obj
+},
+_tgv_obj = {
+ "tgv", 58, 0,
+ NULL, &_mips_obj
+},
+_silicongraphics_obj = {
+ "silicongraphics", 59, 0,
+ NULL, &_tgv_obj
+},
+_ubc_obj = {
+ "ubc", 60, 0,
+ NULL, &_silicongraphics_obj
+},
+_merit_obj = {
+ "merit", 61, 0,
+ NULL, &_ubc_obj
+},
+_fibercom_obj = {
+ "fibercom", 62, 0,
+ NULL, &_merit_obj
+},
+_apple_obj = {
+ "apple", 63, 0,
+ NULL, &_fibercom_obj
+},
+_gandalf_obj = {
+ "gandalf", 64, 0,
+ NULL, &_apple_obj
+},
+_dartmouth_obj = {
+ "dartmouth", 65, 0,
+ NULL, &_gandalf_obj
+},
+_davidsystems_obj = {
+ "davidsystems", 66, 0,
+ NULL, &_dartmouth_obj
+},
+_reuter_obj = {
+ "reuter", 67, 0,
+ NULL, &_davidsystems_obj
+},
+_cornell_obj = {
+ "cornell", 68, 0,
+ NULL, &_reuter_obj
+},
+_tmac_obj = {
+ "tmac", 69, 0,
+ NULL, &_cornell_obj
+},
+_locus_obj = {
+ "locus", 70, 0,
+ NULL, &_tmac_obj
+},
+_nasa_obj = {
+ "nasa", 71, 0,
+ NULL, &_locus_obj
+},
+_retix_obj = {
+ "retix", 72, 0,
+ NULL, &_nasa_obj
+},
+_boeing_obj = {
+ "boeing", 73, 0,
+ NULL, &_retix_obj
+},
+_att_obj = {
+ "att", 74, 0,
+ NULL, &_boeing_obj
+},
+_ungermannbass_obj = {
+ "ungermannbass", 75, 0,
+ NULL, &_att_obj
+},
+_digitalanalysis_obj = {
+ "digitalanalysis", 76, 0,
+ NULL, &_ungermannbass_obj
+},
+_hplanman_obj = {
+ "hplanman", 77, 0,
+ NULL, &_digitalanalysis_obj
+},
+_netlabs_obj = {
+ "netlabs", 78, 0,
+ NULL, &_hplanman_obj
+},
+_icl_obj = {
+ "icl", 79, 0,
+ NULL, &_netlabs_obj
+},
+_auspex_obj = {
+ "auspex", 80, 0,
+ NULL, &_icl_obj
+},
+_lannet_obj = {
+ "lannet", 81, 0,
+ NULL, &_auspex_obj
+},
+_ncd_obj = {
+ "ncd", 82, 0,
+ NULL, &_lannet_obj
+},
+_raycom_obj = {
+ "raycom", 83, 0,
+ NULL, &_ncd_obj
+},
+_pirellifocom_obj = {
+ "pirellifocom", 84, 0,
+ NULL, &_raycom_obj
+},
+_datability_obj = {
+ "datability", 85, 0,
+ NULL, &_pirellifocom_obj
+},
+_networkappltech_obj = {
+ "networkappltech", 86, 0,
+ NULL, &_datability_obj
+},
+_link_obj = {
+ "link", 87, 0,
+ NULL, &_networkappltech_obj
+},
+_nyu_obj = {
+ "nyu", 88, 0,
+ NULL, &_link_obj
+},
+_rnd_obj = {
+ "rnd", 89, 0,
+ NULL, &_nyu_obj
+},
+_intercon_obj = {
+ "intercon", 90, 0,
+ NULL, &_rnd_obj
+},
+_learningtree_obj = {
+ "learningtree", 91, 0,
+ NULL, &_intercon_obj
+},
+_webstercomputer_obj = {
+ "webstercomputer", 92, 0,
+ NULL, &_learningtree_obj
+},
+_frontier_obj = {
+ "frontier", 93, 0,
+ NULL, &_webstercomputer_obj
+},
+_nokia_obj = {
+ "nokia", 94, 0,
+ NULL, &_frontier_obj
+},
+_allenbradley_obj = {
+ "allenbradley", 95, 0,
+ NULL, &_nokia_obj
+},
+_cern_obj = {
+ "cern", 96, 0,
+ NULL, &_allenbradley_obj
+},
+_sigma_obj = {
+ "sigma", 97, 0,
+ NULL, &_cern_obj
+},
+_emergingtech_obj = {
+ "emergingtech", 98, 0,
+ NULL, &_sigma_obj
+},
+_snmpresearch_obj = {
+ "snmpresearch", 99, 0,
+ NULL, &_emergingtech_obj
+},
+_ohiostate_obj = {
+ "ohiostate", 100, 0,
+ NULL, &_snmpresearch_obj
+},
+_ultra_obj = {
+ "ultra", 101, 0,
+ NULL, &_ohiostate_obj
+},
+_ccur_obj = {
+ "ccur", 136, 0,
+ NULL, &_ultra_obj
+},
+_enterprises_obj = {
+ "enterprises", 1, 0,
+ &_ccur_obj, NULL
+},
+_snmpInPkts_obj = {
+ "snmpInPkts", 1, 0,
+ NULL, NULL
+},
+_snmpOutPkts_obj = {
+ "snmpOutPkts", 2, 0,
+ NULL, &_snmpInPkts_obj
+},
+_snmpInBadVersions_obj = {
+ "snmpInBadVersions", 3, 0,
+ NULL, &_snmpOutPkts_obj
+},
+_snmpInBadCommunityNames_obj = {
+ "snmpInBadCommunityNames", 4, 0,
+ NULL, &_snmpInBadVersions_obj
+},
+_snmpInBadCommunityUses_obj = {
+ "snmpInBadCommunityUses", 5, 0,
+ NULL, &_snmpInBadCommunityNames_obj
+},
+_snmpInASNParseErrs_obj = {
+ "snmpInASNParseErrs", 6, 0,
+ NULL, &_snmpInBadCommunityUses_obj
+},
+_snmpInBadTypes_obj = {
+ "snmpInBadTypes", 7, 0,
+ NULL, &_snmpInASNParseErrs_obj
+},
+_snmpInTooBigs_obj = {
+ "snmpInTooBigs", 8, 0,
+ NULL, &_snmpInBadTypes_obj
+},
+_snmpInNoSuchNames_obj = {
+ "snmpInNoSuchNames", 9, 0,
+ NULL, &_snmpInTooBigs_obj
+},
+_snmpInBadValues_obj = {
+ "snmpInBadValues", 10, 0,
+ NULL, &_snmpInNoSuchNames_obj
+},
+_snmpInReadOnlys_obj = {
+ "snmpInReadOnlys", 11, 0,
+ NULL, &_snmpInBadValues_obj
+},
+_snmpInGenErrs_obj = {
+ "snmpInGenErrs", 12, 0,
+ NULL, &_snmpInReadOnlys_obj
+},
+_snmpInTotalReqVars_obj = {
+ "snmpInTotalReqVars", 13, 0,
+ NULL, &_snmpInGenErrs_obj
+},
+_snmpInTotalSetVars_obj = {
+ "snmpInTotalSetVars", 14, 0,
+ NULL, &_snmpInTotalReqVars_obj
+},
+_snmpInGetRequests_obj = {
+ "snmpInGetRequests", 15, 0,
+ NULL, &_snmpInTotalSetVars_obj
+},
+_snmpInGetNexts_obj = {
+ "snmpInGetNexts", 16, 0,
+ NULL, &_snmpInGetRequests_obj
+},
+_snmpInSetRequests_obj = {
+ "snmpInSetRequests", 17, 0,
+ NULL, &_snmpInGetNexts_obj
+},
+_snmpInGetResponses_obj = {
+ "snmpInGetResponses", 18, 0,
+ NULL, &_snmpInSetRequests_obj
+},
+_snmpInTraps_obj = {
+ "snmpInTraps", 19, 0,
+ NULL, &_snmpInGetResponses_obj
+},
+_snmpOutTooBigs_obj = {
+ "snmpOutTooBigs", 20, 0,
+ NULL, &_snmpInTraps_obj
+},
+_snmpOutNoSuchNames_obj = {
+ "snmpOutNoSuchNames", 21, 0,
+ NULL, &_snmpOutTooBigs_obj
+},
+_snmpOutBadValues_obj = {
+ "snmpOutBadValues", 22, 0,
+ NULL, &_snmpOutNoSuchNames_obj
+},
+_snmpOutReadOnlys_obj = {
+ "snmpOutReadOnlys", 23, 0,
+ NULL, &_snmpOutBadValues_obj
+},
+_snmpOutGenErrs_obj = {
+ "snmpOutGenErrs", 24, 0,
+ NULL, &_snmpOutReadOnlys_obj
+},
+_snmpOutGetRequests_obj = {
+ "snmpOutGetRequests", 25, 0,
+ NULL, &_snmpOutGenErrs_obj
+},
+_snmpOutGetNexts_obj = {
+ "snmpOutGetNexts", 26, 0,
+ NULL, &_snmpOutGetRequests_obj
+},
+_snmpOutSetRequests_obj = {
+ "snmpOutSetRequests", 27, 0,
+ NULL, &_snmpOutGetNexts_obj
+},
+_snmpOutGetResponses_obj = {
+ "snmpOutGetResponses", 28, 0,
+ NULL, &_snmpOutSetRequests_obj
+},
+_snmpOutTraps_obj = {
+ "snmpOutTraps", 29, 0,
+ NULL, &_snmpOutGetResponses_obj
+},
+_snmpEnableAuthTraps_obj = {
+ "snmpEnableAuthTraps", 30, 0,
+ NULL, &_snmpOutTraps_obj
+},
+_egpNeighState_obj = {
+ "egpNeighState", 1, 0,
+ NULL, NULL
+},
+_egpNeighAddr_obj = {
+ "egpNeighAddr", 2, 0,
+ NULL, &_egpNeighState_obj
+},
+_egpNeighAs_obj = {
+ "egpNeighAs", 3, 0,
+ NULL, &_egpNeighAddr_obj
+},
+_egpNeighInMsgs_obj = {
+ "egpNeighInMsgs", 4, 0,
+ NULL, &_egpNeighAs_obj
+},
+_egpNeighInErrs_obj = {
+ "egpNeighInErrs", 5, 0,
+ NULL, &_egpNeighInMsgs_obj
+},
+_egpNeighOutMsgs_obj = {
+ "egpNeighOutMsgs", 6, 0,
+ NULL, &_egpNeighInErrs_obj
+},
+_egpNeighOutErrs_obj = {
+ "egpNeighOutErrs", 7, 0,
+ NULL, &_egpNeighOutMsgs_obj
+},
+_egpNeighInErrMsgs_obj = {
+ "egpNeighInErrMsgs", 8, 0,
+ NULL, &_egpNeighOutErrs_obj
+},
+_egpNeighOutErrMsgs_obj = {
+ "egpNeighOutErrMsgs", 9, 0,
+ NULL, &_egpNeighInErrMsgs_obj
+},
+_egpNeighStateUps_obj = {
+ "egpNeighStateUps", 10, 0,
+ NULL, &_egpNeighOutErrMsgs_obj
+},
+_egpNeighStateDowns_obj = {
+ "egpNeighStateDowns", 11, 0,
+ NULL, &_egpNeighStateUps_obj
+},
+_egpNeighIntervalHello_obj = {
+ "egpNeighIntervalHello", 12, 0,
+ NULL, &_egpNeighStateDowns_obj
+},
+_egpNeighIntervalPoll_obj = {
+ "egpNeighIntervalPoll", 13, 0,
+ NULL, &_egpNeighIntervalHello_obj
+},
+_egpNeighMode_obj = {
+ "egpNeighMode", 14, 0,
+ NULL, &_egpNeighIntervalPoll_obj
+},
+_egpNeighEventTrigger_obj = {
+ "egpNeighEventTrigger", 15, 0,
+ NULL, &_egpNeighMode_obj
+},
+_egpNeighEntry_obj = {
+ "egpNeighEntry", 1, 0,
+ &_egpNeighEventTrigger_obj, NULL
+},
+_egpInMsgs_obj = {
+ "egpInMsgs", 1, 0,
+ NULL, NULL
+},
+_egpInErrors_obj = {
+ "egpInErrors", 2, 0,
+ NULL, &_egpInMsgs_obj
+},
+_egpOutMsgs_obj = {
+ "egpOutMsgs", 3, 0,
+ NULL, &_egpInErrors_obj
+},
+_egpOutErrors_obj = {
+ "egpOutErrors", 4, 0,
+ NULL, &_egpOutMsgs_obj
+},
+_egpNeighTable_obj = {
+ "egpNeighTable", 5, 0,
+ &_egpNeighEntry_obj, &_egpOutErrors_obj
+},
+_egpAs_obj = {
+ "egpAs", 6, 0,
+ NULL, &_egpNeighTable_obj
+},
+_udpLocalAddress_obj = {
+ "udpLocalAddress", 1, 0,
+ NULL, NULL
+},
+_udpLocalPort_obj = {
+ "udpLocalPort", 2, 0,
+ NULL, &_udpLocalAddress_obj
+},
+_udpEntry_obj = {
+ "udpEntry", 1, 0,
+ &_udpLocalPort_obj, NULL
+},
+_udpInDatagrams_obj = {
+ "udpInDatagrams", 1, 0,
+ NULL, NULL
+},
+_udpNoPorts_obj = {
+ "udpNoPorts", 2, 0,
+ NULL, &_udpInDatagrams_obj
+},
+_udpInErrors_obj = {
+ "udpInErrors", 3, 0,
+ NULL, &_udpNoPorts_obj
+},
+_udpOutDatagrams_obj = {
+ "udpOutDatagrams", 4, 0,
+ NULL, &_udpInErrors_obj
+},
+_udpTable_obj = {
+ "udpTable", 5, 0,
+ &_udpEntry_obj, &_udpOutDatagrams_obj
+},
+_tcpConnState_obj = {
+ "tcpConnState", 1, 0,
+ NULL, NULL
+},
+_tcpConnLocalAddress_obj = {
+ "tcpConnLocalAddress", 2, 0,
+ NULL, &_tcpConnState_obj
+},
+_tcpConnLocalPort_obj = {
+ "tcpConnLocalPort", 3, 0,
+ NULL, &_tcpConnLocalAddress_obj
+},
+_tcpConnRemAddress_obj = {
+ "tcpConnRemAddress", 4, 0,
+ NULL, &_tcpConnLocalPort_obj
+},
+_tcpConnRemPort_obj = {
+ "tcpConnRemPort", 5, 0,
+ NULL, &_tcpConnRemAddress_obj
+},
+_tcpConnEntry_obj = {
+ "tcpConnEntry", 1, 0,
+ &_tcpConnRemPort_obj, NULL
+},
+_tcpRtoAlgorithm_obj = {
+ "tcpRtoAlgorithm", 1, 0,
+ NULL, NULL
+},
+_tcpRtoMin_obj = {
+ "tcpRtoMin", 2, 0,
+ NULL, &_tcpRtoAlgorithm_obj
+},
+_tcpRtoMax_obj = {
+ "tcpRtoMax", 3, 0,
+ NULL, &_tcpRtoMin_obj
+},
+_tcpMaxConn_obj = {
+ "tcpMaxConn", 4, 0,
+ NULL, &_tcpRtoMax_obj
+},
+_tcpActiveOpens_obj = {
+ "tcpActiveOpens", 5, 0,
+ NULL, &_tcpMaxConn_obj
+},
+_tcpPassiveOpens_obj = {
+ "tcpPassiveOpens", 6, 0,
+ NULL, &_tcpActiveOpens_obj
+},
+_tcpAttemptFails_obj = {
+ "tcpAttemptFails", 7, 0,
+ NULL, &_tcpPassiveOpens_obj
+},
+_tcpEstabResets_obj = {
+ "tcpEstabResets", 8, 0,
+ NULL, &_tcpAttemptFails_obj
+},
+_tcpCurrEstab_obj = {
+ "tcpCurrEstab", 9, 0,
+ NULL, &_tcpEstabResets_obj
+},
+_tcpInSegs_obj = {
+ "tcpInSegs", 10, 0,
+ NULL, &_tcpCurrEstab_obj
+},
+_tcpOutSegs_obj = {
+ "tcpOutSegs", 11, 0,
+ NULL, &_tcpInSegs_obj
+},
+_tcpRetransSegs_obj = {
+ "tcpRetransSegs", 12, 0,
+ NULL, &_tcpOutSegs_obj
+},
+_tcpConnTable_obj = {
+ "tcpConnTable", 13, 0,
+ &_tcpConnEntry_obj, &_tcpRetransSegs_obj
+},
+_tcpInErrs_obj = {
+ "tcpInErrs", 14, 0,
+ NULL, &_tcpConnTable_obj
+},
+_tcpOutRsts_obj = {
+ "tcpOutRsts", 15, 0,
+ NULL, &_tcpInErrs_obj
+},
+_icmpInMsgs_obj = {
+ "icmpInMsgs", 1, 0,
+ NULL, NULL
+},
+_icmpInErrors_obj = {
+ "icmpInErrors", 2, 0,
+ NULL, &_icmpInMsgs_obj
+},
+_icmpInDestUnreachs_obj = {
+ "icmpInDestUnreachs", 3, 0,
+ NULL, &_icmpInErrors_obj
+},
+_icmpInTimeExcds_obj = {
+ "icmpInTimeExcds", 4, 0,
+ NULL, &_icmpInDestUnreachs_obj
+},
+_icmpInParmProbs_obj = {
+ "icmpInParmProbs", 5, 0,
+ NULL, &_icmpInTimeExcds_obj
+},
+_icmpInSrcQuenchs_obj = {
+ "icmpInSrcQuenchs", 6, 0,
+ NULL, &_icmpInParmProbs_obj
+},
+_icmpInRedirects_obj = {
+ "icmpInRedirects", 7, 0,
+ NULL, &_icmpInSrcQuenchs_obj
+},
+_icmpInEchos_obj = {
+ "icmpInEchos", 8, 0,
+ NULL, &_icmpInRedirects_obj
+},
+_icmpInEchoReps_obj = {
+ "icmpInEchoReps", 9, 0,
+ NULL, &_icmpInEchos_obj
+},
+_icmpInTimestamps_obj = {
+ "icmpInTimestamps", 10, 0,
+ NULL, &_icmpInEchoReps_obj
+},
+_icmpInTimestampReps_obj = {
+ "icmpInTimestampReps", 11, 0,
+ NULL, &_icmpInTimestamps_obj
+},
+_icmpInAddrMasks_obj = {
+ "icmpInAddrMasks", 12, 0,
+ NULL, &_icmpInTimestampReps_obj
+},
+_icmpInAddrMaskReps_obj = {
+ "icmpInAddrMaskReps", 13, 0,
+ NULL, &_icmpInAddrMasks_obj
+},
+_icmpOutMsgs_obj = {
+ "icmpOutMsgs", 14, 0,
+ NULL, &_icmpInAddrMaskReps_obj
+},
+_icmpOutErrors_obj = {
+ "icmpOutErrors", 15, 0,
+ NULL, &_icmpOutMsgs_obj
+},
+_icmpOutDestUnreachs_obj = {
+ "icmpOutDestUnreachs", 16, 0,
+ NULL, &_icmpOutErrors_obj
+},
+_icmpOutTimeExcds_obj = {
+ "icmpOutTimeExcds", 17, 0,
+ NULL, &_icmpOutDestUnreachs_obj
+},
+_icmpOutParmProbs_obj = {
+ "icmpOutParmProbs", 18, 0,
+ NULL, &_icmpOutTimeExcds_obj
+},
+_icmpOutSrcQuenchs_obj = {
+ "icmpOutSrcQuenchs", 19, 0,
+ NULL, &_icmpOutParmProbs_obj
+},
+_icmpOutRedirects_obj = {
+ "icmpOutRedirects", 20, 0,
+ NULL, &_icmpOutSrcQuenchs_obj
+},
+_icmpOutEchos_obj = {
+ "icmpOutEchos", 21, 0,
+ NULL, &_icmpOutRedirects_obj
+},
+_icmpOutEchoReps_obj = {
+ "icmpOutEchoReps", 22, 0,
+ NULL, &_icmpOutEchos_obj
+},
+_icmpOutTimestamps_obj = {
+ "icmpOutTimestamps", 23, 0,
+ NULL, &_icmpOutEchoReps_obj
+},
+_icmpOutTimestampReps_obj = {
+ "icmpOutTimestampReps", 24, 0,
+ NULL, &_icmpOutTimestamps_obj
+},
+_icmpOutAddrMasks_obj = {
+ "icmpOutAddrMasks", 25, 0,
+ NULL, &_icmpOutTimestampReps_obj
+},
+_icmpOutAddrMaskReps_obj = {
+ "icmpOutAddrMaskReps", 26, 0,
+ NULL, &_icmpOutAddrMasks_obj
+},
+_ipNetToMediaIfIndex_obj = {
+ "ipNetToMediaIfIndex", 1, 0,
+ NULL, NULL
+},
+_ipNetToMediaPhysAddress_obj = {
+ "ipNetToMediaPhysAddress", 2, 0,
+ NULL, &_ipNetToMediaIfIndex_obj
+},
+_ipNetToMediaNetAddress_obj = {
+ "ipNetToMediaNetAddress", 3, 0,
+ NULL, &_ipNetToMediaPhysAddress_obj
+},
+_ipNetToMediaType_obj = {
+ "ipNetToMediaType", 4, 0,
+ NULL, &_ipNetToMediaNetAddress_obj
+},
+_ipNetToMediaEntry_obj = {
+ "ipNetToMediaEntry", 1, 0,
+ &_ipNetToMediaType_obj, NULL
+},
+_ipRouteDest_obj = {
+ "ipRouteDest", 1, 0,
+ NULL, NULL
+},
+_ipRouteIfIndex_obj = {
+ "ipRouteIfIndex", 2, 0,
+ NULL, &_ipRouteDest_obj
+},
+_ipRouteMetric1_obj = {
+ "ipRouteMetric1", 3, 0,
+ NULL, &_ipRouteIfIndex_obj
+},
+_ipRouteMetric2_obj = {
+ "ipRouteMetric2", 4, 0,
+ NULL, &_ipRouteMetric1_obj
+},
+_ipRouteMetric3_obj = {
+ "ipRouteMetric3", 5, 0,
+ NULL, &_ipRouteMetric2_obj
+},
+_ipRouteMetric4_obj = {
+ "ipRouteMetric4", 6, 0,
+ NULL, &_ipRouteMetric3_obj
+},
+_ipRouteNextHop_obj = {
+ "ipRouteNextHop", 7, 0,
+ NULL, &_ipRouteMetric4_obj
+},
+_ipRouteType_obj = {
+ "ipRouteType", 8, 0,
+ NULL, &_ipRouteNextHop_obj
+},
+_ipRouteProto_obj = {
+ "ipRouteProto", 9, 0,
+ NULL, &_ipRouteType_obj
+},
+_ipRouteAge_obj = {
+ "ipRouteAge", 10, 0,
+ NULL, &_ipRouteProto_obj
+},
+_ipRouteMask_obj = {
+ "ipRouteMask", 11, 0,
+ NULL, &_ipRouteAge_obj
+},
+_ipRouteEntry_obj = {
+ "ipRouteEntry", 1, 0,
+ &_ipRouteMask_obj, NULL
+},
+_ipAdEntAddr_obj = {
+ "ipAdEntAddr", 1, 0,
+ NULL, NULL
+},
+_ipAdEntIfIndex_obj = {
+ "ipAdEntIfIndex", 2, 0,
+ NULL, &_ipAdEntAddr_obj
+},
+_ipAdEntNetMask_obj = {
+ "ipAdEntNetMask", 3, 0,
+ NULL, &_ipAdEntIfIndex_obj
+},
+_ipAdEntBcastAddr_obj = {
+ "ipAdEntBcastAddr", 4, 0,
+ NULL, &_ipAdEntNetMask_obj
+},
+_ipAdEntReasmMaxSize_obj = {
+ "ipAdEntReasmMaxSize", 5, 0,
+ NULL, &_ipAdEntBcastAddr_obj
+},
+_ipAddrEntry_obj = {
+ "ipAddrEntry", 1, 0,
+ &_ipAdEntReasmMaxSize_obj, NULL
+},
+_ipForwarding_obj = {
+ "ipForwarding", 1, 0,
+ NULL, NULL
+},
+_ipDefaultTTL_obj = {
+ "ipDefaultTTL", 2, 0,
+ NULL, &_ipForwarding_obj
+},
+_ipInReceives_obj = {
+ "ipInReceives", 3, 0,
+ NULL, &_ipDefaultTTL_obj
+},
+_ipInHdrErrors_obj = {
+ "ipInHdrErrors", 4, 0,
+ NULL, &_ipInReceives_obj
+},
+_ipInAddrErrors_obj = {
+ "ipInAddrErrors", 5, 0,
+ NULL, &_ipInHdrErrors_obj
+},
+_ipForwDatagrams_obj = {
+ "ipForwDatagrams", 6, 0,
+ NULL, &_ipInAddrErrors_obj
+},
+_ipInUnknownProtos_obj = {
+ "ipInUnknownProtos", 7, 0,
+ NULL, &_ipForwDatagrams_obj
+},
+_ipInDiscards_obj = {
+ "ipInDiscards", 8, 0,
+ NULL, &_ipInUnknownProtos_obj
+},
+_ipInDelivers_obj = {
+ "ipInDelivers", 9, 0,
+ NULL, &_ipInDiscards_obj
+},
+_ipOutRequests_obj = {
+ "ipOutRequests", 10, 0,
+ NULL, &_ipInDelivers_obj
+},
+_ipOutDiscards_obj = {
+ "ipOutDiscards", 11, 0,
+ NULL, &_ipOutRequests_obj
+},
+_ipOutNoRoutes_obj = {
+ "ipOutNoRoutes", 12, 0,
+ NULL, &_ipOutDiscards_obj
+},
+_ipReasmTimeout_obj = {
+ "ipReasmTimeout", 13, 0,
+ NULL, &_ipOutNoRoutes_obj
+},
+_ipReasmReqds_obj = {
+ "ipReasmReqds", 14, 0,
+ NULL, &_ipReasmTimeout_obj
+},
+_ipReasmOKs_obj = {
+ "ipReasmOKs", 15, 0,
+ NULL, &_ipReasmReqds_obj
+},
+_ipReasmFails_obj = {
+ "ipReasmFails", 16, 0,
+ NULL, &_ipReasmOKs_obj
+},
+_ipFragOKs_obj = {
+ "ipFragOKs", 17, 0,
+ NULL, &_ipReasmFails_obj
+},
+_ipFragFails_obj = {
+ "ipFragFails", 18, 0,
+ NULL, &_ipFragOKs_obj
+},
+_ipFragCreates_obj = {
+ "ipFragCreates", 19, 0,
+ NULL, &_ipFragFails_obj
+},
+_ipAddrTable_obj = {
+ "ipAddrTable", 20, 0,
+ &_ipAddrEntry_obj, &_ipFragCreates_obj
+},
+_ipRoutingTable_obj = {
+ "ipRoutingTable", 21, 0,
+ &_ipRouteEntry_obj, &_ipAddrTable_obj
+},
+_ipNetToMediaTable_obj = {
+ "ipNetToMediaTable", 22, 0,
+ &_ipNetToMediaEntry_obj, &_ipRoutingTable_obj
+},
+_atIfIndex_obj = {
+ "atIfIndex", 1, 0,
+ NULL, NULL
+},
+_atPhysAddress_obj = {
+ "atPhysAddress", 2, 0,
+ NULL, &_atIfIndex_obj
+},
+_atNetAddress_obj = {
+ "atNetAddress", 3, 0,
+ NULL, &_atPhysAddress_obj
+},
+_atEntry_obj = {
+ "atEntry", 1, 0,
+ &_atNetAddress_obj, NULL
+},
+_atTable_obj = {
+ "atTable", 1, 0,
+ &_atEntry_obj, NULL
+},
+_ifIndex_obj = {
+ "ifIndex", 1, 0,
+ NULL, NULL
+},
+_ifDescr_obj = {
+ "ifDescr", 2, 0,
+ NULL, &_ifIndex_obj
+},
+_ifType_obj = {
+ "ifType", 3, 0,
+ NULL, &_ifDescr_obj
+},
+_ifMtu_obj = {
+ "ifMtu", 4, 0,
+ NULL, &_ifType_obj
+},
+_ifSpeed_obj = {
+ "ifSpeed", 5, 0,
+ NULL, &_ifMtu_obj
+},
+_ifPhysAddress_obj = {
+ "ifPhysAddress", 6, 0,
+ NULL, &_ifSpeed_obj
+},
+_ifAdminStatus_obj = {
+ "ifAdminStatus", 7, 0,
+ NULL, &_ifPhysAddress_obj
+},
+_ifOperStatus_obj = {
+ "ifOperStatus", 8, 0,
+ NULL, &_ifAdminStatus_obj
+},
+_ifLastChange_obj = {
+ "ifLastChange", 9, 0,
+ NULL, &_ifOperStatus_obj
+},
+_ifInOctets_obj = {
+ "ifInOctets", 10, 0,
+ NULL, &_ifLastChange_obj
+},
+_ifInUcastPkts_obj = {
+ "ifInUcastPkts", 11, 0,
+ NULL, &_ifInOctets_obj
+},
+_ifInNUcastPkts_obj = {
+ "ifInNUcastPkts", 12, 0,
+ NULL, &_ifInUcastPkts_obj
+},
+_ifInDiscards_obj = {
+ "ifInDiscards", 13, 0,
+ NULL, &_ifInNUcastPkts_obj
+},
+_ifInErrors_obj = {
+ "ifInErrors", 14, 0,
+ NULL, &_ifInDiscards_obj
+},
+_ifInUnknownProtos_obj = {
+ "ifInUnknownProtos", 15, 0,
+ NULL, &_ifInErrors_obj
+},
+_ifOutOctets_obj = {
+ "ifOutOctets", 16, 0,
+ NULL, &_ifInUnknownProtos_obj
+},
+_ifOutUcastPkts_obj = {
+ "ifOutUcastPkts", 17, 0,
+ NULL, &_ifOutOctets_obj
+},
+_ifOutNUcastPkts_obj = {
+ "ifOutNUcastPkts", 18, 0,
+ NULL, &_ifOutUcastPkts_obj
+},
+_ifOutDiscards_obj = {
+ "ifOutDiscards", 19, 0,
+ NULL, &_ifOutNUcastPkts_obj
+},
+_ifOutErrors_obj = {
+ "ifOutErrors", 20, 0,
+ NULL, &_ifOutDiscards_obj
+},
+_ifOutQLen_obj = {
+ "ifOutQLen", 21, 0,
+ NULL, &_ifOutErrors_obj
+},
+_ifSpecific_obj = {
+ "ifSpecific", 22, 0,
+ NULL, &_ifOutQLen_obj
+},
+_ifEntry_obj = {
+ "ifEntry", 1, 0,
+ &_ifSpecific_obj, NULL
+},
+_ifNumber_obj = {
+ "ifNumber", 1, 0,
+ NULL, NULL
+},
+_ifTable_obj = {
+ "ifTable", 2, 0,
+ &_ifEntry_obj, &_ifNumber_obj
+},
+_sysDescr_obj = {
+ "sysDescr", 1, 0,
+ NULL, NULL
+},
+_sysObjectID_obj = {
+ "sysObjectID", 2, 0,
+ NULL, &_sysDescr_obj
+},
+_sysUpTime_obj = {
+ "sysUpTime", 3, 0,
+ NULL, &_sysObjectID_obj
+},
+_sysContact_obj = {
+ "sysContact", 4, 0,
+ NULL, &_sysUpTime_obj
+},
+_sysName_obj = {
+ "sysName", 5, 0,
+ NULL, &_sysContact_obj
+},
+_sysLocation_obj = {
+ "sysLocation", 6, 0,
+ NULL, &_sysName_obj
+},
+_sysServices_obj = {
+ "sysServices", 7, 0,
+ NULL, &_sysLocation_obj
+},
+_system_obj = {
+ "system", 1, 0,
+ &_sysServices_obj, NULL
+},
+_interfaces_obj = {
+ "interfaces", 2, 0,
+ &_ifTable_obj, &_system_obj
+},
+_at_obj = {
+ "at", 3, 0,
+ &_atTable_obj, &_interfaces_obj
+},
+_ip_obj = {
+ "ip", 4, 0,
+ &_ipNetToMediaTable_obj, &_at_obj
+},
+_icmp_obj = {
+ "icmp", 5, 0,
+ &_icmpOutAddrMaskReps_obj, &_ip_obj
+},
+_tcp_obj = {
+ "tcp", 6, 0,
+ &_tcpOutRsts_obj, &_icmp_obj
+},
+_udp_obj = {
+ "udp", 7, 0,
+ &_udpTable_obj, &_tcp_obj
+},
+_egp_obj = {
+ "egp", 8, 0,
+ &_egpAs_obj, &_udp_obj
+},
+_transmission_obj = {
+ "transmission", 10, 0,
+ NULL, &_egp_obj
+},
+_snmp_obj = {
+ "snmp", 11, 0,
+ &_snmpEnableAuthTraps_obj, &_transmission_obj
+},
+_usmMIBCompliances_obj = {
+ "usmMIBCompliances", 1, 0,
+ NULL, NULL
+},
+_usmMIBGroups_obj = {
+ "usmMIBGroups", 2, 0,
+ NULL, &_usmMIBCompliances_obj
+},
+_usmUserEngineID_obj = {
+ "usmUserEngineID", 1, 0,
+ NULL, NULL
+},
+_usmUserName_obj = {
+ "usmUserName", 2, 0,
+ NULL, &_usmUserEngineID_obj
+},
+_usmUserSecurityName_obj = {
+ "usmUserSecurityName", 3, 0,
+ NULL, &_usmUserName_obj
+},
+_usmUserCloneFrom_obj = {
+ "usmUserCloneFrom", 4, 0,
+ NULL, &_usmUserSecurityName_obj
+},
+_usmUserAuthProtocol_obj = {
+ "usmUserAuthProtocol", 5, 0,
+ NULL, &_usmUserCloneFrom_obj
+},
+_usmUserAuthKeyChange_obj = {
+ "usmUserAuthKeyChange", 6, 0,
+ NULL, &_usmUserAuthProtocol_obj
+},
+_usmUserOwnAuthKeyChange_obj = {
+ "usmUserOwnAuthKeyChange", 7, 0,
+ NULL, &_usmUserAuthKeyChange_obj
+},
+_usmUserPrivProtocol_obj = {
+ "usmUserPrivProtocol", 8, 0,
+ NULL, &_usmUserOwnAuthKeyChange_obj
+},
+_usmUserPrivKeyChange_obj = {
+ "usmUserPrivKeyChange", 9, 0,
+ NULL, &_usmUserPrivProtocol_obj
+},
+_usmUserOwnPrivKeyChange_obj = {
+ "usmUserOwnPrivKeyChange", 10, 0,
+ NULL, &_usmUserPrivKeyChange_obj
+},
+_usmUserPublic_obj = {
+ "usmUserPublic", 11, 0,
+ NULL, &_usmUserOwnPrivKeyChange_obj
+},
+_usmUserStorageType_obj = {
+ "usmUserStorageType", 12, 0,
+ NULL, &_usmUserPublic_obj
+},
+_usmUserStatus_obj = {
+ "usmUserStatus", 13, 0,
+ NULL, &_usmUserStorageType_obj
+},
+_usmUserEntry_obj = {
+ "usmUserEntry", 1, 0,
+ &_usmUserStatus_obj, NULL
+},
+_usmUserSpinLock_obj = {
+ "usmUserSpinLock", 1, 0,
+ NULL, NULL
+},
+_usmUserTable_obj = {
+ "usmUserTable", 2, 0,
+ &_usmUserEntry_obj, &_usmUserSpinLock_obj
+},
+_usmStatsUnsupportedSecLevels_obj = {
+ "usmStatsUnsupportedSecLevels", 1, 0,
+ NULL, NULL
+},
+_usmStatsNotInTimeWindows_obj = {
+ "usmStatsNotInTimeWindows", 2, 0,
+ NULL, &_usmStatsUnsupportedSecLevels_obj
+},
+_usmStatsUnknownUserNames_obj = {
+ "usmStatsUnknownUserNames", 3, 0,
+ NULL, &_usmStatsNotInTimeWindows_obj
+},
+_usmStatsUnknownEngineIDs_obj = {
+ "usmStatsUnknownEngineIDs", 4, 0,
+ NULL, &_usmStatsUnknownUserNames_obj
+},
+_usmStatsWrongDigests_obj = {
+ "usmStatsWrongDigests", 5, 0,
+ NULL, &_usmStatsUnknownEngineIDs_obj
+},
+_usmStatsDecryptionErrors_obj = {
+ "usmStatsDecryptionErrors", 6, 0,
+ NULL, &_usmStatsWrongDigests_obj
+},
+_usmStats_obj = {
+ "usmStats", 1, 0,
+ &_usmStatsDecryptionErrors_obj, NULL
+},
+_usmUser_obj = {
+ "usmUser", 2, 0,
+ &_usmUserTable_obj, &_usmStats_obj
+},
+_usmMIBObjects_obj = {
+ "usmMIBObjects", 1, 0,
+ &_usmUser_obj, NULL
+},
+_usmMIBConformance_obj = {
+ "usmMIBConformance", 2, 0,
+ &_usmMIBGroups_obj, &_usmMIBObjects_obj
+},
+_snmpMPDMIBCompliances_obj = {
+ "snmpMPDMIBCompliances", 1, 0,
+ NULL, NULL
+},
+_snmpMPDMIBGroups_obj = {
+ "snmpMPDMIBGroups", 2, 0,
+ NULL, &_snmpMPDMIBCompliances_obj
+},
+_snmpUnknownSecurityModels_obj = {
+ "snmpUnknownSecurityModels", 1, 0,
+ NULL, NULL
+},
+_snmpInvalidMsgs_obj = {
+ "snmpInvalidMsgs", 2, 0,
+ NULL, &_snmpUnknownSecurityModels_obj
+},
+_snmpUnknownPDUHandlers_obj = {
+ "snmpUnknownPDUHandlers", 3, 0,
+ NULL, &_snmpInvalidMsgs_obj
+},
+_snmpMPDStats_obj = {
+ "snmpMPDStats", 1, 0,
+ &_snmpUnknownPDUHandlers_obj, NULL
+},
+_snmpMPDAdmin_obj = {
+ "snmpMPDAdmin", 1, 0,
+ NULL, NULL
+},
+_snmpMPDMIBObjects_obj = {
+ "snmpMPDMIBObjects", 2, 0,
+ &_snmpMPDStats_obj, &_snmpMPDAdmin_obj
+},
+_snmpMPDMIBConformance_obj = {
+ "snmpMPDMIBConformance", 3, 0,
+ &_snmpMPDMIBGroups_obj, &_snmpMPDMIBObjects_obj
+},
+_snmpEngineID_obj = {
+ "snmpEngineID", 1, 0,
+ NULL, NULL
+},
+_snmpEngineBoots_obj = {
+ "snmpEngineBoots", 2, 0,
+ NULL, &_snmpEngineID_obj
+},
+_snmpEngineTime_obj = {
+ "snmpEngineTime", 3, 0,
+ NULL, &_snmpEngineBoots_obj
+},
+_snmpEngineMaxMessageSize_obj = {
+ "snmpEngineMaxMessageSize", 4, 0,
+ NULL, &_snmpEngineTime_obj
+},
+_snmpEngine_obj = {
+ "snmpEngine", 1, 0,
+ &_snmpEngineMaxMessageSize_obj, NULL
+},
+_snmpFrameworkAdmin_obj = {
+ "snmpFrameworkAdmin", 1, 0,
+ NULL, NULL
+},
+_snmpFrameworkMIBObjects_obj = {
+ "snmpFrameworkMIBObjects", 2, 0,
+ &_snmpEngine_obj, &_snmpFrameworkAdmin_obj
+},
+_snmpFrameworkMIBConformance_obj = {
+ "snmpFrameworkMIBConformance", 3, 0,
+ NULL, &_snmpFrameworkMIBObjects_obj
+},
+_snmpFrameworkMIB_obj = {
+ "snmpFrameworkMIB", 10, 0,
+ &_snmpFrameworkMIBConformance_obj, NULL
+},
+_snmpMPDMIB_obj = {
+ "snmpMPDMIB", 11, 0,
+ &_snmpMPDMIBConformance_obj, &_snmpFrameworkMIB_obj
+},
+_snmpUsmMIB_obj = {
+ "snmpUsmMIB", 15, 0,
+ &_usmMIBConformance_obj, &_snmpMPDMIB_obj
+},
+_snmpModules_obj = {
+ "snmpModules", 3, 0,
+ &_snmpUsmMIB_obj, NULL
+},
+_mib_obj = {
+ "mib", 1, 0,
+ &_snmp_obj, NULL
+},
+_directory_obj = {
+ "directory", 1, 0,
+ NULL, NULL
+},
+_mgmt_obj = {
+ "mgmt", 2, 0,
+ &_mib_obj, &_directory_obj
+},
+_experimental_obj = {
+ "experimental", 3, 0,
+ NULL, &_mgmt_obj
+},
+_private_obj = {
+ "private", 4, 0,
+ &_enterprises_obj, &_experimental_obj
+},
+_security_obj = {
+ "security", 5, 0,
+ NULL, &_private_obj
+},
+_snmpV2_obj = {
+ "snmpV2", 6, 0,
+ &_snmpModules_obj, &_security_obj
+},
+_internet_obj = {
+ "internet", 1, 0,
+ &_snmpV2_obj, NULL
+},
+_dod_obj = {
+ "dod", 6, 0,
+ &_internet_obj, NULL
+},
+_org_obj = {
+ "org", 3, 0,
+ &_dod_obj, NULL
+},
+_iso_obj = {
+ "iso", 1, 0,
+ &_org_obj, NULL
+},
+*mibroot = &_iso_obj;
--- /dev/null
+/*
+ * Copyright (C) 1995, 1996, 1997, 1998, and 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_ADDRINFO
+
+/*
+ * Error return codes from getaddrinfo()
+ */
+#define EAI_ADDRFAMILY 1 /* address family for hostname not supported */
+#define EAI_AGAIN 2 /* temporary failure in name resolution */
+#define EAI_BADFLAGS 3 /* invalid value for ai_flags */
+#define EAI_FAIL 4 /* non-recoverable failure in name resolution */
+#define EAI_FAMILY 5 /* ai_family not supported */
+#define EAI_MEMORY 6 /* memory allocation failure */
+#define EAI_NODATA 7 /* no address associated with hostname */
+#define EAI_NONAME 8 /* hostname nor servname provided, or not known */
+#define EAI_SERVICE 9 /* servname not supported for ai_socktype */
+#define EAI_SOCKTYPE 10 /* ai_socktype not supported */
+#define EAI_SYSTEM 11 /* system error returned in errno */
+#define EAI_BADHINTS 12
+#define EAI_PROTOCOL 13
+#define EAI_MAX 14
+
+/* internal error */
+#define NETDB_INTERNAL -1 /* see errno */
+
+/*
+ * Flag values for getaddrinfo()
+ */
+#define AI_PASSIVE 0x00000001 /* get address to use bind() */
+#define AI_CANONNAME 0x00000002 /* fill ai_canonname */
+#define AI_NUMERICHOST 0x00000004 /* prevent name resolution */
+/* valid flags for addrinfo */
+#define AI_MASK (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST)
+
+#define AI_ALL 0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */
+#define AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */
+#define AI_ADDRCONFIG 0x00000400 /* only if any address is assigned */
+#define AI_V4MAPPED 0x00000800 /* accept IPv4-mapped IPv6 address */
+/* special recommended flags for getipnodebyname */
+#define AI_DEFAULT (AI_V4MAPPED_CFG | AI_ADDRCONFIG)
+
+struct addrinfo {
+ int ai_flags; /* AI_PASSIVE, AI_CANONNAME */
+ int ai_family; /* PF_xxx */
+ int ai_socktype; /* SOCK_xxx */
+ int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
+ size_t ai_addrlen; /* length of ai_addr */
+ char *ai_canonname; /* canonical name for hostname */
+ struct sockaddr *ai_addr; /* binary address */
+ struct addrinfo *ai_next; /* next structure in linked list */
+};
+
+extern void freeaddrinfo (struct addrinfo *);
+extern void freehostent (struct hostent *);
+extern int getnameinfo (const struct sockaddr *, size_t, char *,
+ size_t, char *, size_t, int);
+extern struct hostent *getipnodebyaddr (const void *, size_t, int, int *);
+extern struct hostent *getipnodebyname (const char *, int, int, int *);
+extern int inet_pton (int, const char *, void *);
+extern const char *inet_ntop (int, const void *, char *, size_t);
+#endif /* HAVE_ADDRINFO */
+
+/*
+ * Constants for getnameinfo()
+ */
+#ifndef NI_MAXHOST
+#define NI_MAXHOST 1025
+#endif
+#ifndef NI_MAXSERV
+#define NI_MAXSERV 32
+#endif
+
+/*
+ * Flag values for getnameinfo()
+ */
+#ifndef NI_NOFQDN
+#define NI_NOFQDN 0x00000001
+#endif
+#ifndef NI_NUMERICHOST
+#define NI_NUMERICHOST 0x00000002
+#endif
+#ifndef NI_NAMEREQD
+#define NI_NAMEREQD 0x00000004
+#endif
+#ifndef NI_NUMERICSERV
+#define NI_NUMERICSERV 0x00000008
+#endif
+#ifndef NI_DGRAM
+#define NI_DGRAM 0x00000010
+#endif
--- /dev/null
+/*
+ * Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Computer Systems
+ * Engineering Group at Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <pcap.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "pcap-missing.h"
+
+/*
+ * Stub versions for platforms that don't support them.
+ */
+int
+pcap_list_datalinks(pcap_t *p, int **dlt_buffer)
+{
+ /*
+ * This platform doesn't support changing the DLT for an
+ * interface. Return a list of DLTs containing only the
+ * DLT this device supports.
+ */
+ *dlt_buffer = (int*)malloc(sizeof(**dlt_buffer));
+ if (*dlt_buffer == NULL)
+ return (-1);
+ **dlt_buffer = pcap_datalink(p);
+ return (1);
+}
--- /dev/null
+/*
+ * Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Computer Systems
+ * Engineering Group at Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <pcap.h>
+#include <string.h>
+
+#include "pcap-missing.h"
+
+struct dlt_choice {
+ const char *name;
+ const char *description;
+ int dlt;
+};
+
+#define DLT_CHOICE(code, description) { #code, description, code }
+#define DLT_CHOICE_SENTINEL { NULL, NULL, 0 }
+
+static struct dlt_choice dlt_choices[] = {
+ DLT_CHOICE(DLT_NULL, "BSD loopback"),
+ DLT_CHOICE(DLT_EN10MB, "Ethernet"),
+ DLT_CHOICE(DLT_IEEE802, "Token ring"),
+ DLT_CHOICE(DLT_ARCNET, "ARCNET"),
+ DLT_CHOICE(DLT_SLIP, "SLIP"),
+ DLT_CHOICE(DLT_PPP, "PPP"),
+ DLT_CHOICE(DLT_FDDI, "FDDI"),
+ DLT_CHOICE(DLT_ATM_RFC1483, "RFC 1483 IP-over-ATM"),
+ DLT_CHOICE(DLT_RAW, "Raw IP"),
+#ifdef DLT_SLIP_BSDOS
+ DLT_CHOICE(DLT_SLIP_BSDOS, "BSD/OS SLIP"),
+#endif
+#ifdef DLT_PPP_BSDOS
+ DLT_CHOICE(DLT_PPP_BSDOS, "BSD/OS PPP"),
+#endif
+#ifdef DLT_ATM_CLIP
+ DLT_CHOICE(DLT_ATM_CLIP, "Linux Classical IP-over-ATM"),
+#endif
+#ifdef DLT_PPP_SERIAL
+ DLT_CHOICE(DLT_PPP_SERIAL, "PPP over serial"),
+#endif
+#ifdef DLT_PPP_ETHER
+ DLT_CHOICE(DLT_PPP_ETHER, "PPPoE"),
+#endif
+#ifdef DLT_C_HDLC
+ DLT_CHOICE(DLT_C_HDLC, "Cisco HDLC"),
+#endif
+#ifdef DLT_IEEE802_11
+ DLT_CHOICE(DLT_IEEE802_11, "802.11"),
+#endif
+#ifdef DLT_FRELAY
+ DLT_CHOICE(DLT_FRELAY, "Frame Relay"),
+#endif
+#ifdef DLT_LOOP
+ DLT_CHOICE(DLT_LOOP, "OpenBSD loopback"),
+#endif
+#ifdef DLT_ENC
+ DLT_CHOICE(DLT_ENC, "OpenBSD encapsulated IP"),
+#endif
+#ifdef DLT_LINUX_SLL
+ DLT_CHOICE(DLT_LINUX_SLL, "Linux cooked"),
+#endif
+#ifdef DLT_LTALK
+ DLT_CHOICE(DLT_LTALK, "Localtalk"),
+#endif
+#ifdef DLT_PFLOG
+ DLT_CHOICE(DLT_PFLOG, "OpenBSD pflog file"),
+#endif
+#ifdef DLT_PRISM_HEADER
+ DLT_CHOICE(DLT_PRISM_HEADER, "802.11 plus Prism header"),
+#endif
+#ifdef DLT_IP_OVER_FC
+ DLT_CHOICE(DLT_IP_OVER_FC, "RFC 2625 IP-over-Fibre Channel"),
+#endif
+#ifdef DLT_SUNATM
+ DLT_CHOICE(DLT_SUNATM, "Sun raw ATM"),
+#endif
+#ifdef DLT_IEEE802_11_RADIO
+ DLT_CHOICE(DLT_IEEE802_11_RADIO, "802.11 plus radio information header"),
+#endif
+#ifdef DLT_ARCNET_LINUX
+ DLT_CHOICE(DLT_ARCNET_LINUX, "Linux ARCNET"),
+#endif
+#ifdef DLT_LINUX_IRDA
+ DLT_CHOICE(DLT_LINUX_IRDA, "Linux IrDA"),
+#endif
+#ifdef DLT_LANE8023
+ DLT_CHOICE(DLT_LANE8023, "Linux 802.3 LANE"),
+#endif
+#ifdef DLT_CIP
+ DLT_CHOICE(DLT_CIP, "Linux Classical IP-over-ATM"),
+#endif
+#ifdef DLT_HDLC
+ DLT_CHOICE(DLT_HDLC, "Cisco HDLC"),
+#endif
+ DLT_CHOICE_SENTINEL
+};
+
+#ifndef HAVE_PCAP_DATALINK_NAME_TO_VAL
+int
+pcap_datalink_name_to_val(const char *name)
+{
+ int i;
+
+ for (i = 0; dlt_choices[i].name != NULL; i++) {
+ if (strcasecmp(dlt_choices[i].name + sizeof("DLT_") - 1,
+ name) == 0)
+ return (dlt_choices[i].dlt);
+ }
+ return (-1);
+}
+
+const char *
+pcap_datalink_val_to_name(int dlt)
+{
+ int i;
+
+ for (i = 0; dlt_choices[i].name != NULL; i++) {
+ if (dlt_choices[i].dlt == dlt)
+ return (dlt_choices[i].name + sizeof("DLT_") - 1);
+ }
+ return (NULL);
+}
+#endif
+
+const char *
+pcap_datalink_val_to_description(int dlt)
+{
+ int i;
+
+ for (i = 0; dlt_choices[i].name != NULL; i++) {
+ if (dlt_choices[i].dlt == dlt)
+ return (dlt_choices[i].description);
+ }
+ return (NULL);
+}
--- /dev/null
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 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.
+ */
+
+/*
+ * Issues to be discussed:
+ * - Thread safe-ness must be checked
+ * - Return values. There seems to be no standard for return value (RFC2553)
+ * but INRIA implementation returns EAI_xxx defined for getaddrinfo().
+ * - RFC2553 says that we should raise error on short buffer. X/Open says
+ * we need to truncate the result. We obey RFC2553 (and X/Open should be
+ * modified).
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <arpa/nameser.h>
+#include <netdb.h>
+#include <resolv.h>
+#include <string.h>
+#include <stddef.h>
+#include <errno.h>
+
+#ifdef NEED_ADDRINFO_H
+#include "addrinfo.h"
+#endif
+
+#define SUCCESS 0
+#define ANY 0
+#define YES 1
+#define NO 0
+
+static struct afd {
+ int a_af;
+ int a_addrlen;
+ int a_socklen;
+ int a_off;
+} afdl [] = {
+#ifdef INET6
+ {PF_INET6, sizeof(struct in6_addr), sizeof(struct sockaddr_in6),
+ offsetof(struct sockaddr_in6, sin6_addr)},
+#endif
+ {PF_INET, sizeof(struct in_addr), sizeof(struct sockaddr_in),
+ offsetof(struct sockaddr_in, sin_addr)},
+ {0, 0, 0},
+};
+
+struct sockinet {
+ u_char si_len;
+ u_char si_family;
+ u_short si_port;
+};
+
+#define ENI_NOSOCKET 0
+#define ENI_NOSERVNAME 1
+#define ENI_NOHOSTNAME 2
+#define ENI_MEMORY 3
+#define ENI_SYSTEM 4
+#define ENI_FAMILY 5
+#define ENI_SALEN 6
+
+int
+getnameinfo(sa, salen, host, hostlen, serv, servlen, flags)
+ const struct sockaddr *sa;
+ size_t salen;
+ char *host;
+ size_t hostlen;
+ char *serv;
+ size_t servlen;
+ int flags;
+{
+ struct afd *afd;
+ struct servent *sp;
+ struct hostent *hp;
+ u_short port;
+ int family, i;
+ char *addr, *p;
+ uint32_t v4a;
+ int h_error;
+ char numserv[512];
+ char numaddr[512];
+
+ if (sa == NULL)
+ return ENI_NOSOCKET;
+
+#ifdef HAVE_SA_LEN /*XXX*/
+ if (sa->sa_len != salen)
+ return ENI_SALEN;
+#endif
+
+ family = sa->sa_family;
+ for (i = 0; afdl[i].a_af; i++)
+ if (afdl[i].a_af == family) {
+ afd = &afdl[i];
+ goto found;
+ }
+ return ENI_FAMILY;
+
+ found:
+ if (salen != afd->a_socklen)
+ return ENI_SALEN;
+
+ port = ((struct sockinet *)sa)->si_port; /* network byte order */
+ addr = (char *)sa + afd->a_off;
+
+ if (serv == NULL || servlen == 0) {
+ /*
+ * do nothing in this case.
+ * in case you are wondering if "&&" is more correct than
+ * "||" here: RFC2553 says that serv == NULL OR servlen == 0
+ * means that the caller does not want the result.
+ */
+ } else {
+ if (flags & NI_NUMERICSERV)
+ sp = NULL;
+ else {
+ sp = getservbyport(port,
+ (flags & NI_DGRAM) ? "udp" : "tcp");
+ }
+ if (sp) {
+ if (strlen(sp->s_name) + 1 > servlen)
+ return ENI_MEMORY;
+ strcpy(serv, sp->s_name);
+ } else {
+ snprintf(numserv, sizeof(numserv), "%d", ntohs(port));
+ if (strlen(numserv) + 1 > servlen)
+ return ENI_MEMORY;
+ strcpy(serv, numserv);
+ }
+ }
+
+ switch (sa->sa_family) {
+ case AF_INET:
+ v4a = (uint32_t)
+ ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr);
+ if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
+ flags |= NI_NUMERICHOST;
+ v4a >>= IN_CLASSA_NSHIFT;
+ if (v4a == 0)
+ flags |= NI_NUMERICHOST;
+ break;
+#ifdef INET6
+ case AF_INET6:
+ {
+ struct sockaddr_in6 *sin6;
+ sin6 = (struct sockaddr_in6 *)sa;
+ switch (sin6->sin6_addr.s6_addr[0]) {
+ case 0x00:
+ if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr))
+ ;
+ else if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr))
+ ;
+ else
+ flags |= NI_NUMERICHOST;
+ break;
+ default:
+ if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
+ flags |= NI_NUMERICHOST;
+ }
+ else if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
+ flags |= NI_NUMERICHOST;
+ break;
+ }
+ }
+ break;
+#endif
+ }
+ if (host == NULL || hostlen == 0) {
+ /*
+ * do nothing in this case.
+ * in case you are wondering if "&&" is more correct than
+ * "||" here: RFC2553 says that host == NULL OR hostlen == 0
+ * means that the caller does not want the result.
+ */
+ } else if (flags & NI_NUMERICHOST) {
+ /* NUMERICHOST and NAMEREQD conflicts with each other */
+ if (flags & NI_NAMEREQD)
+ return ENI_NOHOSTNAME;
+ if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr))
+ == NULL)
+ return ENI_SYSTEM;
+ if (strlen(numaddr) + 1 > hostlen)
+ return ENI_MEMORY;
+ strcpy(host, numaddr);
+#if defined(INET6) && defined(NI_WITHSCOPEID)
+ if (afd->a_af == AF_INET6 &&
+ (IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)addr) ||
+ IN6_IS_ADDR_MULTICAST((struct in6_addr *)addr)) &&
+ ((struct sockaddr_in6 *)sa)->sin6_scope_id) {
+#ifndef ALWAYS_WITHSCOPE
+ if (flags & NI_WITHSCOPEID)
+#endif /* !ALWAYS_WITHSCOPE */
+ {
+ char *ep = strchr(host, '\0');
+ unsigned int ifindex =
+ ((struct sockaddr_in6 *)sa)->sin6_scope_id;
+
+ *ep = SCOPE_DELIMITER;
+ if ((if_indextoname(ifindex, ep + 1)) == NULL)
+ /* XXX what should we do? */
+ strncpy(ep + 1, "???", 3);
+ }
+ }
+#endif /* INET6 */
+ } else {
+#ifdef USE_GETIPNODEBY
+ hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error);
+#else
+ hp = gethostbyaddr(addr, afd->a_addrlen, afd->a_af);
+#ifdef HAVE_H_ERRNO
+ h_error = h_errno;
+#else
+ h_error = EINVAL;
+#endif
+#endif
+
+ if (hp) {
+ if (flags & NI_NOFQDN) {
+ p = strchr(hp->h_name, '.');
+ if (p) *p = '\0';
+ }
+ if (strlen(hp->h_name) + 1 > hostlen) {
+#ifdef USE_GETIPNODEBY
+ freehostent(hp);
+#endif
+ return ENI_MEMORY;
+ }
+ strcpy(host, hp->h_name);
+#ifdef USE_GETIPNODEBY
+ freehostent(hp);
+#endif
+ } else {
+ if (flags & NI_NAMEREQD)
+ return ENI_NOHOSTNAME;
+ if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr))
+ == NULL)
+ return ENI_NOHOSTNAME;
+ if (strlen(numaddr) + 1 > hostlen)
+ return ENI_MEMORY;
+ strcpy(host, numaddr);
+ }
+ }
+ return SUCCESS;
+}
--- /dev/null
+/* $OpenBSD: getopt_long.c,v 1.22 2006/10/04 21:29:04 jmc Exp $ */
+/* NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp */
+
+/*
+ * Copyright (c) 2002 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Sponsored in part by the Defense Advanced Research Projects
+ * Agency (DARPA) and Air Force Research Laboratory, Air Force
+ * Materiel Command, USAF, under agreement number F39502-99-1-0512.
+ */
+/*-
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Dieter Baron and Thomas Klausner.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+
+#include <errno.h>
+#include "getopt_long.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#define GNU_COMPATIBLE /* Be more compatible, configure's use us! */
+
+#define PRINT_ERROR ((opterr) && (*options != ':'))
+
+#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */
+#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */
+#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */
+
+/* return values */
+#define BADCH (int)'?'
+#define BADARG ((*options == ':') ? (int)':' : (int)'?')
+#define INORDER (int)1
+
+#define EMSG ""
+
+#ifdef GNU_COMPATIBLE
+#define NO_PREFIX (-1)
+#define D_PREFIX 0
+#define DD_PREFIX 1
+#define W_PREFIX 2
+#endif
+
+char *optarg;
+int optind, opterr = 1, optopt;
+
+static int getopt_internal(int, char * const *, const char *,
+ const struct option *, int *, int);
+static int parse_long_options(char * const *, const char *,
+ const struct option *, int *, int, int);
+static int gcd(int, int);
+static void permute_args(int, int, int, char * const *);
+
+static const char *place = EMSG; /* option letter processing */
+
+static int nonopt_start = -1; /* first non option argument (for permute) */
+static int nonopt_end = -1; /* first option after non options (for permute) */
+
+/* Error messages */
+static const char recargchar[] = "option requires an argument -- %c";
+static const char illoptchar[] = "illegal option -- %c"; /* From P1003.2 */
+#ifdef GNU_COMPATIBLE
+static int dash_prefix = NO_PREFIX;
+static const char gnuoptchar[] = "invalid option -- %c";
+
+static const char recargstring[] = "option `%s%s' requires an argument";
+static const char ambig[] = "option `%s%.*s' is ambiguous";
+static const char noarg[] = "option `%s%.*s' doesn't allow an argument";
+static const char illoptstring[] = "unrecognized option `%s%s'";
+#else
+static const char recargstring[] = "option requires an argument -- %s";
+static const char ambig[] = "ambiguous option -- %.*s";
+static const char noarg[] = "option doesn't take an argument -- %.*s";
+static const char illoptstring[] = "unknown option -- %s";
+#endif
+
+/*
+ * Compute the greatest common divisor of a and b.
+ */
+static int
+gcd(int a, int b)
+{
+ int c;
+
+ c = a % b;
+ while (c != 0) {
+ a = b;
+ b = c;
+ c = a % b;
+ }
+
+ return (b);
+}
+
+/*
+ * Exchange the block from nonopt_start to nonopt_end with the block
+ * from nonopt_end to opt_end (keeping the same order of arguments
+ * in each block).
+ */
+static void
+permute_args(int panonopt_start, int panonopt_end, int opt_end,
+ char * const *nargv)
+{
+ int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;
+ char *swap;
+
+ /*
+ * compute lengths of blocks and number and size of cycles
+ */
+ nnonopts = panonopt_end - panonopt_start;
+ nopts = opt_end - panonopt_end;
+ ncycle = gcd(nnonopts, nopts);
+ cyclelen = (opt_end - panonopt_start) / ncycle;
+
+ for (i = 0; i < ncycle; i++) {
+ cstart = panonopt_end+i;
+ pos = cstart;
+ for (j = 0; j < cyclelen; j++) {
+ if (pos >= panonopt_end)
+ pos -= nnonopts;
+ else
+ pos += nopts;
+ swap = nargv[pos];
+ /* LINTED const cast */
+ ((char **) nargv)[pos] = nargv[cstart];
+ /* LINTED const cast */
+ ((char **)nargv)[cstart] = swap;
+ }
+ }
+}
+
+static void
+warnx(const char *fmt, ...)
+{
+ extern char *program_name;
+ va_list ap;
+
+ va_start(ap, fmt);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+}
+
+/*
+ * parse_long_options --
+ * Parse long options in argc/argv argument vector.
+ * Returns -1 if short_too is set and the option does not match long_options.
+ */
+static int
+parse_long_options(char * const *nargv, const char *options,
+ const struct option *long_options, int *idx, int short_too, int flags)
+{
+ const char *current_argv, *has_equal;
+#ifdef GNU_COMPATIBLE
+ const char *current_dash;
+#endif
+ size_t current_argv_len;
+ int i, match, exact_match, second_partial_match;
+
+ current_argv = place;
+#ifdef GNU_COMPATIBLE
+ switch (dash_prefix) {
+ case D_PREFIX:
+ current_dash = "-";
+ break;
+ case DD_PREFIX:
+ current_dash = "--";
+ break;
+ case W_PREFIX:
+ current_dash = "-W ";
+ break;
+ default:
+ current_dash = "";
+ break;
+ }
+#endif
+ match = -1;
+ exact_match = 0;
+ second_partial_match = 0;
+
+ optind++;
+
+ if ((has_equal = strchr(current_argv, '=')) != NULL) {
+ /* argument found (--option=arg) */
+ current_argv_len = has_equal - current_argv;
+ has_equal++;
+ } else
+ current_argv_len = strlen(current_argv);
+
+ for (i = 0; long_options[i].name; i++) {
+ /* find matching long option */
+ if (strncmp(current_argv, long_options[i].name,
+ current_argv_len))
+ continue;
+
+ if (strlen(long_options[i].name) == current_argv_len) {
+ /* exact match */
+ match = i;
+ exact_match = 1;
+ break;
+ }
+ /*
+ * If this is a known short option, don't allow
+ * a partial match of a single character.
+ */
+ if (short_too && current_argv_len == 1)
+ continue;
+
+ if (match == -1) /* first partial match */
+ match = i;
+ else if ((flags & FLAG_LONGONLY) ||
+ long_options[i].has_arg !=
+ long_options[match].has_arg ||
+ long_options[i].flag != long_options[match].flag ||
+ long_options[i].val != long_options[match].val)
+ second_partial_match = 1;
+ }
+ if (!exact_match && second_partial_match) {
+ /* ambiguous abbreviation */
+ if (PRINT_ERROR)
+ warnx(ambig,
+#ifdef GNU_COMPATIBLE
+ current_dash,
+#endif
+ (int)current_argv_len,
+ current_argv);
+ optopt = 0;
+ return (BADCH);
+ }
+ if (match != -1) { /* option found */
+ if (long_options[match].has_arg == no_argument
+ && has_equal) {
+ if (PRINT_ERROR)
+ warnx(noarg,
+#ifdef GNU_COMPATIBLE
+ current_dash,
+#endif
+ (int)current_argv_len,
+ current_argv);
+ /*
+ * XXX: GNU sets optopt to val regardless of flag
+ */
+ if (long_options[match].flag == NULL)
+ optopt = long_options[match].val;
+ else
+ optopt = 0;
+#ifdef GNU_COMPATIBLE
+ return (BADCH);
+#else
+ return (BADARG);
+#endif
+ }
+ if (long_options[match].has_arg == required_argument ||
+ long_options[match].has_arg == optional_argument) {
+ if (has_equal)
+ optarg = (char *)has_equal;
+ else if (long_options[match].has_arg ==
+ required_argument) {
+ /*
+ * optional argument doesn't use next nargv
+ */
+ optarg = nargv[optind++];
+ }
+ }
+ if ((long_options[match].has_arg == required_argument)
+ && (optarg == NULL)) {
+ /*
+ * Missing argument; leading ':' indicates no error
+ * should be generated.
+ */
+ if (PRINT_ERROR)
+ warnx(recargstring,
+#ifdef GNU_COMPATIBLE
+ current_dash,
+#endif
+ current_argv);
+ /*
+ * XXX: GNU sets optopt to val regardless of flag
+ */
+ if (long_options[match].flag == NULL)
+ optopt = long_options[match].val;
+ else
+ optopt = 0;
+ --optind;
+ return (BADARG);
+ }
+ } else { /* unknown option */
+ if (short_too) {
+ --optind;
+ return (-1);
+ }
+ if (PRINT_ERROR)
+ warnx(illoptstring,
+#ifdef GNU_COMPATIBLE
+ current_dash,
+#endif
+ current_argv);
+ optopt = 0;
+ return (BADCH);
+ }
+ if (idx)
+ *idx = match;
+ if (long_options[match].flag) {
+ *long_options[match].flag = long_options[match].val;
+ return (0);
+ } else
+ return (long_options[match].val);
+}
+
+/*
+ * getopt_internal --
+ * Parse argc/argv argument vector. Called by user level routines.
+ */
+static int
+getopt_internal(int nargc, char * const *nargv, const char *options,
+ const struct option *long_options, int *idx, int flags)
+{
+ char *oli; /* option letter list index */
+ int optchar, short_too;
+ int posixly_correct; /* no static, can be changed on the fly */
+
+ if (options == NULL)
+ return (-1);
+
+ /*
+ * Disable GNU extensions if POSIXLY_CORRECT is set or options
+ * string begins with a '+'.
+ */
+ posixly_correct = (getenv("POSIXLY_CORRECT") != NULL);
+#ifdef GNU_COMPATIBLE
+ if (*options == '-')
+ flags |= FLAG_ALLARGS;
+ else if (posixly_correct || *options == '+')
+ flags &= ~FLAG_PERMUTE;
+#else
+ if (posixly_correct || *options == '+')
+ flags &= ~FLAG_PERMUTE;
+ else if (*options == '-')
+ flags |= FLAG_ALLARGS;
+#endif
+ if (*options == '+' || *options == '-')
+ options++;
+
+ /*
+ * XXX Some GNU programs (like cvs) set optind to 0 instead of
+ * XXX using optreset. Work around this braindamage.
+ */
+ if (optind == 0)
+ optind = 1;
+
+ optarg = NULL;
+start:
+ if (!*place) { /* update scanning pointer */
+ if (optind >= nargc) { /* end of argument vector */
+ place = EMSG;
+ if (nonopt_end != -1) {
+ /* do permutation, if we have to */
+ permute_args(nonopt_start, nonopt_end,
+ optind, nargv);
+ optind -= nonopt_end - nonopt_start;
+ }
+ else if (nonopt_start != -1) {
+ /*
+ * If we skipped non-options, set optind
+ * to the first of them.
+ */
+ optind = nonopt_start;
+ }
+ nonopt_start = nonopt_end = -1;
+ return (-1);
+ }
+ if (*(place = nargv[optind]) != '-' ||
+#ifdef GNU_COMPATIBLE
+ place[1] == '\0') {
+#else
+ (place[1] == '\0' && strchr(options, '-') == NULL)) {
+#endif
+ place = EMSG; /* found non-option */
+ if (flags & FLAG_ALLARGS) {
+ /*
+ * GNU extension:
+ * return non-option as argument to option 1
+ */
+ optarg = nargv[optind++];
+ return (INORDER);
+ }
+ if (!(flags & FLAG_PERMUTE)) {
+ /*
+ * If no permutation wanted, stop parsing
+ * at first non-option.
+ */
+ return (-1);
+ }
+ /* do permutation */
+ if (nonopt_start == -1)
+ nonopt_start = optind;
+ else if (nonopt_end != -1) {
+ permute_args(nonopt_start, nonopt_end,
+ optind, nargv);
+ nonopt_start = optind -
+ (nonopt_end - nonopt_start);
+ nonopt_end = -1;
+ }
+ optind++;
+ /* process next argument */
+ goto start;
+ }
+ if (nonopt_start != -1 && nonopt_end == -1)
+ nonopt_end = optind;
+
+ /*
+ * If we have "-" do nothing, if "--" we are done.
+ */
+ if (place[1] != '\0' && *++place == '-' && place[1] == '\0') {
+ optind++;
+ place = EMSG;
+ /*
+ * We found an option (--), so if we skipped
+ * non-options, we have to permute.
+ */
+ if (nonopt_end != -1) {
+ permute_args(nonopt_start, nonopt_end,
+ optind, nargv);
+ optind -= nonopt_end - nonopt_start;
+ }
+ nonopt_start = nonopt_end = -1;
+ return (-1);
+ }
+ }
+
+ /*
+ * Check long options if:
+ * 1) we were passed some
+ * 2) the arg is not just "-"
+ * 3) either the arg starts with -- we are getopt_long_only()
+ */
+ if (long_options != NULL && place != nargv[optind] &&
+ (*place == '-' || (flags & FLAG_LONGONLY))) {
+ short_too = 0;
+#ifdef GNU_COMPATIBLE
+ dash_prefix = D_PREFIX;
+#endif
+ if (*place == '-') {
+ place++; /* --foo long option */
+#ifdef GNU_COMPATIBLE
+ dash_prefix = DD_PREFIX;
+#endif
+ } else if (*place != ':' && strchr(options, *place) != NULL)
+ short_too = 1; /* could be short option too */
+
+ optchar = parse_long_options(nargv, options, long_options,
+ idx, short_too, flags);
+ if (optchar != -1) {
+ place = EMSG;
+ return (optchar);
+ }
+ }
+
+ if ((optchar = (int)*place++) == (int)':' ||
+ (optchar == (int)'-' && *place != '\0') ||
+ (oli = strchr(options, optchar)) == NULL) {
+ /*
+ * If the user specified "-" and '-' isn't listed in
+ * options, return -1 (non-option) as per POSIX.
+ * Otherwise, it is an unknown option character (or ':').
+ */
+ if (optchar == (int)'-' && *place == '\0')
+ return (-1);
+ if (!*place)
+ ++optind;
+#ifdef GNU_COMPATIBLE
+ if (PRINT_ERROR)
+ warnx(posixly_correct ? illoptchar : gnuoptchar,
+ optchar);
+#else
+ if (PRINT_ERROR)
+ warnx(illoptchar, optchar);
+#endif
+ optopt = optchar;
+ return (BADCH);
+ }
+ if (long_options != NULL && optchar == 'W' && oli[1] == ';') {
+ /* -W long-option */
+ if (*place) /* no space */
+ /* NOTHING */;
+ else if (++optind >= nargc) { /* no arg */
+ place = EMSG;
+ if (PRINT_ERROR)
+ warnx(recargchar, optchar);
+ optopt = optchar;
+ return (BADARG);
+ } else /* white space */
+ place = nargv[optind];
+#ifdef GNU_COMPATIBLE
+ dash_prefix = W_PREFIX;
+#endif
+ optchar = parse_long_options(nargv, options, long_options,
+ idx, 0, flags);
+ place = EMSG;
+ return (optchar);
+ }
+ if (*++oli != ':') { /* doesn't take argument */
+ if (!*place)
+ ++optind;
+ } else { /* takes (optional) argument */
+ optarg = NULL;
+ if (*place) /* no white space */
+ optarg = (char *)place;
+ else if (oli[1] != ':') { /* arg not optional */
+ if (++optind >= nargc) { /* no arg */
+ place = EMSG;
+ if (PRINT_ERROR)
+ warnx(recargchar, optchar);
+ optopt = optchar;
+ return (BADARG);
+ } else
+ optarg = nargv[optind];
+ }
+ place = EMSG;
+ ++optind;
+ }
+ /* dump back option letter */
+ return (optchar);
+}
+
+#ifdef REPLACE_GETOPT
+/*
+ * getopt --
+ * Parse argc/argv argument vector.
+ *
+ * [eventually this will replace the BSD getopt]
+ */
+int
+getopt(int nargc, char * const *nargv, const char *options)
+{
+
+ /*
+ * We don't pass FLAG_PERMUTE to getopt_internal() since
+ * the BSD getopt(3) (unlike GNU) has never done this.
+ *
+ * Furthermore, since many privileged programs call getopt()
+ * before dropping privileges it makes sense to keep things
+ * as simple (and bug-free) as possible.
+ */
+ return (getopt_internal(nargc, nargv, options, NULL, NULL, 0));
+}
+#endif /* REPLACE_GETOPT */
+
+/*
+ * getopt_long --
+ * Parse argc/argv argument vector.
+ */
+int
+getopt_long(int nargc, char * const *nargv, const char *options,
+ const struct option *long_options, int *idx)
+{
+
+ return (getopt_internal(nargc, nargv, options, long_options, idx,
+ FLAG_PERMUTE));
+}
+
+/*
+ * getopt_long_only --
+ * Parse argc/argv argument vector.
+ */
+int
+getopt_long_only(int nargc, char * const *nargv, const char *options,
+ const struct option *long_options, int *idx)
+{
+
+ return (getopt_internal(nargc, nargv, options, long_options, idx,
+ FLAG_PERMUTE|FLAG_LONGONLY));
+}
--- /dev/null
+/*
+ * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Kungliga Tekniska
+ * Högskolan and its contributors.
+ *
+ * 4. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
+ */
+
+#include <tcpdump-stdinc.h>
+
+/* Minimal implementation of inet_aton.
+ * Cannot distinguish between failure and a local broadcast address. */
+
+#ifndef INADDR_NONE
+#define INADDR_NONE 0xffffffff
+#endif
+
+int
+inet_aton(const char *cp, struct in_addr *addr)
+{
+ addr->s_addr = inet_addr(cp);
+ return (addr->s_addr == INADDR_NONE) ? 0 : 1;
+}
--- /dev/null
+/*
+ * Copyright (c) 1999 Kungliga Tekniska Högskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Kungliga Tekniska
+ * Högskolan and its contributors.
+ *
+ * 4. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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>
+
+/*
+ *
+ */
+
+#ifndef IN6ADDRSZ
+#define IN6ADDRSZ 16 /* IPv6 T_AAAA */
+#endif
+
+#ifndef INT16SZ
+#define INT16SZ 2 /* word size */
+#endif
+
+static const char *
+inet_ntop_v4 (const void *src, char *dst, size_t size)
+{
+ const char digits[] = "0123456789";
+ int i;
+ struct in_addr *addr = (struct in_addr *)src;
+ u_long a = ntohl(addr->s_addr);
+ const char *orig_dst = dst;
+
+ if (size < INET_ADDRSTRLEN) {
+ errno = ENOSPC;
+ return NULL;
+ }
+ for (i = 0; i < 4; ++i) {
+ int n = (a >> (24 - i * 8)) & 0xFF;
+ int non_zerop = 0;
+
+ if (non_zerop || n / 100 > 0) {
+ *dst++ = digits[n / 100];
+ n %= 100;
+ non_zerop = 1;
+ }
+ if (non_zerop || n / 10 > 0) {
+ *dst++ = digits[n / 10];
+ n %= 10;
+ non_zerop = 1;
+ }
+ *dst++ = digits[n];
+ if (i != 3)
+ *dst++ = '.';
+ }
+ *dst++ = '\0';
+ return orig_dst;
+}
+
+#ifdef INET6
+/*
+ * Convert IPv6 binary address into presentation (printable) format.
+ */
+static const char *
+inet_ntop_v6 (const u_char *src, char *dst, size_t size)
+{
+ /*
+ * Note that int32_t and int16_t need only be "at least" large enough
+ * to contain a value of the specified size. On some systems, like
+ * Crays, there is no such thing as an integer variable with 16 bits.
+ * Keep this in mind if you think this function should have been coded
+ * to use pointer overlays. All the world's not a VAX.
+ */
+ char tmp [INET6_ADDRSTRLEN+1];
+ char *tp;
+ struct {
+ long base;
+ long len;
+ } best, cur;
+ u_long words [IN6ADDRSZ / INT16SZ];
+ int i;
+
+ /* Preprocess:
+ * Copy the input (bytewise) array into a wordwise array.
+ * Find the longest run of 0x00's in src[] for :: shorthanding.
+ */
+ memset (words, 0, sizeof(words));
+ for (i = 0; i < IN6ADDRSZ; i++)
+ words[i/2] |= (src[i] << ((1 - (i % 2)) << 3));
+
+ best.len = 0;
+ best.base = -1;
+ cur.len = 0;
+ cur.base = -1;
+ for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++)
+ {
+ if (words[i] == 0)
+ {
+ if (cur.base == -1)
+ cur.base = i, cur.len = 1;
+ else cur.len++;
+ }
+ else if (cur.base != -1)
+ {
+ if (best.base == -1 || cur.len > best.len)
+ best = cur;
+ cur.base = -1;
+ }
+ }
+ if ((cur.base != -1) && (best.base == -1 || cur.len > best.len))
+ best = cur;
+ if (best.base != -1 && best.len < 2)
+ best.base = -1;
+
+ /* Format the result.
+ */
+ tp = tmp;
+ for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++)
+ {
+ /* Are we inside the best run of 0x00's?
+ */
+ if (best.base != -1 && i >= best.base && i < (best.base + best.len))
+ {
+ if (i == best.base)
+ *tp++ = ':';
+ continue;
+ }
+
+ /* Are we following an initial run of 0x00s or any real hex?
+ */
+ if (i != 0)
+ *tp++ = ':';
+
+ /* Is this address an encapsulated IPv4?
+ */
+ if (i == 6 && best.base == 0 &&
+ (best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
+ {
+ if (!inet_ntop_v4(src+12, tp, sizeof(tmp) - (tp - tmp)))
+ {
+ errno = ENOSPC;
+ return (NULL);
+ }
+ tp += strlen(tp);
+ break;
+ }
+ tp += sprintf (tp, "%lx", words[i]);
+ }
+
+ /* Was it a trailing run of 0x00's?
+ */
+ if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ))
+ *tp++ = ':';
+ *tp++ = '\0';
+
+ /* Check for overflow, copy, and we're done.
+ */
+ if ((size_t)(tp - tmp) > size)
+ {
+ errno = ENOSPC;
+ return (NULL);
+ }
+ return strcpy (dst, tmp);
+}
+#endif /* INET6 */
+
+
+const char *
+inet_ntop(int af, const void *src, char *dst, size_t size)
+{
+ switch (af) {
+ case AF_INET :
+ return inet_ntop_v4 (src, dst, size);
+#ifdef INET6
+ case AF_INET6:
+ return inet_ntop_v6 ((const u_char*)src, dst, size);
+#endif
+ default :
+ errno = EAFNOSUPPORT;
+ return NULL;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 1999 Kungliga Tekniska H�gskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Kungliga Tekniska
+ * H�gskolan and its contributors.
+ *
+ * 4. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
+ */
+
+#include <tcpdump-stdinc.h>
+
+int
+inet_pton(int af, const char *src, void *dst)
+{
+ if (af != AF_INET) {
+ errno = EAFNOSUPPORT;
+ return -1;
+ }
+ return inet_aton (src, dst);
+}
--- /dev/null
+/*
+ * Copyright (c) 1995-1999 Kungliga Tekniska Högskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * 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 Institute 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 INSTITUTE 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 INSTITUTE 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 <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/types.h>
+
+#include <interface.h>
+
+enum format_flags {
+ minus_flag = 1,
+ plus_flag = 2,
+ space_flag = 4,
+ alternate_flag = 8,
+ zero_flag = 16
+};
+
+/*
+ * Common state
+ */
+
+struct state {
+ unsigned char *str;
+ unsigned char *s;
+ unsigned char *theend;
+ size_t sz;
+ size_t max_sz;
+ int (*append_char)(struct state *, unsigned char);
+ int (*reserve)(struct state *, size_t);
+ /* XXX - methods */
+};
+
+#ifndef HAVE_VSNPRINTF
+static int
+sn_reserve (struct state *state, size_t n)
+{
+ return state->s + n > state->theend;
+}
+
+static int
+sn_append_char (struct state *state, unsigned char c)
+{
+ if (sn_reserve (state, 1)) {
+ return 1;
+ } else {
+ *state->s++ = c;
+ return 0;
+ }
+}
+#endif
+
+#if 0
+static int
+as_reserve (struct state *state, size_t n)
+{
+ if (state->s + n > state->theend) {
+ int off = state->s - state->str;
+ unsigned char *tmp;
+
+ if (state->max_sz && state->sz >= state->max_sz)
+ return 1;
+
+ state->sz = max(state->sz * 2, state->sz + n);
+ if (state->max_sz)
+ state->sz = min(state->sz, state->max_sz);
+ tmp = realloc (state->str, state->sz);
+ if (tmp == NULL)
+ return 1;
+ state->str = tmp;
+ state->s = state->str + off;
+ state->theend = state->str + state->sz - 1;
+ }
+ return 0;
+}
+
+static int
+as_append_char (struct state *state, unsigned char c)
+{
+ if(as_reserve (state, 1))
+ return 1;
+ else {
+ *state->s++ = c;
+ return 0;
+ }
+}
+#endif
+
+static int
+append_number(struct state *state,
+ unsigned long num, unsigned base, char *rep,
+ int width, int prec, int flags, int minusp)
+{
+ int len = 0;
+ int i;
+
+ /* given precision, ignore zero flag */
+ if(prec != -1)
+ flags &= ~zero_flag;
+ else
+ prec = 1;
+ /* zero value with zero precision -> "" */
+ if(prec == 0 && num == 0)
+ return 0;
+ do{
+ if((*state->append_char)(state, rep[num % base]))
+ return 1;
+ len++;
+ num /= base;
+ }while(num);
+ prec -= len;
+ /* pad with prec zeros */
+ while(prec-- > 0){
+ if((*state->append_char)(state, '0'))
+ return 1;
+ len++;
+ }
+ /* add length of alternate prefix (added later) to len */
+ if(flags & alternate_flag && (base == 16 || base == 8))
+ len += base / 8;
+ /* pad with zeros */
+ if(flags & zero_flag){
+ width -= len;
+ if(minusp || (flags & space_flag) || (flags & plus_flag))
+ width--;
+ while(width-- > 0){
+ if((*state->append_char)(state, '0'))
+ return 1;
+ len++;
+ }
+ }
+ /* add alternate prefix */
+ if(flags & alternate_flag && (base == 16 || base == 8)){
+ if(base == 16)
+ if((*state->append_char)(state, rep[10] + 23)) /* XXX */
+ return 1;
+ if((*state->append_char)(state, '0'))
+ return 1;
+ }
+ /* add sign */
+ if(minusp){
+ if((*state->append_char)(state, '-'))
+ return 1;
+ len++;
+ } else if(flags & plus_flag) {
+ if((*state->append_char)(state, '+'))
+ return 1;
+ len++;
+ } else if(flags & space_flag) {
+ if((*state->append_char)(state, ' '))
+ return 1;
+ len++;
+ }
+ if(flags & minus_flag)
+ /* swap before padding with spaces */
+ for(i = 0; i < len / 2; i++){
+ char c = state->s[-i-1];
+ state->s[-i-1] = state->s[-len+i];
+ state->s[-len+i] = c;
+ }
+ width -= len;
+ while(width-- > 0){
+ if((*state->append_char)(state, ' '))
+ return 1;
+ len++;
+ }
+ if(!(flags & minus_flag))
+ /* swap after padding with spaces */
+ for(i = 0; i < len / 2; i++){
+ char c = state->s[-i-1];
+ state->s[-i-1] = state->s[-len+i];
+ state->s[-len+i] = c;
+ }
+
+ return 0;
+}
+
+static int
+append_string (struct state *state,
+ unsigned char *arg,
+ int width,
+ int prec,
+ int flags)
+{
+ if(prec != -1)
+ width -= prec;
+ else
+ width -= strlen((char *)arg);
+ if(!(flags & minus_flag))
+ while(width-- > 0)
+ if((*state->append_char) (state, ' '))
+ return 1;
+ if (prec != -1) {
+ while (*arg && prec--)
+ if ((*state->append_char) (state, *arg++))
+ return 1;
+ } else {
+ while (*arg)
+ if ((*state->append_char) (state, *arg++))
+ return 1;
+ }
+ if(flags & minus_flag)
+ while(width-- > 0)
+ if((*state->append_char) (state, ' '))
+ return 1;
+ return 0;
+}
+
+static int
+append_char(struct state *state,
+ unsigned char arg,
+ int width,
+ int flags)
+{
+ while(!(flags & minus_flag) && --width > 0)
+ if((*state->append_char) (state, ' '))
+ return 1;
+
+ if((*state->append_char) (state, arg))
+ return 1;
+ while((flags & minus_flag) && --width > 0)
+ if((*state->append_char) (state, ' '))
+ return 1;
+
+ return 0;
+}
+
+/*
+ * This can't be made into a function...
+ */
+
+#define PARSE_INT_FORMAT(res, arg, unsig) \
+if (long_flag) \
+ res = (unsig long)va_arg(arg, unsig long); \
+else if (short_flag) \
+ res = (unsig short)va_arg(arg, unsig int); \
+else \
+ res = (unsig int)va_arg(arg, unsig int)
+
+/*
+ * zyxprintf - return 0 or -1
+ */
+
+static int
+xyzprintf (struct state *state, const char *char_format, va_list ap)
+{
+ const unsigned char *format = (const unsigned char *)char_format;
+ unsigned char c;
+
+ while((c = *format++)) {
+ if (c == '%') {
+ int flags = 0;
+ int width = 0;
+ int prec = -1;
+ int long_flag = 0;
+ int short_flag = 0;
+
+ /* flags */
+ while((c = *format++)){
+ if(c == '-')
+ flags |= minus_flag;
+ else if(c == '+')
+ flags |= plus_flag;
+ else if(c == ' ')
+ flags |= space_flag;
+ else if(c == '#')
+ flags |= alternate_flag;
+ else if(c == '0')
+ flags |= zero_flag;
+ else
+ break;
+ }
+
+ if((flags & space_flag) && (flags & plus_flag))
+ flags ^= space_flag;
+
+ if((flags & minus_flag) && (flags & zero_flag))
+ flags ^= zero_flag;
+
+ /* width */
+ if (isdigit(c))
+ do {
+ width = width * 10 + c - '0';
+ c = *format++;
+ } while(isdigit(c));
+ else if(c == '*') {
+ width = va_arg(ap, int);
+ c = *format++;
+ }
+
+ /* precision */
+ if (c == '.') {
+ prec = 0;
+ c = *format++;
+ if (isdigit(c))
+ do {
+ prec = prec * 10 + c - '0';
+ c = *format++;
+ } while(isdigit(c));
+ else if (c == '*') {
+ prec = va_arg(ap, int);
+ c = *format++;
+ }
+ }
+
+ /* size */
+
+ if (c == 'h') {
+ short_flag = 1;
+ c = *format++;
+ } else if (c == 'l') {
+ long_flag = 1;
+ c = *format++;
+ }
+
+ switch (c) {
+ case 'c' :
+ if(append_char(state, va_arg(ap, int), width, flags))
+ return -1;
+ break;
+ case 's' :
+ if (append_string(state,
+ va_arg(ap, unsigned char*),
+ width,
+ prec,
+ flags))
+ return -1;
+ break;
+ case 'd' :
+ case 'i' : {
+ long arg;
+ unsigned long num;
+ int minusp = 0;
+
+ PARSE_INT_FORMAT(arg, ap, signed);
+
+ if (arg < 0) {
+ minusp = 1;
+ num = -arg;
+ } else
+ num = arg;
+
+ if (append_number (state, num, 10, "0123456789",
+ width, prec, flags, minusp))
+ return -1;
+ break;
+ }
+ case 'u' : {
+ unsigned long arg;
+
+ PARSE_INT_FORMAT(arg, ap, unsigned);
+
+ if (append_number (state, arg, 10, "0123456789",
+ width, prec, flags, 0))
+ return -1;
+ break;
+ }
+ case 'o' : {
+ unsigned long arg;
+
+ PARSE_INT_FORMAT(arg, ap, unsigned);
+
+ if (append_number (state, arg, 010, "01234567",
+ width, prec, flags, 0))
+ return -1;
+ break;
+ }
+ case 'x' : {
+ unsigned long arg;
+
+ PARSE_INT_FORMAT(arg, ap, unsigned);
+
+ if (append_number (state, arg, 0x10, "0123456789abcdef",
+ width, prec, flags, 0))
+ return -1;
+ break;
+ }
+ case 'X' :{
+ unsigned long arg;
+
+ PARSE_INT_FORMAT(arg, ap, unsigned);
+
+ if (append_number (state, arg, 0x10, "0123456789ABCDEF",
+ width, prec, flags, 0))
+ return -1;
+ break;
+ }
+ case 'p' : {
+ unsigned long arg = (unsigned long)va_arg(ap, void*);
+
+ if (append_number (state, arg, 0x10, "0123456789ABCDEF",
+ width, prec, flags, 0))
+ return -1;
+ break;
+ }
+ case 'n' : {
+ int *arg = va_arg(ap, int*);
+ *arg = state->s - state->str;
+ break;
+ }
+ case '\0' :
+ --format;
+ /* FALLTHROUGH */
+ case '%' :
+ if ((*state->append_char)(state, c))
+ return -1;
+ break;
+ default :
+ if ( (*state->append_char)(state, '%')
+ || (*state->append_char)(state, c))
+ return -1;
+ break;
+ }
+ } else
+ if ((*state->append_char) (state, c))
+ return -1;
+ }
+ return 0;
+}
+
+#ifndef HAVE_SNPRINTF
+int
+snprintf (char *str, size_t sz, const char *format, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start(args, format);
+ ret = vsnprintf (str, sz, format, args);
+
+#ifdef PARANOIA
+ {
+ int ret2;
+ char *tmp;
+
+ tmp = malloc (sz);
+ if (tmp == NULL)
+ abort ();
+
+ ret2 = vsprintf (tmp, format, args);
+ if (ret != ret2 || strcmp(str, tmp))
+ abort ();
+ free (tmp);
+ }
+#endif
+
+ va_end(args);
+ return ret;
+}
+#endif
+
+#if 0
+#ifndef HAVE_ASPRINTF
+int
+asprintf (char **ret, const char *format, ...)
+{
+ va_list args;
+ int val;
+
+ va_start(args, format);
+ val = vasprintf (ret, format, args);
+
+#ifdef PARANOIA
+ {
+ int ret2;
+ char *tmp;
+ tmp = malloc (val + 1);
+ if (tmp == NULL)
+ abort ();
+
+ ret2 = vsprintf (tmp, format, args);
+ if (val != ret2 || strcmp(*ret, tmp))
+ abort ();
+ free (tmp);
+ }
+#endif
+
+ va_end(args);
+ return val;
+}
+#endif
+
+#ifndef HAVE_ASNPRINTF
+int
+asnprintf (char **ret, size_t max_sz, const char *format, ...)
+{
+ va_list args;
+ int val;
+
+ va_start(args, format);
+ val = vasnprintf (ret, max_sz, format, args);
+
+#ifdef PARANOIA
+ {
+ int ret2;
+ char *tmp;
+ tmp = malloc (val + 1);
+ if (tmp == NULL)
+ abort ();
+
+ ret2 = vsprintf (tmp, format, args);
+ if (val != ret2 || strcmp(*ret, tmp))
+ abort ();
+ free (tmp);
+ }
+#endif
+
+ va_end(args);
+ return val;
+}
+#endif
+
+#ifndef HAVE_VASPRINTF
+int
+vasprintf (char **ret, const char *format, va_list args)
+{
+ return vasnprintf (ret, 0, format, args);
+}
+#endif
+
+
+#ifndef HAVE_VASNPRINTF
+int
+vasnprintf (char **ret, size_t max_sz, const char *format, va_list args)
+{
+ int st;
+ size_t len;
+ struct state state;
+
+ state.max_sz = max_sz;
+ state.sz = 1;
+ state.str = malloc(state.sz);
+ if (state.str == NULL) {
+ *ret = NULL;
+ return -1;
+ }
+ state.s = state.str;
+ state.theend = state.s + state.sz - 1;
+ state.append_char = as_append_char;
+ state.reserve = as_reserve;
+
+ st = xyzprintf (&state, format, args);
+ if (st) {
+ free (state.str);
+ *ret = NULL;
+ return -1;
+ } else {
+ char *tmp;
+
+ *state.s = '\0';
+ len = state.s - state.str;
+ tmp = realloc (state.str, len+1);
+ if (tmp == NULL) {
+ free (state.str);
+ *ret = NULL;
+ return -1;
+ }
+ *ret = tmp;
+ return len;
+ }
+}
+#endif
+#endif
+
+#ifndef HAVE_VSNPRINTF
+int
+vsnprintf (char *str, size_t sz, const char *format, va_list args)
+{
+ struct state state;
+ int ret;
+ unsigned char *ustr = (unsigned char *)str;
+
+ state.max_sz = 0;
+ state.sz = sz;
+ state.str = ustr;
+ state.s = ustr;
+ state.theend = ustr + sz - 1;
+ state.append_char = sn_append_char;
+ state.reserve = sn_reserve;
+
+ ret = xyzprintf (&state, format, args);
+ *state.s = '\0';
+ if (ret)
+ return sz;
+ else
+ return state.s - state.str;
+}
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 1988, 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. 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.
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "interface.h"
+
+char *
+strdup(str)
+ const char *str;
+{
+ size_t len;
+ char *copy;
+
+ len = strlen(str) + 1;
+ if ((copy = malloc(len)) == NULL)
+ return (NULL);
+ memcpy(copy, str, len);
+ return (copy);
+}
--- /dev/null
+/* NetBSD: strlcat.c,v 1.5 1999/09/20 04:39:47 lukem Exp */
+/* from OpenBSD: strlcat.c,v 1.2 1999/06/17 16:28:58 millert Exp */
+
+/*
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ * 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. The name of the author 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 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 AUTHOR 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 <string.h>
+
+#include "interface.h"
+
+/*
+ * Appends src to string dst of size siz (unlike strncat, siz is the
+ * full size of dst, not space left). At most siz-1 characters
+ * will be copied. Always NUL terminates (unless siz == 0).
+ * Returns strlen(src); if retval >= siz, truncation occurred.
+ */
+size_t
+strlcat(char *dst, const char *src, size_t siz)
+{
+ register char *d = dst;
+ register const char *s = src;
+ register size_t n = siz;
+ size_t dlen;
+
+ /* Find the end of dst and adjust bytes left but don't go past end */
+ while (*d != '\0' && n-- != 0)
+ d++;
+ dlen = d - dst;
+ n = siz - dlen;
+
+ if (n == 0)
+ return(dlen + strlen(s));
+ while (*s != '\0') {
+ if (n != 1) {
+ *d++ = *s;
+ n--;
+ }
+ s++;
+ }
+ *d = '\0';
+
+ return(dlen + (s - src)); /* count does not include NUL */
+}
--- /dev/null
+/* NetBSD: strlcpy.c,v 1.5 1999/09/20 04:39:47 lukem Exp */
+/* from OpenBSD: strlcpy.c,v 1.4 1999/05/01 18:56:41 millert Exp */
+
+/*
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ * 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. The name of the author 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 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 AUTHOR 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 <string.h>
+
+#include "interface.h"
+
+/*
+ * Copy src to string dst of size siz. At most siz-1 characters
+ * will be copied. Always NUL terminates (unless siz == 0).
+ * Returns strlen(src); if retval >= siz, truncation occurred.
+ */
+size_t
+strlcpy(char *dst, const char *src, size_t siz)
+{
+ register char *d = dst;
+ register const char *s = src;
+ register size_t n = siz;
+
+ /* Copy as many bytes as will fit */
+ if (n != 0 && --n != 0) {
+ do {
+ if ((*d++ = *s++) == 0)
+ break;
+ } while (--n != 0);
+ }
+
+ /* Not enough room in dst, add NUL and traverse rest of src */
+ if (n == 0) {
+ if (siz != 0)
+ *d = '\0'; /* NUL-terminate dst */
+ while (*s++)
+ ;
+ }
+
+ return(s - src - 1); /* count does not include NUL */
+}
--- /dev/null
+/*-
+ * Copyright (c) 1990, 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+
+/*
+ * Get next token from string *stringp, where tokens are possibly-empty
+ * strings separated by characters from delim.
+ *
+ * Writes NULs into the string at *stringp to end tokens.
+ * delim need not remain constant from call to call.
+ * On return, *stringp points past the last NUL written (if there might
+ * be further tokens), or is NULL (if there are definitely no more tokens).
+ *
+ * If *stringp is NULL, strsep returns NULL.
+ */
+char *
+strsep(char **stringp, const char *delim)
+{
+ register char *s;
+ register const char *spanp;
+ register int c, sc;
+ char *tok;
+
+ if ((s = *stringp) == NULL)
+ return (NULL);
+ for (tok = s;;) {
+ c = *s++;
+ spanp = delim;
+ do {
+ if ((sc = *spanp++) == c) {
+ if (c == 0)
+ s = NULL;
+ else
+ s[-1] = 0;
+ *stringp = s;
+ return (tok);
+ }
+ } while (sc != 0);
+ }
+ /* NOTREACHED */
+}
--- /dev/null
+#!/bin/sh -
+#
+# Copyright (c) 1994, 1996
+# The Regents of the University of California. All rights reserved.
+#
+# Redistribution and use in source and binary forms are permitted
+# provided that this notice is preserved and that due credit is given
+# to the University of California at Berkeley. The name of the University
+# may not be used to endorse or promote products derived from this
+# software without specific prior written permission. This software
+# is provided ``as is'' without express or implied warranty.
+#
+# @(#)mkdep.sh 5.11 (Berkeley) 5/5/88
+#
+
+MAKE=Makefile # default makefile name is "Makefile"
+CC=cc # default C compiler is "cc"
+DEPENDENCY_CFLAG=-M # default dependency-generation flag is -M
+
+while :
+ do case "$1" in
+ # -c allows you to specify the C compiler
+ -c)
+ CC=$2
+ shift; shift ;;
+
+ # -f allows you to select a makefile name
+ -f)
+ MAKE=$2
+ shift; shift ;;
+
+ # -m allows you to specify the dependency-generation flag
+ -m)
+ DEPENDENCY_CFLAG=$2
+ shift; shift ;;
+
+ # the -p flag produces "program: program.c" style dependencies
+ # so .o's don't get produced
+ -p)
+ SED='s;\.o;;'
+ shift ;;
+ *)
+ break ;;
+ esac
+done
+
+if [ $# = 0 ] ; then
+ echo 'usage: mkdep [-p] [-c cc] [-f makefile] [-m dependency-cflag] [flags] file ...'
+ exit 1
+fi
+
+if [ ! -w $MAKE ]; then
+ echo "mkdep: no writeable file \"$MAKE\""
+ exit 1
+fi
+
+TMP=/tmp/mkdep$$
+
+trap 'rm -f $TMP ; exit 1' 1 2 3 13 15
+
+cp $MAKE ${MAKE}.bak
+
+sed -e '/DO NOT DELETE THIS LINE/,$d' < $MAKE > $TMP
+
+cat << _EOF_ >> $TMP
+# DO NOT DELETE THIS LINE -- mkdep uses it.
+# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
+
+_EOF_
+
+# If your compiler doesn't have -M, add it. If you can't, the next two
+# lines will try and replace the "cc -M". The real problem is that this
+# hack can't deal with anything that requires a search path, and doesn't
+# even try for anything using bracket (<>) syntax.
+#
+# egrep '^#include[ ]*".*"' /dev/null $* |
+# sed -e 's/:[^"]*"\([^"]*\)".*/: \1/' -e 's/\.c/.o/' |
+
+# XXX this doesn't work with things like "-DDECLWAITSTATUS=union\ wait"
+$CC $DEPENDENCY_CFLAG $* |
+sed "
+ s; \./; ;g
+ $SED" |
+awk '{
+ if ($1 != prev) {
+ if (rec != "")
+ print rec;
+ rec = $0;
+ prev = $1;
+ }
+ else {
+ if (length(rec $2) > 78) {
+ print rec;
+ rec = $0;
+ }
+ else
+ rec = rec " " $2
+ }
+}
+END {
+ print rec
+}' >> $TMP
+
+cat << _EOF_ >> $TMP
+
+# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
+_EOF_
+
+# copy to preserve permissions
+cp $TMP $MAKE
+rm -f ${MAKE}.bak $TMP
+exit 0
--- /dev/null
+/*
+ * Copyright (C) 2001 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.
+ */
+
+#define LABEL_MASK 0xfffff000
+#define LABEL_SHIFT 12
+#define EXP_MASK 0x00000e00
+#define EXP_SHIFT 9
+#define STACK_MASK 0x00000100
+#define STACK_SHIFT 8
+#define TTL_MASK 0x000000ff
+#define TTL_SHIFT 0
+
+#define MPLS_LABEL(x) (((x) & LABEL_MASK) >> LABEL_SHIFT)
+#define MPLS_EXP(x) (((x) & EXP_MASK) >> EXP_SHIFT)
+#define MPLS_STACK(x) (((x) & STACK_MASK) >> STACK_SHIFT)
+#define MPLS_TTL(x) (((x) & TTL_MASK) >> TTL_SHIFT)
--- /dev/null
+/*
+ * Copyright (c) 1983, 1989, 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.
+ *
+ * @(#)nameser.h 8.2 (Berkeley) 2/16/94
+ * -
+ * Portions Copyright (c) 1993 by Digital Equipment Corporation.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies, and that
+ * the name of Digital Equipment Corporation not be used in advertising or
+ * publicity pertaining to distribution of the document or software without
+ * specific, written prior permission.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
+ * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ * -
+ * --Copyright--
+ */
+
+#ifndef _NAMESER_H_
+#define _NAMESER_H_
+
+#include <sys/types.h>
+
+/*
+ * Define constants based on rfc883
+ */
+#define PACKETSZ 512 /* maximum packet size */
+#define MAXDNAME 256 /* maximum domain name */
+#define MAXCDNAME 255 /* maximum compressed domain name */
+#define MAXLABEL 63 /* maximum length of domain label */
+ /* Number of bytes of fixed size data in query structure */
+#define QFIXEDSZ 4
+ /* number of bytes of fixed size data in resource record */
+#define RRFIXEDSZ 10
+
+/*
+ * Internet nameserver port number
+ */
+#define NAMESERVER_PORT 53
+
+/*
+ * Port for multicast DNS; see
+ *
+ * http://files.multicastdns.org/draft-cheshire-dnsext-multicastdns.txt
+ *
+ * for the current mDNS spec.
+ */
+#define MULTICASTDNS_PORT 5353
+
+/*
+ * Currently defined opcodes
+ */
+#define QUERY 0x0 /* standard query */
+#define IQUERY 0x1 /* inverse query */
+#define STATUS 0x2 /* nameserver status query */
+#if 0
+#define xxx 0x3 /* 0x3 reserved */
+#endif
+ /* non standard - supports ALLOW_UPDATES stuff from Mike Schwartz */
+#define UPDATEA 0x9 /* add resource record */
+#define UPDATED 0xa /* delete a specific resource record */
+#define UPDATEDA 0xb /* delete all named resource record */
+#define UPDATEM 0xc /* modify a specific resource record */
+#define UPDATEMA 0xd /* modify all named resource record */
+
+#define ZONEINIT 0xe /* initial zone transfer */
+#define ZONEREF 0xf /* incremental zone referesh */
+
+/*
+ * Undefine various #defines from various System V-flavored OSes (Solaris,
+ * SINIX, HP-UX) so the compiler doesn't whine that we redefine them.
+ */
+#ifdef T_NULL
+#undef T_NULL
+#endif
+#ifdef T_OPT
+#undef T_OPT
+#endif
+#ifdef T_UNSPEC
+#undef T_UNSPEC
+#endif
+#ifdef NOERROR
+#undef NOERROR
+#endif
+
+/*
+ * Currently defined response codes
+ */
+#define NOERROR 0 /* no error */
+#define FORMERR 1 /* format error */
+#define SERVFAIL 2 /* server failure */
+#define NXDOMAIN 3 /* non existent domain */
+#define NOTIMP 4 /* not implemented */
+#define REFUSED 5 /* query refused */
+ /* non standard */
+#define NOCHANGE 0xf /* update failed to change db */
+
+/*
+ * Type values for resources and queries
+ */
+#define T_A 1 /* host address */
+#define T_NS 2 /* authoritative server */
+#define T_MD 3 /* mail destination */
+#define T_MF 4 /* mail forwarder */
+#define T_CNAME 5 /* connonical name */
+#define T_SOA 6 /* start of authority zone */
+#define T_MB 7 /* mailbox domain name */
+#define T_MG 8 /* mail group member */
+#define T_MR 9 /* mail rename name */
+#define T_NULL 10 /* null resource record */
+#define T_WKS 11 /* well known service */
+#define T_PTR 12 /* domain name pointer */
+#define T_HINFO 13 /* host information */
+#define T_MINFO 14 /* mailbox information */
+#define T_MX 15 /* mail routing information */
+#define T_TXT 16 /* text strings */
+#define T_RP 17 /* responsible person */
+#define T_AFSDB 18 /* AFS cell database */
+#define T_X25 19 /* X_25 calling address */
+#define T_ISDN 20 /* ISDN calling address */
+#define T_RT 21 /* router */
+#define T_NSAP 22 /* NSAP address */
+#define T_NSAP_PTR 23 /* reverse lookup for NSAP */
+#define T_SIG 24 /* security signature */
+#define T_KEY 25 /* security key */
+#define T_PX 26 /* X.400 mail mapping */
+#define T_GPOS 27 /* geographical position (withdrawn) */
+#define T_AAAA 28 /* IP6 Address */
+#define T_LOC 29 /* Location Information */
+#define T_NXT 30 /* Next Valid Name in Zone */
+#define T_EID 31 /* Endpoint identifier */
+#define T_NIMLOC 32 /* Nimrod locator */
+#define T_SRV 33 /* Server selection */
+#define T_ATMA 34 /* ATM Address */
+#define T_NAPTR 35 /* Naming Authority PoinTeR */
+#define T_KX 36 /* Key Exchanger */
+#define T_CERT 37 /* Certificates in the DNS */
+#define T_A6 38 /* IP6 address */
+#define T_DNAME 39 /* non-terminal redirection */
+#define T_SINK 40 /* unknown */
+#define T_OPT 41 /* EDNS0 option (meta-RR) */
+#define T_APL 42 /* lists of address prefixes */
+#define T_DS 43 /* Delegation Signer */
+#define T_SSHFP 44 /* SSH Fingerprint */
+#define T_IPSECKEY 45 /* IPsec keying material */
+#define T_RRSIG 46 /* new security signature */
+#define T_NSEC 47 /* provable insecure information */
+#define T_DNSKEY 48 /* new security key */
+ /* non standard */
+#define T_SPF 99 /* sender policy framework */
+#define T_UINFO 100 /* user (finger) information */
+#define T_UID 101 /* user ID */
+#define T_GID 102 /* group ID */
+#define T_UNSPEC 103 /* Unspecified format (binary data) */
+#define T_UNSPECA 104 /* "unspecified ascii". Ugly MIT hack */
+ /* Query type values which do not appear in resource records */
+#define T_TKEY 249 /* Transaction Key [RFC2930] */
+#define T_TSIG 250 /* Transaction Signature [RFC2845] */
+#define T_IXFR 251 /* incremental transfer [RFC1995] */
+#define T_AXFR 252 /* transfer zone of authority */
+#define T_MAILB 253 /* transfer mailbox records */
+#define T_MAILA 254 /* transfer mail agent records */
+#define T_ANY 255 /* wildcard match */
+
+/*
+ * Values for class field
+ */
+
+#define C_IN 1 /* the arpa internet */
+#define C_CHAOS 3 /* for chaos net (MIT) */
+#define C_HS 4 /* for Hesiod name server (MIT) (XXX) */
+ /* Query class values which do not appear in resource records */
+#define C_ANY 255 /* wildcard match */
+#define C_QU 0x8000 /* mDNS QU flag in queries */
+#define C_CACHE_FLUSH 0x8000 /* mDNS cache flush flag in replies */
+
+/*
+ * Status return codes for T_UNSPEC conversion routines
+ */
+#define CONV_SUCCESS 0
+#define CONV_OVERFLOW -1
+#define CONV_BADFMT -2
+#define CONV_BADCKSUM -3
+#define CONV_BADBUFLEN -4
+
+/*
+ * Structure for query header.
+ */
+typedef struct {
+ uint16_t id; /* query identification number */
+ uint8_t flags1; /* first byte of flags */
+ uint8_t flags2; /* second byte of flags */
+ uint16_t qdcount; /* number of question entries */
+ uint16_t ancount; /* number of answer entries */
+ uint16_t nscount; /* number of authority entries */
+ uint16_t arcount; /* number of resource entries */
+} HEADER;
+
+/*
+ * Macros for subfields of flag fields.
+ */
+#define DNS_QR(np) ((np)->flags1 & 0x80) /* response flag */
+#define DNS_OPCODE(np) ((((np)->flags1) >> 3) & 0xF) /* purpose of message */
+#define DNS_AA(np) ((np)->flags1 & 0x04) /* authoritative answer */
+#define DNS_TC(np) ((np)->flags1 & 0x02) /* truncated message */
+#define DNS_RD(np) ((np)->flags1 & 0x01) /* recursion desired */
+
+#define DNS_RA(np) ((np)->flags2 & 0x80) /* recursion available */
+#define DNS_AD(np) ((np)->flags2 & 0x20) /* authentic data from named */
+#define DNS_CD(np) ((np)->flags2 & 0x10) /* checking disabled by resolver */
+#define DNS_RCODE(np) ((np)->flags2 & 0xF) /* response code */
+
+/*
+ * Defines for handling compressed domain names, EDNS0 labels, etc.
+ */
+#define INDIR_MASK 0xc0 /* 11.... */
+#define EDNS0_MASK 0x40 /* 01.... */
+# define EDNS0_ELT_BITLABEL 0x01
+
+/*
+ * Structure for passing resource records around.
+ */
+struct rrec {
+ int16_t r_zone; /* zone number */
+ int16_t r_class; /* class number */
+ int16_t r_type; /* type number */
+ uint32_t r_ttl; /* time to live */
+ int r_size; /* size of data area */
+ char *r_data; /* pointer to data */
+};
+
+/*
+ * Inline versions of get/put short/long. Pointer is advanced.
+ * We also assume that a "uint16_t" holds 2 "chars"
+ * and that a "uint32_t" holds 4 "chars".
+ *
+ * These macros demonstrate the property of C whereby it can be
+ * portable or it can be elegant but never both.
+ */
+#define GETSHORT(s, cp) { \
+ register u_char *t_cp = (u_char *)(cp); \
+ (s) = ((uint16_t)t_cp[0] << 8) | (uint16_t)t_cp[1]; \
+ (cp) += 2; \
+}
+
+#define GETLONG(l, cp) { \
+ register u_char *t_cp = (u_char *)(cp); \
+ (l) = (((uint32_t)t_cp[0]) << 24) \
+ | (((uint32_t)t_cp[1]) << 16) \
+ | (((uint32_t)t_cp[2]) << 8) \
+ | (((uint32_t)t_cp[3])); \
+ (cp) += 4; \
+}
+
+#define PUTSHORT(s, cp) { \
+ register uint16_t t_s = (uint16_t)(s); \
+ register u_char *t_cp = (u_char *)(cp); \
+ *t_cp++ = t_s >> 8; \
+ *t_cp = t_s; \
+ (cp) += 2; \
+}
+
+/*
+ * Warning: PUTLONG --no-longer-- destroys its first argument. if you
+ * were depending on this "feature", you will lose.
+ */
+#define PUTLONG(l, cp) { \
+ register uint32_t t_l = (uint32_t)(l); \
+ register u_char *t_cp = (u_char *)(cp); \
+ *t_cp++ = t_l >> 24; \
+ *t_cp++ = t_l >> 16; \
+ *t_cp++ = t_l >> 8; \
+ *t_cp = t_l; \
+ (cp) += 4; \
+}
+
+#endif /* !_NAMESER_H_ */
--- /dev/null
+/*
+ * Copyright (c) 1988-1997
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Copyright (c) 1998-2012 Michael Richardson <mcr@tcpdump.org>
+ * 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, (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.
+ */
+
+#ifndef netdissect_h
+#define netdissect_h
+
+#ifdef HAVE_OS_PROTO_H
+#include "os-proto.h"
+#endif
+#include <sys/types.h>
+
+#ifndef HAVE___ATTRIBUTE__
+#define __attribute__(x)
+#endif
+
+/* snprintf et al */
+
+#include <stdarg.h>
+
+#include "ip.h" /* struct ip for nextproto4_cksum() */
+
+#if !defined(HAVE_SNPRINTF)
+int snprintf (char *str, size_t sz, const char *format, ...)
+#ifdef __ATTRIBUTE___FORMAT_OK
+ __attribute__((format (printf, 3, 4)))
+#endif /* __ATTRIBUTE___FORMAT_OK */
+ ;
+#endif /* !defined(HAVE_SNPRINTF) */
+
+#if !defined(HAVE_VSNPRINTF)
+int vsnprintf (char *str, size_t sz, const char *format, va_list ap)
+#ifdef __ATTRIBUTE___FORMAT_OK
+ __attribute__((format (printf, 3, 0)))
+#endif /* __ATTRIBUTE___FORMAT_OK */
+ ;
+#endif /* !defined(HAVE_SNPRINTF) */
+
+#ifndef HAVE_STRLCAT
+extern size_t strlcat (char *, const char *, size_t);
+#endif
+#ifndef HAVE_STRLCPY
+extern size_t strlcpy (char *, const char *, size_t);
+#endif
+
+#ifndef HAVE_STRDUP
+extern char *strdup (const char *str);
+#endif
+
+#ifndef HAVE_STRSEP
+extern char *strsep(char **, const char *);
+#endif
+
+struct tok {
+ u_int v; /* value */
+ const char *s; /* string */
+};
+
+#define TOKBUFSIZE 128
+extern const char *tok2strbuf(const struct tok *, const char *, u_int,
+ char *buf, size_t bufsize);
+
+/* tok2str is deprecated */
+extern const char *tok2str(const struct tok *, const char *, int);
+extern char *bittok2str(const struct tok *, const char *, int);
+extern char *bittok2str_nosep(const struct tok *, const char *, int);
+
+
+typedef struct netdissect_options netdissect_options;
+
+struct netdissect_options {
+ int ndo_aflag; /* translate network and broadcast addresses */
+ int ndo_bflag; /* print 4 byte ASes in ASDOT notation */
+ int ndo_eflag; /* print ethernet header */
+ int ndo_fflag; /* don't translate "foreign" IP address */
+ int ndo_Kflag; /* don't check TCP checksums */
+ int ndo_nflag; /* leave addresses as numbers */
+ int ndo_Nflag; /* remove domains from printed host names */
+ int ndo_qflag; /* quick (shorter) output */
+ int ndo_Rflag; /* print sequence # field in AH/ESP*/
+ int ndo_sflag; /* use the libsmi to translate OIDs */
+ int ndo_Sflag; /* print raw TCP sequence numbers */
+ int ndo_tflag; /* print packet arrival time */
+ int ndo_Uflag; /* "unbuffered" output of dump files */
+ int ndo_uflag; /* Print undecoded NFS handles */
+ int ndo_vflag; /* verbose */
+ int ndo_xflag; /* print packet in hex */
+ int ndo_Xflag; /* print packet in hex/ascii */
+ int ndo_Aflag; /* print packet only in ascii observing TAB,
+ * LF, CR and SPACE as graphical chars
+ */
+ int ndo_Bflag; /* buffer size */
+ 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_immediate; /* use immediate mode */
+
+ int ndo_Cflag; /* rotate dump files after this many bytes */
+ int ndo_Cflag_count; /* Keep track of which file number we're writing */
+ int ndo_Gflag; /* rotate dump files after this many seconds */
+ int ndo_Gflag_count; /* number of files created with Gflag rotation */
+ 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_packet_number; /* print a packet number in the beginning of line */
+ int ndo_suppress_default_print; /* don't use default_print() for unknown packet types */
+ int ndo_tstamp_precision; /* requested time stamp precision */
+ const char *ndo_dltname;
+
+ char *ndo_espsecret;
+ struct sa_list *ndo_sa_list_head; /* used by print-esp.c */
+ struct sa_list *ndo_sa_default;
+
+ char *ndo_sigsecret; /* Signature verification secret key */
+
+ struct esp_algorithm *ndo_espsecret_xform; /* cache of decoded */
+ char *ndo_espsecret_key;
+
+ int ndo_packettype; /* as specified by -T */
+
+ char *ndo_program_name; /*used to generate self-identifying messages */
+
+ int32_t ndo_thiszone; /* seconds offset from gmt to local time */
+
+ int ndo_snaplen;
+
+ /*global pointers to beginning and end of current packet (during printing) */
+ const u_char *ndo_packetp;
+ const u_char *ndo_snapend;
+
+ /* bookkeeping for ^T output */
+ int ndo_infodelay;
+
+ /* pointer to void function to output stuff */
+ void (*ndo_default_print)(netdissect_options *,
+ register const u_char *bp, register u_int length);
+
+ /* pointer to function to print ^T output */
+ void (*ndo_info)(netdissect_options *, int verbose);
+
+ /* pointer to function to do regular output */
+ int (*ndo_printf)(netdissect_options *,
+ const char *fmt, ...)
+#ifdef __ATTRIBUTE___FORMAT_OK_FOR_FUNCTION_POINTERS
+ __attribute__ ((format (printf, 2, 3)))
+#endif
+ ;
+ /* pointer to function to output errors */
+ void (*ndo_error)(netdissect_options *,
+ const char *fmt, ...)
+#ifdef __ATTRIBUTE___NORETURN_OK_FOR_FUNCTION_POINTERS
+ __attribute__ ((noreturn))
+#endif /* __ATTRIBUTE___NORETURN_OK_FOR_FUNCTION_POINTERS */
+#ifdef __ATTRIBUTE___FORMAT_OK_FOR_FUNCTION_POINTERS
+ __attribute__ ((format (printf, 2, 3)))
+#endif /* __ATTRIBUTE___FORMAT_OK_FOR_FUNCTION_POINTERS */
+ ;
+ /* pointer to function to output warnings */
+ void (*ndo_warning)(netdissect_options *,
+ const char *fmt, ...)
+#ifdef __ATTRIBUTE___FORMAT_OK_FOR_FUNCTION_POINTERS
+ __attribute__ ((format (printf, 2, 3)))
+#endif
+ ;
+};
+
+#define PT_VAT 1 /* Visual Audio Tool */
+#define PT_WB 2 /* distributed White Board */
+#define PT_RPC 3 /* Remote Procedure Call */
+#define PT_RTP 4 /* Real-Time Applications protocol */
+#define PT_RTCP 5 /* Real-Time Applications control protocol */
+#define PT_SNMP 6 /* Simple Network Management Protocol */
+#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 */
+#define PT_RADIUS 11 /* RADIUS authentication Protocol */
+#define PT_ZMTP1 12 /* ZeroMQ Message Transport Protocol 1.0 */
+#define PT_VXLAN 13 /* Virtual eXtensible Local Area Network */
+#define PT_PGM 14 /* [UDP-encapsulated] Pragmatic General Multicast */
+#define PT_PGM_ZMTP1 15 /* ZMTP/1.0 inside PGM (native or UDP-encapsulated) */
+#define PT_LMP 16 /* Link Management Protocol */
+
+#ifndef min
+#define min(a,b) ((a)>(b)?(b):(a))
+#endif
+#ifndef max
+#define max(a,b) ((b)>(a)?(b):(a))
+#endif
+
+/*
+ * Maximum snapshot length. This should be enough to capture the full
+ * packet on most network interfaces.
+ *
+ *
+ * Somewhat arbitrary, but chosen to be:
+ *
+ * 1) big enough for maximum-size Linux loopback packets (65549)
+ * and some USB packets captured with USBPcap:
+ *
+ * http://desowin.org/usbpcap/
+ *
+ * (> 131072, < 262144)
+ *
+ * and
+ *
+ * 2) small enough not to cause attempts to allocate huge amounts of
+ * memory; some applications might use the snapshot length in a
+ * savefile header to control the size of the buffer they allocate,
+ * so a size of, say, 2^31-1 might not work well.
+ *
+ * XXX - does it need to be bigger still?
+ */
+#define MAXIMUM_SNAPLEN 262144
+
+/*
+ * The default snapshot length is the maximum.
+ */
+#define DEFAULT_SNAPLEN MAXIMUM_SNAPLEN
+
+#define ESRC(ep) ((ep)->ether_shost)
+#define EDST(ep) ((ep)->ether_dhost)
+
+#ifndef NTOHL
+#define NTOHL(x) (x) = ntohl(x)
+#define NTOHS(x) (x) = ntohs(x)
+#define HTONL(x) (x) = htonl(x)
+#define HTONS(x) (x) = htons(x)
+#endif
+
+/*
+ * True if "l" bytes of "var" were captured.
+ *
+ * The "ndo->ndo_snapend - (l) <= ndo->ndo_snapend" checks to make sure
+ * "l" isn't so large that "ndo->ndo_snapend - (l)" underflows.
+ *
+ * The check is for <= rather than < because "l" might be 0.
+ *
+ * We cast the pointers to uintptr_t to make sure that the compiler
+ * doesn't optimize away any of these tests (which it is allowed to
+ * do, as adding an integer to, or subtracting an integer from, a
+ * pointer assumes that the pointer is a pointer to an element of an
+ * array and that the result of the addition or subtraction yields a
+ * pointer to another member of the array, so that, for example, if
+ * you subtract a positive integer from a pointer, the result is
+ * guaranteed to be less than the original pointer value). See
+ *
+ * http://www.kb.cert.org/vuls/id/162289
+ */
+#define ND_TTEST2(var, l) \
+ ((l) >= 0 && \
+ ((uintptr_t)ndo->ndo_snapend - (l) <= (uintptr_t)ndo->ndo_snapend && \
+ (uintptr_t)&(var) <= (uintptr_t)ndo->ndo_snapend - (l)))
+
+/* True if "var" was captured */
+#define ND_TTEST(var) ND_TTEST2(var, sizeof(var))
+
+/* Bail if "l" bytes of "var" were not captured */
+#define ND_TCHECK2(var, l) if (!ND_TTEST2(var, l)) goto trunc
+
+/* Bail if "var" was not captured */
+#define ND_TCHECK(var) ND_TCHECK2(var, sizeof(var))
+
+#define ND_PRINT(STUFF) (*ndo->ndo_printf)STUFF
+#define ND_DEFAULTPRINT(ap, length) (*ndo->ndo_default_print)(ndo, ap, length)
+
+extern void ts_print(netdissect_options *, const struct timeval *);
+extern void relts_print(netdissect_options *, int);
+
+extern int fn_print(netdissect_options *, const u_char *, const u_char *);
+extern int fn_printn(netdissect_options *, const u_char *, u_int, const u_char *);
+extern int fn_printzp(netdissect_options *, const u_char *, u_int, const u_char *);
+extern const char *tok2str(const struct tok *, const char *, int);
+
+/*
+ * Flags for txtproto_print().
+ */
+#define RESP_CODE_SECOND_TOKEN 0x00000001 /* response code is second token in response line */
+
+extern void txtproto_print(netdissect_options *, const u_char *, u_int,
+ const char *, const char **, u_int);
+
+#if 0
+extern char *read_infile(netdissect_options *, char *);
+extern char *copy_argv(netdissect_options *, char **);
+#endif
+
+/*
+ * Locale-independent macros for testing character properties and
+ * stripping the 8th bit from characters. Assumed to be handed
+ * a value between 0 and 255, i.e. don't hand them a char, as
+ * those might be in the range -128 to 127.
+ */
+#define ND_ISASCII(c) (!((c) & 0x80)) /* value is an ASCII code point */
+#define ND_ISPRINT(c) ((c) >= 0x20 && (c) <= 0x7E)
+#define ND_ISGRAPH(c) ((c) > 0x20 && (c) <= 0x7E)
+#define ND_TOASCII(c) ((c) & 0x7F)
+
+extern void safeputchar(netdissect_options *, const u_char);
+extern void safeputs(netdissect_options *, const u_char *, const u_int);
+
+#ifdef LBL_ALIGN
+/*
+ * The processor doesn't natively handle unaligned loads,
+ * and the compiler might "helpfully" optimize memcpy()
+ * and memcmp(), when handed pointers that would normally
+ * be properly aligned, into sequences that assume proper
+ * alignment.
+ *
+ * Do copies and compares of possibly-unaligned data by
+ * calling routines that wrap memcpy() and memcmp(), to
+ * prevent that optimization.
+ */
+extern void unaligned_memcpy(void *, const void *, size_t);
+extern int unaligned_memcmp(const void *, const void *, size_t);
+#define UNALIGNED_MEMCPY(p, q, l) unaligned_memcpy((p), (q), (l))
+#define UNALIGNED_MEMCMP(p, q, l) unaligned_memcmp((p), (q), (l))
+#else
+/*
+ * The procesor natively handles unaligned loads, so just use memcpy()
+ * and memcmp(), to enable those optimizations.
+ */
+#define UNALIGNED_MEMCPY(p, q, l) memcpy((p), (q), (l))
+#define UNALIGNED_MEMCMP(p, q, l) memcmp((p), (q), (l))
+#endif
+
+#define PLURAL_SUFFIX(n) \
+ (((n) != 1) ? "s" : "")
+
+#if 0
+extern const char *dnname_string(netdissect_options *, u_short);
+extern const char *dnnum_string(netdissect_options *, u_short);
+#endif
+
+/* The printer routines. */
+
+#include <pcap.h>
+
+extern char *q922_string(netdissect_options *ndo, const u_char *, u_int);
+
+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 *,
+ const u_char *bp, const int length, const u_char *bp2,
+ int *nhdr, int *padlen);
+extern void arp_print(netdissect_options *,const u_char *, u_int, u_int);
+extern void tipc_print(netdissect_options *, const u_char *, u_int, u_int);
+extern void msnlb_print(netdissect_options *, const u_char *);
+extern void icmp6_print(netdissect_options *ndo, const u_char *,
+ u_int, const u_char *, int);
+extern void isakmp_print(netdissect_options *,const u_char *,
+ u_int, const u_char *);
+extern void isakmp_rfc3948_print(netdissect_options *,const u_char *,
+ u_int, const u_char *);
+extern void ip_print(netdissect_options *,const u_char *, u_int);
+extern void ip_print_inner(netdissect_options *ndo,
+ const u_char *bp, u_int length, u_int nh,
+ const u_char *bp2);
+extern void rrcp_print(netdissect_options *,const u_char *, u_int);
+extern void loopback_print(netdissect_options *, const u_char *, const u_int);
+extern void carp_print(netdissect_options *, const u_char *, u_int, 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);
+
+extern int print_unknown_data(netdissect_options *,const u_char *, const char *,int);
+extern void ascii_print(netdissect_options *, const u_char *, u_int);
+extern void hex_print_with_offset(netdissect_options *, const char *ident, const u_char *cp,
+ u_int, u_int);
+extern void hex_print(netdissect_options *,const char *ident, const u_char *cp,u_int);
+extern void hex_and_ascii_print_with_offset(netdissect_options *, const char *, const u_char *, u_int, u_int);
+extern void hex_and_ascii_print(netdissect_options *, const char *, const u_char *, u_int);
+
+extern int ah_print(netdissect_options *, register const u_char *);
+extern void beep_print(netdissect_options *, const u_char *, u_int);
+extern void dtp_print(netdissect_options *, const u_char *, u_int);
+extern u_int cip_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern int ipcomp_print(netdissect_options *, register const u_char *, int *);
+extern u_int ipfc_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void udld_print(netdissect_options *, const u_char *, u_int);
+extern void hsrp_print(netdissect_options *, const u_char *, u_int);
+extern void igrp_print(netdissect_options *, const u_char *, u_int);
+extern void msdp_print(netdissect_options *, const u_char *, u_int);
+extern u_int null_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void mobile_print(netdissect_options *, const u_char *, u_int);
+extern u_int ap1394_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int bt_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void lane_print(netdissect_options *, const u_char *, u_int, u_int);
+extern u_int lane_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void otv_print(netdissect_options *, const u_char *, u_int);
+extern void ahcp_print(netdissect_options *, const u_char *, const u_int);
+extern void vxlan_print(netdissect_options *, const u_char *, u_int);
+extern u_int arcnet_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int arcnet_linux_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void bfd_print(netdissect_options *, const u_char *, u_int, u_int);
+extern void gre_print(netdissect_options *, const u_char *, u_int);
+extern int vjc_print(netdissect_options *, register const char *, u_short);
+extern void ipN_print(netdissect_options *, const u_char *, u_int);
+extern u_int raw_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int usb_linux_48_byte_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int usb_linux_64_byte_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int symantec_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int chdlc_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int chdlc_print(netdissect_options *, register const u_char *, u_int);
+extern void zmtp1_print(netdissect_options *, const u_char *, u_int);
+extern void zmtp1_print_datagram(netdissect_options *, const u_char *, const u_int);
+extern void ipx_print(netdissect_options *, const u_char *, u_int);
+extern void mpls_print(netdissect_options *, const u_char *, u_int);
+extern u_int pppoe_print(netdissect_options *, const u_char *, u_int);
+extern u_int pppoe_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void sunrpcrequest_print(netdissect_options *, const u_char *, u_int, const u_char *);
+extern u_int pflog_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int token_print(netdissect_options *, const u_char *, u_int, u_int);
+extern u_int token_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void vqp_print(netdissect_options *, register const u_char *, register u_int);
+extern void zephyr_print(netdissect_options *, const u_char *, int);
+extern void fddi_print(netdissect_options *, const u_char *, u_int, u_int);
+extern u_int fddi_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void mpcp_print(netdissect_options *, const u_char *, u_int);
+extern void rpki_rtr_print(netdissect_options *, const u_char *, u_int);
+extern u_int sll_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void dccp_print(netdissect_options *, const u_char *, const u_char *, u_int);
+extern int llc_print(netdissect_options *, const u_char *, u_int, u_int, const u_char *, const u_char *, u_short *);
+extern int snap_print(netdissect_options *, const u_char *, u_int, u_int, u_int);
+extern void eigrp_print(netdissect_options *, const u_char *, u_int);
+extern void stp_print(netdissect_options *, const u_char *, u_int);
+extern void l2tp_print(netdissect_options *, const u_char *, u_int);
+extern void udp_print(netdissect_options *, const u_char *, u_int, const u_char *, int);
+extern void icmp_print(netdissect_options *, const u_char *, u_int, const u_char *, int);
+extern void openflow_print(netdissect_options *, const u_char *, const u_int);
+extern void telnet_print(netdissect_options *, const u_char *, u_int);
+extern void slow_print(netdissect_options *, const u_char *, u_int);
+extern void radius_print(netdissect_options *, const u_char *, u_int);
+extern void lmp_print(netdissect_options *, const u_char *, u_int);
+extern u_int fr_print(netdissect_options *, register const u_char *, u_int);
+extern u_int mfr_print(netdissect_options *, register const u_char *, u_int);
+extern u_int fr_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int mfr_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void q933_print(netdissect_options *, const u_char *, u_int);
+extern void igmp_print(netdissect_options *, const u_char *, u_int);
+extern void rip_print(netdissect_options *, const u_char *, u_int);
+extern void lwapp_control_print(netdissect_options *, const u_char *, u_int, int);
+extern void lwapp_data_print(netdissect_options *, const u_char *, u_int);
+extern void pgm_print(netdissect_options *, const u_char *, u_int, const u_char *);
+extern void pptp_print(netdissect_options *, const u_char *);
+extern void ldp_print(netdissect_options *, const u_char *, u_int);
+extern void wb_print(netdissect_options *, const void *, u_int);
+extern int oam_print(netdissect_options *, const u_char *, u_int, u_int);
+extern void atm_print(netdissect_options *, u_int, u_int, u_int, const u_char *, u_int, u_int);
+extern u_int sunatm_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int atm_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void vtp_print(netdissect_options *, const u_char *, u_int);
+extern int mptcp_print(netdissect_options *, const u_char *, u_int, u_char);
+extern void ntp_print(netdissect_options *, const u_char *, u_int);
+extern void cnfp_print(netdissect_options *, const u_char *);
+extern void dvmrp_print(netdissect_options *, const u_char *, u_int);
+extern void egp_print(netdissect_options *, const u_char *, u_int);
+extern u_int enc_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int sl_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int sl_bsdos_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void tftp_print(netdissect_options *, const u_char *, u_int);
+extern void vrrp_print(netdissect_options *, const u_char *, u_int, const u_char *, int);
+extern void pimv1_print(netdissect_options *, const u_char *, u_int);
+extern void cisco_autorp_print(netdissect_options *, const u_char *, u_int);
+extern void pim_print(netdissect_options *, const u_char *, u_int, u_int);
+extern const u_char * ns_nprint (netdissect_options *, register const u_char *, register const u_char *);
+extern void ns_print(netdissect_options *, const u_char *, u_int, int);
+extern void bootp_print(netdissect_options *, const u_char *, u_int);
+extern void sflow_print(netdissect_options *, const u_char *, u_int);
+extern void aodv_print(netdissect_options *, const u_char *, u_int, int);
+extern void sctp_print(netdissect_options *, const u_char *, const u_char *, u_int);
+extern char *bgp_vpn_rd_print (netdissect_options *, const u_char *);
+extern void bgp_print(netdissect_options *, const u_char *, int);
+extern void olsr_print(netdissect_options *, const u_char *, u_int, int);
+extern void forces_print(netdissect_options *, const u_char *, u_int);
+extern void lspping_print(netdissect_options *, const u_char *, u_int);
+extern void isoclns_print(netdissect_options *, const u_char *, u_int, u_int);
+extern void krb_print(netdissect_options *, const u_char *);
+extern void cdp_print(netdissect_options *, const u_char *, u_int, u_int);
+extern void atalk_print(netdissect_options *, const u_char *, u_int);
+extern u_int ltalk_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int llap_print(netdissect_options *, const u_char *, u_int);
+extern void aarp_print(netdissect_options *, const u_char *, u_int);
+extern u_int juniper_atm1_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int juniper_atm2_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int juniper_mfr_print(netdissect_options *, const struct pcap_pkthdr *, register const u_char *);
+extern u_int juniper_mlfr_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int juniper_mlppp_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int juniper_pppoe_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int juniper_pppoe_atm_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int juniper_ggsn_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int juniper_es_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int juniper_monitor_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int juniper_services_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int juniper_ether_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int juniper_ppp_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int juniper_frelay_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int juniper_chdlc_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void snmp_print(netdissect_options *, const u_char *, u_int);
+extern void rx_print(netdissect_options *, register const u_char *, int, int, int, u_char *);
+extern void nfsreply_print(netdissect_options *, const u_char *, u_int, const u_char *);
+extern void nfsreply_print_noaddr(netdissect_options *, const u_char *, u_int, const u_char *);
+extern void nfsreq_print_noaddr(netdissect_options *, const u_char *, u_int, const u_char *);
+extern void sip_print(netdissect_options *, const u_char *, u_int);
+extern void syslog_print(netdissect_options *, const u_char *, u_int);
+extern void lwres_print(netdissect_options *, const u_char *, u_int);
+extern void cfm_print(netdissect_options *, const u_char *, u_int);
+extern void nbt_tcp_print(netdissect_options *, const u_char *, int);
+extern void nbt_udp137_print(netdissect_options *, const u_char *, int);
+extern void nbt_udp138_print(netdissect_options *, const u_char *, int);
+extern void smb_tcp_print(netdissect_options *, const u_char *, int);
+extern void netbeui_print(netdissect_options *, u_short, const u_char *, int);
+extern void ipx_netbios_print(netdissect_options *, const u_char *, u_int);
+extern void print_data(netdissect_options *, const unsigned char *, int);
+extern void decnet_print(netdissect_options *, const u_char *, u_int, u_int);
+extern void tcp_print(netdissect_options *, const u_char *, u_int, const u_char *, int);
+extern void ospf_print(netdissect_options *, const u_char *, u_int, const u_char *);
+extern int ospf_print_te_lsa(netdissect_options *, const uint8_t *, u_int);
+extern int ospf_print_grace_lsa(netdissect_options *, const uint8_t *, u_int);
+extern u_int ppp_print(netdissect_options *, register const u_char *, u_int);
+extern u_int ppp_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int ppp_hdlc_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int ppp_bsdos_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void lldp_print(netdissect_options *, const u_char *, u_int);
+extern void rsvp_print(netdissect_options *, const u_char *, u_int);
+extern void timed_print(netdissect_options *, const u_char *);
+extern void m3ua_print(netdissect_options *, const u_char *, const u_int);
+extern void aoe_print(netdissect_options *, const u_char *, const u_int);
+extern void ftp_print(netdissect_options *, const u_char *, u_int);
+extern void http_print(netdissect_options *, const u_char *, u_int);
+extern void rtsp_print(netdissect_options *, const u_char *, u_int);
+extern void smtp_print(netdissect_options *, const u_char *, u_int);
+extern void geneve_print(netdissect_options *, const u_char *, u_int);
+
+
+/* stuff that has not yet been rototiled */
+
+#if 0
+extern void ascii_print(netdissect_options *,u_int);
+extern void default_print(netdissect_options *,const u_char *, u_int);
+extern char *smb_errstr(netdissect_options *,int, int);
+extern const char *nt_errstr(netdissect_options *, uint32_t);
+#endif
+
+extern u_int pfsync_if_print(netdissect_options *,const struct pcap_pkthdr *, const u_char *);
+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 nflog_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 *);
+extern u_int pktap_if_print(netdissect_options *,const struct pcap_pkthdr *, const u_char *);
+extern u_int ieee802_11_radio_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int ieee802_11_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int ieee802_11_radio_avs_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int prism_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+
+extern void ip6_print(netdissect_options *,const u_char *, u_int);
+#ifdef INET6
+extern int frag6_print(netdissect_options *, const u_char *, const u_char *);
+extern int rt6_print(netdissect_options *, const u_char *, const u_char *);
+extern int hbhopt_print(netdissect_options *, const u_char *);
+extern int dstopt_print(netdissect_options *, const u_char *);
+extern void ripng_print(netdissect_options *, const u_char *, unsigned int);
+extern int mobility_print(netdissect_options *, const u_char *, const u_char *);
+extern void dhcp6_print(netdissect_options *, const u_char *, u_int);
+extern void ospf6_print(netdissect_options *, const u_char *, u_int);
+extern void babel_print(netdissect_options *, const u_char *, u_int);
+#endif /*INET6*/
+
+#if 0
+struct cksum_vec {
+ const uint8_t *ptr;
+ int len;
+};
+extern uint16_t in_cksum(const struct cksum_vec *, int);
+extern uint16_t in_cksum_shouldbe(uint16_t, uint16_t);
+#endif
+extern int nextproto4_cksum(netdissect_options *ndo, const struct ip *, const uint8_t *, u_int, u_int, u_int);
+extern int decode_prefix4(netdissect_options *ndo, const u_char *, u_int, char *, u_int);
+#ifdef INET6
+extern int decode_prefix6(netdissect_options *ndo, const u_char *, u_int, char *, u_int);
+#endif
+
+extern void esp_print_decodesecret(netdissect_options *ndo);
+extern int esp_print_decrypt_buffer_by_ikev2(netdissect_options *ndo,
+ int initiator,
+ u_char spii[8], u_char spir[8],
+ u_char *buf, u_char *end);
+
+
+extern void geonet_print(netdissect_options *ndo,const u_char *eth_hdr,const u_char *geo_pck, u_int len);
+extern void calm_fast_print(netdissect_options *ndo,const u_char *eth_hdr,const u_char *calm_pck, u_int len);
+
+extern void pfsync_ip_print(const u_char *bp, u_int len, const u_char *bp2 __unused);
+
+#endif /* netdissect_h */
--- /dev/null
+/* NetBSD: nfs.h,v 1.1 1996/05/23 22:49:53 fvdl Exp */
+
+/*
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Rick Macklem at The University of Guelph.
+ *
+ * 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.
+ *
+ * @(#)nfsproto.h 8.2 (Berkeley) 3/30/95
+ */
+
+/*
+ * nfs definitions as per the Version 2 and 3 specs
+ */
+
+/*
+ * Constants as defined in the Sun NFS Version 2 and 3 specs.
+ * "NFS: Network File System Protocol Specification" RFC1094
+ * and in the "NFS: Network File System Version 3 Protocol
+ * Specification"
+ */
+
+#define NFS_PORT 2049
+#define NFS_PROG 100003
+#define NFS_VER2 2
+#define NFS_VER3 3
+#define NFS_V2MAXDATA 8192
+#define NFS_MAXDGRAMDATA 16384
+#define NFS_MAXDATA 32768
+#define NFS_MAXPATHLEN 1024
+#define NFS_MAXNAMLEN 255
+#define NFS_MAXPKTHDR 404
+#define NFS_MAXPACKET (NFS_MAXPKTHDR + NFS_MAXDATA)
+#define NFS_MINPACKET 20
+#define NFS_FABLKSIZE 512 /* Size in bytes of a block wrt fa_blocks */
+
+/* Stat numbers for rpc returns (version 2 and 3) */
+#define NFS_OK 0
+#define NFSERR_PERM 1
+#define NFSERR_NOENT 2
+#define NFSERR_IO 5
+#define NFSERR_NXIO 6
+#define NFSERR_ACCES 13
+#define NFSERR_EXIST 17
+#define NFSERR_XDEV 18 /* Version 3 only */
+#define NFSERR_NODEV 19
+#define NFSERR_NOTDIR 20
+#define NFSERR_ISDIR 21
+#define NFSERR_INVAL 22 /* Version 3 only */
+#define NFSERR_FBIG 27
+#define NFSERR_NOSPC 28
+#define NFSERR_ROFS 30
+#define NFSERR_MLINK 31 /* Version 3 only */
+#define NFSERR_NAMETOL 63
+#define NFSERR_NOTEMPTY 66
+#define NFSERR_DQUOT 69
+#define NFSERR_STALE 70
+#define NFSERR_REMOTE 71 /* Version 3 only */
+#define NFSERR_WFLUSH 99 /* Version 2 only */
+#define NFSERR_BADHANDLE 10001 /* The rest Version 3 only */
+#define NFSERR_NOT_SYNC 10002
+#define NFSERR_BAD_COOKIE 10003
+#define NFSERR_NOTSUPP 10004
+#define NFSERR_TOOSMALL 10005
+#define NFSERR_SERVERFAULT 10006
+#define NFSERR_BADTYPE 10007
+#define NFSERR_JUKEBOX 10008
+#define NFSERR_TRYLATER NFSERR_JUKEBOX
+#define NFSERR_STALEWRITEVERF 30001 /* Fake return for nfs_commit() */
+
+#define NFSERR_RETVOID 0x20000000 /* Return void, not error */
+#define NFSERR_AUTHERR 0x40000000 /* Mark an authentication error */
+#define NFSERR_RETERR 0x80000000 /* Mark an error return for V3 */
+
+/* Sizes in bytes of various nfs rpc components */
+#define NFSX_UNSIGNED 4
+
+/* specific to NFS Version 2 */
+#define NFSX_V2FH 32
+#define NFSX_V2FATTR 68
+#define NFSX_V2SATTR 32
+#define NFSX_V2COOKIE 4
+#define NFSX_V2STATFS 20
+
+/* specific to NFS Version 3 */
+#if 0
+#define NFSX_V3FH (sizeof (fhandle_t)) /* size this server uses */
+#endif
+#define NFSX_V3FHMAX 64 /* max. allowed by protocol */
+#define NFSX_V3FATTR 84
+#define NFSX_V3SATTR 60 /* max. all fields filled in */
+#define NFSX_V3SRVSATTR (sizeof (struct nfsv3_sattr))
+#define NFSX_V3POSTOPATTR (NFSX_V3FATTR + NFSX_UNSIGNED)
+#define NFSX_V3WCCDATA (NFSX_V3POSTOPATTR + 8 * NFSX_UNSIGNED)
+#define NFSX_V3COOKIEVERF 8
+#define NFSX_V3WRITEVERF 8
+#define NFSX_V3CREATEVERF 8
+#define NFSX_V3STATFS 52
+#define NFSX_V3FSINFO 48
+#define NFSX_V3PATHCONF 24
+
+/* variants for both versions */
+#define NFSX_FH(v3) ((v3) ? (NFSX_V3FHMAX + NFSX_UNSIGNED) : \
+ NFSX_V2FH)
+#define NFSX_SRVFH(v3) ((v3) ? NFSX_V3FH : NFSX_V2FH)
+#define NFSX_FATTR(v3) ((v3) ? NFSX_V3FATTR : NFSX_V2FATTR)
+#define NFSX_PREOPATTR(v3) ((v3) ? (7 * NFSX_UNSIGNED) : 0)
+#define NFSX_POSTOPATTR(v3) ((v3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : 0)
+#define NFSX_POSTOPORFATTR(v3) ((v3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : \
+ NFSX_V2FATTR)
+#define NFSX_WCCDATA(v3) ((v3) ? NFSX_V3WCCDATA : 0)
+#define NFSX_WCCORFATTR(v3) ((v3) ? NFSX_V3WCCDATA : NFSX_V2FATTR)
+#define NFSX_SATTR(v3) ((v3) ? NFSX_V3SATTR : NFSX_V2SATTR)
+#define NFSX_COOKIEVERF(v3) ((v3) ? NFSX_V3COOKIEVERF : 0)
+#define NFSX_WRITEVERF(v3) ((v3) ? NFSX_V3WRITEVERF : 0)
+#define NFSX_READDIR(v3) ((v3) ? (5 * NFSX_UNSIGNED) : \
+ (2 * NFSX_UNSIGNED))
+#define NFSX_STATFS(v3) ((v3) ? NFSX_V3STATFS : NFSX_V2STATFS)
+
+/* nfs rpc procedure numbers (before version mapping) */
+#define NFSPROC_NULL 0
+#define NFSPROC_GETATTR 1
+#define NFSPROC_SETATTR 2
+#define NFSPROC_LOOKUP 3
+#define NFSPROC_ACCESS 4
+#define NFSPROC_READLINK 5
+#define NFSPROC_READ 6
+#define NFSPROC_WRITE 7
+#define NFSPROC_CREATE 8
+#define NFSPROC_MKDIR 9
+#define NFSPROC_SYMLINK 10
+#define NFSPROC_MKNOD 11
+#define NFSPROC_REMOVE 12
+#define NFSPROC_RMDIR 13
+#define NFSPROC_RENAME 14
+#define NFSPROC_LINK 15
+#define NFSPROC_READDIR 16
+#define NFSPROC_READDIRPLUS 17
+#define NFSPROC_FSSTAT 18
+#define NFSPROC_FSINFO 19
+#define NFSPROC_PATHCONF 20
+#define NFSPROC_COMMIT 21
+
+/* And leasing (nqnfs) procedure numbers (must be last) */
+#define NQNFSPROC_GETLEASE 22
+#define NQNFSPROC_VACATED 23
+#define NQNFSPROC_EVICTED 24
+
+#define NFSPROC_NOOP 25
+#define NFS_NPROCS 26
+
+/* Actual Version 2 procedure numbers */
+#define NFSV2PROC_NULL 0
+#define NFSV2PROC_GETATTR 1
+#define NFSV2PROC_SETATTR 2
+#define NFSV2PROC_NOOP 3
+#define NFSV2PROC_ROOT NFSV2PROC_NOOP /* Obsolete */
+#define NFSV2PROC_LOOKUP 4
+#define NFSV2PROC_READLINK 5
+#define NFSV2PROC_READ 6
+#define NFSV2PROC_WRITECACHE NFSV2PROC_NOOP /* Obsolete */
+#define NFSV2PROC_WRITE 8
+#define NFSV2PROC_CREATE 9
+#define NFSV2PROC_REMOVE 10
+#define NFSV2PROC_RENAME 11
+#define NFSV2PROC_LINK 12
+#define NFSV2PROC_SYMLINK 13
+#define NFSV2PROC_MKDIR 14
+#define NFSV2PROC_RMDIR 15
+#define NFSV2PROC_READDIR 16
+#define NFSV2PROC_STATFS 17
+
+/*
+ * Constants used by the Version 3 protocol for various RPCs
+ */
+#define NFSV3SATTRTIME_DONTCHANGE 0
+#define NFSV3SATTRTIME_TOSERVER 1
+#define NFSV3SATTRTIME_TOCLIENT 2
+
+#define NFSV3ATTRTIME_NMODES 3
+
+#define NFSV3ACCESS_READ 0x01
+#define NFSV3ACCESS_LOOKUP 0x02
+#define NFSV3ACCESS_MODIFY 0x04
+#define NFSV3ACCESS_EXTEND 0x08
+#define NFSV3ACCESS_DELETE 0x10
+#define NFSV3ACCESS_EXECUTE 0x20
+#define NFSV3ACCESS_FULL 0x3f
+
+#define NFSV3WRITE_UNSTABLE 0
+#define NFSV3WRITE_DATASYNC 1
+#define NFSV3WRITE_FILESYNC 2
+
+#define NFSV3WRITE_NMODES 3
+
+#define NFSV3CREATE_UNCHECKED 0
+#define NFSV3CREATE_GUARDED 1
+#define NFSV3CREATE_EXCLUSIVE 2
+
+#define NFSV3CREATE_NMODES 3
+
+#define NFSV3FSINFO_LINK 0x01
+#define NFSV3FSINFO_SYMLINK 0x02
+#define NFSV3FSINFO_HOMOGENEOUS 0x08
+#define NFSV3FSINFO_CANSETTIME 0x10
+
+/* Conversion macros */
+#define vtonfsv2_mode(t,m) \
+ txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : \
+ MAKEIMODE((t), (m)))
+#define vtonfsv3_mode(m) txdr_unsigned((m) & 07777)
+#define nfstov_mode(a) (fxdr_unsigned(uint16_t, (a))&07777)
+#define vtonfsv2_type(a) txdr_unsigned(nfsv2_type[((int32_t)(a))])
+#define vtonfsv3_type(a) txdr_unsigned(nfsv3_type[((int32_t)(a))])
+#define nfsv2tov_type(a) nv2tov_type[fxdr_unsigned(uint32_t,(a))&0x7]
+#define nfsv3tov_type(a) nv3tov_type[fxdr_unsigned(uint32_t,(a))&0x7]
+
+/* File types */
+typedef enum { NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5,
+ NFSOCK=6, NFFIFO=7 } nfs_type;
+
+/* Structs for common parts of the rpc's */
+/*
+ * File Handle (32 bytes for version 2), variable up to 64 for version 3.
+ * File Handles of up to NFS_SMALLFH in size are stored directly in the
+ * nfs node, whereas larger ones are malloc'd. (This never happens when
+ * NFS_SMALLFH is set to 64.)
+ * NFS_SMALLFH should be in the range of 32 to 64 and be divisible by 4.
+ */
+#ifndef NFS_SMALLFH
+#define NFS_SMALLFH 64
+#endif
+union nfsfh {
+/* fhandle_t fh_generic; */
+ u_char fh_bytes[NFS_SMALLFH];
+};
+typedef union nfsfh nfsfh_t;
+
+struct nfsv2_time {
+ uint32_t nfsv2_sec;
+ uint32_t nfsv2_usec;
+};
+typedef struct nfsv2_time nfstime2;
+
+struct nfsv3_time {
+ uint32_t nfsv3_sec;
+ uint32_t nfsv3_nsec;
+};
+typedef struct nfsv3_time nfstime3;
+
+/*
+ * Quads are defined as arrays of 2 longs to ensure dense packing for the
+ * protocol and to facilitate xdr conversion.
+ */
+struct nfs_uquad {
+ uint32_t nfsuquad[2];
+};
+typedef struct nfs_uquad nfsuint64;
+
+/*
+ * NFS Version 3 special file number.
+ */
+struct nfsv3_spec {
+ uint32_t specdata1;
+ uint32_t specdata2;
+};
+typedef struct nfsv3_spec nfsv3spec;
+
+/*
+ * File attributes and setable attributes. These structures cover both
+ * NFS version 2 and the version 3 protocol. Note that the union is only
+ * used so that one pointer can refer to both variants. These structures
+ * go out on the wire and must be densely packed, so no quad data types
+ * are used. (all fields are longs or u_longs or structures of same)
+ * NB: You can't do sizeof(struct nfs_fattr), you must use the
+ * NFSX_FATTR(v3) macro.
+ */
+struct nfs_fattr {
+ uint32_t fa_type;
+ uint32_t fa_mode;
+ uint32_t fa_nlink;
+ uint32_t fa_uid;
+ uint32_t fa_gid;
+ union {
+ struct {
+ uint32_t nfsv2fa_size;
+ uint32_t nfsv2fa_blocksize;
+ uint32_t nfsv2fa_rdev;
+ uint32_t nfsv2fa_blocks;
+ uint32_t nfsv2fa_fsid;
+ uint32_t nfsv2fa_fileid;
+ nfstime2 nfsv2fa_atime;
+ nfstime2 nfsv2fa_mtime;
+ nfstime2 nfsv2fa_ctime;
+ } fa_nfsv2;
+ struct {
+ nfsuint64 nfsv3fa_size;
+ nfsuint64 nfsv3fa_used;
+ nfsv3spec nfsv3fa_rdev;
+ nfsuint64 nfsv3fa_fsid;
+ nfsuint64 nfsv3fa_fileid;
+ nfstime3 nfsv3fa_atime;
+ nfstime3 nfsv3fa_mtime;
+ nfstime3 nfsv3fa_ctime;
+ } fa_nfsv3;
+ } fa_un;
+};
+
+/* and some ugly defines for accessing union components */
+#define fa2_size fa_un.fa_nfsv2.nfsv2fa_size
+#define fa2_blocksize fa_un.fa_nfsv2.nfsv2fa_blocksize
+#define fa2_rdev fa_un.fa_nfsv2.nfsv2fa_rdev
+#define fa2_blocks fa_un.fa_nfsv2.nfsv2fa_blocks
+#define fa2_fsid fa_un.fa_nfsv2.nfsv2fa_fsid
+#define fa2_fileid fa_un.fa_nfsv2.nfsv2fa_fileid
+#define fa2_atime fa_un.fa_nfsv2.nfsv2fa_atime
+#define fa2_mtime fa_un.fa_nfsv2.nfsv2fa_mtime
+#define fa2_ctime fa_un.fa_nfsv2.nfsv2fa_ctime
+#define fa3_size fa_un.fa_nfsv3.nfsv3fa_size
+#define fa3_used fa_un.fa_nfsv3.nfsv3fa_used
+#define fa3_rdev fa_un.fa_nfsv3.nfsv3fa_rdev
+#define fa3_fsid fa_un.fa_nfsv3.nfsv3fa_fsid
+#define fa3_fileid fa_un.fa_nfsv3.nfsv3fa_fileid
+#define fa3_atime fa_un.fa_nfsv3.nfsv3fa_atime
+#define fa3_mtime fa_un.fa_nfsv3.nfsv3fa_mtime
+#define fa3_ctime fa_un.fa_nfsv3.nfsv3fa_ctime
+
+struct nfsv2_sattr {
+ uint32_t sa_mode;
+ uint32_t sa_uid;
+ uint32_t sa_gid;
+ uint32_t sa_size;
+ nfstime2 sa_atime;
+ nfstime2 sa_mtime;
+};
+
+/*
+ * NFS Version 3 sattr structure for the new node creation case.
+ */
+struct nfsv3_sattr {
+ uint32_t sa_modeset;
+ uint32_t sa_mode;
+ uint32_t sa_uidset;
+ uint32_t sa_uid;
+ uint32_t sa_gidset;
+ uint32_t sa_gid;
+ uint32_t sa_sizeset;
+ uint32_t sa_size;
+ uint32_t sa_atimetype;
+ nfstime3 sa_atime;
+ uint32_t sa_mtimetype;
+ nfstime3 sa_mtime;
+};
+
+struct nfs_statfs {
+ union {
+ struct {
+ uint32_t nfsv2sf_tsize;
+ uint32_t nfsv2sf_bsize;
+ uint32_t nfsv2sf_blocks;
+ uint32_t nfsv2sf_bfree;
+ uint32_t nfsv2sf_bavail;
+ } sf_nfsv2;
+ struct {
+ nfsuint64 nfsv3sf_tbytes;
+ nfsuint64 nfsv3sf_fbytes;
+ nfsuint64 nfsv3sf_abytes;
+ nfsuint64 nfsv3sf_tfiles;
+ nfsuint64 nfsv3sf_ffiles;
+ nfsuint64 nfsv3sf_afiles;
+ uint32_t nfsv3sf_invarsec;
+ } sf_nfsv3;
+ } sf_un;
+};
+
+#define sf_tsize sf_un.sf_nfsv2.nfsv2sf_tsize
+#define sf_bsize sf_un.sf_nfsv2.nfsv2sf_bsize
+#define sf_blocks sf_un.sf_nfsv2.nfsv2sf_blocks
+#define sf_bfree sf_un.sf_nfsv2.nfsv2sf_bfree
+#define sf_bavail sf_un.sf_nfsv2.nfsv2sf_bavail
+#define sf_tbytes sf_un.sf_nfsv3.nfsv3sf_tbytes
+#define sf_fbytes sf_un.sf_nfsv3.nfsv3sf_fbytes
+#define sf_abytes sf_un.sf_nfsv3.nfsv3sf_abytes
+#define sf_tfiles sf_un.sf_nfsv3.nfsv3sf_tfiles
+#define sf_ffiles sf_un.sf_nfsv3.nfsv3sf_ffiles
+#define sf_afiles sf_un.sf_nfsv3.nfsv3sf_afiles
+#define sf_invarsec sf_un.sf_nfsv3.nfsv3sf_invarsec
+
+struct nfsv3_fsinfo {
+ uint32_t fs_rtmax;
+ uint32_t fs_rtpref;
+ uint32_t fs_rtmult;
+ uint32_t fs_wtmax;
+ uint32_t fs_wtpref;
+ uint32_t fs_wtmult;
+ uint32_t fs_dtpref;
+ nfsuint64 fs_maxfilesize;
+ nfstime3 fs_timedelta;
+ uint32_t fs_properties;
+};
+
+struct nfsv3_pathconf {
+ uint32_t pc_linkmax;
+ uint32_t pc_namemax;
+ uint32_t pc_notrunc;
+ uint32_t pc_chownrestricted;
+ uint32_t pc_caseinsensitive;
+ uint32_t pc_casepreserving;
+};
--- /dev/null
+/*
+ * Copyright (c) 1993, 1994 Jeffrey C. Mogul, Digital Equipment Corporation,
+ * Western Research Laboratory. All rights reserved.
+ * Copyright (c) 2001 Compaq Computer Corporation. All rights reserved.
+ *
+ * Permission to use, copy, and modify this software and its
+ * documentation is hereby granted only under the following terms and
+ * conditions. Both the above copyright notice and this permission
+ * notice must appear in all copies of the software, derivative works
+ * or modified versions, and any portions thereof, and both notices
+ * must appear in supporting documentation.
+ *
+ * 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.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND COMPAQ COMPUTER CORPORATION
+ * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
+ * EVENT SHALL COMPAQ COMPUTER CORPORATION BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+/*
+ * nfsfh.h - NFS file handle definitions (for portable use)
+ *
+ * Jeffrey C. Mogul
+ * Digital Equipment Corporation
+ * Western Research Laboratory
+ */
+
+/*
+ * Internal representation of dev_t, because different NFS servers
+ * that we might be spying upon use different external representations.
+ */
+typedef struct {
+ uint32_t Minor; /* upper case to avoid clashing with macro names */
+ uint32_t Major;
+} my_devt;
+
+#define dev_eq(a,b) ((a.Minor == b.Minor) && (a.Major == b.Major))
+
+/*
+ * Many file servers now use a large file system ID. This is
+ * our internal representation of that.
+ */
+typedef struct {
+ my_devt Fsid_dev; /* XXX avoid name conflict with AIX */
+ char Opaque_Handle[2 * 32 + 1];
+ uint32_t fsid_code;
+} my_fsid;
+
+#define fsid_eq(a,b) ((a.fsid_code == b.fsid_code) &&\
+ dev_eq(a.Fsid_dev, b.Fsid_dev))
+
+extern void Parse_fh(const unsigned char *, int, my_fsid *, uint32_t *, const char **, const char **, int);
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: nlpid.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+#include "interface.h"
+#include "nlpid.h"
+
+const struct tok nlpid_values[] = {
+ { NLPID_NULLNS, "NULL" },
+ { NLPID_Q933, "Q.933" },
+ { NLPID_LMI, "LMI" },
+ { NLPID_SNAP, "SNAP" },
+ { NLPID_CLNP, "CLNP" },
+ { NLPID_ESIS, "ES-IS" },
+ { NLPID_ISIS, "IS-IS" },
+ { NLPID_CONS, "CONS" },
+ { NLPID_IDRP, "IDRP" },
+ { NLPID_SPB, "ISIS_SPB" },
+ { NLPID_MFR, "FRF.15" },
+ { NLPID_IP, "IPv4" },
+ { NLPID_PPP, "PPP" },
+ { NLPID_X25_ESIS, "X25 ES-IS" },
+ { NLPID_IP6, "IPv6" },
+ { 0, NULL }
+};
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+extern const struct tok nlpid_values[];
+
+#define NLPID_NULLNS 0x00
+#define NLPID_Q933 0x08 /* ANSI T1.617 Annex D or ITU-T Q.933 Annex A */
+#define NLPID_LMI 0x09 /* The original, aka Cisco, aka Gang of Four */
+#define NLPID_SNAP 0x80
+#define NLPID_CLNP 0x81 /* iso9577 */
+#define NLPID_ESIS 0x82 /* iso9577 */
+#define NLPID_ISIS 0x83 /* iso9577 */
+#define NLPID_CONS 0x84
+#define NLPID_IDRP 0x85
+#define NLPID_MFR 0xb1 /* FRF.15 */
+#define NLPID_SPB 0xc1 /* IEEE 802.1aq/D4.5 */
+#define NLPID_IP 0xcc
+#define NLPID_PPP 0xcf
+#define NLPID_X25_ESIS 0x8a
+#define NLPID_IP6 0x8e
--- /dev/null
+/*
+ * Copyright (c) 2013 The TCPDUMP 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
+ * COPYRIGHT HOLDER 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.
+ */
+
+/* OpenFlow: protocol between controller and datapath. */
+
+/* for netdissect_options */
+#include "netdissect.h"
+
+#define OF_HEADER_LEN 8
+
+#define ONF_EXP_ONF 0x4f4e4600
+#define ONF_EXP_BUTE 0xff000001
+#define ONF_EXP_NOVIFLOW 0xff000002
+#define ONF_EXP_L3 0xff000003
+#define ONF_EXP_L4L7 0xff000004
+#define ONF_EXP_WMOB 0xff000005
+#define ONF_EXP_FABS 0xff000006
+#define ONF_EXP_OTRANS 0xff000007
+extern const struct tok onf_exp_str[];
+
+/*
+ * Routines to print packets for various versions of OpenFlow.
+ */
+extern const u_char *of10_header_body_print(netdissect_options *ndo,
+ const u_char *, const u_char *,
+ const uint8_t, const uint16_t, const uint32_t);
+extern const char * of_vendor_name(const uint32_t);
--- /dev/null
+/*
+ * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * OSPF support contributed by Jeffrey Honig (jch@mitchell.cit.cornell.edu)
+ */
+#define OSPF_TYPE_UMD 0 /* UMd's special monitoring packets */
+#define OSPF_TYPE_HELLO 1 /* Hello */
+#define OSPF_TYPE_DD 2 /* Database Description */
+#define OSPF_TYPE_LS_REQ 3 /* Link State Request */
+#define OSPF_TYPE_LS_UPDATE 4 /* Link State Update */
+#define OSPF_TYPE_LS_ACK 5 /* Link State Ack */
+
+/* Options field
+ *
+ * +------------------------------------+
+ * | DN | O | DC | L | N/P | MC | E | T |
+ * +------------------------------------+
+ *
+ */
+
+#define OSPF_OPTION_T 0x01 /* T bit: TOS support */
+#define OSPF_OPTION_E 0x02 /* E bit: External routes advertised */
+#define OSPF_OPTION_MC 0x04 /* MC bit: Multicast capable */
+#define OSPF_OPTION_NP 0x08 /* N/P bit: NSSA capable */
+#define OSPF_OPTION_EA 0x10 /* EA bit: External Attribute capable */
+#define OSPF_OPTION_L 0x10 /* L bit: Packet contains LLS data block */
+#define OSPF_OPTION_DC 0x20 /* DC bit: Demand circuit capable */
+#define OSPF_OPTION_O 0x40 /* O bit: Opaque LSA capable */
+#define OSPF_OPTION_DN 0x80 /* DN bit: Up/Down Bit capable - draft-ietf-ospf-2547-dnbit-04 */
+
+/* ospf_authtype */
+#define OSPF_AUTH_NONE 0 /* No auth-data */
+#define OSPF_AUTH_SIMPLE 1 /* Simple password */
+#define OSPF_AUTH_SIMPLE_LEN 8 /* max length of simple authentication */
+#define OSPF_AUTH_MD5 2 /* MD5 authentication */
+#define OSPF_AUTH_MD5_LEN 16 /* length of MD5 authentication */
+
+/* db_flags */
+#define OSPF_DB_INIT 0x04
+#define OSPF_DB_MORE 0x02
+#define OSPF_DB_MASTER 0x01
+#define OSPF_DB_RESYNC 0x08 /* RFC4811 */
+
+/* ls_type */
+#define LS_TYPE_ROUTER 1 /* router link */
+#define LS_TYPE_NETWORK 2 /* network link */
+#define LS_TYPE_SUM_IP 3 /* summary link */
+#define LS_TYPE_SUM_ABR 4 /* summary area link */
+#define LS_TYPE_ASE 5 /* ASE */
+#define LS_TYPE_GROUP 6 /* Group membership (multicast */
+ /* extensions 23 July 1991) */
+#define LS_TYPE_NSSA 7 /* rfc3101 - Not so Stubby Areas */
+#define LS_TYPE_OPAQUE_LL 9 /* rfc2370 - Opaque Link Local */
+#define LS_TYPE_OPAQUE_AL 10 /* rfc2370 - Opaque Link Local */
+#define LS_TYPE_OPAQUE_DW 11 /* rfc2370 - Opaque Domain Wide */
+
+#define LS_OPAQUE_TYPE_TE 1 /* rfc3630 */
+#define LS_OPAQUE_TYPE_GRACE 3 /* rfc3623 */
+#define LS_OPAQUE_TYPE_RI 4 /* draft-ietf-ospf-cap-03 */
+
+#define LS_OPAQUE_TE_TLV_ROUTER 1 /* rfc3630 */
+#define LS_OPAQUE_TE_TLV_LINK 2 /* rfc3630 */
+
+#define LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE 1 /* rfc3630 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_LINK_ID 2 /* rfc3630 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_LOCAL_IP 3 /* rfc3630 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_REMOTE_IP 4 /* rfc3630 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_TE_METRIC 5 /* rfc3630 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_MAX_BW 6 /* rfc3630 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_MAX_RES_BW 7 /* rfc3630 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_UNRES_BW 8 /* rfc3630 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_ADMIN_GROUP 9 /* rfc3630 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_LINK_LOCAL_REMOTE_ID 11 /* rfc4203 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_LINK_PROTECTION_TYPE 14 /* rfc4203 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_INTF_SW_CAP_DESCR 15 /* rfc4203 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_SHARED_RISK_GROUP 16 /* rfc4203 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_BW_CONSTRAINTS 17 /* rfc4124 */
+
+#define LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE_PTP 1 /* rfc3630 */
+#define LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE_MA 2 /* rfc3630 */
+
+#define LS_OPAQUE_GRACE_TLV_PERIOD 1 /* rfc3623 */
+#define LS_OPAQUE_GRACE_TLV_REASON 2 /* rfc3623 */
+#define LS_OPAQUE_GRACE_TLV_INT_ADDRESS 3 /* rfc3623 */
+
+#define LS_OPAQUE_GRACE_TLV_REASON_UNKNOWN 0 /* rfc3623 */
+#define LS_OPAQUE_GRACE_TLV_REASON_SW_RESTART 1 /* rfc3623 */
+#define LS_OPAQUE_GRACE_TLV_REASON_SW_UPGRADE 2 /* rfc3623 */
+#define LS_OPAQUE_GRACE_TLV_REASON_CP_SWITCH 3 /* rfc3623 */
+
+#define LS_OPAQUE_RI_TLV_CAP 1 /* draft-ietf-ospf-cap-03 */
+
+
+/* rla_link.link_type */
+#define RLA_TYPE_ROUTER 1 /* point-to-point to another router */
+#define RLA_TYPE_TRANSIT 2 /* connection to transit network */
+#define RLA_TYPE_STUB 3 /* connection to stub network */
+#define RLA_TYPE_VIRTUAL 4 /* virtual link */
+
+/* rla_flags */
+#define RLA_FLAG_B 0x01
+#define RLA_FLAG_E 0x02
+#define RLA_FLAG_W1 0x04
+#define RLA_FLAG_W2 0x08
+
+/* sla_tosmetric breakdown */
+#define SLA_MASK_TOS 0x7f000000
+#define SLA_MASK_METRIC 0x00ffffff
+#define SLA_SHIFT_TOS 24
+
+/* asla_tosmetric breakdown */
+#define ASLA_FLAG_EXTERNAL 0x80000000
+#define ASLA_MASK_TOS 0x7f000000
+#define ASLA_SHIFT_TOS 24
+#define ASLA_MASK_METRIC 0x00ffffff
+
+/* multicast vertex type */
+#define MCLA_VERTEX_ROUTER 1
+#define MCLA_VERTEX_NETWORK 2
+
+/* Link-Local-Signaling */
+#define OSPF_LLS_HDRLEN 4U /* RFC5613 Section 2.2 */
+
+#define OSPF_LLS_EO 1 /* RFC4811, RFC4812 */
+#define OSPF_LLS_MD5 2 /* RFC4813 */
+
+#define OSPF_LLS_EO_LR 0x00000001 /* RFC4811 */
+#define OSPF_LLS_EO_RS 0x00000002 /* RFC4812 */
+
+/*
+ * TOS metric struct (will be 0 or more in router links update)
+ */
+struct tos_metric {
+ uint8_t tos_type;
+ uint8_t reserved;
+ uint8_t tos_metric[2];
+};
+struct tos_link {
+ uint8_t link_type;
+ uint8_t link_tos_count;
+ uint8_t tos_metric[2];
+};
+union un_tos {
+ struct tos_link link;
+ struct tos_metric metrics;
+};
+
+/* link state advertisement header */
+struct lsa_hdr {
+ uint16_t ls_age;
+ uint8_t ls_options;
+ uint8_t ls_type;
+ union {
+ struct in_addr lsa_id;
+ struct { /* opaque LSAs change the LSA-ID field */
+ uint8_t opaque_type;
+ uint8_t opaque_id[3];
+ } opaque_field;
+ } un_lsa_id;
+ struct in_addr ls_router;
+ uint32_t ls_seq;
+ uint16_t ls_chksum;
+ uint16_t ls_length;
+};
+
+/* link state advertisement */
+struct lsa {
+ struct lsa_hdr ls_hdr;
+
+ /* Link state types */
+ union {
+ /* Router links advertisements */
+ struct {
+ uint8_t rla_flags;
+ uint8_t rla_zero[1];
+ uint16_t rla_count;
+ struct rlalink {
+ struct in_addr link_id;
+ struct in_addr link_data;
+ union un_tos un_tos;
+ } rla_link[1]; /* may repeat */
+ } un_rla;
+
+ /* Network links advertisements */
+ struct {
+ struct in_addr nla_mask;
+ struct in_addr nla_router[1]; /* may repeat */
+ } un_nla;
+
+ /* Summary links advertisements */
+ struct {
+ struct in_addr sla_mask;
+ uint32_t sla_tosmetric[1]; /* may repeat */
+ } un_sla;
+
+ /* AS external links advertisements */
+ struct {
+ struct in_addr asla_mask;
+ struct aslametric {
+ uint32_t asla_tosmetric;
+ struct in_addr asla_forward;
+ struct in_addr asla_tag;
+ } asla_metric[1]; /* may repeat */
+ } un_asla;
+
+ /* Multicast group membership */
+ struct mcla {
+ uint32_t mcla_vtype;
+ struct in_addr mcla_vid;
+ } un_mcla[1];
+
+ /* Opaque TE LSA */
+ struct {
+ uint16_t type;
+ uint16_t length;
+ uint8_t data[1]; /* may repeat */
+ } un_te_lsa_tlv;
+
+ /* Opaque Grace LSA */
+ struct {
+ uint16_t type;
+ uint16_t length;
+ uint8_t data[1]; /* may repeat */
+ } un_grace_tlv;
+
+ /* Opaque Router information LSA */
+ struct {
+ uint16_t type;
+ uint16_t length;
+ uint8_t data[1]; /* may repeat */
+ } un_ri_tlv;
+
+ /* Unknown LSA */
+ struct unknown {
+ uint8_t data[1]; /* may repeat */
+ } un_unknown[1];
+
+ } lsa_un;
+};
+
+#define OSPF_AUTH_SIZE 8
+
+/*
+ * the main header
+ */
+struct ospfhdr {
+ uint8_t ospf_version;
+ uint8_t ospf_type;
+ uint16_t ospf_len;
+ struct in_addr ospf_routerid;
+ struct in_addr ospf_areaid;
+ uint16_t ospf_chksum;
+ uint16_t ospf_authtype;
+ uint8_t ospf_authdata[OSPF_AUTH_SIZE];
+ union {
+
+ /* Hello packet */
+ struct {
+ struct in_addr hello_mask;
+ uint16_t hello_helloint;
+ uint8_t hello_options;
+ uint8_t hello_priority;
+ uint32_t hello_deadint;
+ struct in_addr hello_dr;
+ struct in_addr hello_bdr;
+ struct in_addr hello_neighbor[1]; /* may repeat */
+ } un_hello;
+
+ /* Database Description packet */
+ struct {
+ uint16_t db_ifmtu;
+ uint8_t db_options;
+ uint8_t db_flags;
+ uint32_t db_seq;
+ struct lsa_hdr db_lshdr[1]; /* may repeat */
+ } un_db;
+
+ /* Link State Request */
+ struct lsr {
+ uint8_t ls_type[4];
+ union {
+ struct in_addr ls_stateid;
+ struct { /* opaque LSAs change the LSA-ID field */
+ uint8_t opaque_type;
+ uint8_t opaque_id[3];
+ } opaque_field;
+ } un_ls_stateid;
+ struct in_addr ls_router;
+ } un_lsr[1]; /* may repeat */
+
+ /* Link State Update */
+ struct {
+ uint32_t lsu_count;
+ struct lsa lsu_lsa[1]; /* may repeat */
+ } un_lsu;
+
+ /* Link State Acknowledgement */
+ struct {
+ struct lsa_hdr lsa_lshdr[1]; /* may repeat */
+ } un_lsa ;
+ } ospf_un ;
+};
+
+#define ospf_hello ospf_un.un_hello
+#define ospf_db ospf_un.un_db
+#define ospf_lsr ospf_un.un_lsr
+#define ospf_lsu ospf_un.un_lsu
+#define ospf_lsa ospf_un.un_lsa
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: oui.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+#include "interface.h"
+#include "oui.h"
+
+/* FIXME complete OUI list using a script */
+
+const struct tok oui_values[] = {
+ { OUI_ENCAP_ETHER, "Ethernet" },
+ { OUI_CISCO, "Cisco" },
+ { OUI_NORTEL, "Nortel Networks SONMP" },
+ { OUI_CISCO_90, "Cisco bridged" },
+ { OUI_RFC2684, "Ethernet bridged" },
+ { OUI_ATM_FORUM, "ATM Forum" },
+ { OUI_CABLE_BPDU, "DOCSIS Spanning Tree" },
+ { OUI_APPLETALK, "Appletalk" },
+ { OUI_JUNIPER, "Juniper" },
+ { OUI_HP, "Hewlett-Packard" },
+ { OUI_IEEE_8021_PRIVATE, "IEEE 802.1 Private"},
+ { OUI_IEEE_8023_PRIVATE, "IEEE 802.3 Private"},
+ { OUI_TIA, "ANSI/TIA"},
+ { OUI_DCBX, "DCBX"},
+ { OUI_NICIRA, "Nicira Networks" },
+ { OUI_BSN, "Big Switch Networks" },
+ { OUI_VELLO, "Vello Systems" },
+ { OUI_HP2, "HP" },
+ { OUI_HPLABS, "HP-Labs" },
+ { OUI_INFOBLOX, "Infoblox Inc" },
+ { OUI_ONLAB, "Open Networking Lab" },
+ { OUI_FREESCALE, "Freescale" },
+ { OUI_NETRONOME, "Netronome" },
+ { 0, NULL }
+};
+
+/*
+ * SMI Network Management Private Enterprise Codes for organizations.
+ *
+ * XXX - these also appear in FreeRadius dictionary files, with items such
+ * as
+ *
+ * VENDOR Cisco 9
+ *
+ * List taken from Ethereal's epan/sminmpec.c.
+ */
+const struct tok smi_values[] = {
+ { SMI_IETF, "IETF (reserved)"},
+ { SMI_ACC, "ACC"},
+ { SMI_CISCO, "Cisco"},
+ { SMI_HEWLETT_PACKARD, "Hewlett Packard"},
+ { SMI_SUN_MICROSYSTEMS, "Sun Microsystems"},
+ { SMI_MERIT, "Merit"},
+ { SMI_SHIVA, "Shiva"},
+ { SMI_ERICSSON, "Ericsson AB"},
+ { SMI_CISCO_VPN5000, "Cisco VPN 5000"},
+ { SMI_LIVINGSTON, "Livingston"},
+ { SMI_MICROSOFT, "Microsoft"},
+ { SMI_3COM, "3Com"},
+ { SMI_ASCEND, "Ascend"},
+ { SMI_BAY, "Bay Networks"},
+ { SMI_FOUNDRY, "Foundry"},
+ { SMI_VERSANET, "Versanet"},
+ { SMI_REDBACK, "Redback"},
+ { SMI_JUNIPER, "Juniper Networks"},
+ { SMI_APTIS, "Aptis"},
+ { SMI_CISCO_VPN3000, "Cisco VPN 3000"},
+ { SMI_COSINE, "CoSine Communications"},
+ { SMI_NETSCREEN, "Netscreen"},
+ { SMI_SHASTA, "Shasta"},
+ { SMI_NOMADIX, "Nomadix"},
+ { SMI_SIEMENS, "Siemens"},
+ { SMI_CABLELABS, "CableLabs"},
+ { SMI_UNISPHERE, "Unisphere Networks"},
+ { SMI_CISCO_BBSM, "Cisco BBSM"},
+ { SMI_THE3GPP2, "3rd Generation Partnership Project 2 (3GPP2)"},
+ { SMI_IP_UNPLUGGED, "ipUnplugged"},
+ { SMI_ISSANNI, "Issanni Communications"},
+ { SMI_QUINTUM, "Quintum"},
+ { SMI_INTERLINK, "Interlink"},
+ { SMI_COLUBRIS, "Colubris"},
+ { SMI_COLUMBIA_UNIVERSITY, "Columbia University"},
+ { SMI_THE3GPP, "3GPP"},
+ { SMI_GEMTEK_SYSTEMS, "Gemtek-Systems"},
+ { SMI_WIFI_ALLIANCE, "Wi-Fi Alliance"},
+ { 0, NULL}
+};
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+extern const struct tok oui_values[];
+extern const struct tok smi_values[];
+
+#define OUI_ENCAP_ETHER 0x000000 /* encapsulated Ethernet */
+#define OUI_CISCO 0x00000c /* Cisco protocols */
+#define OUI_NORTEL 0x000081 /* Nortel SONMP */
+#define OUI_CISCO_90 0x0000f8 /* Cisco bridging */
+#define OUI_RFC2684 0x0080c2 /* RFC 2427/2684 bridged Ethernet */
+#define OUI_ATM_FORUM 0x00A03E /* ATM Forum */
+#define OUI_CABLE_BPDU 0x00E02F /* DOCSIS spanning tree BPDU */
+#define OUI_APPLETALK 0x080007 /* Appletalk */
+#define OUI_JUNIPER 0x009069 /* Juniper */
+#define OUI_HP 0x080009 /* Hewlett-Packard */
+#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 */
+#define OUI_NICIRA 0x002320 /* Nicira Networks */
+#define OUI_BSN 0x5c16c7 /* Big Switch Networks */
+#define OUI_VELLO 0xb0d2f5 /* Vello Systems */
+#define OUI_HP2 0x002481 /* HP too */
+#define OUI_HPLABS 0x0004ea /* HP-Labs */
+#define OUI_INFOBLOX 0x748771 /* Infoblox Inc */
+#define OUI_ONLAB 0xa42305 /* Open Networking Lab */
+#define OUI_FREESCALE 0x00049f /* Freescale */
+#define OUI_NETRONOME 0x0015ad /* Netronome */
+
+/*
+ * These are SMI Network Management Private Enterprise Codes for
+ * organizations; see
+ *
+ * http://www.iana.org/assignments/enterprise-numbers
+ *
+ * for a list.
+ *
+ * List taken from Ethereal's epan/sminmpec.h.
+ */
+#define SMI_IETF 0 /* reserved - used by the IETF in L2TP? */
+#define SMI_ACC 5
+#define SMI_CISCO 9
+#define SMI_HEWLETT_PACKARD 11
+#define SMI_SUN_MICROSYSTEMS 42
+#define SMI_MERIT 61
+#define SMI_SHIVA 166
+#define SMI_ERICSSON 193
+#define SMI_CISCO_VPN5000 255
+#define SMI_LIVINGSTON 307
+#define SMI_MICROSOFT 311
+#define SMI_3COM 429
+#define SMI_ASCEND 529
+#define SMI_BAY 1584
+#define SMI_FOUNDRY 1991
+#define SMI_VERSANET 2180
+#define SMI_REDBACK 2352
+#define SMI_JUNIPER 2636
+#define SMI_APTIS 2637
+#define SMI_CISCO_VPN3000 3076
+#define SMI_COSINE 3085
+#define SMI_SHASTA 3199
+#define SMI_NETSCREEN 3224
+#define SMI_NOMADIX 3309
+#define SMI_SIEMENS 4329
+#define SMI_CABLELABS 4491
+#define SMI_UNISPHERE 4874
+#define SMI_CISCO_BBSM 5263
+#define SMI_THE3GPP2 5535
+#define SMI_IP_UNPLUGGED 5925
+#define SMI_ISSANNI 5948
+#define SMI_QUINTUM 6618
+#define SMI_INTERLINK 6728
+#define SMI_COLUBRIS 8744
+#define SMI_COLUMBIA_UNIVERSITY 11862
+#define SMI_THE3GPP 10415
+#define SMI_GEMTEK_SYSTEMS 10529
+#define SMI_WIFI_ALLIANCE 14122
--- /dev/null
+BEGIN {
+ # we need to know (usual) packet size to convert byte numbers
+ # to packet numbers
+ if (packetsize <= 0)
+ packetsize = 512
+ }
+$5 !~ /[SR]/ {
+ # print out per-packet data in the form:
+ # <packet #>
+ # <start sequence #>
+ # <1st send time>
+ # <last send time>
+ # <1st ack time>
+ # <last ack time>
+ # <# sends>
+ # <# acks>
+
+ n = split ($1,t,":")
+ tim = t[1]*3600 + t[2]*60 + t[3]
+ if ($6 != "ack") {
+ i = index($6,":")
+ strtSeq = substr($6,1,i-1)
+ id = 1.5 + (strtSeq - 1) / packetsize
+ id -= id % 1
+ if (maxId < id)
+ maxId = id
+ if (firstSend[id] == 0) {
+ firstSend[id] = tim
+ seqNo[id] = strtSeq
+ }
+ lastSend[id] = tim
+ timesSent[id]++
+ totalPackets++
+ } else {
+ id = 1 + ($7 - 2) / packetsize
+ id -= id % 1
+ timesAcked[id]++
+ if (firstAck[id] == 0)
+ firstAck[id] = tim
+ lastAck[id] = tim
+ totalAcks++
+ }
+ }
+END {
+ print "# " maxId " chunks. " totalPackets " packets sent. " \
+ totalAcks " acks."
+ # for packets that were implicitly acked, make the ack time
+ # be the ack time of next explicitly acked packet.
+ for (i = maxId-1; i > 0; --i)
+ while (i > 0 && firstAck[i] == 0) {
+ lastAck[i] = firstAck[i] = firstAck[i+1]
+ --i
+ }
+ tzero = firstSend[1]
+ for (i = 1; i <= maxId; i++)
+ printf "%d\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%d\t%d\n",\
+ i, seqNo[i], \
+ firstSend[i] - tzero, lastSend[i] - tzero,\
+ firstAck[i] - tzero, lastAck[i] - tzero,\
+ timesSent[i], timesAcked[i]
+ }
--- /dev/null
+/*
+ * Copyright (c) 1993, 1994 Jeffrey C. Mogul, Digital Equipment Corporation,
+ * Western Research Laboratory. All rights reserved.
+ * Copyright (c) 2001 Compaq Computer Corporation. All rights reserved.
+ *
+ * Permission to use, copy, and modify this software and its
+ * documentation is hereby granted only under the following terms and
+ * conditions. Both the above copyright notice and this permission
+ * notice must appear in all copies of the software, derivative works
+ * or modified versions, and any portions thereof, and both notices
+ * must appear in supporting documentation.
+ *
+ * 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.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND COMPAQ COMPUTER CORPORATION
+ * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
+ * EVENT SHALL COMPAQ COMPUTER CORPORATION BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+/*
+ * parsenfsfh.c - portable parser for NFS file handles
+ * uses all sorts of heuristics
+ *
+ * Jeffrey C. Mogul
+ * Digital Equipment Corporation
+ * Western Research Laboratory
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: parsenfsfh.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "nfsfh.h"
+
+/*
+ * This routine attempts to parse a file handle (in network byte order),
+ * using heuristics to guess what kind of format it is in. See the
+ * file "fhandle_layouts" for a detailed description of the various
+ * patterns we know about.
+ *
+ * The file handle is parsed into our internal representation of a
+ * file-system id, and an internal representation of an inode-number.
+ */
+
+#define FHT_UNKNOWN 0
+#define FHT_AUSPEX 1
+#define FHT_DECOSF 2
+#define FHT_IRIX4 3
+#define FHT_IRIX5 4
+#define FHT_SUNOS3 5
+#define FHT_SUNOS4 6
+#define FHT_ULTRIX 7
+#define FHT_VMSUCX 8
+#define FHT_SUNOS5 9
+#define FHT_AIX32 10
+#define FHT_HPUX9 11
+#define FHT_BSD44 12
+
+#ifdef ultrix
+/* Nasty hack to keep the Ultrix C compiler from emitting bogus warnings */
+#define XFF(x) ((uint32_t)(x))
+#else
+#define XFF(x) (x)
+#endif
+
+#define make_uint32(msb,b,c,lsb)\
+ (XFF(lsb) + (XFF(c)<<8) + (XFF(b)<<16) + (XFF(msb)<<24))
+
+#define make_uint24(msb,b, lsb)\
+ (XFF(lsb) + (XFF(b)<<8) + (XFF(msb)<<16))
+
+#define make_uint16(msb,lsb)\
+ (XFF(lsb) + (XFF(msb)<<8))
+
+#ifdef __alpha
+ /* or other 64-bit systems */
+#define make_uint48(msb,b,c,d,e,lsb)\
+ ((lsb) + ((e)<<8) + ((d)<<16) + ((c)<<24) + ((b)<<32) + ((msb)<<40))
+#else
+ /* on 32-bit systems ignore high-order bits */
+#define make_uint48(msb,b,c,d,e,lsb)\
+ ((lsb) + ((e)<<8) + ((d)<<16) + ((c)<<24))
+#endif
+
+static int is_UCX(const unsigned char *);
+
+void
+Parse_fh(register const unsigned char *fh, int len _U_, my_fsid *fsidp,
+ uint32_t *inop,
+ const char **osnamep, /* if non-NULL, return OS name here */
+ const char **fsnamep, /* if non-NULL, return server fs name here (for VMS) */
+ int ourself) /* true if file handle was generated on this host */
+{
+ register const unsigned char *fhp = fh;
+ uint32_t temp;
+ int fhtype = FHT_UNKNOWN;
+ int i;
+
+ if (ourself) {
+ /* File handle generated on this host, no need for guessing */
+#if defined(IRIX40)
+ fhtype = FHT_IRIX4;
+#endif
+#if defined(IRIX50)
+ fhtype = FHT_IRIX5;
+#endif
+#if defined(IRIX51)
+ fhtype = FHT_IRIX5;
+#endif
+#if defined(SUNOS4)
+ fhtype = FHT_SUNOS4;
+#endif
+#if defined(SUNOS5)
+ fhtype = FHT_SUNOS5;
+#endif
+#if defined(ultrix)
+ fhtype = FHT_ULTRIX;
+#endif
+#if defined(__osf__)
+ fhtype = FHT_DECOSF;
+#endif
+#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) \
+ || defined(__OpenBSD__)
+ fhtype = FHT_BSD44;
+#endif
+ }
+ /*
+ * This is basically a big decision tree
+ */
+ else if ((fhp[0] == 0) && (fhp[1] == 0)) {
+ /* bytes[0,1] == (0,0); rules out Ultrix, IRIX5, SUNOS5 */
+ /* probably rules out HP-UX, AIX unless they allow major=0 */
+ if ((fhp[2] == 0) && (fhp[3] == 0)) {
+ /* bytes[2,3] == (0,0); must be Auspex */
+ /* XXX or could be Ultrix+MASSBUS "hp" disk? */
+ fhtype = FHT_AUSPEX;
+ }
+ else {
+ /*
+ * bytes[2,3] != (0,0); rules out Auspex, could be
+ * DECOSF, SUNOS4, or IRIX4
+ */
+ if ((fhp[4] != 0) && (fhp[5] == 0) &&
+ (fhp[8] == 12) && (fhp[9] == 0)) {
+ /* seems to be DECOSF, with minor == 0 */
+ fhtype = FHT_DECOSF;
+ }
+ else {
+ /* could be SUNOS4 or IRIX4 */
+ /* XXX the test of fhp[5] == 8 could be wrong */
+ if ((fhp[4] == 0) && (fhp[5] == 8) && (fhp[6] == 0) &&
+ (fhp[7] == 0)) {
+ /* looks like a length, not a file system typecode */
+ fhtype = FHT_IRIX4;
+ }
+ else {
+ /* by elimination */
+ fhtype = FHT_SUNOS4;
+ }
+ }
+ }
+ }
+ else {
+ /*
+ * bytes[0,1] != (0,0); rules out Auspex, IRIX4, SUNOS4
+ * could be IRIX5, DECOSF, UCX, Ultrix, SUNOS5
+ * could be AIX, HP-UX
+ */
+ if ((fhp[2] == 0) && (fhp[3] == 0)) {
+ /*
+ * bytes[2,3] == (0,0); rules out OSF, probably not UCX
+ * (unless the exported device name is just one letter!),
+ * could be Ultrix, IRIX5, AIX, or SUNOS5
+ * might be HP-UX (depends on their values for minor devs)
+ */
+ if ((fhp[6] == 0) && (fhp[7] == 0)) {
+ fhtype = FHT_BSD44;
+ }
+ /*XXX we probably only need to test of these two bytes */
+ else if ((fhp[21] == 0) && (fhp[23] == 0)) {
+ fhtype = FHT_ULTRIX;
+ }
+ else {
+ /* Could be SUNOS5/IRIX5, maybe AIX */
+ /* XXX no obvious difference between SUNOS5 and IRIX5 */
+ if (fhp[9] == 10)
+ fhtype = FHT_SUNOS5;
+ /* XXX what about AIX? */
+ }
+ }
+ else {
+ /*
+ * bytes[2,3] != (0,0); rules out Ultrix, could be
+ * DECOSF, SUNOS5, IRIX5, AIX, HP-UX, or UCX
+ */
+ if ((fhp[8] == 12) && (fhp[9] == 0)) {
+ fhtype = FHT_DECOSF;
+ }
+ else if ((fhp[8] == 0) && (fhp[9] == 10)) {
+ /* could be SUNOS5/IRIX5, AIX, HP-UX */
+ if ((fhp[7] == 0) && (fhp[6] == 0) &&
+ (fhp[5] == 0) && (fhp[4] == 0)) {
+ /* XXX is this always true of HP-UX? */
+ fhtype = FHT_HPUX9;
+ }
+ else if (fhp[7] == 2) {
+ /* This would be MNT_NFS on AIX, which is impossible */
+ fhtype = FHT_SUNOS5; /* or maybe IRIX5 */
+ }
+ else {
+ /*
+ * XXX Could be SUNOS5/IRIX5 or AIX. I don't
+ * XXX see any way to disambiguate these, so
+ * XXX I'm going with the more likely guess.
+ * XXX Sorry, Big Blue.
+ */
+ fhtype = FHT_SUNOS5; /* or maybe IRIX5 */
+ }
+ }
+ else {
+ if (is_UCX(fhp)) {
+ fhtype = FHT_VMSUCX;
+ }
+ else {
+ fhtype = FHT_UNKNOWN;
+ }
+ }
+ }
+ }
+
+ /* XXX still needs to handle SUNOS3 */
+
+ switch (fhtype) {
+ case FHT_AUSPEX:
+ fsidp->Fsid_dev.Minor = fhp[7];
+ fsidp->Fsid_dev.Major = fhp[6];
+ fsidp->fsid_code = 0;
+
+ *inop = make_uint32(fhp[12], fhp[13], fhp[14], fhp[15]);
+
+ if (osnamep)
+ *osnamep = "Auspex";
+ break;
+
+ case FHT_BSD44:
+ fsidp->Fsid_dev.Minor = fhp[0];
+ fsidp->Fsid_dev.Major = fhp[1];
+ fsidp->fsid_code = 0;
+
+ *inop = make_uint32(fhp[15], fhp[14], fhp[13], fhp[12]);
+
+ if (osnamep)
+ *osnamep = "BSD 4.4";
+ break;
+
+ case FHT_DECOSF:
+ fsidp->fsid_code = make_uint32(fhp[7], fhp[6], fhp[5], fhp[4]);
+ /* XXX could ignore 3 high-order bytes */
+
+ temp = make_uint32(fhp[3], fhp[2], fhp[1], fhp[0]);
+ fsidp->Fsid_dev.Minor = temp & 0xFFFFF;
+ fsidp->Fsid_dev.Major = (temp>>20) & 0xFFF;
+
+ *inop = make_uint32(fhp[15], fhp[14], fhp[13], fhp[12]);
+ if (osnamep)
+ *osnamep = "OSF";
+ break;
+
+ case FHT_IRIX4:
+ fsidp->Fsid_dev.Minor = fhp[3];
+ fsidp->Fsid_dev.Major = fhp[2];
+ fsidp->fsid_code = 0;
+
+ *inop = make_uint32(fhp[8], fhp[9], fhp[10], fhp[11]);
+
+ if (osnamep)
+ *osnamep = "IRIX4";
+ break;
+
+ case FHT_IRIX5:
+ fsidp->Fsid_dev.Minor = make_uint16(fhp[2], fhp[3]);
+ fsidp->Fsid_dev.Major = make_uint16(fhp[0], fhp[1]);
+ fsidp->fsid_code = make_uint32(fhp[4], fhp[5], fhp[6], fhp[7]);
+
+ *inop = make_uint32(fhp[12], fhp[13], fhp[14], fhp[15]);
+
+ if (osnamep)
+ *osnamep = "IRIX5";
+ break;
+
+#ifdef notdef
+ case FHT_SUNOS3:
+ /*
+ * XXX - none of the heuristics above return this.
+ * Are there any SunOS 3.x systems around to care about?
+ */
+ if (osnamep)
+ *osnamep = "SUNOS3";
+ break;
+#endif
+
+ case FHT_SUNOS4:
+ fsidp->Fsid_dev.Minor = fhp[3];
+ fsidp->Fsid_dev.Major = fhp[2];
+ fsidp->fsid_code = make_uint32(fhp[4], fhp[5], fhp[6], fhp[7]);
+
+ *inop = make_uint32(fhp[12], fhp[13], fhp[14], fhp[15]);
+
+ if (osnamep)
+ *osnamep = "SUNOS4";
+ break;
+
+ case FHT_SUNOS5:
+ temp = make_uint16(fhp[0], fhp[1]);
+ fsidp->Fsid_dev.Major = (temp>>2) & 0x3FFF;
+ temp = make_uint24(fhp[1], fhp[2], fhp[3]);
+ fsidp->Fsid_dev.Minor = temp & 0x3FFFF;
+ fsidp->fsid_code = make_uint32(fhp[4], fhp[5], fhp[6], fhp[7]);
+
+ *inop = make_uint32(fhp[12], fhp[13], fhp[14], fhp[15]);
+
+ if (osnamep)
+ *osnamep = "SUNOS5";
+ break;
+
+ case FHT_ULTRIX:
+ fsidp->fsid_code = 0;
+ fsidp->Fsid_dev.Minor = fhp[0];
+ fsidp->Fsid_dev.Major = fhp[1];
+
+ temp = make_uint32(fhp[7], fhp[6], fhp[5], fhp[4]);
+ *inop = temp;
+ if (osnamep)
+ *osnamep = "Ultrix";
+ break;
+
+ case FHT_VMSUCX:
+ /* No numeric file system ID, so hash on the device-name */
+ if (sizeof(*fsidp) >= 14) {
+ if (sizeof(*fsidp) > 14)
+ memset((char *)fsidp, 0, sizeof(*fsidp));
+ /* just use the whole thing */
+ memcpy((char *)fsidp, (char *)fh, 14);
+ }
+ else {
+ uint32_t tempa[4]; /* at least 16 bytes, maybe more */
+
+ memset((char *)tempa, 0, sizeof(tempa));
+ memcpy((char *)tempa, (char *)fh, 14); /* ensure alignment */
+ fsidp->Fsid_dev.Minor = tempa[0] + (tempa[1]<<1);
+ fsidp->Fsid_dev.Major = tempa[2] + (tempa[3]<<1);
+ fsidp->fsid_code = 0;
+ }
+
+ /* VMS file ID is: (RVN, FidHi, FidLo) */
+ *inop = make_uint32(fhp[26], fhp[27], fhp[23], fhp[22]);
+
+ /* Caller must save (and null-terminate?) this value */
+ if (fsnamep)
+ *fsnamep = (char *)&(fhp[1]);
+
+ if (osnamep)
+ *osnamep = "VMS";
+ break;
+
+ case FHT_AIX32:
+ fsidp->Fsid_dev.Minor = make_uint16(fhp[2], fhp[3]);
+ fsidp->Fsid_dev.Major = make_uint16(fhp[0], fhp[1]);
+ fsidp->fsid_code = make_uint32(fhp[4], fhp[5], fhp[6], fhp[7]);
+
+ *inop = make_uint32(fhp[12], fhp[13], fhp[14], fhp[15]);
+
+ if (osnamep)
+ *osnamep = "AIX32";
+ break;
+
+ case FHT_HPUX9:
+ fsidp->Fsid_dev.Major = fhp[0];
+ temp = make_uint24(fhp[1], fhp[2], fhp[3]);
+ fsidp->Fsid_dev.Minor = temp;
+ fsidp->fsid_code = make_uint32(fhp[4], fhp[5], fhp[6], fhp[7]);
+
+ *inop = make_uint32(fhp[12], fhp[13], fhp[14], fhp[15]);
+
+ if (osnamep)
+ *osnamep = "HPUX9";
+ break;
+
+ case FHT_UNKNOWN:
+#ifdef DEBUG
+ /* XXX debugging */
+ for (i = 0; i < 32; i++)
+ (void)fprintf(stderr, "%x.", fhp[i]);
+ (void)fprintf(stderr, "\n");
+#endif
+ /* Save the actual handle, so it can be display with -u */
+ for (i = 0; i < 32; i++)
+ (void)snprintf(&(fsidp->Opaque_Handle[i*2]), 3, "%.2X", fhp[i]);
+
+ /* XXX for now, give "bogus" values to aid debugging */
+ fsidp->fsid_code = 0;
+ fsidp->Fsid_dev.Minor = 257;
+ fsidp->Fsid_dev.Major = 257;
+ *inop = 1;
+
+ /* display will show this string instead of (257,257) */
+ if (fsnamep)
+ *fsnamep = "Unknown";
+
+ if (osnamep)
+ *osnamep = "Unknown";
+ break;
+
+ }
+}
+
+/*
+ * Is this a VMS UCX file handle?
+ * Check for:
+ * (1) leading code byte [XXX not yet]
+ * (2) followed by string of printing chars & spaces
+ * (3) followed by string of nulls
+ */
+static int
+is_UCX(const unsigned char *fhp)
+{
+ register int i;
+ int seen_null = 0;
+
+ for (i = 1; i < 14; i++) {
+ if (ND_ISPRINT(fhp[i])) {
+ if (seen_null)
+ return(0);
+ else
+ continue;
+ }
+ else if (fhp[i] == 0) {
+ seen_null = 1;
+ continue;
+ }
+ else
+ return(0);
+ }
+
+ return(1);
+}
--- /dev/null
+/*
+ * Copyright (c) 1988-2002
+ * 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: (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.
+ */
+
+#ifndef tcpdump_pcap_missing_h
+#define tcpdump_pcap_missing_h
+
+/*
+ * Declarations of functions that might be missing from libpcap.
+ */
+
+#ifndef HAVE_PCAP_LIST_DATALINKS
+extern int pcap_list_datalinks(pcap_t *, int **);
+#endif
+
+#ifndef HAVE_PCAP_DATALINK_NAME_TO_VAL
+/*
+ * We assume no platform has one but not the other.
+ */
+extern int pcap_datalink_name_to_val(const char *);
+extern const char *pcap_datalink_val_to_name(int);
+#endif
+
+#ifndef HAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION
+extern const char *pcap_datalink_val_to_description(int);
+#endif
+
+#ifndef HAVE_PCAP_DUMP_FTELL
+extern long pcap_dump_ftell(pcap_dumper_t *);
+#endif
+
+#endif
+
+
+
+
+
+
+
+
+
--- /dev/null
+/*
+ * Copyright (c) 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: pcap_dump_ftell.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#include <stdio.h>
+#include <pcap.h>
+
+#include "pcap-missing.h"
+
+long
+pcap_dump_ftell(pcap_dumper_t *p)
+{
+ return (ftell((FILE *)p));
+}
--- /dev/null
+
+/*
+ * Copyright (c) 2001 Daniel Hartmeier
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * - 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
+ * COPYRIGHT HOLDERS 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.
+ *
+ * @(#) Header: /tcpdump/master/tcpdump/pf.h,v 1.2 2004/04/02 06:36:25 guy Exp (LBL)
+ */
+
+/* from $OpenBSD: pfvar.h,v 1.170 2003/08/22 21:50:34 david Exp $ */
+
+enum { PF_INOUT=0, PF_IN=1, PF_OUT=2 };
+enum { PF_PASS=0, PF_DROP=1, PF_SCRUB=2, PF_NAT=3, PF_NONAT=4,
+ PF_BINAT=5, PF_NOBINAT=6, PF_RDR=7, PF_NORDR=8, PF_SYNPROXY_DROP=9 };
+
+/* Reasons code for passing/dropping a packet */
+#define PFRES_MATCH 0 /* Explicit match of a rule */
+#define PFRES_BADOFF 1 /* Bad offset for pull_hdr */
+#define PFRES_FRAG 2 /* Dropping following fragment */
+#define PFRES_SHORT 3 /* Dropping short packet */
+#define PFRES_NORM 4 /* Dropping by normalizer */
+#define PFRES_MEMORY 5 /* Dropped due to lacking mem */
+#define PFRES_MAX 6 /* total+1 */
+
+#define PFRES_NAMES { \
+ "match", \
+ "bad-offset", \
+ "fragment", \
+ "short", \
+ "normalize", \
+ "memory", \
+ NULL \
+}
+
+#define PF_RULESET_NAME_SIZE 16
+
+/* from $OpenBSD: if_pflog.h,v 1.9 2003/07/15 20:27:27 dhartmei Exp $ */
+
+#ifndef IFNAMSIZ
+#define IFNAMSIZ 16
+#endif
+
+struct pfloghdr {
+ u_int8_t length;
+ u_int8_t af;
+ u_int8_t action;
+ u_int8_t reason;
+ char ifname[IFNAMSIZ];
+ char ruleset[PF_RULESET_NAME_SIZE];
+ u_int32_t rulenr;
+ u_int32_t subrulenr;
+ u_int8_t dir;
+ u_int8_t pad[3];
+};
+#define PFLOG_HDRLEN sizeof(struct pfloghdr)
--- /dev/null
+/* $NetBSD: pf_print_state.c,v 1.1 2010/12/05 05:11:30 christos Exp $ */
+/* $OpenBSD: pf_print_state.c,v 1.45 2007/05/31 04:13:37 mcbride Exp $ */
+
+/*
+ * Copyright (c) 2001 Daniel Hartmeier
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * - 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
+ * COPYRIGHT HOLDERS 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.
+ *
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: pf_print_state.c,v 1.1 2010/12/05 05:11:30 christos Exp $");
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#define TCPSTATES
+#include <netinet/tcp_fsm.h>
+#include <net/pfvar.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "pfctl_parser.h"
+#include "pfctl.h"
+
+void print_name(struct pf_addr *, sa_family_t);
+
+void
+print_addr(struct pf_addr_wrap *addr, sa_family_t af, int verbose)
+{
+ switch (addr->type) {
+ case PF_ADDR_DYNIFTL:
+ printf("(%s", addr->v.ifname);
+ if (addr->iflags & PFI_AFLAG_NETWORK)
+ printf(":network");
+ if (addr->iflags & PFI_AFLAG_BROADCAST)
+ printf(":broadcast");
+ if (addr->iflags & PFI_AFLAG_PEER)
+ printf(":peer");
+ if (addr->iflags & PFI_AFLAG_NOALIAS)
+ printf(":0");
+ if (verbose) {
+ if (addr->p.dyncnt <= 0)
+ printf(":*");
+ else
+ printf(":%d", addr->p.dyncnt);
+ }
+ printf(")");
+ break;
+ case PF_ADDR_TABLE:
+ if (verbose)
+ if (addr->p.tblcnt == -1)
+ printf("<%s:*>", addr->v.tblname);
+ else
+ printf("<%s:%d>", addr->v.tblname,
+ addr->p.tblcnt);
+ else
+ printf("<%s>", addr->v.tblname);
+ return;
+ case PF_ADDR_ADDRMASK:
+ if (PF_AZERO(&addr->v.a.addr, AF_INET6) &&
+ PF_AZERO(&addr->v.a.mask, AF_INET6))
+ printf("any");
+ else {
+ char buf[48];
+
+ if (inet_ntop(af, &addr->v.a.addr, buf,
+ sizeof(buf)) == NULL)
+ printf("?");
+ else
+ printf("%s", buf);
+ }
+ break;
+ case PF_ADDR_NOROUTE:
+ printf("no-route");
+ return;
+ case PF_ADDR_URPFFAILED:
+ printf("urpf-failed");
+ return;
+ case PF_ADDR_RTLABEL:
+ printf("route \"%s\"", addr->v.rtlabelname);
+ return;
+ default:
+ printf("?");
+ return;
+ }
+
+ /* mask if not _both_ address and mask are zero */
+ if (!(PF_AZERO(&addr->v.a.addr, AF_INET6) &&
+ PF_AZERO(&addr->v.a.mask, AF_INET6))) {
+ int bits = unmask(&addr->v.a.mask, af);
+
+ if (bits != (af == AF_INET ? 32 : 128))
+ printf("/%d", bits);
+ }
+}
+
+void
+print_name(struct pf_addr *addr, sa_family_t af)
+{
+ char host[NI_MAXHOST];
+
+ strlcpy(host, "?", sizeof(host));
+ switch (af) {
+ case AF_INET: {
+ struct sockaddr_in sin;
+
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_len = sizeof(sin);
+ sin.sin_family = AF_INET;
+ sin.sin_addr = addr->v4;
+ getnameinfo((struct sockaddr *)&sin, sin.sin_len,
+ host, sizeof(host), NULL, 0, NI_NOFQDN);
+ break;
+ }
+ case AF_INET6: {
+ struct sockaddr_in6 sin6;
+
+ memset(&sin6, 0, sizeof(sin6));
+ sin6.sin6_len = sizeof(sin6);
+ sin6.sin6_family = AF_INET6;
+ sin6.sin6_addr = addr->v6;
+ getnameinfo((struct sockaddr *)&sin6, sin6.sin6_len,
+ host, sizeof(host), NULL, 0, NI_NOFQDN);
+ break;
+ }
+ }
+ printf("%s", host);
+}
+
+void
+print_host(struct pfsync_state_host *h, sa_family_t af, int opts)
+{
+ u_int16_t p = ntohs(h->port);
+
+ if (opts & PF_OPT_USEDNS)
+ print_name(&h->addr, af);
+ else {
+ struct pf_addr_wrap aw;
+
+ memset(&aw, 0, sizeof(aw));
+ aw.v.a.addr = h->addr;
+ if (af == AF_INET)
+ aw.v.a.mask.addr32[0] = 0xffffffff;
+ else {
+ memset(&aw.v.a.mask, 0xff, sizeof(aw.v.a.mask));
+ af = AF_INET6;
+ }
+ print_addr(&aw, af, opts & PF_OPT_VERBOSE2);
+ }
+
+ if (p) {
+ if (af == AF_INET)
+ printf(":%u", p);
+ else
+ printf("[%u]", p);
+ }
+}
+
+void
+print_seq(struct pfsync_state_peer *p)
+{
+ if (p->seqdiff)
+ printf("[%u + %u](+%u)", p->seqlo, p->seqhi - p->seqlo,
+ p->seqdiff);
+ else
+ printf("[%u + %u]", p->seqlo, p->seqhi - p->seqlo);
+}
+
+void
+print_state(struct pfsync_state *s, int opts)
+{
+ struct pfsync_state_peer *src, *dst;
+ struct protoent *p;
+ int min, sec;
+
+ if (s->direction == PF_OUT) {
+ src = &s->src;
+ dst = &s->dst;
+ } else {
+ src = &s->dst;
+ dst = &s->src;
+ }
+ printf("%s ", s->ifname);
+ if ((p = getprotobynumber(s->proto)) != NULL)
+ printf("%s ", p->p_name);
+ else
+ printf("%u ", s->proto);
+ if (PF_ANEQ(&s->lan.addr, &s->gwy.addr, s->af) ||
+ (s->lan.port != s->gwy.port)) {
+ print_host(&s->lan, s->af, opts);
+ if (s->direction == PF_OUT)
+ printf(" -> ");
+ else
+ printf(" <- ");
+ }
+ print_host(&s->gwy, s->af, opts);
+ if (s->direction == PF_OUT)
+ printf(" -> ");
+ else
+ printf(" <- ");
+ print_host(&s->ext, s->af, opts);
+
+ printf(" ");
+ if (s->proto == IPPROTO_TCP) {
+ if (src->state <= TCPS_TIME_WAIT &&
+ dst->state <= TCPS_TIME_WAIT)
+ printf(" %s:%s\n", tcpstates[src->state],
+ tcpstates[dst->state]);
+ else if (src->state == PF_TCPS_PROXY_SRC ||
+ dst->state == PF_TCPS_PROXY_SRC)
+ printf(" PROXY:SRC\n");
+ else if (src->state == PF_TCPS_PROXY_DST ||
+ dst->state == PF_TCPS_PROXY_DST)
+ printf(" PROXY:DST\n");
+ else
+ printf(" <BAD STATE LEVELS %u:%u>\n",
+ src->state, dst->state);
+ if (opts & PF_OPT_VERBOSE) {
+ printf(" ");
+ print_seq(src);
+ if (src->wscale && dst->wscale)
+ printf(" wscale %u",
+ src->wscale & PF_WSCALE_MASK);
+ printf(" ");
+ print_seq(dst);
+ if (src->wscale && dst->wscale)
+ printf(" wscale %u",
+ dst->wscale & PF_WSCALE_MASK);
+ printf("\n");
+ }
+ } else if (s->proto == IPPROTO_UDP && src->state < PFUDPS_NSTATES &&
+ dst->state < PFUDPS_NSTATES) {
+ const char *states[] = PFUDPS_NAMES;
+
+ printf(" %s:%s\n", states[src->state], states[dst->state]);
+ } else if (s->proto != IPPROTO_ICMP && src->state < PFOTHERS_NSTATES &&
+ dst->state < PFOTHERS_NSTATES) {
+ /* XXX ICMP doesn't really have state levels */
+ const char *states[] = PFOTHERS_NAMES;
+
+ printf(" %s:%s\n", states[src->state], states[dst->state]);
+ } else {
+ printf(" %u:%u\n", src->state, dst->state);
+ }
+
+ if (opts & PF_OPT_VERBOSE) {
+ sec = s->creation % 60;
+ s->creation /= 60;
+ min = s->creation % 60;
+ s->creation /= 60;
+ printf(" age %.2u:%.2u:%.2u", s->creation, min, sec);
+ sec = s->expire % 60;
+ s->expire /= 60;
+ min = s->expire % 60;
+ s->expire /= 60;
+ printf(", expires in %.2u:%.2u:%.2u", s->expire, min, sec);
+ printf(", %llu:%llu pkts, %llu:%llu bytes",
+ (unsigned long long)pf_state_counter_from_pfsync(s->packets[0]),
+ (unsigned long long)pf_state_counter_from_pfsync(s->packets[1]),
+ (unsigned long long)pf_state_counter_from_pfsync(s->bytes[0]),
+ (unsigned long long)pf_state_counter_from_pfsync(s->bytes[1]));
+ if (s->anchor != -1)
+ printf(", anchor %u", s->anchor);
+ if (s->rule != -1)
+ printf(", rule %u", s->rule);
+ if (s->sync_flags & PFSYNC_FLAG_SRCNODE)
+ printf(", source-track");
+ if (s->sync_flags & PFSYNC_FLAG_NATSRCNODE)
+ printf(", sticky-address");
+ printf("\n");
+ }
+ if (opts & PF_OPT_VERBOSE2) {
+ printf(" id: %016llx creatorid: %08x%s\n",
+ (unsigned long long int)pf_state_counter_from_pfsync(s->id),
+ ntohl(s->creatorid),
+ ((s->sync_flags & PFSTATE_NOSYNC) ? " (no-sync)" : ""));
+ }
+}
+
+int
+unmask(struct pf_addr *m, sa_family_t af)
+{
+ int i = 31, j = 0, b = 0;
+ u_int32_t tmp;
+
+ while (j < 4 && m->addr32[j] == 0xffffffff) {
+ b += 32;
+ j++;
+ }
+ if (j < 4) {
+ tmp = ntohl(m->addr32[j]);
+ for (i = 31; tmp & (1 << i); --i)
+ b++;
+ }
+ return (b);
+}
--- /dev/null
+/*
+ * Point to Point Protocol (PPP) RFC1331
+ *
+ * Copyright 1989 by Carnegie Mellon.
+ *
+ * Permission to use, copy, modify, and distribute this program for any
+ * purpose and without fee is hereby granted, provided that this copyright
+ * and permission notice appear on all copies and supporting documentation,
+ * the name of Carnegie Mellon not be used in advertising or publicity
+ * pertaining to distribution of the program without specific prior
+ * permission, and notice be given in supporting documentation that copying
+ * and distribution is by permission of Carnegie Mellon and Stanford
+ * University. Carnegie Mellon makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ */
+#define PPP_HDRLEN 4 /* length of PPP header */
+
+#define PPP_ADDRESS 0xff /* The address byte value */
+#define PPP_CONTROL 0x03 /* The control byte value */
+
+#define PPP_WITHDIRECTION_IN 0x00 /* non-standard for DLT_PPP_WITHDIRECTION */
+#define PPP_WITHDIRECTION_OUT 0x01 /* non-standard for DLT_PPP_WITHDIRECTION */
+
+/* Protocol numbers */
+#define PPP_IP 0x0021 /* Raw IP */
+#define PPP_OSI 0x0023 /* OSI Network Layer */
+#define PPP_NS 0x0025 /* Xerox NS IDP */
+#define PPP_DECNET 0x0027 /* DECnet Phase IV */
+#define PPP_APPLE 0x0029 /* Appletalk */
+#define PPP_IPX 0x002b /* Novell IPX */
+#define PPP_VJC 0x002d /* Van Jacobson Compressed TCP/IP */
+#define PPP_VJNC 0x002f /* Van Jacobson Uncompressed TCP/IP */
+#define PPP_BRPDU 0x0031 /* Bridging PDU */
+#define PPP_STII 0x0033 /* Stream Protocol (ST-II) */
+#define PPP_VINES 0x0035 /* Banyan Vines */
+#define PPP_ML 0x003d /* Multi-Link PPP */
+#define PPP_IPV6 0x0057 /* IPv6 */
+#define PPP_COMP 0x00fd /* Compressed Datagram */
+
+#define PPP_HELLO 0x0201 /* 802.1d Hello Packets */
+#define PPP_LUXCOM 0x0231 /* Luxcom */
+#define PPP_SNS 0x0233 /* Sigma Network Systems */
+#define PPP_MPLS_UCAST 0x0281 /* rfc 3032 */
+#define PPP_MPLS_MCAST 0x0283 /* rfc 3022 */
+
+#define PPP_IPCP 0x8021 /* IP Control Protocol */
+#define PPP_OSICP 0x8023 /* OSI Network Layer Control Protocol */
+#define PPP_NSCP 0x8025 /* Xerox NS IDP Control Protocol */
+#define PPP_DECNETCP 0x8027 /* DECnet Control Protocol */
+#define PPP_APPLECP 0x8029 /* Appletalk Control Protocol */
+#define PPP_IPXCP 0x802b /* Novell IPX Control Protocol */
+#define PPP_STIICP 0x8033 /* Strean Protocol Control Protocol */
+#define PPP_VINESCP 0x8035 /* Banyan Vines Control Protocol */
+#define PPP_IPV6CP 0x8057 /* IPv6 Control Protocol */
+#define PPP_CCP 0x80fd /* Compress Control Protocol */
+#define PPP_MPLSCP 0x8281 /* rfc 3022 */
+
+#define PPP_LCP 0xc021 /* Link Control Protocol */
+#define PPP_PAP 0xc023 /* Password Authentication Protocol */
+#define PPP_LQM 0xc025 /* Link Quality Monitoring */
+#define PPP_SPAP 0xc027
+#define PPP_CHAP 0xc223 /* Challenge Handshake Authentication Protocol */
+#define PPP_BACP 0xc02b /* Bandwidth Allocation Control Protocol */
+#define PPP_BAP 0xc02d /* BAP */
+#define PPP_MPCP 0xc03d /* Multi-Link */
+#define PPP_SPAP_OLD 0xc123
+#define PPP_EAP 0xc227
--- /dev/null
+/*
+ * Copyright (c) 2001
+ * Fortress Technologies, Inc. All rights reserved.
+ * Charlie Lenahan (clenahan@fortresstech.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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-802_11.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+
+#include "extract.h"
+
+#include "cpack.h"
+
+
+/* Lengths of 802.11 header components. */
+#define IEEE802_11_FC_LEN 2
+#define IEEE802_11_DUR_LEN 2
+#define IEEE802_11_DA_LEN 6
+#define IEEE802_11_SA_LEN 6
+#define IEEE802_11_BSSID_LEN 6
+#define IEEE802_11_RA_LEN 6
+#define IEEE802_11_TA_LEN 6
+#define IEEE802_11_SEQ_LEN 2
+#define IEEE802_11_CTL_LEN 2
+#define IEEE802_11_IV_LEN 3
+#define IEEE802_11_KID_LEN 1
+
+/* Frame check sequence length. */
+#define IEEE802_11_FCS_LEN 4
+
+/* Lengths of beacon components. */
+#define IEEE802_11_TSTAMP_LEN 8
+#define IEEE802_11_BCNINT_LEN 2
+#define IEEE802_11_CAPINFO_LEN 2
+#define IEEE802_11_LISTENINT_LEN 2
+
+#define IEEE802_11_AID_LEN 2
+#define IEEE802_11_STATUS_LEN 2
+#define IEEE802_11_REASON_LEN 2
+
+/* Length of previous AP in reassocation frame */
+#define IEEE802_11_AP_LEN 6
+
+#define T_MGMT 0x0 /* management */
+#define T_CTRL 0x1 /* control */
+#define T_DATA 0x2 /* data */
+#define T_RESV 0x3 /* reserved */
+
+#define ST_ASSOC_REQUEST 0x0
+#define ST_ASSOC_RESPONSE 0x1
+#define ST_REASSOC_REQUEST 0x2
+#define ST_REASSOC_RESPONSE 0x3
+#define ST_PROBE_REQUEST 0x4
+#define ST_PROBE_RESPONSE 0x5
+/* RESERVED 0x6 */
+/* RESERVED 0x7 */
+#define ST_BEACON 0x8
+#define ST_ATIM 0x9
+#define ST_DISASSOC 0xA
+#define ST_AUTH 0xB
+#define ST_DEAUTH 0xC
+#define ST_ACTION 0xD
+/* RESERVED 0xE */
+/* RESERVED 0xF */
+
+static const struct tok st_str[] = {
+ { ST_ASSOC_REQUEST, "Assoc Request" },
+ { ST_ASSOC_RESPONSE, "Assoc Response" },
+ { ST_REASSOC_REQUEST, "ReAssoc Request" },
+ { ST_REASSOC_RESPONSE, "ReAssoc Response" },
+ { ST_PROBE_REQUEST, "Probe Request" },
+ { ST_PROBE_RESPONSE, "Probe Response" },
+ { ST_BEACON, "Beacon" },
+ { ST_ATIM, "ATIM" },
+ { ST_DISASSOC, "Disassociation" },
+ { ST_AUTH, "Authentication" },
+ { ST_DEAUTH, "DeAuthentication" },
+ { ST_ACTION, "Action" },
+ { 0, NULL }
+};
+
+#define CTRL_CONTROL_WRAPPER 0x7
+#define CTRL_BAR 0x8
+#define CTRL_BA 0x9
+#define CTRL_PS_POLL 0xA
+#define CTRL_RTS 0xB
+#define CTRL_CTS 0xC
+#define CTRL_ACK 0xD
+#define CTRL_CF_END 0xE
+#define CTRL_END_ACK 0xF
+
+static const struct tok ctrl_str[] = {
+ { CTRL_CONTROL_WRAPPER, "Control Wrapper" },
+ { CTRL_BAR, "BAR" },
+ { CTRL_BA, "BA" },
+ { CTRL_PS_POLL, "Power Save-Poll" },
+ { CTRL_RTS, "Request-To-Send" },
+ { CTRL_CTS, "Clear-To-Send" },
+ { CTRL_ACK, "Acknowledgment" },
+ { CTRL_CF_END, "CF-End" },
+ { CTRL_END_ACK, "CF-End+CF-Ack" },
+ { 0, NULL }
+};
+
+#define DATA_DATA 0x0
+#define DATA_DATA_CF_ACK 0x1
+#define DATA_DATA_CF_POLL 0x2
+#define DATA_DATA_CF_ACK_POLL 0x3
+#define DATA_NODATA 0x4
+#define DATA_NODATA_CF_ACK 0x5
+#define DATA_NODATA_CF_POLL 0x6
+#define DATA_NODATA_CF_ACK_POLL 0x7
+
+#define DATA_QOS_DATA 0x8
+#define DATA_QOS_DATA_CF_ACK 0x9
+#define DATA_QOS_DATA_CF_POLL 0xA
+#define DATA_QOS_DATA_CF_ACK_POLL 0xB
+#define DATA_QOS_NODATA 0xC
+#define DATA_QOS_CF_POLL_NODATA 0xE
+#define DATA_QOS_CF_ACK_POLL_NODATA 0xF
+
+/*
+ * The subtype field of a data frame is, in effect, composed of 4 flag
+ * bits - CF-Ack, CF-Poll, Null (means the frame doesn't actually have
+ * any data), and QoS.
+ */
+#define DATA_FRAME_IS_CF_ACK(x) ((x) & 0x01)
+#define DATA_FRAME_IS_CF_POLL(x) ((x) & 0x02)
+#define DATA_FRAME_IS_NULL(x) ((x) & 0x04)
+#define DATA_FRAME_IS_QOS(x) ((x) & 0x08)
+
+/*
+ * Bits in the frame control field.
+ */
+#define FC_VERSION(fc) ((fc) & 0x3)
+#define FC_TYPE(fc) (((fc) >> 2) & 0x3)
+#define FC_SUBTYPE(fc) (((fc) >> 4) & 0xF)
+#define FC_TO_DS(fc) ((fc) & 0x0100)
+#define FC_FROM_DS(fc) ((fc) & 0x0200)
+#define FC_MORE_FLAG(fc) ((fc) & 0x0400)
+#define FC_RETRY(fc) ((fc) & 0x0800)
+#define FC_POWER_MGMT(fc) ((fc) & 0x1000)
+#define FC_MORE_DATA(fc) ((fc) & 0x2000)
+#define FC_WEP(fc) ((fc) & 0x4000)
+#define FC_ORDER(fc) ((fc) & 0x8000)
+
+struct mgmt_header_t {
+ uint16_t fc;
+ uint16_t duration;
+ uint8_t da[6];
+ uint8_t sa[6];
+ uint8_t bssid[6];
+ uint16_t seq_ctrl;
+};
+
+#define MGMT_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
+ IEEE802_11_DA_LEN+IEEE802_11_SA_LEN+\
+ IEEE802_11_BSSID_LEN+IEEE802_11_SEQ_LEN)
+
+#define CAPABILITY_ESS(cap) ((cap) & 0x0001)
+#define CAPABILITY_IBSS(cap) ((cap) & 0x0002)
+#define CAPABILITY_CFP(cap) ((cap) & 0x0004)
+#define CAPABILITY_CFP_REQ(cap) ((cap) & 0x0008)
+#define CAPABILITY_PRIVACY(cap) ((cap) & 0x0010)
+
+struct ssid_t {
+ uint8_t element_id;
+ uint8_t length;
+ u_char ssid[33]; /* 32 + 1 for null */
+};
+
+struct rates_t {
+ uint8_t element_id;
+ uint8_t length;
+ uint8_t rate[16];
+};
+
+struct challenge_t {
+ uint8_t element_id;
+ uint8_t length;
+ uint8_t text[254]; /* 1-253 + 1 for null */
+};
+
+struct fh_t {
+ uint8_t element_id;
+ uint8_t length;
+ uint16_t dwell_time;
+ uint8_t hop_set;
+ uint8_t hop_pattern;
+ uint8_t hop_index;
+};
+
+struct ds_t {
+ uint8_t element_id;
+ uint8_t length;
+ uint8_t channel;
+};
+
+struct cf_t {
+ uint8_t element_id;
+ uint8_t length;
+ uint8_t count;
+ uint8_t period;
+ uint16_t max_duration;
+ uint16_t dur_remaing;
+};
+
+struct tim_t {
+ uint8_t element_id;
+ uint8_t length;
+ uint8_t count;
+ uint8_t period;
+ uint8_t bitmap_control;
+ uint8_t bitmap[251];
+};
+
+#define E_SSID 0
+#define E_RATES 1
+#define E_FH 2
+#define E_DS 3
+#define E_CF 4
+#define E_TIM 5
+#define E_IBSS 6
+/* reserved 7 */
+/* reserved 8 */
+/* reserved 9 */
+/* reserved 10 */
+/* reserved 11 */
+/* reserved 12 */
+/* reserved 13 */
+/* reserved 14 */
+/* reserved 15 */
+/* reserved 16 */
+
+#define E_CHALLENGE 16
+/* reserved 17 */
+/* reserved 18 */
+/* reserved 19 */
+/* reserved 16 */
+/* reserved 16 */
+
+
+struct mgmt_body_t {
+ uint8_t timestamp[IEEE802_11_TSTAMP_LEN];
+ uint16_t beacon_interval;
+ uint16_t listen_interval;
+ uint16_t status_code;
+ uint16_t aid;
+ u_char ap[IEEE802_11_AP_LEN];
+ uint16_t reason_code;
+ uint16_t auth_alg;
+ uint16_t auth_trans_seq_num;
+ int challenge_present;
+ struct challenge_t challenge;
+ uint16_t capability_info;
+ int ssid_present;
+ struct ssid_t ssid;
+ int rates_present;
+ struct rates_t rates;
+ int ds_present;
+ struct ds_t ds;
+ int cf_present;
+ struct cf_t cf;
+ int fh_present;
+ struct fh_t fh;
+ int tim_present;
+ struct tim_t tim;
+};
+
+struct ctrl_rts_t {
+ uint16_t fc;
+ uint16_t duration;
+ uint8_t ra[6];
+ uint8_t ta[6];
+ uint8_t fcs[4];
+};
+
+#define CTRL_RTS_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
+ IEEE802_11_RA_LEN+IEEE802_11_TA_LEN)
+
+struct ctrl_cts_t {
+ uint16_t fc;
+ uint16_t duration;
+ uint8_t ra[6];
+ uint8_t fcs[4];
+};
+
+#define CTRL_CTS_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN)
+
+struct ctrl_ack_t {
+ uint16_t fc;
+ uint16_t duration;
+ uint8_t ra[6];
+ uint8_t fcs[4];
+};
+
+#define CTRL_ACK_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN)
+
+struct ctrl_ps_poll_t {
+ uint16_t fc;
+ uint16_t aid;
+ uint8_t bssid[6];
+ uint8_t ta[6];
+ uint8_t fcs[4];
+};
+
+#define CTRL_PS_POLL_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_AID_LEN+\
+ IEEE802_11_BSSID_LEN+IEEE802_11_TA_LEN)
+
+struct ctrl_end_t {
+ uint16_t fc;
+ uint16_t duration;
+ uint8_t ra[6];
+ uint8_t bssid[6];
+ uint8_t fcs[4];
+};
+
+#define CTRL_END_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
+ IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN)
+
+struct ctrl_end_ack_t {
+ uint16_t fc;
+ uint16_t duration;
+ uint8_t ra[6];
+ uint8_t bssid[6];
+ uint8_t fcs[4];
+};
+
+#define CTRL_END_ACK_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
+ IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN)
+
+struct ctrl_ba_t {
+ uint16_t fc;
+ uint16_t duration;
+ uint8_t ra[6];
+ uint8_t fcs[4];
+};
+
+#define CTRL_BA_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN)
+
+struct ctrl_bar_t {
+ uint16_t fc;
+ uint16_t dur;
+ uint8_t ra[6];
+ uint8_t ta[6];
+ uint16_t ctl;
+ uint16_t seq;
+ uint8_t fcs[4];
+};
+
+#define CTRL_BAR_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
+ IEEE802_11_RA_LEN+IEEE802_11_TA_LEN+\
+ IEEE802_11_CTL_LEN+IEEE802_11_SEQ_LEN)
+
+struct meshcntl_t {
+ uint8_t flags;
+ uint8_t ttl;
+ uint8_t seq[4];
+ uint8_t addr4[6];
+ uint8_t addr5[6];
+ uint8_t addr6[6];
+};
+
+#define IV_IV(iv) ((iv) & 0xFFFFFF)
+#define IV_PAD(iv) (((iv) >> 24) & 0x3F)
+#define IV_KEYID(iv) (((iv) >> 30) & 0x03)
+
+/* $FreeBSD: src/sys/net80211/ieee80211_radiotap.h,v 1.5 2005/01/22 20:12:05 sam Exp $ */
+/* NetBSD: ieee802_11_radio.h,v 1.2 2006/02/26 03:04:03 dyoung Exp */
+
+/*-
+ * Copyright (c) 2003, 2004 David Young. 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. The name of David Young may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY DAVID YOUNG ``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 DAVID
+ * YOUNG 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.
+ */
+
+/* A generic radio capture format is desirable. It must be
+ * rigidly defined (e.g., units for fields should be given),
+ * and easily extensible.
+ *
+ * The following is an extensible radio capture format. It is
+ * based on a bitmap indicating which fields are present.
+ *
+ * I am trying to describe precisely what the application programmer
+ * should expect in the following, and for that reason I tell the
+ * units and origin of each measurement (where it applies), or else I
+ * use sufficiently weaselly language ("is a monotonically nondecreasing
+ * function of...") that I cannot set false expectations for lawyerly
+ * readers.
+ */
+
+/*
+ * The radio capture header precedes the 802.11 header.
+ *
+ * Note well: all radiotap fields are little-endian.
+ */
+struct ieee80211_radiotap_header {
+ uint8_t it_version; /* Version 0. Only increases
+ * for drastic changes,
+ * introduction of compatible
+ * new fields does not count.
+ */
+ uint8_t it_pad;
+ uint16_t it_len; /* length of the whole
+ * header in bytes, including
+ * it_version, it_pad,
+ * it_len, and data fields.
+ */
+ uint32_t it_present; /* A bitmap telling which
+ * fields are present. Set bit 31
+ * (0x80000000) to extend the
+ * bitmap by another 32 bits.
+ * Additional extensions are made
+ * by setting bit 31.
+ */
+};
+
+/* Name Data type Units
+ * ---- --------- -----
+ *
+ * IEEE80211_RADIOTAP_TSFT uint64_t microseconds
+ *
+ * Value in microseconds of the MAC's 64-bit 802.11 Time
+ * Synchronization Function timer when the first bit of the
+ * MPDU arrived at the MAC. For received frames, only.
+ *
+ * IEEE80211_RADIOTAP_CHANNEL 2 x uint16_t MHz, bitmap
+ *
+ * Tx/Rx frequency in MHz, followed by flags (see below).
+ * Note that IEEE80211_RADIOTAP_XCHANNEL must be used to
+ * represent an HT channel as there is not enough room in
+ * the flags word.
+ *
+ * IEEE80211_RADIOTAP_FHSS uint16_t see below
+ *
+ * For frequency-hopping radios, the hop set (first byte)
+ * and pattern (second byte).
+ *
+ * IEEE80211_RADIOTAP_RATE uint8_t 500kb/s or index
+ *
+ * Tx/Rx data rate. If bit 0x80 is set then it represents an
+ * an MCS index and not an IEEE rate.
+ *
+ * IEEE80211_RADIOTAP_DBM_ANTSIGNAL int8_t decibels from
+ * one milliwatt (dBm)
+ *
+ * RF signal power at the antenna, decibel difference from
+ * one milliwatt.
+ *
+ * IEEE80211_RADIOTAP_DBM_ANTNOISE int8_t decibels from
+ * one milliwatt (dBm)
+ *
+ * RF noise power at the antenna, decibel difference from one
+ * milliwatt.
+ *
+ * IEEE80211_RADIOTAP_DB_ANTSIGNAL uint8_t decibel (dB)
+ *
+ * RF signal power at the antenna, decibel difference from an
+ * arbitrary, fixed reference.
+ *
+ * IEEE80211_RADIOTAP_DB_ANTNOISE uint8_t decibel (dB)
+ *
+ * RF noise power at the antenna, decibel difference from an
+ * arbitrary, fixed reference point.
+ *
+ * IEEE80211_RADIOTAP_LOCK_QUALITY uint16_t unitless
+ *
+ * Quality of Barker code lock. Unitless. Monotonically
+ * nondecreasing with "better" lock strength. Called "Signal
+ * Quality" in datasheets. (Is there a standard way to measure
+ * this?)
+ *
+ * IEEE80211_RADIOTAP_TX_ATTENUATION uint16_t unitless
+ *
+ * Transmit power expressed as unitless distance from max
+ * power set at factory calibration. 0 is max power.
+ * Monotonically nondecreasing with lower power levels.
+ *
+ * IEEE80211_RADIOTAP_DB_TX_ATTENUATION uint16_t decibels (dB)
+ *
+ * Transmit power expressed as decibel distance from max power
+ * set at factory calibration. 0 is max power. Monotonically
+ * nondecreasing with lower power levels.
+ *
+ * IEEE80211_RADIOTAP_DBM_TX_POWER int8_t decibels from
+ * one milliwatt (dBm)
+ *
+ * Transmit power expressed as dBm (decibels from a 1 milliwatt
+ * reference). This is the absolute power level measured at
+ * the antenna port.
+ *
+ * IEEE80211_RADIOTAP_FLAGS uint8_t bitmap
+ *
+ * Properties of transmitted and received frames. See flags
+ * defined below.
+ *
+ * IEEE80211_RADIOTAP_ANTENNA uint8_t antenna index
+ *
+ * Unitless indication of the Rx/Tx antenna for this packet.
+ * The first antenna is antenna 0.
+ *
+ * IEEE80211_RADIOTAP_RX_FLAGS uint16_t bitmap
+ *
+ * Properties of received frames. See flags defined below.
+ *
+ * IEEE80211_RADIOTAP_XCHANNEL uint32_t bitmap
+ * uint16_t MHz
+ * uint8_t channel number
+ * uint8_t .5 dBm
+ *
+ * Extended channel specification: flags (see below) followed by
+ * frequency in MHz, the corresponding IEEE channel number, and
+ * 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 uint8_t known
+ * uint8_t flags
+ * uint8_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
+ * uint8_t OUI[3]
+ * uint8_t subspace
+ * uint16_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,
+ IEEE80211_RADIOTAP_FLAGS = 1,
+ IEEE80211_RADIOTAP_RATE = 2,
+ IEEE80211_RADIOTAP_CHANNEL = 3,
+ IEEE80211_RADIOTAP_FHSS = 4,
+ IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5,
+ IEEE80211_RADIOTAP_DBM_ANTNOISE = 6,
+ IEEE80211_RADIOTAP_LOCK_QUALITY = 7,
+ IEEE80211_RADIOTAP_TX_ATTENUATION = 8,
+ IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9,
+ IEEE80211_RADIOTAP_DBM_TX_POWER = 10,
+ 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
+};
+
+/* channel attributes */
+#define IEEE80211_CHAN_TURBO 0x00010 /* Turbo channel */
+#define IEEE80211_CHAN_CCK 0x00020 /* CCK channel */
+#define IEEE80211_CHAN_OFDM 0x00040 /* OFDM channel */
+#define IEEE80211_CHAN_2GHZ 0x00080 /* 2 GHz spectrum channel. */
+#define IEEE80211_CHAN_5GHZ 0x00100 /* 5 GHz spectrum channel */
+#define IEEE80211_CHAN_PASSIVE 0x00200 /* Only passive scan allowed */
+#define IEEE80211_CHAN_DYN 0x00400 /* Dynamic CCK-OFDM channel */
+#define IEEE80211_CHAN_GFSK 0x00800 /* GFSK channel (FHSS PHY) */
+#define IEEE80211_CHAN_GSM 0x01000 /* 900 MHz spectrum channel */
+#define IEEE80211_CHAN_STURBO 0x02000 /* 11a static turbo channel only */
+#define IEEE80211_CHAN_HALF 0x04000 /* Half rate channel */
+#define IEEE80211_CHAN_QUARTER 0x08000 /* Quarter rate channel */
+#define IEEE80211_CHAN_HT20 0x10000 /* HT 20 channel */
+#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
+ */
+#define IEEE80211_RADIOTAP_F_SHORTPRE 0x02 /* sent/received
+ * with short
+ * preamble
+ */
+#define IEEE80211_RADIOTAP_F_WEP 0x04 /* sent/received
+ * with WEP encryption
+ */
+#define IEEE80211_RADIOTAP_F_FRAG 0x08 /* sent/received
+ * with fragmentation
+ */
+#define IEEE80211_RADIOTAP_F_FCS 0x10 /* frame includes FCS */
+#define IEEE80211_RADIOTAP_F_DATAPAD 0x20 /* frame has padding between
+ * 802.11 header and payload
+ * (to 32-bit boundary)
+ */
+#define IEEE80211_RADIOTAP_F_BADFCS 0x40 /* does not pass FCS check */
+
+/* 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
+#define IEEE80211_RADIOTAP_MCS_STBC_KNOWN 0x20
+
+/* 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
+#define IEEE80211_RADIOTAP_MCS_STBC_MASK 0x60
+#define IEEE80211_RADIOTAP_MCS_STBC_1 1
+#define IEEE80211_RADIOTAP_MCS_STBC_2 2
+#define IEEE80211_RADIOTAP_MCS_STBC_3 3
+#define IEEE80211_RADIOTAP_MCS_STBC_SHIFT 5
+
+static const char tstr[] = "[|802.11]";
+
+/* Radiotap state */
+/* This is used to save state when parsing/processing parameters */
+struct radiotap_state
+{
+ uint32_t present;
+
+ uint8_t rate;
+};
+
+#define PRINT_SSID(p) \
+ if (p.ssid_present) { \
+ ND_PRINT((ndo, " (")); \
+ fn_print(ndo, p.ssid.ssid, NULL); \
+ ND_PRINT((ndo, ")")); \
+ }
+
+#define PRINT_RATE(_sep, _r, _suf) \
+ ND_PRINT((ndo, "%s%2.1f%s", _sep, (.5 * ((_r) & 0x7f)), _suf))
+#define PRINT_RATES(p) \
+ if (p.rates_present) { \
+ int z; \
+ const char *sep = " ["; \
+ for (z = 0; z < p.rates.length ; z++) { \
+ PRINT_RATE(sep, p.rates.rate[z], \
+ (p.rates.rate[z] & 0x80 ? "*" : "")); \
+ sep = " "; \
+ } \
+ if (p.rates.length != 0) \
+ ND_PRINT((ndo, " Mbit]")); \
+ }
+
+#define PRINT_DS_CHANNEL(p) \
+ if (p.ds_present) \
+ ND_PRINT((ndo, " CH: %u", p.ds.channel)); \
+ ND_PRINT((ndo, "%s", \
+ CAPABILITY_PRIVACY(p.capability_info) ? ", PRIVACY" : ""));
+
+#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, },
+ },
+};
+
+static const char *auth_alg_text[]={"Open System","Shared Key","EAP"};
+#define NUM_AUTH_ALGS (sizeof auth_alg_text / sizeof auth_alg_text[0])
+
+static const char *status_text[] = {
+ "Successful", /* 0 */
+ "Unspecified failure", /* 1 */
+ "Reserved", /* 2 */
+ "Reserved", /* 3 */
+ "Reserved", /* 4 */
+ "Reserved", /* 5 */
+ "Reserved", /* 6 */
+ "Reserved", /* 7 */
+ "Reserved", /* 8 */
+ "Reserved", /* 9 */
+ "Cannot Support all requested capabilities in the Capability "
+ "Information field", /* 10 */
+ "Reassociation denied due to inability to confirm that association "
+ "exists", /* 11 */
+ "Association denied due to reason outside the scope of the "
+ "standard", /* 12 */
+ "Responding station does not support the specified authentication "
+ "algorithm ", /* 13 */
+ "Received an Authentication frame with authentication transaction "
+ "sequence number out of expected sequence", /* 14 */
+ "Authentication rejected because of challenge failure", /* 15 */
+ "Authentication rejected due to timeout waiting for next frame in "
+ "sequence", /* 16 */
+ "Association denied because AP is unable to handle additional"
+ "associated stations", /* 17 */
+ "Association denied due to requesting station not supporting all of "
+ "the data rates in BSSBasicRateSet parameter", /* 18 */
+ "Association denied due to requesting station not supporting "
+ "short preamble operation", /* 19 */
+ "Association denied due to requesting station not supporting "
+ "PBCC encoding", /* 20 */
+ "Association denied due to requesting station not supporting "
+ "channel agility", /* 21 */
+ "Association request rejected because Spectrum Management "
+ "capability is required", /* 22 */
+ "Association request rejected because the information in the "
+ "Power Capability element is unacceptable", /* 23 */
+ "Association request rejected because the information in the "
+ "Supported Channels element is unacceptable", /* 24 */
+ "Association denied due to requesting station not supporting "
+ "short slot operation", /* 25 */
+ "Association denied due to requesting station not supporting "
+ "DSSS-OFDM operation", /* 26 */
+ "Association denied because the requested STA does not support HT "
+ "features", /* 27 */
+ "Reserved", /* 28 */
+ "Association denied because the requested STA does not support "
+ "the PCO transition time required by the AP", /* 29 */
+ "Reserved", /* 30 */
+ "Reserved", /* 31 */
+ "Unspecified, QoS-related failure", /* 32 */
+ "Association denied due to QAP having insufficient bandwidth "
+ "to handle another QSTA", /* 33 */
+ "Association denied due to excessive frame loss rates and/or "
+ "poor conditions on current operating channel", /* 34 */
+ "Association (with QBSS) denied due to requesting station not "
+ "supporting the QoS facility", /* 35 */
+ "Association denied due to requesting station not supporting "
+ "Block Ack", /* 36 */
+ "The request has been declined", /* 37 */
+ "The request has not been successful as one or more parameters "
+ "have invalid values", /* 38 */
+ "The TS has not been created because the request cannot be honored. "
+ "Try again with the suggested changes to the TSPEC", /* 39 */
+ "Invalid Information Element", /* 40 */
+ "Group Cipher is not valid", /* 41 */
+ "Pairwise Cipher is not valid", /* 42 */
+ "AKMP is not valid", /* 43 */
+ "Unsupported RSN IE version", /* 44 */
+ "Invalid RSN IE Capabilities", /* 45 */
+ "Cipher suite is rejected per security policy", /* 46 */
+ "The TS has not been created. However, the HC may be capable of "
+ "creating a TS, in response to a request, after the time indicated "
+ "in the TS Delay element", /* 47 */
+ "Direct Link is not allowed in the BSS by policy", /* 48 */
+ "Destination STA is not present within this QBSS.", /* 49 */
+ "The Destination STA is not a QSTA.", /* 50 */
+
+};
+#define NUM_STATUSES (sizeof status_text / sizeof status_text[0])
+
+static const char *reason_text[] = {
+ "Reserved", /* 0 */
+ "Unspecified reason", /* 1 */
+ "Previous authentication no longer valid", /* 2 */
+ "Deauthenticated because sending station is leaving (or has left) "
+ "IBSS or ESS", /* 3 */
+ "Disassociated due to inactivity", /* 4 */
+ "Disassociated because AP is unable to handle all currently "
+ " associated stations", /* 5 */
+ "Class 2 frame received from nonauthenticated station", /* 6 */
+ "Class 3 frame received from nonassociated station", /* 7 */
+ "Disassociated because sending station is leaving "
+ "(or has left) BSS", /* 8 */
+ "Station requesting (re)association is not authenticated with "
+ "responding station", /* 9 */
+ "Disassociated because the information in the Power Capability "
+ "element is unacceptable", /* 10 */
+ "Disassociated because the information in the SupportedChannels "
+ "element is unacceptable", /* 11 */
+ "Invalid Information Element", /* 12 */
+ "Reserved", /* 13 */
+ "Michael MIC failure", /* 14 */
+ "4-Way Handshake timeout", /* 15 */
+ "Group key update timeout", /* 16 */
+ "Information element in 4-Way Handshake different from (Re)Association"
+ "Request/Probe Response/Beacon", /* 17 */
+ "Group Cipher is not valid", /* 18 */
+ "AKMP is not valid", /* 20 */
+ "Unsupported RSN IE version", /* 21 */
+ "Invalid RSN IE Capabilities", /* 22 */
+ "IEEE 802.1X Authentication failed", /* 23 */
+ "Cipher suite is rejected per security policy", /* 24 */
+ "Reserved", /* 25 */
+ "Reserved", /* 26 */
+ "Reserved", /* 27 */
+ "Reserved", /* 28 */
+ "Reserved", /* 29 */
+ "Reserved", /* 30 */
+ "TS deleted because QoS AP lacks sufficient bandwidth for this "
+ "QoS STA due to a change in BSS service characteristics or "
+ "operational mode (e.g. an HT BSS change from 40 MHz channel "
+ "to 20 MHz channel)", /* 31 */
+ "Disassociated for unspecified, QoS-related reason", /* 32 */
+ "Disassociated because QoS AP lacks sufficient bandwidth for this "
+ "QoS STA", /* 33 */
+ "Disassociated because of excessive number of frames that need to be "
+ "acknowledged, but are not acknowledged for AP transmissions "
+ "and/or poor channel conditions", /* 34 */
+ "Disassociated because STA is transmitting outside the limits "
+ "of its TXOPs", /* 35 */
+ "Requested from peer STA as the STA is leaving the BSS "
+ "(or resetting)", /* 36 */
+ "Requested from peer STA as it does not want to use the "
+ "mechanism", /* 37 */
+ "Requested from peer STA as the STA received frames using the "
+ "mechanism for which a set up is required", /* 38 */
+ "Requested from peer STA due to time out", /* 39 */
+ "Reserved", /* 40 */
+ "Reserved", /* 41 */
+ "Reserved", /* 42 */
+ "Reserved", /* 43 */
+ "Reserved", /* 44 */
+ "Peer STA does not support the requested cipher suite", /* 45 */
+ "Association denied due to requesting STA not supporting HT "
+ "features", /* 46 */
+};
+#define NUM_REASONS (sizeof reason_text / sizeof reason_text[0])
+
+static int
+wep_print(netdissect_options *ndo,
+ const u_char *p)
+{
+ uint32_t iv;
+
+ if (!ND_TTEST2(*p, IEEE802_11_IV_LEN + IEEE802_11_KID_LEN))
+ return 0;
+ iv = EXTRACT_LE_32BITS(p);
+
+ ND_PRINT((ndo, "Data IV:%3x Pad %x KeyID %x", IV_IV(iv), IV_PAD(iv),
+ IV_KEYID(iv)));
+
+ return 1;
+}
+
+static int
+parse_elements(netdissect_options *ndo,
+ 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;
+ struct ds_t ds;
+ struct cf_t cf;
+ struct tim_t tim;
+
+ /*
+ * We haven't seen any elements yet.
+ */
+ pbody->challenge_present = 0;
+ pbody->ssid_present = 0;
+ pbody->rates_present = 0;
+ pbody->ds_present = 0;
+ pbody->cf_present = 0;
+ pbody->tim_present = 0;
+
+ while (length != 0) {
+ /* Make sure we at least have the element ID and length. */
+ if (!ND_TTEST2(*(p + offset), 2))
+ return 0;
+ if (length < 2)
+ return 0;
+ elementlen = *(p + offset + 1);
+
+ /* Make sure we have the entire element. */
+ if (!ND_TTEST2(*(p + offset + 2), elementlen))
+ return 0;
+ if (length < elementlen + 2)
+ return 0;
+
+ switch (*(p + offset)) {
+ case E_SSID:
+ memcpy(&ssid, p + offset, 2);
+ offset += 2;
+ length -= 2;
+ if (ssid.length != 0) {
+ if (ssid.length > sizeof(ssid.ssid) - 1)
+ return 0;
+ if (!ND_TTEST2(*(p + offset), ssid.length))
+ return 0;
+ if (length < ssid.length)
+ return 0;
+ memcpy(&ssid.ssid, p + offset, ssid.length);
+ offset += ssid.length;
+ length -= ssid.length;
+ }
+ ssid.ssid[ssid.length] = '\0';
+ /*
+ * Present and not truncated.
+ *
+ * If we haven't already seen an SSID IE,
+ * copy this one, otherwise ignore this one,
+ * so we later report the first one we saw.
+ */
+ if (!pbody->ssid_present) {
+ pbody->ssid = ssid;
+ pbody->ssid_present = 1;
+ }
+ break;
+ case E_CHALLENGE:
+ memcpy(&challenge, p + offset, 2);
+ offset += 2;
+ length -= 2;
+ if (challenge.length != 0) {
+ if (challenge.length >
+ sizeof(challenge.text) - 1)
+ return 0;
+ if (!ND_TTEST2(*(p + offset), challenge.length))
+ return 0;
+ if (length < challenge.length)
+ return 0;
+ memcpy(&challenge.text, p + offset,
+ challenge.length);
+ offset += challenge.length;
+ length -= challenge.length;
+ }
+ challenge.text[challenge.length] = '\0';
+ /*
+ * Present and not truncated.
+ *
+ * If we haven't already seen a challenge IE,
+ * copy this one, otherwise ignore this one,
+ * so we later report the first one we saw.
+ */
+ if (!pbody->challenge_present) {
+ pbody->challenge = challenge;
+ pbody->challenge_present = 1;
+ }
+ break;
+ case E_RATES:
+ memcpy(&rates, p + offset, 2);
+ offset += 2;
+ length -= 2;
+ if (rates.length != 0) {
+ if (rates.length > sizeof rates.rate)
+ return 0;
+ if (!ND_TTEST2(*(p + offset), rates.length))
+ return 0;
+ if (length < rates.length)
+ return 0;
+ memcpy(&rates.rate, p + offset, rates.length);
+ offset += rates.length;
+ length -= rates.length;
+ }
+ /*
+ * Present and not truncated.
+ *
+ * If we haven't already seen a rates IE,
+ * copy this one if it's not zero-length,
+ * otherwise ignore this one, so we later
+ * report the first one we saw.
+ *
+ * We ignore zero-length rates IEs as some
+ * devices seem to put a zero-length rates
+ * IE, followed by an SSID IE, followed by
+ * a non-zero-length rates IE into frames,
+ * even though IEEE Std 802.11-2007 doesn't
+ * seem to indicate that a zero-length rates
+ * IE is valid.
+ */
+ if (!pbody->rates_present && rates.length != 0) {
+ pbody->rates = rates;
+ pbody->rates_present = 1;
+ }
+ break;
+ case E_DS:
+ memcpy(&ds, p + offset, 2);
+ offset += 2;
+ length -= 2;
+ if (ds.length != 1) {
+ offset += ds.length;
+ length -= ds.length;
+ break;
+ }
+ ds.channel = *(p + offset);
+ offset += 1;
+ length -= 1;
+ /*
+ * Present and not truncated.
+ *
+ * If we haven't already seen a DS IE,
+ * copy this one, otherwise ignore this one,
+ * so we later report the first one we saw.
+ */
+ if (!pbody->ds_present) {
+ pbody->ds = ds;
+ pbody->ds_present = 1;
+ }
+ break;
+ case E_CF:
+ memcpy(&cf, p + offset, 2);
+ offset += 2;
+ length -= 2;
+ if (cf.length != 6) {
+ offset += cf.length;
+ length -= cf.length;
+ break;
+ }
+ memcpy(&cf.count, p + offset, 6);
+ offset += 6;
+ length -= 6;
+ /*
+ * Present and not truncated.
+ *
+ * If we haven't already seen a CF IE,
+ * copy this one, otherwise ignore this one,
+ * so we later report the first one we saw.
+ */
+ if (!pbody->cf_present) {
+ pbody->cf = cf;
+ pbody->cf_present = 1;
+ }
+ break;
+ case E_TIM:
+ memcpy(&tim, p + offset, 2);
+ offset += 2;
+ length -= 2;
+ if (tim.length <= 3) {
+ offset += tim.length;
+ length -= tim.length;
+ break;
+ }
+ if (tim.length - 3 > (int)sizeof tim.bitmap)
+ return 0;
+ memcpy(&tim.count, p + offset, 3);
+ offset += 3;
+ length -= 3;
+
+ memcpy(tim.bitmap, p + (tim.length - 3),
+ (tim.length - 3));
+ offset += tim.length - 3;
+ length -= tim.length - 3;
+ /*
+ * Present and not truncated.
+ *
+ * If we haven't already seen a TIM IE,
+ * copy this one, otherwise ignore this one,
+ * so we later report the first one we saw.
+ */
+ if (!pbody->tim_present) {
+ pbody->tim = tim;
+ pbody->tim_present = 1;
+ }
+ break;
+ default:
+#if 0
+ ND_PRINT((ndo, "(1) unhandled element_id (%d) ",
+ *(p + offset)));
+#endif
+ offset += 2 + elementlen;
+ length -= 2 + elementlen;
+ break;
+ }
+ }
+
+ /* No problems found. */
+ return 1;
+}
+
+/*********************************************************************************
+ * Print Handle functions for the management frame types
+ *********************************************************************************/
+
+static int
+handle_beacon(netdissect_options *ndo,
+ const u_char *p, u_int length)
+{
+ struct mgmt_body_t pbody;
+ int offset = 0;
+ int ret;
+
+ memset(&pbody, 0, sizeof(pbody));
+
+ if (!ND_TTEST2(*p, IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN +
+ IEEE802_11_CAPINFO_LEN))
+ return 0;
+ if (length < IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN +
+ IEEE802_11_CAPINFO_LEN)
+ return 0;
+ memcpy(&pbody.timestamp, p, IEEE802_11_TSTAMP_LEN);
+ offset += IEEE802_11_TSTAMP_LEN;
+ length -= IEEE802_11_TSTAMP_LEN;
+ pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset);
+ offset += IEEE802_11_BCNINT_LEN;
+ length -= IEEE802_11_BCNINT_LEN;
+ pbody.capability_info = EXTRACT_LE_16BITS(p+offset);
+ offset += IEEE802_11_CAPINFO_LEN;
+ length -= IEEE802_11_CAPINFO_LEN;
+
+ ret = parse_elements(ndo, &pbody, p, offset, length);
+
+ PRINT_SSID(pbody);
+ PRINT_RATES(pbody);
+ ND_PRINT((ndo, " %s",
+ CAPABILITY_ESS(pbody.capability_info) ? "ESS" : "IBSS"));
+ PRINT_DS_CHANNEL(pbody);
+
+ return ret;
+}
+
+static int
+handle_assoc_request(netdissect_options *ndo,
+ const u_char *p, u_int length)
+{
+ struct mgmt_body_t pbody;
+ int offset = 0;
+ int ret;
+
+ memset(&pbody, 0, sizeof(pbody));
+
+ if (!ND_TTEST2(*p, IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN))
+ return 0;
+ if (length < IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN)
+ return 0;
+ pbody.capability_info = EXTRACT_LE_16BITS(p);
+ offset += IEEE802_11_CAPINFO_LEN;
+ length -= IEEE802_11_CAPINFO_LEN;
+ pbody.listen_interval = EXTRACT_LE_16BITS(p+offset);
+ offset += IEEE802_11_LISTENINT_LEN;
+ length -= IEEE802_11_LISTENINT_LEN;
+
+ ret = parse_elements(ndo, &pbody, p, offset, length);
+
+ PRINT_SSID(pbody);
+ PRINT_RATES(pbody);
+ return ret;
+}
+
+static int
+handle_assoc_response(netdissect_options *ndo,
+ const u_char *p, u_int length)
+{
+ struct mgmt_body_t pbody;
+ int offset = 0;
+ int ret;
+
+ memset(&pbody, 0, sizeof(pbody));
+
+ if (!ND_TTEST2(*p, IEEE802_11_CAPINFO_LEN + IEEE802_11_STATUS_LEN +
+ IEEE802_11_AID_LEN))
+ return 0;
+ if (length < IEEE802_11_CAPINFO_LEN + IEEE802_11_STATUS_LEN +
+ IEEE802_11_AID_LEN)
+ return 0;
+ pbody.capability_info = EXTRACT_LE_16BITS(p);
+ offset += IEEE802_11_CAPINFO_LEN;
+ length -= IEEE802_11_CAPINFO_LEN;
+ pbody.status_code = EXTRACT_LE_16BITS(p+offset);
+ offset += IEEE802_11_STATUS_LEN;
+ length -= IEEE802_11_STATUS_LEN;
+ pbody.aid = EXTRACT_LE_16BITS(p+offset);
+ offset += IEEE802_11_AID_LEN;
+ length -= IEEE802_11_AID_LEN;
+
+ ret = parse_elements(ndo, &pbody, p, offset, length);
+
+ ND_PRINT((ndo, " AID(%x) :%s: %s", ((uint16_t)(pbody.aid << 2 )) >> 2 ,
+ CAPABILITY_PRIVACY(pbody.capability_info) ? " PRIVACY " : "",
+ (pbody.status_code < NUM_STATUSES
+ ? status_text[pbody.status_code]
+ : "n/a")));
+
+ return ret;
+}
+
+static int
+handle_reassoc_request(netdissect_options *ndo,
+ const u_char *p, u_int length)
+{
+ struct mgmt_body_t pbody;
+ int offset = 0;
+ int ret;
+
+ memset(&pbody, 0, sizeof(pbody));
+
+ if (!ND_TTEST2(*p, IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN +
+ IEEE802_11_AP_LEN))
+ return 0;
+ if (length < IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN +
+ IEEE802_11_AP_LEN)
+ return 0;
+ pbody.capability_info = EXTRACT_LE_16BITS(p);
+ offset += IEEE802_11_CAPINFO_LEN;
+ length -= IEEE802_11_CAPINFO_LEN;
+ pbody.listen_interval = EXTRACT_LE_16BITS(p+offset);
+ offset += IEEE802_11_LISTENINT_LEN;
+ length -= IEEE802_11_LISTENINT_LEN;
+ memcpy(&pbody.ap, p+offset, IEEE802_11_AP_LEN);
+ offset += IEEE802_11_AP_LEN;
+ length -= IEEE802_11_AP_LEN;
+
+ ret = parse_elements(ndo, &pbody, p, offset, length);
+
+ PRINT_SSID(pbody);
+ ND_PRINT((ndo, " AP : %s", etheraddr_string(ndo, pbody.ap )));
+
+ return ret;
+}
+
+static int
+handle_reassoc_response(netdissect_options *ndo,
+ const u_char *p, u_int length)
+{
+ /* Same as a Association Reponse */
+ return handle_assoc_response(ndo, p, length);
+}
+
+static int
+handle_probe_request(netdissect_options *ndo,
+ const u_char *p, u_int length)
+{
+ struct mgmt_body_t pbody;
+ int offset = 0;
+ int ret;
+
+ memset(&pbody, 0, sizeof(pbody));
+
+ ret = parse_elements(ndo, &pbody, p, offset, length);
+
+ PRINT_SSID(pbody);
+ PRINT_RATES(pbody);
+
+ return ret;
+}
+
+static int
+handle_probe_response(netdissect_options *ndo,
+ const u_char *p, u_int length)
+{
+ struct mgmt_body_t pbody;
+ int offset = 0;
+ int ret;
+
+ memset(&pbody, 0, sizeof(pbody));
+
+ if (!ND_TTEST2(*p, IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN +
+ IEEE802_11_CAPINFO_LEN))
+ return 0;
+ if (length < IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN +
+ IEEE802_11_CAPINFO_LEN)
+ return 0;
+ memcpy(&pbody.timestamp, p, IEEE802_11_TSTAMP_LEN);
+ offset += IEEE802_11_TSTAMP_LEN;
+ length -= IEEE802_11_TSTAMP_LEN;
+ pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset);
+ offset += IEEE802_11_BCNINT_LEN;
+ length -= IEEE802_11_BCNINT_LEN;
+ pbody.capability_info = EXTRACT_LE_16BITS(p+offset);
+ offset += IEEE802_11_CAPINFO_LEN;
+ length -= IEEE802_11_CAPINFO_LEN;
+
+ ret = parse_elements(ndo, &pbody, p, offset, length);
+
+ PRINT_SSID(pbody);
+ PRINT_RATES(pbody);
+ PRINT_DS_CHANNEL(pbody);
+
+ return ret;
+}
+
+static int
+handle_atim(void)
+{
+ /* the frame body for ATIM is null. */
+ return 1;
+}
+
+static int
+handle_disassoc(netdissect_options *ndo,
+ const u_char *p, u_int length)
+{
+ struct mgmt_body_t pbody;
+
+ memset(&pbody, 0, sizeof(pbody));
+
+ if (!ND_TTEST2(*p, IEEE802_11_REASON_LEN))
+ return 0;
+ if (length < IEEE802_11_REASON_LEN)
+ return 0;
+ pbody.reason_code = EXTRACT_LE_16BITS(p);
+
+ ND_PRINT((ndo, ": %s",
+ (pbody.reason_code < NUM_REASONS)
+ ? reason_text[pbody.reason_code]
+ : "Reserved"));
+
+ return 1;
+}
+
+static int
+handle_auth(netdissect_options *ndo,
+ const u_char *p, u_int length)
+{
+ struct mgmt_body_t pbody;
+ int offset = 0;
+ int ret;
+
+ memset(&pbody, 0, sizeof(pbody));
+
+ if (!ND_TTEST2(*p, 6))
+ return 0;
+ if (length < 6)
+ return 0;
+ pbody.auth_alg = EXTRACT_LE_16BITS(p);
+ offset += 2;
+ length -= 2;
+ pbody.auth_trans_seq_num = EXTRACT_LE_16BITS(p + offset);
+ offset += 2;
+ length -= 2;
+ pbody.status_code = EXTRACT_LE_16BITS(p + offset);
+ offset += 2;
+ length -= 2;
+
+ ret = parse_elements(ndo, &pbody, p, offset, length);
+
+ if ((pbody.auth_alg == 1) &&
+ ((pbody.auth_trans_seq_num == 2) ||
+ (pbody.auth_trans_seq_num == 3))) {
+ ND_PRINT((ndo, " (%s)-%x [Challenge Text] %s",
+ (pbody.auth_alg < NUM_AUTH_ALGS)
+ ? auth_alg_text[pbody.auth_alg]
+ : "Reserved",
+ pbody.auth_trans_seq_num,
+ ((pbody.auth_trans_seq_num % 2)
+ ? ((pbody.status_code < NUM_STATUSES)
+ ? status_text[pbody.status_code]
+ : "n/a") : "")));
+ return ret;
+ }
+ ND_PRINT((ndo, " (%s)-%x: %s",
+ (pbody.auth_alg < NUM_AUTH_ALGS)
+ ? auth_alg_text[pbody.auth_alg]
+ : "Reserved",
+ pbody.auth_trans_seq_num,
+ (pbody.auth_trans_seq_num % 2)
+ ? ((pbody.status_code < NUM_STATUSES)
+ ? status_text[pbody.status_code]
+ : "n/a")
+ : ""));
+
+ return ret;
+}
+
+static int
+handle_deauth(netdissect_options *ndo,
+ const struct mgmt_header_t *pmh, const u_char *p, u_int length)
+{
+ struct mgmt_body_t pbody;
+ const char *reason = NULL;
+
+ memset(&pbody, 0, sizeof(pbody));
+
+ if (!ND_TTEST2(*p, IEEE802_11_REASON_LEN))
+ return 0;
+ if (length < IEEE802_11_REASON_LEN)
+ return 0;
+ pbody.reason_code = EXTRACT_LE_16BITS(p);
+
+ reason = (pbody.reason_code < NUM_REASONS)
+ ? reason_text[pbody.reason_code]
+ : "Reserved";
+
+ if (ndo->ndo_eflag) {
+ ND_PRINT((ndo, ": %s", reason));
+ } else {
+ ND_PRINT((ndo, " (%s): %s", etheraddr_string(ndo, pmh->sa), reason));
+ }
+ return 1;
+}
+
+#define PRINT_HT_ACTION(v) (\
+ (v) == 0 ? ND_PRINT((ndo, "TxChWidth")) : \
+ (v) == 1 ? ND_PRINT((ndo, "MIMOPwrSave")) : \
+ ND_PRINT((ndo, "Act#%d", (v))) \
+)
+#define PRINT_BA_ACTION(v) (\
+ (v) == 0 ? ND_PRINT((ndo, "ADDBA Request")) : \
+ (v) == 1 ? ND_PRINT((ndo, "ADDBA Response")) : \
+ (v) == 2 ? ND_PRINT((ndo, "DELBA")) : \
+ ND_PRINT((ndo, "Act#%d", (v))) \
+)
+#define PRINT_MESHLINK_ACTION(v) (\
+ (v) == 0 ? ND_PRINT((ndo, "Request")) : \
+ (v) == 1 ? ND_PRINT((ndo, "Report")) : \
+ ND_PRINT((ndo, "Act#%d", (v))) \
+)
+#define PRINT_MESHPEERING_ACTION(v) (\
+ (v) == 0 ? ND_PRINT((ndo, "Open")) : \
+ (v) == 1 ? ND_PRINT((ndo, "Confirm")) : \
+ (v) == 2 ? ND_PRINT((ndo, "Close")) : \
+ ND_PRINT((ndo, "Act#%d", (v))) \
+)
+#define PRINT_MESHPATH_ACTION(v) (\
+ (v) == 0 ? ND_PRINT((ndo, "Request")) : \
+ (v) == 1 ? ND_PRINT((ndo, "Report")) : \
+ (v) == 2 ? ND_PRINT((ndo, "Error")) : \
+ (v) == 3 ? ND_PRINT((ndo, "RootAnnouncement")) : \
+ ND_PRINT((ndo, "Act#%d", (v))) \
+)
+
+#define PRINT_MESH_ACTION(v) (\
+ (v) == 0 ? ND_PRINT((ndo, "MeshLink")) : \
+ (v) == 1 ? ND_PRINT((ndo, "HWMP")) : \
+ (v) == 2 ? ND_PRINT((ndo, "Gate Announcement")) : \
+ (v) == 3 ? ND_PRINT((ndo, "Congestion Control")) : \
+ (v) == 4 ? ND_PRINT((ndo, "MCCA Setup Request")) : \
+ (v) == 5 ? ND_PRINT((ndo, "MCCA Setup Reply")) : \
+ (v) == 6 ? ND_PRINT((ndo, "MCCA Advertisement Request")) : \
+ (v) == 7 ? ND_PRINT((ndo, "MCCA Advertisement")) : \
+ (v) == 8 ? ND_PRINT((ndo, "MCCA Teardown")) : \
+ (v) == 9 ? ND_PRINT((ndo, "TBTT Adjustment Request")) : \
+ (v) == 10 ? ND_PRINT((ndo, "TBTT Adjustment Response")) : \
+ ND_PRINT((ndo, "Act#%d", (v))) \
+)
+#define PRINT_MULTIHOP_ACTION(v) (\
+ (v) == 0 ? ND_PRINT((ndo, "Proxy Update")) : \
+ (v) == 1 ? ND_PRINT((ndo, "Proxy Update Confirmation")) : \
+ ND_PRINT((ndo, "Act#%d", (v))) \
+)
+#define PRINT_SELFPROT_ACTION(v) (\
+ (v) == 1 ? ND_PRINT((ndo, "Peering Open")) : \
+ (v) == 2 ? ND_PRINT((ndo, "Peering Confirm")) : \
+ (v) == 3 ? ND_PRINT((ndo, "Peering Close")) : \
+ (v) == 4 ? ND_PRINT((ndo, "Group Key Inform")) : \
+ (v) == 5 ? ND_PRINT((ndo, "Group Key Acknowledge")) : \
+ ND_PRINT((ndo, "Act#%d", (v))) \
+)
+
+static int
+handle_action(netdissect_options *ndo,
+ const struct mgmt_header_t *pmh, const u_char *p, u_int length)
+{
+ if (!ND_TTEST2(*p, 2))
+ return 0;
+ if (length < 2)
+ return 0;
+ if (ndo->ndo_eflag) {
+ ND_PRINT((ndo, ": "));
+ } else {
+ ND_PRINT((ndo, " (%s): ", etheraddr_string(ndo, pmh->sa)));
+ }
+ switch (p[0]) {
+ case 0: ND_PRINT((ndo, "Spectrum Management Act#%d", p[1])); break;
+ case 1: ND_PRINT((ndo, "QoS Act#%d", p[1])); break;
+ case 2: ND_PRINT((ndo, "DLS Act#%d", p[1])); break;
+ case 3: ND_PRINT((ndo, "BA ")); PRINT_BA_ACTION(p[1]); break;
+ case 7: ND_PRINT((ndo, "HT ")); PRINT_HT_ACTION(p[1]); break;
+ case 13: ND_PRINT((ndo, "MeshAction ")); PRINT_MESH_ACTION(p[1]); break;
+ case 14:
+ ND_PRINT((ndo, "MultiohopAction "));
+ PRINT_MULTIHOP_ACTION(p[1]); break;
+ case 15:
+ ND_PRINT((ndo, "SelfprotectAction "));
+ PRINT_SELFPROT_ACTION(p[1]); break;
+ case 127: ND_PRINT((ndo, "Vendor Act#%d", p[1])); break;
+ default:
+ ND_PRINT((ndo, "Reserved(%d) Act#%d", p[0], p[1]));
+ break;
+ }
+ return 1;
+}
+
+
+/*********************************************************************************
+ * Print Body funcs
+ *********************************************************************************/
+
+
+static int
+mgmt_body_print(netdissect_options *ndo,
+ uint16_t fc, const struct mgmt_header_t *pmh,
+ const u_char *p, u_int length)
+{
+ ND_PRINT((ndo, "%s", tok2str(st_str, "Unhandled Management subtype(%x)", FC_SUBTYPE(fc))));
+ switch (FC_SUBTYPE(fc)) {
+ case ST_ASSOC_REQUEST:
+ return handle_assoc_request(ndo, p, length);
+ case ST_ASSOC_RESPONSE:
+ return handle_assoc_response(ndo, p, length);
+ case ST_REASSOC_REQUEST:
+ return handle_reassoc_request(ndo, p, length);
+ case ST_REASSOC_RESPONSE:
+ return handle_reassoc_response(ndo, p, length);
+ case ST_PROBE_REQUEST:
+ return handle_probe_request(ndo, p, length);
+ case ST_PROBE_RESPONSE:
+ return handle_probe_response(ndo, p, length);
+ case ST_BEACON:
+ return handle_beacon(ndo, p, length);
+ case ST_ATIM:
+ return handle_atim();
+ case ST_DISASSOC:
+ return handle_disassoc(ndo, p, length);
+ case ST_AUTH:
+ if (!ND_TTEST2(*p, 3))
+ return 0;
+ if ((p[0] == 0 ) && (p[1] == 0) && (p[2] == 0)) {
+ ND_PRINT((ndo, "Authentication (Shared-Key)-3 "));
+ return wep_print(ndo, p);
+ }
+ return handle_auth(ndo, p, length);
+ case ST_DEAUTH:
+ return handle_deauth(ndo, pmh, p, length);
+ case ST_ACTION:
+ return handle_action(ndo, pmh, p, length);
+ default:
+ return 1;
+ }
+}
+
+
+/*********************************************************************************
+ * Handles printing all the control frame types
+ *********************************************************************************/
+
+static int
+ctrl_body_print(netdissect_options *ndo,
+ uint16_t fc, const u_char *p)
+{
+ ND_PRINT((ndo, "%s", tok2str(ctrl_str, "Unknown Ctrl Subtype", FC_SUBTYPE(fc))));
+ switch (FC_SUBTYPE(fc)) {
+ case CTRL_CONTROL_WRAPPER:
+ /* XXX - requires special handling */
+ break;
+ case CTRL_BAR:
+ if (!ND_TTEST2(*p, CTRL_BAR_HDRLEN))
+ return 0;
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, " RA:%s TA:%s CTL(%x) SEQ(%u) ",
+ etheraddr_string(ndo, ((const struct ctrl_bar_t *)p)->ra),
+ etheraddr_string(ndo, ((const struct ctrl_bar_t *)p)->ta),
+ EXTRACT_LE_16BITS(&(((const struct ctrl_bar_t *)p)->ctl)),
+ EXTRACT_LE_16BITS(&(((const struct ctrl_bar_t *)p)->seq))));
+ break;
+ case CTRL_BA:
+ if (!ND_TTEST2(*p, CTRL_BA_HDRLEN))
+ return 0;
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, " RA:%s ",
+ etheraddr_string(ndo, ((const struct ctrl_ba_t *)p)->ra)));
+ break;
+ case CTRL_PS_POLL:
+ if (!ND_TTEST2(*p, CTRL_PS_POLL_HDRLEN))
+ return 0;
+ ND_PRINT((ndo, " AID(%x)",
+ EXTRACT_LE_16BITS(&(((const struct ctrl_ps_poll_t *)p)->aid))));
+ break;
+ case CTRL_RTS:
+ if (!ND_TTEST2(*p, CTRL_RTS_HDRLEN))
+ return 0;
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, " TA:%s ",
+ etheraddr_string(ndo, ((const struct ctrl_rts_t *)p)->ta)));
+ break;
+ case CTRL_CTS:
+ if (!ND_TTEST2(*p, CTRL_CTS_HDRLEN))
+ return 0;
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, " RA:%s ",
+ etheraddr_string(ndo, ((const struct ctrl_cts_t *)p)->ra)));
+ break;
+ case CTRL_ACK:
+ if (!ND_TTEST2(*p, CTRL_ACK_HDRLEN))
+ return 0;
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, " RA:%s ",
+ etheraddr_string(ndo, ((const struct ctrl_ack_t *)p)->ra)));
+ break;
+ case CTRL_CF_END:
+ if (!ND_TTEST2(*p, CTRL_END_HDRLEN))
+ return 0;
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, " RA:%s ",
+ etheraddr_string(ndo, ((const struct ctrl_end_t *)p)->ra)));
+ break;
+ case CTRL_END_ACK:
+ if (!ND_TTEST2(*p, CTRL_END_ACK_HDRLEN))
+ return 0;
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, " RA:%s ",
+ etheraddr_string(ndo, ((const struct ctrl_end_ack_t *)p)->ra)));
+ break;
+ }
+ return 1;
+}
+
+/*
+ * Print Header funcs
+ */
+
+/*
+ * Data Frame - Address field contents
+ *
+ * To Ds | From DS | Addr 1 | Addr 2 | Addr 3 | Addr 4
+ * 0 | 0 | DA | SA | BSSID | n/a
+ * 0 | 1 | DA | BSSID | SA | n/a
+ * 1 | 0 | BSSID | SA | DA | n/a
+ * 1 | 1 | RA | TA | DA | SA
+ */
+
+static void
+data_header_print(netdissect_options *ndo,
+ uint16_t fc, const u_char *p, const uint8_t **srcp,
+ const uint8_t **dstp)
+{
+ u_int subtype = FC_SUBTYPE(fc);
+
+ if (DATA_FRAME_IS_CF_ACK(subtype) || DATA_FRAME_IS_CF_POLL(subtype) ||
+ DATA_FRAME_IS_QOS(subtype)) {
+ ND_PRINT((ndo, "CF "));
+ if (DATA_FRAME_IS_CF_ACK(subtype)) {
+ if (DATA_FRAME_IS_CF_POLL(subtype))
+ ND_PRINT((ndo, "Ack/Poll"));
+ else
+ ND_PRINT((ndo, "Ack"));
+ } else {
+ if (DATA_FRAME_IS_CF_POLL(subtype))
+ ND_PRINT((ndo, "Poll"));
+ }
+ if (DATA_FRAME_IS_QOS(subtype))
+ ND_PRINT((ndo, "+QoS"));
+ ND_PRINT((ndo, " "));
+ }
+
+#define ADDR1 (p + 4)
+#define ADDR2 (p + 10)
+#define ADDR3 (p + 16)
+#define ADDR4 (p + 24)
+
+ if (!FC_TO_DS(fc) && !FC_FROM_DS(fc)) {
+ if (srcp != NULL)
+ *srcp = ADDR2;
+ if (dstp != NULL)
+ *dstp = ADDR1;
+ if (!ndo->ndo_eflag)
+ return;
+ ND_PRINT((ndo, "DA:%s SA:%s BSSID:%s ",
+ etheraddr_string(ndo, ADDR1), etheraddr_string(ndo, ADDR2),
+ etheraddr_string(ndo, ADDR3)));
+ } else if (!FC_TO_DS(fc) && FC_FROM_DS(fc)) {
+ if (srcp != NULL)
+ *srcp = ADDR3;
+ if (dstp != NULL)
+ *dstp = ADDR1;
+ if (!ndo->ndo_eflag)
+ return;
+ ND_PRINT((ndo, "DA:%s BSSID:%s SA:%s ",
+ etheraddr_string(ndo, ADDR1), etheraddr_string(ndo, ADDR2),
+ etheraddr_string(ndo, ADDR3)));
+ } else if (FC_TO_DS(fc) && !FC_FROM_DS(fc)) {
+ if (srcp != NULL)
+ *srcp = ADDR2;
+ if (dstp != NULL)
+ *dstp = ADDR3;
+ if (!ndo->ndo_eflag)
+ return;
+ ND_PRINT((ndo, "BSSID:%s SA:%s DA:%s ",
+ etheraddr_string(ndo, ADDR1), etheraddr_string(ndo, ADDR2),
+ etheraddr_string(ndo, ADDR3)));
+ } else if (FC_TO_DS(fc) && FC_FROM_DS(fc)) {
+ if (srcp != NULL)
+ *srcp = ADDR4;
+ if (dstp != NULL)
+ *dstp = ADDR3;
+ if (!ndo->ndo_eflag)
+ return;
+ ND_PRINT((ndo, "RA:%s TA:%s DA:%s SA:%s ",
+ etheraddr_string(ndo, ADDR1), etheraddr_string(ndo, ADDR2),
+ etheraddr_string(ndo, ADDR3), etheraddr_string(ndo, ADDR4)));
+ }
+
+#undef ADDR1
+#undef ADDR2
+#undef ADDR3
+#undef ADDR4
+}
+
+static void
+mgmt_header_print(netdissect_options *ndo,
+ const u_char *p, const uint8_t **srcp, const uint8_t **dstp)
+{
+ const struct mgmt_header_t *hp = (const struct mgmt_header_t *) p;
+
+ if (srcp != NULL)
+ *srcp = hp->sa;
+ if (dstp != NULL)
+ *dstp = hp->da;
+ if (!ndo->ndo_eflag)
+ return;
+
+ ND_PRINT((ndo, "BSSID:%s DA:%s SA:%s ",
+ etheraddr_string(ndo, (hp)->bssid), etheraddr_string(ndo, (hp)->da),
+ etheraddr_string(ndo, (hp)->sa)));
+}
+
+static void
+ctrl_header_print(netdissect_options *ndo,
+ uint16_t fc, const u_char *p, const uint8_t **srcp,
+ const uint8_t **dstp)
+{
+ if (srcp != NULL)
+ *srcp = NULL;
+ if (dstp != NULL)
+ *dstp = NULL;
+ if (!ndo->ndo_eflag)
+ return;
+
+ switch (FC_SUBTYPE(fc)) {
+ case CTRL_BAR:
+ ND_PRINT((ndo, " RA:%s TA:%s CTL(%x) SEQ(%u) ",
+ etheraddr_string(ndo, ((const struct ctrl_bar_t *)p)->ra),
+ etheraddr_string(ndo, ((const struct ctrl_bar_t *)p)->ta),
+ EXTRACT_LE_16BITS(&(((const struct ctrl_bar_t *)p)->ctl)),
+ EXTRACT_LE_16BITS(&(((const struct ctrl_bar_t *)p)->seq))));
+ break;
+ case CTRL_BA:
+ ND_PRINT((ndo, "RA:%s ",
+ etheraddr_string(ndo, ((const struct ctrl_ba_t *)p)->ra)));
+ break;
+ case CTRL_PS_POLL:
+ ND_PRINT((ndo, "BSSID:%s TA:%s ",
+ etheraddr_string(ndo, ((const struct ctrl_ps_poll_t *)p)->bssid),
+ etheraddr_string(ndo, ((const struct ctrl_ps_poll_t *)p)->ta)));
+ break;
+ case CTRL_RTS:
+ ND_PRINT((ndo, "RA:%s TA:%s ",
+ etheraddr_string(ndo, ((const struct ctrl_rts_t *)p)->ra),
+ etheraddr_string(ndo, ((const struct ctrl_rts_t *)p)->ta)));
+ break;
+ case CTRL_CTS:
+ ND_PRINT((ndo, "RA:%s ",
+ etheraddr_string(ndo, ((const struct ctrl_cts_t *)p)->ra)));
+ break;
+ case CTRL_ACK:
+ ND_PRINT((ndo, "RA:%s ",
+ etheraddr_string(ndo, ((const struct ctrl_ack_t *)p)->ra)));
+ break;
+ case CTRL_CF_END:
+ ND_PRINT((ndo, "RA:%s BSSID:%s ",
+ etheraddr_string(ndo, ((const struct ctrl_end_t *)p)->ra),
+ etheraddr_string(ndo, ((const struct ctrl_end_t *)p)->bssid)));
+ break;
+ case CTRL_END_ACK:
+ ND_PRINT((ndo, "RA:%s BSSID:%s ",
+ etheraddr_string(ndo, ((const struct ctrl_end_ack_t *)p)->ra),
+ etheraddr_string(ndo, ((const struct ctrl_end_ack_t *)p)->bssid)));
+ break;
+ default:
+ ND_PRINT((ndo, "(H) Unknown Ctrl Subtype"));
+ break;
+ }
+}
+
+static int
+extract_header_length(netdissect_options *ndo,
+ uint16_t fc)
+{
+ int len;
+
+ switch (FC_TYPE(fc)) {
+ case T_MGMT:
+ return MGMT_HDRLEN;
+ case T_CTRL:
+ switch (FC_SUBTYPE(fc)) {
+ case CTRL_BAR:
+ return CTRL_BAR_HDRLEN;
+ case CTRL_PS_POLL:
+ return CTRL_PS_POLL_HDRLEN;
+ case CTRL_RTS:
+ return CTRL_RTS_HDRLEN;
+ case CTRL_CTS:
+ return CTRL_CTS_HDRLEN;
+ case CTRL_ACK:
+ return CTRL_ACK_HDRLEN;
+ case CTRL_CF_END:
+ return CTRL_END_HDRLEN;
+ case CTRL_END_ACK:
+ return CTRL_END_ACK_HDRLEN;
+ default:
+ return 0;
+ }
+ case T_DATA:
+ len = (FC_TO_DS(fc) && FC_FROM_DS(fc)) ? 30 : 24;
+ if (DATA_FRAME_IS_QOS(FC_SUBTYPE(fc)))
+ len += 2;
+ return len;
+ default:
+ ND_PRINT((ndo, "unknown IEEE802.11 frame type (%d)", FC_TYPE(fc)));
+ return 0;
+ }
+}
+
+static int
+extract_mesh_header_length(const u_char *p)
+{
+ return (p[0] &~ 3) ? 0 : 6*(1 + (p[0] & 3));
+}
+
+/*
+ * Print the 802.11 MAC header if eflag is set, and set "*srcp" and "*dstp"
+ * to point to the source and destination MAC addresses in any case if
+ * "srcp" and "dstp" aren't null.
+ */
+static void
+ieee_802_11_hdr_print(netdissect_options *ndo,
+ uint16_t fc, const u_char *p, u_int hdrlen,
+ u_int meshdrlen, const uint8_t **srcp,
+ const uint8_t **dstp)
+{
+ if (ndo->ndo_vflag) {
+ if (FC_MORE_DATA(fc))
+ ND_PRINT((ndo, "More Data "));
+ if (FC_MORE_FLAG(fc))
+ ND_PRINT((ndo, "More Fragments "));
+ if (FC_POWER_MGMT(fc))
+ ND_PRINT((ndo, "Pwr Mgmt "));
+ if (FC_RETRY(fc))
+ ND_PRINT((ndo, "Retry "));
+ if (FC_ORDER(fc))
+ ND_PRINT((ndo, "Strictly Ordered "));
+ if (FC_WEP(fc))
+ ND_PRINT((ndo, "WEP Encrypted "));
+ if (FC_TYPE(fc) != T_CTRL || FC_SUBTYPE(fc) != CTRL_PS_POLL)
+ ND_PRINT((ndo, "%dus ",
+ EXTRACT_LE_16BITS(
+ &((const struct mgmt_header_t *)p)->duration)));
+ }
+ if (meshdrlen != 0) {
+ const struct meshcntl_t *mc =
+ (const struct meshcntl_t *)&p[hdrlen - meshdrlen];
+ int ae = mc->flags & 3;
+
+ ND_PRINT((ndo, "MeshData (AE %d TTL %u seq %u", ae, mc->ttl,
+ EXTRACT_LE_32BITS(mc->seq)));
+ if (ae > 0)
+ ND_PRINT((ndo, " A4:%s", etheraddr_string(ndo, mc->addr4)));
+ if (ae > 1)
+ ND_PRINT((ndo, " A5:%s", etheraddr_string(ndo, mc->addr5)));
+ if (ae > 2)
+ ND_PRINT((ndo, " A6:%s", etheraddr_string(ndo, mc->addr6)));
+ ND_PRINT((ndo, ") "));
+ }
+
+ switch (FC_TYPE(fc)) {
+ case T_MGMT:
+ mgmt_header_print(ndo, p, srcp, dstp);
+ break;
+ case T_CTRL:
+ ctrl_header_print(ndo, fc, p, srcp, dstp);
+ break;
+ case T_DATA:
+ data_header_print(ndo, fc, p, srcp, dstp);
+ break;
+ default:
+ ND_PRINT((ndo, "(header) unknown IEEE802.11 frame type (%d)",
+ FC_TYPE(fc)));
+ *srcp = NULL;
+ *dstp = NULL;
+ break;
+ }
+}
+
+#ifndef roundup2
+#define roundup2(x, y) (((x)+((y)-1))&(~((y)-1))) /* if y is powers of two */
+#endif
+
+static u_int
+ieee802_11_print(netdissect_options *ndo,
+ const u_char *p, u_int length, u_int orig_caplen, int pad,
+ u_int fcslen)
+{
+ uint16_t fc;
+ u_int caplen, hdrlen, meshdrlen;
+ const uint8_t *src, *dst;
+ u_short extracted_ethertype;
+
+ caplen = orig_caplen;
+ /* Remove FCS, if present */
+ if (length < fcslen) {
+ ND_PRINT((ndo, "%s", tstr));
+ return caplen;
+ }
+ length -= fcslen;
+ if (caplen > length) {
+ /* Amount of FCS in actual packet data, if any */
+ fcslen = caplen - length;
+ caplen -= fcslen;
+ ndo->ndo_snapend -= fcslen;
+ }
+
+ if (caplen < IEEE802_11_FC_LEN) {
+ ND_PRINT((ndo, "%s", tstr));
+ return orig_caplen;
+ }
+
+ fc = EXTRACT_LE_16BITS(p);
+ hdrlen = extract_header_length(ndo, fc);
+ if (pad)
+ hdrlen = roundup2(hdrlen, 4);
+ if (ndo->ndo_Hflag && FC_TYPE(fc) == T_DATA &&
+ DATA_FRAME_IS_QOS(FC_SUBTYPE(fc))) {
+ meshdrlen = extract_mesh_header_length(p+hdrlen);
+ hdrlen += meshdrlen;
+ } else
+ meshdrlen = 0;
+
+
+ if (caplen < hdrlen) {
+ ND_PRINT((ndo, "%s", tstr));
+ return hdrlen;
+ }
+
+ ieee_802_11_hdr_print(ndo, fc, p, hdrlen, meshdrlen, &src, &dst);
+
+ /*
+ * Go past the 802.11 header.
+ */
+ length -= hdrlen;
+ caplen -= hdrlen;
+ p += hdrlen;
+
+ switch (FC_TYPE(fc)) {
+ case T_MGMT:
+ if (!mgmt_body_print(ndo, fc,
+ (const struct mgmt_header_t *)(p - hdrlen), p, length)) {
+ ND_PRINT((ndo, "%s", tstr));
+ return hdrlen;
+ }
+ break;
+ case T_CTRL:
+ if (!ctrl_body_print(ndo, fc, p - hdrlen)) {
+ ND_PRINT((ndo, "%s", tstr));
+ return hdrlen;
+ }
+ break;
+ case T_DATA:
+ if (DATA_FRAME_IS_NULL(FC_SUBTYPE(fc)))
+ return hdrlen; /* no-data frame */
+ /* There may be a problem w/ AP not having this bit set */
+ if (FC_WEP(fc)) {
+ if (!wep_print(ndo, p)) {
+ ND_PRINT((ndo, "%s", tstr));
+ return hdrlen;
+ }
+ } else if (llc_print(ndo, p, length, caplen, dst, src,
+ &extracted_ethertype) == 0) {
+ /*
+ * Some kinds of LLC packet we cannot
+ * handle intelligently
+ */
+ if (!ndo->ndo_eflag)
+ ieee_802_11_hdr_print(ndo, fc, p - hdrlen, hdrlen,
+ meshdrlen, NULL, NULL);
+ if (extracted_ethertype)
+ ND_PRINT((ndo, "(LLC %s) ",
+ etherproto_string(
+ htons(extracted_ethertype))));
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+ break;
+ default:
+ ND_PRINT((ndo, "unknown 802.11 frame type (%d)", FC_TYPE(fc)));
+ break;
+ }
+
+ return hdrlen;
+}
+
+/*
+ * This is the top level routine of the printer. 'p' points
+ * to the 802.11 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
+ieee802_11_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, const u_char *p)
+{
+ return ieee802_11_print(ndo, p, h->len, h->caplen, 0, 0);
+}
+
+#define IEEE80211_CHAN_FHSS \
+ (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_GFSK)
+#define IEEE80211_CHAN_A \
+ (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM)
+#define IEEE80211_CHAN_B \
+ (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK)
+#define IEEE80211_CHAN_PUREG \
+ (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM)
+#define IEEE80211_CHAN_G \
+ (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN)
+
+#define IS_CHAN_FHSS(flags) \
+ ((flags & IEEE80211_CHAN_FHSS) == IEEE80211_CHAN_FHSS)
+#define IS_CHAN_A(flags) \
+ ((flags & IEEE80211_CHAN_A) == IEEE80211_CHAN_A)
+#define IS_CHAN_B(flags) \
+ ((flags & IEEE80211_CHAN_B) == IEEE80211_CHAN_B)
+#define IS_CHAN_PUREG(flags) \
+ ((flags & IEEE80211_CHAN_PUREG) == IEEE80211_CHAN_PUREG)
+#define IS_CHAN_G(flags) \
+ ((flags & IEEE80211_CHAN_G) == IEEE80211_CHAN_G)
+#define IS_CHAN_ANYG(flags) \
+ (IS_CHAN_PUREG(flags) || IS_CHAN_G(flags))
+
+static void
+print_chaninfo(netdissect_options *ndo,
+ int freq, int flags)
+{
+ ND_PRINT((ndo, "%u MHz", freq));
+ if (IS_CHAN_FHSS(flags))
+ ND_PRINT((ndo, " FHSS"));
+ if (IS_CHAN_A(flags)) {
+ if (flags & IEEE80211_CHAN_HALF)
+ ND_PRINT((ndo, " 11a/10Mhz"));
+ else if (flags & IEEE80211_CHAN_QUARTER)
+ ND_PRINT((ndo, " 11a/5Mhz"));
+ else
+ ND_PRINT((ndo, " 11a"));
+ }
+ if (IS_CHAN_ANYG(flags)) {
+ if (flags & IEEE80211_CHAN_HALF)
+ ND_PRINT((ndo, " 11g/10Mhz"));
+ else if (flags & IEEE80211_CHAN_QUARTER)
+ ND_PRINT((ndo, " 11g/5Mhz"));
+ else
+ ND_PRINT((ndo, " 11g"));
+ } else if (IS_CHAN_B(flags))
+ ND_PRINT((ndo, " 11b"));
+ if (flags & IEEE80211_CHAN_TURBO)
+ ND_PRINT((ndo, " Turbo"));
+ if (flags & IEEE80211_CHAN_HT20)
+ ND_PRINT((ndo, " ht/20"));
+ else if (flags & IEEE80211_CHAN_HT40D)
+ ND_PRINT((ndo, " ht/40-"));
+ else if (flags & IEEE80211_CHAN_HT40U)
+ ND_PRINT((ndo, " ht/40+"));
+ ND_PRINT((ndo, " "));
+}
+
+static int
+print_radiotap_field(netdissect_options *ndo,
+ struct cpack_state *s, uint32_t bit, uint8_t *flags,
+ struct radiotap_state *state, uint32_t presentflags)
+{
+ union {
+ int8_t i8;
+ uint8_t u8;
+ int16_t i16;
+ uint16_t u16;
+ uint32_t u32;
+ uint64_t u64;
+ } u, u2, u3, u4;
+ int rc;
+
+ 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:
+ rc = cpack_uint8(s, &u.u8);
+ break;
+ case IEEE80211_RADIOTAP_DBM_ANTSIGNAL:
+ case IEEE80211_RADIOTAP_DBM_ANTNOISE:
+ rc = cpack_int8(s, &u.i8);
+ break;
+ case IEEE80211_RADIOTAP_CHANNEL:
+ rc = cpack_uint16(s, &u.u16);
+ if (rc != 0)
+ break;
+ rc = cpack_uint16(s, &u2.u16);
+ break;
+ 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:
+ rc = cpack_uint8(s, &u.u8);
+ break;
+ case IEEE80211_RADIOTAP_DBM_TX_POWER:
+ rc = cpack_int8(s, &u.i8);
+ break;
+ case IEEE80211_RADIOTAP_TSFT:
+ rc = cpack_uint64(s, &u.u64);
+ break;
+ case IEEE80211_RADIOTAP_XCHANNEL:
+ rc = cpack_uint32(s, &u.u32);
+ if (rc != 0)
+ break;
+ rc = cpack_uint16(s, &u2.u16);
+ if (rc != 0)
+ break;
+ rc = cpack_uint8(s, &u3.u8);
+ if (rc != 0)
+ 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: {
+ uint8_t vns[3];
+ uint16_t length;
+ uint8_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
+ * proceed. Just print the bit number.
+ */
+ ND_PRINT((ndo, "[bit %u] ", bit));
+ return -1;
+ }
+
+ if (rc != 0) {
+ ND_PRINT((ndo, "%s", tstr));
+ 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(ndo, u.u16, u2.u16);
+ break;
+ case IEEE80211_RADIOTAP_FHSS:
+ ND_PRINT((ndo, "fhset %d fhpat %d ", u.u16 & 0xff, (u.u16 >> 8) & 0xff));
+ break;
+ case IEEE80211_RADIOTAP_RATE:
+ /*
+ * 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?
+ */
+ ND_PRINT((ndo, "MCS %u ", u.u8 & 0x7f));
+ } else
+ ND_PRINT((ndo, "%2.1f Mb/s ", .5 * u.u8));
+ break;
+ case IEEE80211_RADIOTAP_DBM_ANTSIGNAL:
+ ND_PRINT((ndo, "%ddB signal ", u.i8));
+ break;
+ case IEEE80211_RADIOTAP_DBM_ANTNOISE:
+ ND_PRINT((ndo, "%ddB noise ", u.i8));
+ break;
+ case IEEE80211_RADIOTAP_DB_ANTSIGNAL:
+ ND_PRINT((ndo, "%ddB signal ", u.u8));
+ break;
+ case IEEE80211_RADIOTAP_DB_ANTNOISE:
+ ND_PRINT((ndo, "%ddB noise ", u.u8));
+ break;
+ case IEEE80211_RADIOTAP_LOCK_QUALITY:
+ ND_PRINT((ndo, "%u sq ", u.u16));
+ break;
+ case IEEE80211_RADIOTAP_TX_ATTENUATION:
+ ND_PRINT((ndo, "%d tx power ", -(int)u.u16));
+ break;
+ case IEEE80211_RADIOTAP_DB_TX_ATTENUATION:
+ ND_PRINT((ndo, "%ddB tx power ", -(int)u.u8));
+ break;
+ case IEEE80211_RADIOTAP_DBM_TX_POWER:
+ ND_PRINT((ndo, "%ddBm tx power ", u.i8));
+ break;
+ case IEEE80211_RADIOTAP_FLAGS:
+ if (u.u8 & IEEE80211_RADIOTAP_F_CFP)
+ ND_PRINT((ndo, "cfp "));
+ if (u.u8 & IEEE80211_RADIOTAP_F_SHORTPRE)
+ ND_PRINT((ndo, "short preamble "));
+ if (u.u8 & IEEE80211_RADIOTAP_F_WEP)
+ ND_PRINT((ndo, "wep "));
+ if (u.u8 & IEEE80211_RADIOTAP_F_FRAG)
+ ND_PRINT((ndo, "fragmented "));
+ if (u.u8 & IEEE80211_RADIOTAP_F_BADFCS)
+ ND_PRINT((ndo, "bad-fcs "));
+ break;
+ case IEEE80211_RADIOTAP_ANTENNA:
+ ND_PRINT((ndo, "antenna %d ", u.u8));
+ break;
+ case IEEE80211_RADIOTAP_TSFT:
+ ND_PRINT((ndo, "%" PRIu64 "us tsft ", u.u64));
+ break;
+ case IEEE80211_RADIOTAP_RX_FLAGS:
+ /* Do nothing for now */
+ break;
+ case IEEE80211_RADIOTAP_XCHANNEL:
+ print_chaninfo(ndo, 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.
+ */
+ ND_PRINT((ndo, "%.1f Mb/s MCS %u ", htrate, u3.u8));
+ } else {
+ /*
+ * We at least have the MCS index.
+ * Print it.
+ */
+ ND_PRINT((ndo, "MCS %u ", u3.u8));
+ }
+ }
+ if (u.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_KNOWN) {
+ ND_PRINT((ndo, "%s ",
+ bandwidth[u2.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_MASK]));
+ }
+ if (u.u8 & IEEE80211_RADIOTAP_MCS_GUARD_INTERVAL_KNOWN) {
+ ND_PRINT((ndo, "%s GI ",
+ (u2.u8 & IEEE80211_RADIOTAP_MCS_SHORT_GI) ?
+ "short" : "lon"));
+ }
+ if (u.u8 & IEEE80211_RADIOTAP_MCS_HT_FORMAT_KNOWN) {
+ ND_PRINT((ndo, "%s ",
+ (u2.u8 & IEEE80211_RADIOTAP_MCS_HT_GREENFIELD) ?
+ "greenfield" : "mixed"));
+ }
+ if (u.u8 & IEEE80211_RADIOTAP_MCS_FEC_TYPE_KNOWN) {
+ ND_PRINT((ndo, "%s FEC ",
+ (u2.u8 & IEEE80211_RADIOTAP_MCS_FEC_LDPC) ?
+ "LDPC" : "BCC"));
+ }
+ if (u.u8 & IEEE80211_RADIOTAP_MCS_STBC_KNOWN) {
+ ND_PRINT((ndo, "RX-STBC%u ",
+ (u2.u8 & IEEE80211_RADIOTAP_MCS_STBC_MASK) >> IEEE80211_RADIOTAP_MCS_STBC_SHIFT));
+ }
+
+ break;
+ }
+ }
+ return 0;
+}
+
+static u_int
+ieee802_11_radio_print(netdissect_options *ndo,
+ const u_char *p, u_int length, u_int caplen)
+{
+#define BITNO_32(x) (((x) >> 16) ? 16 + BITNO_16((x) >> 16) : BITNO_16((x)))
+#define BITNO_16(x) (((x) >> 8) ? 8 + BITNO_8((x) >> 8) : BITNO_8((x)))
+#define BITNO_8(x) (((x) >> 4) ? 4 + BITNO_4((x) >> 4) : BITNO_4((x)))
+#define BITNO_4(x) (((x) >> 2) ? 2 + BITNO_2((x) >> 2) : BITNO_2((x)))
+#define BITNO_2(x) (((x) & 2) ? 1 : 0)
+#define BIT(n) (1U << n)
+#define IS_EXTENDED(__p) \
+ (EXTRACT_LE_32BITS(__p) & BIT(IEEE80211_RADIOTAP_EXT)) != 0
+
+ struct cpack_state cpacker;
+ struct ieee80211_radiotap_header *hdr;
+ uint32_t present, next_present;
+ uint32_t presentflags = 0;
+ uint32_t *presentp, *last_presentp;
+ enum ieee80211_radiotap_type bit;
+ int bit0;
+ u_int len;
+ uint8_t flags;
+ int pad;
+ u_int fcslen;
+ struct radiotap_state state;
+
+ if (caplen < sizeof(*hdr)) {
+ ND_PRINT((ndo, "%s", tstr));
+ return caplen;
+ }
+
+ hdr = (struct ieee80211_radiotap_header *)p;
+
+ len = EXTRACT_LE_16BITS(&hdr->it_len);
+
+ if (caplen < len) {
+ ND_PRINT((ndo, "%s", tstr));
+ return caplen;
+ }
+ cpack_init(&cpacker, (uint8_t *)hdr, len); /* align against header start */
+ cpack_advance(&cpacker, sizeof(*hdr)); /* includes the 1st bitmap */
+ for (last_presentp = &hdr->it_present;
+ IS_EXTENDED(last_presentp) &&
+ (u_char*)(last_presentp + 1) <= p + len;
+ last_presentp++)
+ cpack_advance(&cpacker, sizeof(hdr->it_present)); /* more bitmaps */
+
+ /* are there more bitmap extensions than bytes in header? */
+ if (IS_EXTENDED(last_presentp)) {
+ ND_PRINT((ndo, "%s", tstr));
+ return caplen;
+ }
+
+ /* Assume no flags */
+ flags = 0;
+ /* Assume no Atheros padding between 802.11 header and body */
+ pad = 0;
+ /* Assume no FCS at end of frame */
+ 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 */
+ next_present = present & (present - 1);
+
+ /* extract the least significant bit that is set */
+ bit = (enum ieee80211_radiotap_type)
+ (bit0 + BITNO_32(present ^ next_present));
+
+ if (print_radiotap_field(ndo, &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 */
+ return len + ieee802_11_print(ndo, p + len, length - len, caplen - len, pad,
+ fcslen);
+#undef BITNO_32
+#undef BITNO_16
+#undef BITNO_8
+#undef BITNO_4
+#undef BITNO_2
+#undef BIT
+}
+
+static u_int
+ieee802_11_avs_radio_print(netdissect_options *ndo,
+ const u_char *p, u_int length, u_int caplen)
+{
+ uint32_t caphdr_len;
+
+ if (caplen < 8) {
+ ND_PRINT((ndo, "%s", tstr));
+ return caplen;
+ }
+
+ caphdr_len = EXTRACT_32BITS(p + 4);
+ if (caphdr_len < 8) {
+ /*
+ * Yow! The capture header length is claimed not
+ * to be large enough to include even the version
+ * cookie or capture header length!
+ */
+ ND_PRINT((ndo, "%s", tstr));
+ return caplen;
+ }
+
+ if (caplen < caphdr_len) {
+ ND_PRINT((ndo, "%s", tstr));
+ return caplen;
+ }
+
+ return caphdr_len + ieee802_11_print(ndo, p + caphdr_len,
+ length - caphdr_len, caplen - caphdr_len, 0, 0);
+}
+
+#define PRISM_HDR_LEN 144
+
+#define WLANCAP_MAGIC_COOKIE_BASE 0x80211000
+#define WLANCAP_MAGIC_COOKIE_V1 0x80211001
+#define WLANCAP_MAGIC_COOKIE_V2 0x80211002
+
+/*
+ * For DLT_PRISM_HEADER; like DLT_IEEE802_11, but with an extra header,
+ * containing information such as radio information, which we
+ * currently ignore.
+ *
+ * If, however, the packet begins with WLANCAP_MAGIC_COOKIE_V1 or
+ * WLANCAP_MAGIC_COOKIE_V2, it's really DLT_IEEE802_11_RADIO_AVS
+ * (currently, on Linux, there's no ARPHRD_ type for
+ * DLT_IEEE802_11_RADIO_AVS, as there is a ARPHRD_IEEE80211_PRISM
+ * for DLT_PRISM_HEADER, so ARPHRD_IEEE80211_PRISM is used for
+ * the AVS header, and the first 4 bytes of the header are used to
+ * indicate whether it's a Prism header or an AVS header).
+ */
+u_int
+prism_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int caplen = h->caplen;
+ u_int length = h->len;
+ uint32_t msgcode;
+
+ if (caplen < 4) {
+ ND_PRINT((ndo, "%s", tstr));
+ return caplen;
+ }
+
+ msgcode = EXTRACT_32BITS(p);
+ if (msgcode == WLANCAP_MAGIC_COOKIE_V1 ||
+ msgcode == WLANCAP_MAGIC_COOKIE_V2)
+ return ieee802_11_avs_radio_print(ndo, p, length, caplen);
+
+ if (caplen < PRISM_HDR_LEN) {
+ ND_PRINT((ndo, "%s", tstr));
+ return caplen;
+ }
+
+ return PRISM_HDR_LEN + ieee802_11_print(ndo, p + PRISM_HDR_LEN,
+ length - PRISM_HDR_LEN, caplen - PRISM_HDR_LEN, 0, 0);
+}
+
+/*
+ * For DLT_IEEE802_11_RADIO; like DLT_IEEE802_11, but with an extra
+ * header, containing information such as radio information.
+ */
+u_int
+ieee802_11_radio_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, const u_char *p)
+{
+ return ieee802_11_radio_print(ndo, p, h->len, h->caplen);
+}
+
+/*
+ * For DLT_IEEE802_11_RADIO_AVS; like DLT_IEEE802_11, but with an
+ * extra header, containing information such as radio information,
+ * which we currently ignore.
+ */
+u_int
+ieee802_11_radio_avs_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, const u_char *p)
+{
+ return ieee802_11_avs_radio_print(ndo, p, h->len, h->caplen);
+}
--- /dev/null
+/*
+ * 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.
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.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(uint16_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(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int caplen = h->caplen;
+ int hdrlen;
+ uint16_t fc;
+ uint8_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 (ndo->ndo_vflag)
+ ND_PRINT((ndo,"seq %02x ", seq));
+ if (hdrlen == -1) {
+ ND_PRINT((ndo,"malformed! "));
+ return caplen;
+ }
+
+
+ if (!ndo->ndo_vflag) {
+ p+= hdrlen;
+ caplen -= hdrlen;
+ } else {
+ uint16_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 (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+
+ return 0;
+}
--- /dev/null
+/* NetBSD: print-ah.c,v 1.4 1996/05/20 00:41:16 fvdl Exp */
+
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ah.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "ah.h"
+
+#include "interface.h"
+#include "extract.h"
+
+int
+ah_print(netdissect_options *ndo, register const u_char *bp)
+{
+ register const struct ah *ah;
+ register const u_char *ep;
+ int sumlen;
+ uint32_t spi;
+
+ ah = (const struct ah *)bp;
+ ep = ndo->ndo_snapend; /* 'ep' points to the end of available data. */
+
+ ND_TCHECK(*ah);
+
+ sumlen = ah->ah_len << 2;
+ spi = EXTRACT_32BITS(&ah->ah_spi);
+
+ ND_PRINT((ndo, "AH(spi=0x%08x", spi));
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, ",sumlen=%d", sumlen));
+ ND_PRINT((ndo, ",seq=0x%x", EXTRACT_32BITS(ah + 1)));
+ if (bp + sizeof(struct ah) + sumlen > ep)
+ ND_PRINT((ndo, "[truncated]"));
+ ND_PRINT((ndo, "): "));
+
+ return sizeof(struct ah) + sumlen;
+ trunc:
+ ND_PRINT((ndo, "[|AH]"));
+ return -1;
+}
--- /dev/null
+/*
+ * This module implements decoding of AHCP (Ad Hoc Configuration Protocol) based
+ * on draft-chroboczek-ahcp-00 and source code of ahcpd-0.53.
+ *
+ *
+ * Copyright (c) 2013 The TCPDUMP 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
+ * COPYRIGHT HOLDER 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ahcp.c,v 1.3 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+static const char tstr[] = " [|ahcp]";
+static const char cstr[] = "(corrupt)";
+
+#define AHCP_MAGIC_NUMBER 43
+#define AHCP_VERSION_1 1
+#define AHCP1_HEADER_FIX_LEN 24
+#define AHCP1_BODY_MIN_LEN 4
+
+#define AHCP1_MSG_DISCOVER 0
+#define AHCP1_MSG_OFFER 1
+#define AHCP1_MSG_REQUEST 2
+#define AHCP1_MSG_ACK 3
+#define AHCP1_MSG_NACK 4
+#define AHCP1_MSG_RELEASE 5
+
+static const struct tok ahcp1_msg_str[] = {
+ { AHCP1_MSG_DISCOVER, "Discover" },
+ { AHCP1_MSG_OFFER, "Offer" },
+ { AHCP1_MSG_REQUEST, "Request" },
+ { AHCP1_MSG_ACK, "Ack" },
+ { AHCP1_MSG_NACK, "Nack" },
+ { AHCP1_MSG_RELEASE, "Release" },
+ { 0, NULL }
+};
+
+#define AHCP1_OPT_PAD 0
+#define AHCP1_OPT_MANDATORY 1
+#define AHCP1_OPT_ORIGIN_TIME 2
+#define AHCP1_OPT_EXPIRES 3
+#define AHCP1_OPT_MY_IPV6_ADDRESS 4
+#define AHCP1_OPT_MY_IPV4_ADDRESS 5
+#define AHCP1_OPT_IPV6_PREFIX 6
+#define AHCP1_OPT_IPV4_PREFIX 7
+#define AHCP1_OPT_IPV6_ADDRESS 8
+#define AHCP1_OPT_IPV4_ADDRESS 9
+#define AHCP1_OPT_IPV6_PREFIX_DELEGATION 10
+#define AHCP1_OPT_IPV4_PREFIX_DELEGATION 11
+#define AHCP1_OPT_NAME_SERVER 12
+#define AHCP1_OPT_NTP_SERVER 13
+#define AHCP1_OPT_MAX 13
+
+static const struct tok ahcp1_opt_str[] = {
+ { AHCP1_OPT_PAD, "Pad" },
+ { AHCP1_OPT_MANDATORY, "Mandatory" },
+ { AHCP1_OPT_ORIGIN_TIME, "Origin Time" },
+ { AHCP1_OPT_EXPIRES, "Expires" },
+ { AHCP1_OPT_MY_IPV6_ADDRESS, "My-IPv6-Address" },
+ { AHCP1_OPT_MY_IPV4_ADDRESS, "My-IPv4-Address" },
+ { AHCP1_OPT_IPV6_PREFIX, "IPv6 Prefix" },
+ { AHCP1_OPT_IPV4_PREFIX, "IPv4 Prefix" },
+ { AHCP1_OPT_IPV6_ADDRESS, "IPv6 Address" },
+ { AHCP1_OPT_IPV4_ADDRESS, "IPv4 Address" },
+ { AHCP1_OPT_IPV6_PREFIX_DELEGATION, "IPv6 Prefix Delegation" },
+ { AHCP1_OPT_IPV4_PREFIX_DELEGATION, "IPv4 Prefix Delegation" },
+ { AHCP1_OPT_NAME_SERVER, "Name Server" },
+ { AHCP1_OPT_NTP_SERVER, "NTP Server" },
+ { 0, NULL }
+};
+
+static int
+ahcp_time_print(netdissect_options *ndo, const u_char *cp, const u_char *ep)
+{
+ time_t t;
+ struct tm *tm;
+ char buf[BUFSIZE];
+
+ if (cp + 4 != ep)
+ goto corrupt;
+ ND_TCHECK2(*cp, 4);
+ t = EXTRACT_32BITS(cp);
+ if (NULL == (tm = gmtime(&t)))
+ ND_PRINT((ndo, ": gmtime() error"));
+ else if (0 == strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm))
+ ND_PRINT((ndo, ": strftime() error"));
+ else
+ ND_PRINT((ndo, ": %s UTC", buf));
+ return 0;
+
+corrupt:
+ ND_PRINT((ndo, ": %s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return 0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+ahcp_seconds_print(netdissect_options *ndo, const u_char *cp, const u_char *ep)
+{
+ if (cp + 4 != ep)
+ goto corrupt;
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ": %us", EXTRACT_32BITS(cp)));
+ return 0;
+
+corrupt:
+ ND_PRINT((ndo, ": %s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return 0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+ahcp_ipv6_addresses_print(netdissect_options *ndo, const u_char *cp, const u_char *ep)
+{
+ const char *sep = ": ";
+
+ while (cp < ep) {
+ if (cp + 16 > ep)
+ goto corrupt;
+ ND_TCHECK2(*cp, 16);
+#ifdef INET6
+ ND_PRINT((ndo, "%s%s", sep, ip6addr_string(ndo, cp)));
+#else
+ ND_PRINT((ndo, "%s(compiled w/o IPv6)", sep));
+#endif /* INET6 */
+ cp += 16;
+ sep = ", ";
+ }
+ return 0;
+
+corrupt:
+ ND_PRINT((ndo, ": %s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return 0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+ahcp_ipv4_addresses_print(netdissect_options *ndo, const u_char *cp, const u_char *ep)
+{
+ const char *sep = ": ";
+
+ while (cp < ep) {
+ if (cp + 4 > ep)
+ goto corrupt;
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "%s%s", sep, ipaddr_string(ndo, cp)));
+ cp += 4;
+ sep = ", ";
+ }
+ return 0;
+
+corrupt:
+ ND_PRINT((ndo, ": %s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return 0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+ahcp_ipv6_prefixes_print(netdissect_options *ndo, const u_char *cp, const u_char *ep)
+{
+ const char *sep = ": ";
+
+ while (cp < ep) {
+ if (cp + 17 > ep)
+ goto corrupt;
+ ND_TCHECK2(*cp, 17);
+#ifdef INET6
+ ND_PRINT((ndo, "%s%s/%u", sep, ip6addr_string(ndo, cp), *(cp + 16)));
+#else
+ ND_PRINT((ndo, "%s(compiled w/o IPv6)/%u", sep, *(cp + 16)));
+#endif /* INET6 */
+ cp += 17;
+ sep = ", ";
+ }
+ return 0;
+
+corrupt:
+ ND_PRINT((ndo, ": %s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return 0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+ahcp_ipv4_prefixes_print(netdissect_options *ndo, const u_char *cp, const u_char *ep)
+{
+ const char *sep = ": ";
+
+ while (cp < ep) {
+ if (cp + 5 > ep)
+ goto corrupt;
+ ND_TCHECK2(*cp, 5);
+ ND_PRINT((ndo, "%s%s/%u", sep, ipaddr_string(ndo, cp), *(cp + 4)));
+ cp += 5;
+ sep = ", ";
+ }
+ return 0;
+
+corrupt:
+ ND_PRINT((ndo, ": %s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return 0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+/* Data decoders signal truncated data with -1. */
+static int
+(* const data_decoders[AHCP1_OPT_MAX + 1])(netdissect_options *, const u_char *, const u_char *) = {
+ /* [AHCP1_OPT_PAD] = */ NULL,
+ /* [AHCP1_OPT_MANDATORY] = */ NULL,
+ /* [AHCP1_OPT_ORIGIN_TIME] = */ ahcp_time_print,
+ /* [AHCP1_OPT_EXPIRES] = */ ahcp_seconds_print,
+ /* [AHCP1_OPT_MY_IPV6_ADDRESS] = */ ahcp_ipv6_addresses_print,
+ /* [AHCP1_OPT_MY_IPV4_ADDRESS] = */ ahcp_ipv4_addresses_print,
+ /* [AHCP1_OPT_IPV6_PREFIX] = */ ahcp_ipv6_prefixes_print,
+ /* [AHCP1_OPT_IPV4_PREFIX] = */ NULL,
+ /* [AHCP1_OPT_IPV6_ADDRESS] = */ ahcp_ipv6_addresses_print,
+ /* [AHCP1_OPT_IPV4_ADDRESS] = */ ahcp_ipv4_addresses_print,
+ /* [AHCP1_OPT_IPV6_PREFIX_DELEGATION] = */ ahcp_ipv6_prefixes_print,
+ /* [AHCP1_OPT_IPV4_PREFIX_DELEGATION] = */ ahcp_ipv4_prefixes_print,
+ /* [AHCP1_OPT_NAME_SERVER] = */ ahcp_ipv6_addresses_print,
+ /* [AHCP1_OPT_NTP_SERVER] = */ ahcp_ipv6_addresses_print,
+};
+
+static void
+ahcp1_options_print(netdissect_options *ndo, const u_char *cp, const u_char *ep)
+{
+ uint8_t option_no, option_len;
+
+ while (cp < ep) {
+ /* Option no */
+ ND_TCHECK2(*cp, 1);
+ option_no = *cp;
+ cp += 1;
+ ND_PRINT((ndo, "\n\t %s", tok2str(ahcp1_opt_str, "Unknown-%u", option_no)));
+ if (option_no == AHCP1_OPT_PAD || option_no == AHCP1_OPT_MANDATORY)
+ continue;
+ /* Length */
+ if (cp + 1 > ep)
+ goto corrupt;
+ ND_TCHECK2(*cp, 1);
+ option_len = *cp;
+ cp += 1;
+ if (cp + option_len > ep)
+ goto corrupt;
+ /* Value */
+ if (option_no <= AHCP1_OPT_MAX && data_decoders[option_no] != NULL) {
+ if (data_decoders[option_no](ndo, cp, cp + option_len) < 0)
+ break; /* truncated and already marked up */
+ } else {
+ ND_PRINT((ndo, " (Length %u)", option_len));
+ ND_TCHECK2(*cp, option_len);
+ }
+ cp += option_len;
+ }
+ return;
+
+corrupt:
+ ND_PRINT((ndo, " %s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+ahcp1_body_print(netdissect_options *ndo, const u_char *cp, const u_char *ep)
+{
+ uint8_t type, mbz;
+ uint16_t body_len;
+
+ if (cp + AHCP1_BODY_MIN_LEN > ep)
+ goto corrupt;
+ /* Type */
+ ND_TCHECK2(*cp, 1);
+ type = *cp;
+ cp += 1;
+ /* MBZ */
+ ND_TCHECK2(*cp, 1);
+ mbz = *cp;
+ cp += 1;
+ /* Length */
+ ND_TCHECK2(*cp, 2);
+ body_len = EXTRACT_16BITS(cp);
+ cp += 2;
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "\n\t%s", tok2str(ahcp1_msg_str, "Unknown-%u", type)));
+ if (mbz != 0)
+ ND_PRINT((ndo, ", MBZ %u", mbz));
+ ND_PRINT((ndo, ", Length %u", body_len));
+ }
+ if (cp + body_len > ep)
+ goto corrupt;
+
+ /* Options */
+ if (ndo->ndo_vflag >= 2)
+ ahcp1_options_print(ndo, cp, cp + body_len); /* not ep (ignore extra data) */
+ else
+ ND_TCHECK2(*cp, body_len);
+ return;
+
+corrupt:
+ ND_PRINT((ndo, " %s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+void
+ahcp_print(netdissect_options *ndo, const u_char *cp, const u_int len)
+{
+ const u_char *ep = cp + len;
+ uint8_t version;
+
+ ND_PRINT((ndo, "AHCP"));
+ if (len < 2)
+ goto corrupt;
+ /* Magic */
+ ND_TCHECK2(*cp, 1);
+ if (*cp != AHCP_MAGIC_NUMBER)
+ goto corrupt;
+ cp += 1;
+ /* Version */
+ ND_TCHECK2(*cp, 1);
+ version = *cp;
+ cp += 1;
+ switch (version) {
+ case AHCP_VERSION_1: {
+ ND_PRINT((ndo, " Version 1"));
+ if (len < AHCP1_HEADER_FIX_LEN)
+ goto corrupt;
+ if (!ndo->ndo_vflag) {
+ ND_TCHECK2(*cp, AHCP1_HEADER_FIX_LEN - 2);
+ cp += AHCP1_HEADER_FIX_LEN - 2;
+ } else {
+ /* Hopcount */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, "\n\tHopcount %u", *cp));
+ cp += 1;
+ /* Original Hopcount */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", Original Hopcount %u", *cp));
+ cp += 1;
+ /* Nonce */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", Nonce 0x%08x", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* Source Id */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", Source Id %s", linkaddr_string(ndo, cp, 0, 8)));
+ cp += 8;
+ /* Destination Id */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", Destination Id %s", linkaddr_string(ndo, cp, 0, 8)));
+ cp += 8;
+ }
+ /* Body */
+ ahcp1_body_print(ndo, cp, ep);
+ break;
+ }
+ default:
+ ND_PRINT((ndo, " Version %u (unknown)", version));
+ break;
+ }
+ return;
+
+corrupt:
+ ND_PRINT((ndo, " %s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
--- /dev/null
+/*
+ * Copyright (c) 2003 Bruce M. Simpson <bms@spc.org>
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Bruce M. Simpson.
+ * 4. Neither the name of Bruce M. Simpson nor the names of co-
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Bruce M. Simpson 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 Bruce M. Simpson 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-aodv.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+
+
+struct aodv_rreq {
+ uint8_t rreq_type; /* AODV message type (1) */
+ uint8_t rreq_flags; /* various flags */
+ uint8_t rreq_zero0; /* reserved, set to zero */
+ uint8_t rreq_hops; /* number of hops from originator */
+ uint32_t rreq_id; /* request ID */
+ uint32_t rreq_da; /* destination IPv4 address */
+ uint32_t rreq_ds; /* destination sequence number */
+ uint32_t rreq_oa; /* originator IPv4 address */
+ uint32_t rreq_os; /* originator sequence number */
+};
+#ifdef INET6
+struct aodv_rreq6 {
+ uint8_t rreq_type; /* AODV message type (1) */
+ uint8_t rreq_flags; /* various flags */
+ uint8_t rreq_zero0; /* reserved, set to zero */
+ uint8_t rreq_hops; /* number of hops from originator */
+ uint32_t rreq_id; /* request ID */
+ struct in6_addr rreq_da; /* destination IPv6 address */
+ uint32_t rreq_ds; /* destination sequence number */
+ struct in6_addr rreq_oa; /* originator IPv6 address */
+ uint32_t rreq_os; /* originator sequence number */
+};
+struct aodv_rreq6_draft_01 {
+ uint8_t rreq_type; /* AODV message type (16) */
+ uint8_t rreq_flags; /* various flags */
+ uint8_t rreq_zero0; /* reserved, set to zero */
+ uint8_t rreq_hops; /* number of hops from originator */
+ uint32_t rreq_id; /* request ID */
+ uint32_t rreq_ds; /* destination sequence number */
+ uint32_t rreq_os; /* originator sequence number */
+ struct in6_addr rreq_da; /* destination IPv6 address */
+ struct in6_addr rreq_oa; /* originator IPv6 address */
+};
+#endif
+
+#define RREQ_JOIN 0x80 /* join (reserved for multicast */
+#define RREQ_REPAIR 0x40 /* repair (reserved for multicast */
+#define RREQ_GRAT 0x20 /* gratuitous RREP */
+#define RREQ_DEST 0x10 /* destination only */
+#define RREQ_UNKNOWN 0x08 /* unknown destination sequence num */
+#define RREQ_FLAGS_MASK 0xF8 /* mask for rreq_flags */
+
+struct aodv_rrep {
+ uint8_t rrep_type; /* AODV message type (2) */
+ uint8_t rrep_flags; /* various flags */
+ uint8_t rrep_ps; /* prefix size */
+ uint8_t rrep_hops; /* number of hops from o to d */
+ uint32_t rrep_da; /* destination IPv4 address */
+ uint32_t rrep_ds; /* destination sequence number */
+ uint32_t rrep_oa; /* originator IPv4 address */
+ uint32_t rrep_life; /* lifetime of this route */
+};
+#ifdef INET6
+struct aodv_rrep6 {
+ uint8_t rrep_type; /* AODV message type (2) */
+ uint8_t rrep_flags; /* various flags */
+ uint8_t rrep_ps; /* prefix size */
+ uint8_t rrep_hops; /* number of hops from o to d */
+ struct in6_addr rrep_da; /* destination IPv6 address */
+ uint32_t rrep_ds; /* destination sequence number */
+ struct in6_addr rrep_oa; /* originator IPv6 address */
+ uint32_t rrep_life; /* lifetime of this route */
+};
+struct aodv_rrep6_draft_01 {
+ uint8_t rrep_type; /* AODV message type (17) */
+ uint8_t rrep_flags; /* various flags */
+ uint8_t rrep_ps; /* prefix size */
+ uint8_t rrep_hops; /* number of hops from o to d */
+ uint32_t rrep_ds; /* destination sequence number */
+ struct in6_addr rrep_da; /* destination IPv6 address */
+ struct in6_addr rrep_oa; /* originator IPv6 address */
+ uint32_t rrep_life; /* lifetime of this route */
+};
+#endif
+
+#define RREP_REPAIR 0x80 /* repair (reserved for multicast */
+#define RREP_ACK 0x40 /* acknowledgement required */
+#define RREP_FLAGS_MASK 0xC0 /* mask for rrep_flags */
+#define RREP_PREFIX_MASK 0x1F /* mask for prefix size */
+
+struct rerr_unreach {
+ uint32_t u_da; /* IPv4 address */
+ uint32_t u_ds; /* sequence number */
+};
+#ifdef INET6
+struct rerr_unreach6 {
+ struct in6_addr u_da; /* IPv6 address */
+ uint32_t u_ds; /* sequence number */
+};
+struct rerr_unreach6_draft_01 {
+ struct in6_addr u_da; /* IPv6 address */
+ uint32_t u_ds; /* sequence number */
+};
+#endif
+
+struct aodv_rerr {
+ uint8_t rerr_type; /* AODV message type (3 or 18) */
+ uint8_t rerr_flags; /* various flags */
+ uint8_t rerr_zero0; /* reserved, set to zero */
+ uint8_t rerr_dc; /* destination count */
+};
+
+#define RERR_NODELETE 0x80 /* don't delete the link */
+#define RERR_FLAGS_MASK 0x80 /* mask for rerr_flags */
+
+struct aodv_rrep_ack {
+ uint8_t ra_type;
+ uint8_t ra_zero0;
+};
+
+#define AODV_RREQ 1 /* route request */
+#define AODV_RREP 2 /* route response */
+#define AODV_RERR 3 /* error report */
+#define AODV_RREP_ACK 4 /* route response acknowledgement */
+
+#define AODV_V6_DRAFT_01_RREQ 16 /* IPv6 route request */
+#define AODV_V6_DRAFT_01_RREP 17 /* IPv6 route response */
+#define AODV_V6_DRAFT_01_RERR 18 /* IPv6 error report */
+#define AODV_V6_DRAFT_01_RREP_ACK 19 /* IPV6 route response acknowledgment */
+
+struct aodv_ext {
+ uint8_t type; /* extension type */
+ uint8_t length; /* extension length */
+};
+
+struct aodv_hello {
+ struct aodv_ext eh; /* extension header */
+ uint8_t interval[4]; /* expect my next hello in
+ * (n) ms
+ * NOTE: this is not aligned */
+};
+
+#define AODV_EXT_HELLO 1
+
+static void
+aodv_extension(netdissect_options *ndo,
+ const struct aodv_ext *ep, u_int length)
+{
+ const struct aodv_hello *ah;
+
+ switch (ep->type) {
+ case AODV_EXT_HELLO:
+ ah = (const struct aodv_hello *)(const void *)ep;
+ ND_TCHECK(*ah);
+ if (length < sizeof(struct aodv_hello))
+ goto trunc;
+ ND_PRINT((ndo, "\n\text HELLO %ld ms",
+ (unsigned long)EXTRACT_32BITS(&ah->interval)));
+ break;
+
+ default:
+ ND_PRINT((ndo, "\n\text %u %u", ep->type, ep->length));
+ break;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|hello]"));
+}
+
+static void
+aodv_rreq(netdissect_options *ndo, const u_char *dat, u_int length)
+{
+ u_int i;
+ const struct aodv_rreq *ap = (const struct aodv_rreq *)dat;
+
+ ND_TCHECK(*ap);
+ if (length < sizeof(*ap))
+ goto trunc;
+ ND_PRINT((ndo, " rreq %u %s%s%s%s%shops %u id 0x%08lx\n"
+ "\tdst %s seq %lu src %s seq %lu", length,
+ ap->rreq_type & RREQ_JOIN ? "[J]" : "",
+ ap->rreq_type & RREQ_REPAIR ? "[R]" : "",
+ ap->rreq_type & RREQ_GRAT ? "[G]" : "",
+ ap->rreq_type & RREQ_DEST ? "[D]" : "",
+ ap->rreq_type & RREQ_UNKNOWN ? "[U] " : " ",
+ ap->rreq_hops,
+ (unsigned long)EXTRACT_32BITS(&ap->rreq_id),
+ ipaddr_string(ndo, &ap->rreq_da),
+ (unsigned long)EXTRACT_32BITS(&ap->rreq_ds),
+ ipaddr_string(ndo, &ap->rreq_oa),
+ (unsigned long)EXTRACT_32BITS(&ap->rreq_os)));
+ i = length - sizeof(*ap);
+ if (i >= sizeof(struct aodv_ext))
+ aodv_extension(ndo, (const struct aodv_ext *)(dat + sizeof(*ap)), i);
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|rreq"));
+}
+
+static void
+aodv_rrep(netdissect_options *ndo, const u_char *dat, u_int length)
+{
+ u_int i;
+ const struct aodv_rrep *ap = (const struct aodv_rrep *)dat;
+
+ ND_TCHECK(*ap);
+ if (length < sizeof(*ap))
+ goto trunc;
+ ND_PRINT((ndo, " rrep %u %s%sprefix %u hops %u\n"
+ "\tdst %s dseq %lu src %s %lu ms", length,
+ ap->rrep_type & RREP_REPAIR ? "[R]" : "",
+ ap->rrep_type & RREP_ACK ? "[A] " : " ",
+ ap->rrep_ps & RREP_PREFIX_MASK,
+ ap->rrep_hops,
+ ipaddr_string(ndo, &ap->rrep_da),
+ (unsigned long)EXTRACT_32BITS(&ap->rrep_ds),
+ ipaddr_string(ndo, &ap->rrep_oa),
+ (unsigned long)EXTRACT_32BITS(&ap->rrep_life)));
+ i = length - sizeof(*ap);
+ if (i >= sizeof(struct aodv_ext))
+ aodv_extension(ndo, (const struct aodv_ext *)(dat + sizeof(*ap)), i);
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|rreq"));
+}
+
+static void
+aodv_rerr(netdissect_options *ndo, const u_char *dat, u_int length)
+{
+ u_int i, dc;
+ const struct aodv_rerr *ap = (const struct aodv_rerr *)dat;
+ const struct rerr_unreach *dp;
+
+ ND_TCHECK(*ap);
+ if (length < sizeof(*ap))
+ goto trunc;
+ ND_PRINT((ndo, " rerr %s [items %u] [%u]:",
+ ap->rerr_flags & RERR_NODELETE ? "[D]" : "",
+ ap->rerr_dc, length));
+ dp = (struct rerr_unreach *)(dat + sizeof(*ap));
+ i = length - sizeof(*ap);
+ for (dc = ap->rerr_dc; dc != 0; dc--) {
+ ND_TCHECK(*dp);
+ if (i < sizeof(*dp))
+ goto trunc;
+ ND_PRINT((ndo, " {%s}(%ld)", ipaddr_string(ndo, &dp->u_da),
+ (unsigned long)EXTRACT_32BITS(&dp->u_ds)));
+ dp++;
+ i -= sizeof(*dp);
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|rerr]"));
+}
+
+static void
+#ifdef INET6
+aodv_v6_rreq(netdissect_options *ndo, const u_char *dat, u_int length)
+#else
+aodv_v6_rreq(netdissect_options *ndo, const u_char *dat _U_, u_int length)
+#endif
+{
+#ifdef INET6
+ u_int i;
+ const struct aodv_rreq6 *ap = (const struct aodv_rreq6 *)dat;
+
+ ND_TCHECK(*ap);
+ if (length < sizeof(*ap))
+ goto trunc;
+ ND_PRINT((ndo, " v6 rreq %u %s%s%s%s%shops %u id 0x%08lx\n"
+ "\tdst %s seq %lu src %s seq %lu", length,
+ ap->rreq_type & RREQ_JOIN ? "[J]" : "",
+ ap->rreq_type & RREQ_REPAIR ? "[R]" : "",
+ ap->rreq_type & RREQ_GRAT ? "[G]" : "",
+ ap->rreq_type & RREQ_DEST ? "[D]" : "",
+ ap->rreq_type & RREQ_UNKNOWN ? "[U] " : " ",
+ ap->rreq_hops,
+ (unsigned long)EXTRACT_32BITS(&ap->rreq_id),
+ ip6addr_string(ndo, &ap->rreq_da),
+ (unsigned long)EXTRACT_32BITS(&ap->rreq_ds),
+ ip6addr_string(ndo, &ap->rreq_oa),
+ (unsigned long)EXTRACT_32BITS(&ap->rreq_os)));
+ i = length - sizeof(*ap);
+ if (i >= sizeof(struct aodv_ext))
+ aodv_extension(ndo, (const struct aodv_ext *)(dat + sizeof(*ap)), i);
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|rreq"));
+#else
+ ND_PRINT((ndo, " v6 rreq %u", length));
+#endif
+}
+
+static void
+#ifdef INET6
+aodv_v6_rrep(netdissect_options *ndo, const u_char *dat, u_int length)
+#else
+aodv_v6_rrep(netdissect_options *ndo, const u_char *dat _U_, u_int length)
+#endif
+{
+#ifdef INET6
+ u_int i;
+ const struct aodv_rrep6 *ap = (const struct aodv_rrep6 *)dat;
+
+ ND_TCHECK(*ap);
+ if (length < sizeof(*ap))
+ goto trunc;
+ ND_PRINT((ndo, " rrep %u %s%sprefix %u hops %u\n"
+ "\tdst %s dseq %lu src %s %lu ms", length,
+ ap->rrep_type & RREP_REPAIR ? "[R]" : "",
+ ap->rrep_type & RREP_ACK ? "[A] " : " ",
+ ap->rrep_ps & RREP_PREFIX_MASK,
+ ap->rrep_hops,
+ ip6addr_string(ndo, &ap->rrep_da),
+ (unsigned long)EXTRACT_32BITS(&ap->rrep_ds),
+ ip6addr_string(ndo, &ap->rrep_oa),
+ (unsigned long)EXTRACT_32BITS(&ap->rrep_life)));
+ i = length - sizeof(*ap);
+ if (i >= sizeof(struct aodv_ext))
+ aodv_extension(ndo, (const struct aodv_ext *)(dat + sizeof(*ap)), i);
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|rreq"));
+#else
+ ND_PRINT((ndo, " rrep %u", length));
+#endif
+}
+
+static void
+#ifdef INET6
+aodv_v6_rerr(netdissect_options *ndo, const u_char *dat, u_int length)
+#else
+aodv_v6_rerr(netdissect_options *ndo, const u_char *dat _U_, u_int length)
+#endif
+{
+#ifdef INET6
+ u_int i, dc;
+ const struct aodv_rerr *ap = (const struct aodv_rerr *)dat;
+ const struct rerr_unreach6 *dp6;
+
+ ND_TCHECK(*ap);
+ if (length < sizeof(*ap))
+ goto trunc;
+ ND_PRINT((ndo, " rerr %s [items %u] [%u]:",
+ ap->rerr_flags & RERR_NODELETE ? "[D]" : "",
+ ap->rerr_dc, length));
+ dp6 = (struct rerr_unreach6 *)(void *)(ap + 1);
+ i = length - sizeof(*ap);
+ for (dc = ap->rerr_dc; dc != 0; dc--) {
+ ND_TCHECK(*dp6);
+ if (i < sizeof(*dp6))
+ goto trunc;
+ ND_PRINT((ndo, " {%s}(%ld)", ip6addr_string(ndo, &dp6->u_da),
+ (unsigned long)EXTRACT_32BITS(&dp6->u_ds)));
+ dp6++;
+ i -= sizeof(*dp6);
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|rerr]"));
+#else
+ ND_PRINT((ndo, " rerr %u", length));
+#endif
+}
+
+static void
+#ifdef INET6
+aodv_v6_draft_01_rreq(netdissect_options *ndo, const u_char *dat, u_int length)
+#else
+aodv_v6_draft_01_rreq(netdissect_options *ndo, const u_char *dat _U_, u_int length)
+#endif
+{
+#ifdef INET6
+ u_int i;
+ const struct aodv_rreq6_draft_01 *ap = (const struct aodv_rreq6_draft_01 *)dat;
+
+ ND_TCHECK(*ap);
+ if (length < sizeof(*ap))
+ goto trunc;
+ ND_PRINT((ndo, " rreq %u %s%s%s%s%shops %u id 0x%08lx\n"
+ "\tdst %s seq %lu src %s seq %lu", length,
+ ap->rreq_type & RREQ_JOIN ? "[J]" : "",
+ ap->rreq_type & RREQ_REPAIR ? "[R]" : "",
+ ap->rreq_type & RREQ_GRAT ? "[G]" : "",
+ ap->rreq_type & RREQ_DEST ? "[D]" : "",
+ ap->rreq_type & RREQ_UNKNOWN ? "[U] " : " ",
+ ap->rreq_hops,
+ (unsigned long)EXTRACT_32BITS(&ap->rreq_id),
+ ip6addr_string(ndo, &ap->rreq_da),
+ (unsigned long)EXTRACT_32BITS(&ap->rreq_ds),
+ ip6addr_string(ndo, &ap->rreq_oa),
+ (unsigned long)EXTRACT_32BITS(&ap->rreq_os)));
+ i = length - sizeof(*ap);
+ if (i >= sizeof(struct aodv_ext))
+ aodv_extension(ndo, (const struct aodv_ext *)(dat + sizeof(*ap)), i);
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|rreq"));
+#else
+ ND_PRINT((ndo, " rreq %u", length));
+#endif
+}
+
+static void
+#ifdef INET6
+aodv_v6_draft_01_rrep(netdissect_options *ndo, const u_char *dat, u_int length)
+#else
+aodv_v6_draft_01_rrep(netdissect_options *ndo, const u_char *dat _U_, u_int length)
+#endif
+{
+#ifdef INET6
+ u_int i;
+ const struct aodv_rrep6_draft_01 *ap = (const struct aodv_rrep6_draft_01 *)dat;
+
+ ND_TCHECK(*ap);
+ if (length < sizeof(*ap))
+ goto trunc;
+ ND_PRINT((ndo, " rrep %u %s%sprefix %u hops %u\n"
+ "\tdst %s dseq %lu src %s %lu ms", length,
+ ap->rrep_type & RREP_REPAIR ? "[R]" : "",
+ ap->rrep_type & RREP_ACK ? "[A] " : " ",
+ ap->rrep_ps & RREP_PREFIX_MASK,
+ ap->rrep_hops,
+ ip6addr_string(ndo, &ap->rrep_da),
+ (unsigned long)EXTRACT_32BITS(&ap->rrep_ds),
+ ip6addr_string(ndo, &ap->rrep_oa),
+ (unsigned long)EXTRACT_32BITS(&ap->rrep_life)));
+ i = length - sizeof(*ap);
+ if (i >= sizeof(struct aodv_ext))
+ aodv_extension(ndo, (const struct aodv_ext *)(dat + sizeof(*ap)), i);
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|rreq"));
+#else
+ ND_PRINT((ndo, " rrep %u", length));
+#endif
+}
+
+static void
+#ifdef INET6
+aodv_v6_draft_01_rerr(netdissect_options *ndo, const u_char *dat, u_int length)
+#else
+aodv_v6_draft_01_rerr(netdissect_options *ndo, const u_char *dat _U_, u_int length)
+#endif
+{
+#ifdef INET6
+ u_int i, dc;
+ const struct aodv_rerr *ap = (const struct aodv_rerr *)dat;
+ const struct rerr_unreach6_draft_01 *dp6;
+
+ ND_TCHECK(*ap);
+ if (length < sizeof(*ap))
+ goto trunc;
+ ND_PRINT((ndo, " rerr %s [items %u] [%u]:",
+ ap->rerr_flags & RERR_NODELETE ? "[D]" : "",
+ ap->rerr_dc, length));
+ dp6 = (struct rerr_unreach6_draft_01 *)(void *)(ap + 1);
+ i = length - sizeof(*ap);
+ for (dc = ap->rerr_dc; dc != 0; dc--) {
+ ND_TCHECK(*dp6);
+ if (i < sizeof(*dp6))
+ goto trunc;
+ ND_PRINT((ndo, " {%s}(%ld)", ip6addr_string(ndo, &dp6->u_da),
+ (unsigned long)EXTRACT_32BITS(&dp6->u_ds)));
+ dp6++;
+ i -= sizeof(*dp6);
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|rerr]"));
+#else
+ ND_PRINT((ndo, " rerr %u", length));
+#endif
+}
+
+void
+aodv_print(netdissect_options *ndo,
+ const u_char *dat, u_int length, int is_ip6)
+{
+ uint8_t msg_type;
+
+ /*
+ * The message type is the first byte; make sure we have it
+ * and then fetch it.
+ */
+ ND_TCHECK(*dat);
+ msg_type = *dat;
+ ND_PRINT((ndo, " aodv"));
+
+ switch (msg_type) {
+
+ case AODV_RREQ:
+ if (is_ip6)
+ aodv_v6_rreq(ndo, dat, length);
+ else
+ aodv_rreq(ndo, dat, length);
+ break;
+
+ case AODV_RREP:
+ if (is_ip6)
+ aodv_v6_rrep(ndo, dat, length);
+ else
+ aodv_rrep(ndo, dat, length);
+ break;
+
+ case AODV_RERR:
+ if (is_ip6)
+ aodv_v6_rerr(ndo, dat, length);
+ else
+ aodv_rerr(ndo, dat, length);
+ break;
+
+ case AODV_RREP_ACK:
+ ND_PRINT((ndo, " rrep-ack %u", length));
+ break;
+
+ case AODV_V6_DRAFT_01_RREQ:
+ aodv_v6_draft_01_rreq(ndo, dat, length);
+ break;
+
+ case AODV_V6_DRAFT_01_RREP:
+ aodv_v6_draft_01_rrep(ndo, dat, length);
+ break;
+
+ case AODV_V6_DRAFT_01_RERR:
+ aodv_v6_draft_01_rerr(ndo, dat, length);
+ break;
+
+ case AODV_V6_DRAFT_01_RREP_ACK:
+ ND_PRINT((ndo, " rrep-ack %u", length));
+ break;
+
+ default:
+ ND_PRINT((ndo, " type %u %u", msg_type, length));
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|aodv]"));
+}
--- /dev/null
+/*
+ * This module implements decoding of the ATA over Ethernet (AoE) protocol
+ * according to the following specification:
+ * http://support.coraid.com/documents/AoEr11.txt
+ *
+ * Copyright (c) 2014 The TCPDUMP 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
+ * COPYRIGHT HOLDER 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-aoe.c,v 1.2 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+#include "ether.h"
+
+static const char tstr[] = " [|aoe]";
+static const char cstr[] = " (corrupt)";
+
+#define AOE_V1 1
+#define ATA_SECTOR_SIZE 512
+
+#define AOEV1_CMD_ISSUE_ATA_COMMAND 0
+#define AOEV1_CMD_QUERY_CONFIG_INFORMATION 1
+#define AOEV1_CMD_MAC_MASK_LIST 2
+#define AOEV1_CMD_RESERVE_RELEASE 3
+
+static const struct tok cmdcode_str[] = {
+ { AOEV1_CMD_ISSUE_ATA_COMMAND, "Issue ATA Command" },
+ { AOEV1_CMD_QUERY_CONFIG_INFORMATION, "Query Config Information" },
+ { AOEV1_CMD_MAC_MASK_LIST, "MAC Mask List" },
+ { AOEV1_CMD_RESERVE_RELEASE, "Reserve/Release" },
+ { 0, NULL }
+};
+
+#define AOEV1_COMMON_HDR_LEN 10U /* up to but w/o Arg */
+#define AOEV1_ISSUE_ARG_LEN 12U /* up to but w/o Data */
+#define AOEV1_QUERY_ARG_LEN 8U /* up to but w/o Config String */
+#define AOEV1_MAC_ARG_LEN 4U /* up to but w/o Directive 0 */
+#define AOEV1_RESERVE_ARG_LEN 2U /* up to but w/o Ethernet address 0 */
+#define AOEV1_MAX_CONFSTR_LEN 1024U
+
+#define AOEV1_FLAG_R 0x08
+#define AOEV1_FLAG_E 0x04
+
+static const struct tok aoev1_flag_str[] = {
+ { AOEV1_FLAG_R, "Response" },
+ { AOEV1_FLAG_E, "Error" },
+ { 0x02, "MBZ-0x02" },
+ { 0x01, "MBZ-0x01" },
+ { 0, NULL }
+};
+
+static const struct tok aoev1_errcode_str[] = {
+ { 1, "Unrecognized command code" },
+ { 2, "Bad argument parameter" },
+ { 3, "Device unavailable" },
+ { 4, "Config string present" },
+ { 5, "Unsupported version" },
+ { 6, "Target is reserved" },
+ { 0, NULL }
+};
+
+#define AOEV1_AFLAG_E 0x40
+#define AOEV1_AFLAG_D 0x10
+#define AOEV1_AFLAG_A 0x02
+#define AOEV1_AFLAG_W 0x01
+
+static const struct tok aoev1_aflag_str[] = {
+ { 0x08, "MBZ-0x08" },
+ { AOEV1_AFLAG_E, "Ext48" },
+ { 0x06, "MBZ-0x06" },
+ { AOEV1_AFLAG_D, "Device" },
+ { 0x04, "MBZ-0x04" },
+ { 0x03, "MBZ-0x03" },
+ { AOEV1_AFLAG_A, "Async" },
+ { AOEV1_AFLAG_W, "Write" },
+ { 0, NULL }
+};
+
+static const struct tok aoev1_ccmd_str[] = {
+ { 0, "read config string" },
+ { 1, "test config string" },
+ { 2, "test config string prefix" },
+ { 3, "set config string" },
+ { 4, "force set config string" },
+ { 0, NULL }
+};
+
+static const struct tok aoev1_mcmd_str[] = {
+ { 0, "Read Mac Mask List" },
+ { 1, "Edit Mac Mask List" },
+ { 0, NULL }
+};
+
+static const struct tok aoev1_merror_str[] = {
+ { 1, "Unspecified Error" },
+ { 2, "Bad DCmd directive" },
+ { 3, "Mask list full" },
+ { 0, NULL }
+};
+
+static const struct tok aoev1_dcmd_str[] = {
+ { 0, "No Directive" },
+ { 1, "Add mac address to mask list" },
+ { 2, "Delete mac address from mask list" },
+ { 0, NULL }
+};
+
+static const struct tok aoev1_rcmd_str[] = {
+ { 0, "Read reserve list" },
+ { 1, "Set reserve list" },
+ { 2, "Force set reserve list" },
+ { 0, NULL }
+};
+
+static void
+aoev1_issue_print(netdissect_options *ndo,
+ const u_char *cp, const u_int len)
+{
+ const u_char *ep = cp + len;
+
+ if (len < AOEV1_ISSUE_ARG_LEN)
+ goto corrupt;
+ /* AFlags */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, "\n\tAFlags: [%s]", bittok2str(aoev1_aflag_str, "none", *cp)));
+ cp += 1;
+ /* Err/Feature */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", Err/Feature: %u", *cp));
+ cp += 1;
+ /* Sector Count (not correlated with the length) */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", Sector Count: %u", *cp));
+ cp += 1;
+ /* Cmd/Status */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", Cmd/Status: %u", *cp));
+ cp += 1;
+ /* lba0 */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, "\n\tlba0: %u", *cp));
+ cp += 1;
+ /* lba1 */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", lba1: %u", *cp));
+ cp += 1;
+ /* lba2 */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", lba2: %u", *cp));
+ cp += 1;
+ /* lba3 */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", lba3: %u", *cp));
+ cp += 1;
+ /* lba4 */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", lba4: %u", *cp));
+ cp += 1;
+ /* lba5 */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", lba5: %u", *cp));
+ cp += 1;
+ /* Reserved */
+ ND_TCHECK2(*cp, 2);
+ cp += 2;
+ /* Data */
+ if (len > AOEV1_ISSUE_ARG_LEN)
+ ND_PRINT((ndo, "\n\tData: %u bytes", len - AOEV1_ISSUE_ARG_LEN));
+ return;
+
+corrupt:
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+aoev1_query_print(netdissect_options *ndo,
+ const u_char *cp, const u_int len)
+{
+ const u_char *ep = cp + len;
+ uint16_t cslen;
+
+ if (len < AOEV1_QUERY_ARG_LEN)
+ goto corrupt;
+ /* Buffer Count */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, "\n\tBuffer Count: %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* Firmware Version */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", Firmware Version: %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* Sector Count */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", Sector Count: %u", *cp));
+ cp += 1;
+ /* AoE/CCmd */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", AoE: %u, CCmd: %s", (*cp & 0xF0) >> 4,
+ tok2str(aoev1_ccmd_str, "Unknown (0x02x)", *cp & 0x0F)));
+ cp += 1;
+ /* Config String Length */
+ ND_TCHECK2(*cp, 2);
+ cslen = EXTRACT_16BITS(cp);
+ cp += 2;
+ if (cslen > AOEV1_MAX_CONFSTR_LEN || AOEV1_QUERY_ARG_LEN + cslen > len)
+ goto corrupt;
+ /* Config String */
+ ND_TCHECK2(*cp, cslen);
+ if (cslen) {
+ ND_PRINT((ndo, "\n\tConfig String (length %u): ", cslen));
+ if (fn_printn(ndo, cp, cslen, ndo->ndo_snapend))
+ goto trunc;
+ }
+ return;
+
+corrupt:
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+aoev1_mac_print(netdissect_options *ndo,
+ const u_char *cp, const u_int len)
+{
+ const u_char *ep = cp + len;
+ uint8_t dircount, i;
+
+ if (len < AOEV1_MAC_ARG_LEN)
+ goto corrupt;
+ /* Reserved */
+ ND_TCHECK2(*cp, 1);
+ cp += 1;
+ /* MCmd */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, "\n\tMCmd: %s", tok2str(aoev1_mcmd_str, "Unknown (0x%02x)", *cp)));
+ cp += 1;
+ /* MError */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", MError: %s", tok2str(aoev1_merror_str, "Unknown (0x%02x)", *cp)));
+ cp += 1;
+ /* Dir Count */
+ ND_TCHECK2(*cp, 1);
+ dircount = *cp;
+ cp += 1;
+ ND_PRINT((ndo, ", Dir Count: %u", dircount));
+ if (AOEV1_MAC_ARG_LEN + dircount * 8 > len)
+ goto corrupt;
+ /* directives */
+ for (i = 0; i < dircount; i++) {
+ /* Reserved */
+ ND_TCHECK2(*cp, 1);
+ cp += 1;
+ /* DCmd */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, "\n\t DCmd: %s", tok2str(aoev1_dcmd_str, "Unknown (0x%02x)", *cp)));
+ cp += 1;
+ /* Ethernet Address */
+ ND_TCHECK2(*cp, ETHER_ADDR_LEN);
+ ND_PRINT((ndo, ", Ethernet Address: %s", etheraddr_string(ndo, cp)));
+ cp += ETHER_ADDR_LEN;
+ }
+ return;
+
+corrupt:
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+aoev1_reserve_print(netdissect_options *ndo,
+ const u_char *cp, const u_int len)
+{
+ const u_char *ep = cp + len;
+ uint8_t nmacs, i;
+
+ if (len < AOEV1_RESERVE_ARG_LEN || (len - AOEV1_RESERVE_ARG_LEN) % ETHER_ADDR_LEN)
+ goto corrupt;
+ /* RCmd */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, "\n\tRCmd: %s", tok2str(aoev1_rcmd_str, "Unknown (0x%02x)", *cp)));
+ cp += 1;
+ /* NMacs (correlated with the length) */
+ ND_TCHECK2(*cp, 1);
+ nmacs = *cp;
+ cp += 1;
+ ND_PRINT((ndo, ", NMacs: %u", nmacs));
+ if (AOEV1_RESERVE_ARG_LEN + nmacs * ETHER_ADDR_LEN != len)
+ goto corrupt;
+ /* addresses */
+ for (i = 0; i < nmacs; i++) {
+ ND_PRINT((ndo, "\n\tEthernet Address %u: %s", i, etheraddr_string(ndo, cp)));
+ cp += ETHER_ADDR_LEN;
+ }
+ return;
+
+corrupt:
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/* cp points to the Ver/Flags octet */
+static void
+aoev1_print(netdissect_options *ndo,
+ const u_char *cp, const u_int len)
+{
+ const u_char *ep = cp + len;
+ uint8_t flags, command;
+ void (*cmd_decoder)(netdissect_options *, const u_char *, const u_int);
+
+ if (len < AOEV1_COMMON_HDR_LEN)
+ goto corrupt;
+ /* Flags */
+ flags = *cp & 0x0F;
+ ND_PRINT((ndo, ", Flags: [%s]", bittok2str(aoev1_flag_str, "none", flags)));
+ cp += 1;
+ if (! ndo->ndo_vflag)
+ return;
+ /* Error */
+ ND_TCHECK2(*cp, 1);
+ if (flags & AOEV1_FLAG_E)
+ ND_PRINT((ndo, "\n\tError: %s", tok2str(aoev1_errcode_str, "Invalid (%u)", *cp)));
+ cp += 1;
+ /* Major */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, "\n\tMajor: 0x%04x", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* Minor */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", Minor: 0x%02x", *cp));
+ cp += 1;
+ /* Command */
+ ND_TCHECK2(*cp, 1);
+ command = *cp;
+ cp += 1;
+ ND_PRINT((ndo, ", Command: %s", tok2str(cmdcode_str, "Unknown (0x%02x)", command)));
+ /* Tag */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", Tag: 0x%08x", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* Arg */
+ cmd_decoder =
+ command == AOEV1_CMD_ISSUE_ATA_COMMAND ? aoev1_issue_print :
+ command == AOEV1_CMD_QUERY_CONFIG_INFORMATION ? aoev1_query_print :
+ command == AOEV1_CMD_MAC_MASK_LIST ? aoev1_mac_print :
+ command == AOEV1_CMD_RESERVE_RELEASE ? aoev1_reserve_print :
+ NULL;
+ if (cmd_decoder != NULL)
+ cmd_decoder(ndo, cp, len - AOEV1_COMMON_HDR_LEN);
+ return;
+
+corrupt:
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+void
+aoe_print(netdissect_options *ndo,
+ const u_char *cp, const u_int len)
+{
+ const u_char *ep = cp + len;
+ uint8_t ver;
+
+ ND_PRINT((ndo, "AoE length %u", len));
+
+ if (len < 1)
+ goto corrupt;
+ /* Ver/Flags */
+ ND_TCHECK2(*cp, 1);
+ ver = (*cp & 0xF0) >> 4;
+ /* Don't advance cp yet: low order 4 bits are version-specific. */
+ ND_PRINT((ndo, ", Ver %u", ver));
+
+ switch (ver) {
+ case AOE_V1:
+ aoev1_print(ndo, cp, len);
+ break;
+ }
+ return;
+
+corrupt:
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
+ * 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: (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.
+ */
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ap1394.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+#include "ethertype.h"
+
+/*
+ * Structure of a header for Apple's IP-over-IEEE 1384 BPF header.
+ */
+#define FIREWIRE_EUI64_LEN 8
+struct firewire_header {
+ u_char firewire_dhost[FIREWIRE_EUI64_LEN];
+ u_char firewire_shost[FIREWIRE_EUI64_LEN];
+ u_short firewire_type;
+};
+
+/*
+ * Length of that header; note that some compilers may pad
+ * "struct firewire_header" to a multiple of 4 bytes, for example, so
+ * "sizeof (struct firewire_header)" may not give the right answer.
+ */
+#define FIREWIRE_HDRLEN 18
+
+static inline void
+ap1394_hdr_print(netdissect_options *ndo, register const u_char *bp, u_int length)
+{
+ register const struct firewire_header *fp;
+ uint16_t firewire_type;
+
+ fp = (const struct firewire_header *)bp;
+
+ ND_PRINT((ndo, "%s > %s",
+ linkaddr_string(ndo, fp->firewire_dhost, LINKADDR_IEEE1394, FIREWIRE_EUI64_LEN),
+ linkaddr_string(ndo, fp->firewire_shost, LINKADDR_IEEE1394, FIREWIRE_EUI64_LEN)));
+
+ firewire_type = EXTRACT_16BITS(&fp->firewire_type);
+ if (!ndo->ndo_qflag) {
+ ND_PRINT((ndo, ", ethertype %s (0x%04x)",
+ tok2str(ethertype_values,"Unknown", firewire_type),
+ firewire_type));
+ } else {
+ ND_PRINT((ndo, ", %s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", firewire_type)));
+ }
+
+ ND_PRINT((ndo, ", length %u: ", length));
+}
+
+/*
+ * 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
+ap1394_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int length = h->len;
+ u_int caplen = h->caplen;
+ struct firewire_header *fp;
+ u_short ether_type;
+
+ if (caplen < FIREWIRE_HDRLEN) {
+ ND_PRINT((ndo, "[|ap1394]"));
+ return FIREWIRE_HDRLEN;
+ }
+
+ if (ndo->ndo_eflag)
+ ap1394_hdr_print(ndo, p, length);
+
+ length -= FIREWIRE_HDRLEN;
+ caplen -= FIREWIRE_HDRLEN;
+ fp = (struct firewire_header *)p;
+ p += FIREWIRE_HDRLEN;
+
+ ether_type = EXTRACT_16BITS(&fp->firewire_type);
+ if (ethertype_print(ndo, ether_type, p, length, caplen) == 0) {
+ /* ether_type not known, print raw packet */
+ if (!ndo->ndo_eflag)
+ ap1394_hdr_print(ndo, (u_char *)fp, length + FIREWIRE_HDRLEN);
+
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+
+ return FIREWIRE_HDRLEN;
+}
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * From: NetBSD: print-arcnet.c,v 1.2 2000/04/24 13:02:28 itojun Exp
+ */
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-arcnet.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+/*
+ * from: NetBSD: if_arc.h,v 1.13 1999/11/19 20:41:19 thorpej Exp
+ */
+
+/*
+ * Structure of a 2.5MB/s Arcnet header on the BSDs,
+ * as given to interface code.
+ */
+struct arc_header {
+ uint8_t arc_shost;
+ uint8_t arc_dhost;
+ uint8_t arc_type;
+ /*
+ * only present for newstyle encoding with LL fragmentation.
+ * Don't use sizeof(anything), use ARC_HDR{,NEW}LEN instead.
+ */
+ uint8_t arc_flag;
+ uint16_t arc_seqid;
+
+ /*
+ * only present in exception packets (arc_flag == 0xff)
+ */
+ uint8_t arc_type2; /* same as arc_type */
+ uint8_t arc_flag2; /* real flag value */
+ uint16_t arc_seqid2; /* real seqid value */
+};
+
+#define ARC_HDRLEN 3
+#define ARC_HDRNEWLEN 6
+#define ARC_HDRNEWLEN_EXC 10
+
+/* RFC 1051 */
+#define ARCTYPE_IP_OLD 240 /* IP protocol */
+#define ARCTYPE_ARP_OLD 241 /* address resolution protocol */
+
+/* RFC 1201 */
+#define ARCTYPE_IP 212 /* IP protocol */
+#define ARCTYPE_ARP 213 /* address resolution protocol */
+#define ARCTYPE_REVARP 214 /* reverse addr resolution protocol */
+
+#define ARCTYPE_ATALK 221 /* Appletalk */
+#define ARCTYPE_BANIAN 247 /* Banyan Vines */
+#define ARCTYPE_IPX 250 /* Novell IPX */
+
+#define ARCTYPE_INET6 0xc4 /* IPng */
+#define ARCTYPE_DIAGNOSE 0x80 /* as per ANSI/ATA 878.1 */
+
+/*
+ * Structure of a 2.5MB/s Arcnet header on Linux. Linux has
+ * an extra "offset" field when given to interface code, and
+ * never presents packets that look like exception frames.
+ */
+struct arc_linux_header {
+ uint8_t arc_shost;
+ uint8_t arc_dhost;
+ uint16_t arc_offset;
+ uint8_t arc_type;
+ /*
+ * only present for newstyle encoding with LL fragmentation.
+ * Don't use sizeof(anything), use ARC_LINUX_HDR{,NEW}LEN
+ * instead.
+ */
+ uint8_t arc_flag;
+ uint16_t arc_seqid;
+};
+
+#define ARC_LINUX_HDRLEN 5
+#define ARC_LINUX_HDRNEWLEN 8
+
+static int arcnet_encap_print(netdissect_options *, u_char arctype, const u_char *p,
+ u_int length, u_int caplen);
+
+static const struct tok arctypemap[] = {
+ { ARCTYPE_IP_OLD, "oldip" },
+ { ARCTYPE_ARP_OLD, "oldarp" },
+ { ARCTYPE_IP, "ip" },
+ { ARCTYPE_ARP, "arp" },
+ { ARCTYPE_REVARP, "rarp" },
+ { ARCTYPE_ATALK, "atalk" },
+ { ARCTYPE_BANIAN, "banyan" },
+ { ARCTYPE_IPX, "ipx" },
+ { ARCTYPE_INET6, "ipv6" },
+ { ARCTYPE_DIAGNOSE, "diag" },
+ { 0, 0 }
+};
+
+static inline void
+arcnet_print(netdissect_options *ndo, const u_char *bp, u_int length, int phds,
+ int flag, u_int seqid)
+{
+ const struct arc_header *ap;
+ const char *arctypename;
+
+
+ ap = (const struct arc_header *)bp;
+
+
+ if (ndo->ndo_qflag) {
+ ND_PRINT((ndo, "%02x %02x %d: ",
+ ap->arc_shost,
+ ap->arc_dhost,
+ length));
+ return;
+ }
+
+ arctypename = tok2str(arctypemap, "%02x", ap->arc_type);
+
+ if (!phds) {
+ ND_PRINT((ndo, "%02x %02x %s %d: ",
+ ap->arc_shost, ap->arc_dhost, arctypename,
+ length));
+ return;
+ }
+
+ if (flag == 0) {
+ ND_PRINT((ndo, "%02x %02x %s seqid %04x %d: ",
+ ap->arc_shost, ap->arc_dhost, arctypename, seqid,
+ length));
+ return;
+ }
+
+ if (flag & 1)
+ ND_PRINT((ndo, "%02x %02x %s seqid %04x "
+ "(first of %d fragments) %d: ",
+ ap->arc_shost, ap->arc_dhost, arctypename, seqid,
+ (flag + 3) / 2, length));
+ else
+ ND_PRINT((ndo, "%02x %02x %s seqid %04x "
+ "(fragment %d) %d: ",
+ ap->arc_shost, ap->arc_dhost, arctypename, seqid,
+ flag/2 + 1, length));
+}
+
+/*
+ * This is the top level routine of the printer. 'p' points
+ * to the ARCNET 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
+arcnet_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int caplen = h->caplen;
+ u_int length = h->len;
+ const struct arc_header *ap;
+
+ int phds, flag = 0, archdrlen = 0;
+ u_int seqid = 0;
+ u_char arc_type;
+
+ if (caplen < ARC_HDRLEN || length < ARC_HDRLEN) {
+ ND_PRINT((ndo, "[|arcnet]"));
+ return (caplen);
+ }
+
+ ap = (const struct arc_header *)p;
+ arc_type = ap->arc_type;
+
+ switch (arc_type) {
+ default:
+ phds = 1;
+ break;
+ case ARCTYPE_IP_OLD:
+ case ARCTYPE_ARP_OLD:
+ case ARCTYPE_DIAGNOSE:
+ phds = 0;
+ archdrlen = ARC_HDRLEN;
+ break;
+ }
+
+ if (phds) {
+ if (caplen < ARC_HDRNEWLEN || length < ARC_HDRNEWLEN) {
+ arcnet_print(ndo, p, length, 0, 0, 0);
+ ND_PRINT((ndo, "[|phds]"));
+ return (caplen);
+ }
+
+ if (ap->arc_flag == 0xff) {
+ if (caplen < ARC_HDRNEWLEN_EXC || length < ARC_HDRNEWLEN_EXC) {
+ arcnet_print(ndo, p, length, 0, 0, 0);
+ ND_PRINT((ndo, "[|phds extended]"));
+ return (caplen);
+ }
+ flag = ap->arc_flag2;
+ seqid = EXTRACT_16BITS(&ap->arc_seqid2);
+ archdrlen = ARC_HDRNEWLEN_EXC;
+ } else {
+ flag = ap->arc_flag;
+ seqid = EXTRACT_16BITS(&ap->arc_seqid);
+ archdrlen = ARC_HDRNEWLEN;
+ }
+ }
+
+
+ if (ndo->ndo_eflag)
+ arcnet_print(ndo, p, length, phds, flag, seqid);
+
+ /*
+ * Go past the ARCNET header.
+ */
+ length -= archdrlen;
+ caplen -= archdrlen;
+ p += archdrlen;
+
+ if (phds && flag && (flag & 1) == 0) {
+ /*
+ * This is a middle fragment.
+ */
+ return (archdrlen);
+ }
+
+ if (!arcnet_encap_print(ndo, arc_type, p, length, caplen))
+ ND_DEFAULTPRINT(p, caplen);
+
+ return (archdrlen);
+}
+
+/*
+ * This is the top level routine of the printer. 'p' points
+ * to the ARCNET 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. It is quite similar
+ * to the non-Linux style printer except that Linux doesn't ever
+ * supply packets that look like exception frames, it always supplies
+ * reassembled packets rather than raw frames, and headers have an
+ * extra "offset" field between the src/dest and packet type.
+ */
+u_int
+arcnet_linux_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int caplen = h->caplen;
+ u_int length = h->len;
+ const struct arc_linux_header *ap;
+
+ int archdrlen = 0;
+ u_char arc_type;
+
+ if (caplen < ARC_LINUX_HDRLEN || length < ARC_LINUX_HDRLEN) {
+ ND_PRINT((ndo, "[|arcnet]"));
+ return (caplen);
+ }
+
+ ap = (const struct arc_linux_header *)p;
+ arc_type = ap->arc_type;
+
+ switch (arc_type) {
+ default:
+ archdrlen = ARC_LINUX_HDRNEWLEN;
+ if (caplen < ARC_LINUX_HDRNEWLEN || length < ARC_LINUX_HDRNEWLEN) {
+ ND_PRINT((ndo, "[|arcnet]"));
+ return (caplen);
+ }
+ break;
+ case ARCTYPE_IP_OLD:
+ case ARCTYPE_ARP_OLD:
+ case ARCTYPE_DIAGNOSE:
+ archdrlen = ARC_LINUX_HDRLEN;
+ break;
+ }
+
+ if (ndo->ndo_eflag)
+ arcnet_print(ndo, p, length, 0, 0, 0);
+
+ /*
+ * Go past the ARCNET header.
+ */
+ length -= archdrlen;
+ caplen -= archdrlen;
+ p += archdrlen;
+
+ if (!arcnet_encap_print(ndo, arc_type, p, length, caplen))
+ ND_DEFAULTPRINT(p, caplen);
+
+ return (archdrlen);
+}
+
+/*
+ * Prints the packet encapsulated in an ARCnet data field,
+ * given the ARCnet system code.
+ *
+ * Returns non-zero if it can do so, zero if the system code is unknown.
+ */
+
+
+static int
+arcnet_encap_print(netdissect_options *ndo, u_char arctype, const u_char *p,
+ u_int length, u_int caplen)
+{
+ switch (arctype) {
+
+ case ARCTYPE_IP_OLD:
+ case ARCTYPE_IP:
+ ip_print(ndo, p, length);
+ return (1);
+
+ case ARCTYPE_INET6:
+ ip6_print(ndo, p, length);
+ return (1);
+
+ case ARCTYPE_ARP_OLD:
+ case ARCTYPE_ARP:
+ case ARCTYPE_REVARP:
+ arp_print(ndo, p, length, caplen);
+ return (1);
+
+ case ARCTYPE_ATALK: /* XXX was this ever used? */
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "et1 "));
+ atalk_print(ndo, p, length);
+ return (1);
+
+ case ARCTYPE_IPX:
+ ipx_print(ndo, p, length);
+ return (1);
+
+ default:
+ return (0);
+ }
+}
+
+/*
+ * Local Variables:
+ * c-style: bsd
+ * End:
+ */
+
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-arp.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "ether.h"
+#include "ethertype.h"
+#include "extract.h" /* must come after interface.h */
+
+static const char tstr[] = "[|ARP]";
+
+/*
+ * Address Resolution Protocol.
+ *
+ * See RFC 826 for protocol description. ARP packets are variable
+ * in size; the arphdr structure defines the fixed-length portion.
+ * Protocol type values are the same as those for 10 Mb/s Ethernet.
+ * It is followed by the variable-sized fields ar_sha, arp_spa,
+ * arp_tha and arp_tpa in that order, according to the lengths
+ * specified. Field names used correspond to RFC 826.
+ */
+struct arp_pkthdr {
+ u_short ar_hrd; /* format of hardware address */
+#define ARPHRD_ETHER 1 /* ethernet hardware format */
+#define ARPHRD_IEEE802 6 /* token-ring hardware format */
+#define ARPHRD_ARCNET 7 /* arcnet hardware format */
+#define ARPHRD_FRELAY 15 /* frame relay hardware format */
+#define ARPHRD_ATM2225 19 /* ATM (RFC 2225) */
+#define ARPHRD_STRIP 23 /* Ricochet Starmode Radio hardware format */
+#define ARPHRD_IEEE1394 24 /* IEEE 1394 (FireWire) hardware format */
+ u_short ar_pro; /* format of protocol address */
+ u_char ar_hln; /* length of hardware address */
+ u_char ar_pln; /* length of protocol address */
+ u_short ar_op; /* one of: */
+#define ARPOP_REQUEST 1 /* request to resolve address */
+#define ARPOP_REPLY 2 /* response to previous request */
+#define ARPOP_REVREQUEST 3 /* request protocol address given hardware */
+#define ARPOP_REVREPLY 4 /* response giving protocol address */
+#define ARPOP_INVREQUEST 8 /* request to identify peer */
+#define ARPOP_INVREPLY 9 /* response identifying peer */
+#define ARPOP_NAK 10 /* NAK - only valif for ATM ARP */
+
+/*
+ * The remaining fields are variable in size,
+ * according to the sizes above.
+ */
+#ifdef COMMENT_ONLY
+ u_char ar_sha[]; /* sender hardware address */
+ u_char ar_spa[]; /* sender protocol address */
+ u_char ar_tha[]; /* target hardware address */
+ u_char ar_tpa[]; /* target protocol address */
+#endif
+#define ar_sha(ap) (((const u_char *)((ap)+1))+0)
+#define ar_spa(ap) (((const u_char *)((ap)+1))+ (ap)->ar_hln)
+#define ar_tha(ap) (((const u_char *)((ap)+1))+ (ap)->ar_hln+(ap)->ar_pln)
+#define ar_tpa(ap) (((const u_char *)((ap)+1))+2*(ap)->ar_hln+(ap)->ar_pln)
+};
+
+#define ARP_HDRLEN 8
+
+#define HRD(ap) EXTRACT_16BITS(&(ap)->ar_hrd)
+#define HRD_LEN(ap) ((ap)->ar_hln)
+#define PROTO_LEN(ap) ((ap)->ar_pln)
+#define OP(ap) EXTRACT_16BITS(&(ap)->ar_op)
+#define PRO(ap) EXTRACT_16BITS(&(ap)->ar_pro)
+#define SHA(ap) (ar_sha(ap))
+#define SPA(ap) (ar_spa(ap))
+#define THA(ap) (ar_tha(ap))
+#define TPA(ap) (ar_tpa(ap))
+
+
+static const struct tok arpop_values[] = {
+ { ARPOP_REQUEST, "Request" },
+ { ARPOP_REPLY, "Reply" },
+ { ARPOP_REVREQUEST, "Reverse Request" },
+ { ARPOP_REVREPLY, "Reverse Reply" },
+ { ARPOP_INVREQUEST, "Inverse Request" },
+ { ARPOP_INVREPLY, "Inverse Reply" },
+ { ARPOP_NAK, "NACK Reply" },
+ { 0, NULL }
+};
+
+static const struct tok arphrd_values[] = {
+ { ARPHRD_ETHER, "Ethernet" },
+ { ARPHRD_IEEE802, "TokenRing" },
+ { ARPHRD_ARCNET, "ArcNet" },
+ { ARPHRD_FRELAY, "FrameRelay" },
+ { ARPHRD_STRIP, "Strip" },
+ { ARPHRD_IEEE1394, "IEEE 1394" },
+ { ARPHRD_ATM2225, "ATM" },
+ { 0, NULL }
+};
+
+/*
+ * ATM Address Resolution Protocol.
+ *
+ * See RFC 2225 for protocol description. ATMARP packets are similar
+ * to ARP packets, except that there are no length fields for the
+ * protocol address - instead, there are type/length fields for
+ * the ATM number and subaddress - and the hardware addresses consist
+ * of an ATM number and an ATM subaddress.
+ */
+struct atmarp_pkthdr {
+ u_short aar_hrd; /* format of hardware address */
+ u_short aar_pro; /* format of protocol address */
+ u_char aar_shtl; /* length of source ATM number */
+ u_char aar_sstl; /* length of source ATM subaddress */
+#define ATMARP_IS_E164 0x40 /* bit in type/length for E.164 format */
+#define ATMARP_LEN_MASK 0x3F /* length of {sub}address in type/length */
+ u_short aar_op; /* same as regular ARP */
+ u_char aar_spln; /* length of source protocol address */
+ u_char aar_thtl; /* length of target ATM number */
+ u_char aar_tstl; /* length of target ATM subaddress */
+ u_char aar_tpln; /* length of target protocol address */
+/*
+ * The remaining fields are variable in size,
+ * according to the sizes above.
+ */
+#ifdef COMMENT_ONLY
+ u_char aar_sha[]; /* source ATM number */
+ u_char aar_ssa[]; /* source ATM subaddress */
+ u_char aar_spa[]; /* sender protocol address */
+ u_char aar_tha[]; /* target ATM number */
+ u_char aar_tsa[]; /* target ATM subaddress */
+ u_char aar_tpa[]; /* target protocol address */
+#endif
+
+#define ATMHRD(ap) EXTRACT_16BITS(&(ap)->aar_hrd)
+#define ATMSHRD_LEN(ap) ((ap)->aar_shtl & ATMARP_LEN_MASK)
+#define ATMSSLN(ap) ((ap)->aar_sstl & ATMARP_LEN_MASK)
+#define ATMSPROTO_LEN(ap) ((ap)->aar_spln)
+#define ATMOP(ap) EXTRACT_16BITS(&(ap)->aar_op)
+#define ATMPRO(ap) EXTRACT_16BITS(&(ap)->aar_pro)
+#define ATMTHRD_LEN(ap) ((ap)->aar_thtl & ATMARP_LEN_MASK)
+#define ATMTSLN(ap) ((ap)->aar_tstl & ATMARP_LEN_MASK)
+#define ATMTPROTO_LEN(ap) ((ap)->aar_tpln)
+#define aar_sha(ap) ((const u_char *)((ap)+1))
+#define aar_ssa(ap) (aar_sha(ap) + ATMSHRD_LEN(ap))
+#define aar_spa(ap) (aar_ssa(ap) + ATMSSLN(ap))
+#define aar_tha(ap) (aar_spa(ap) + ATMSPROTO_LEN(ap))
+#define aar_tsa(ap) (aar_tha(ap) + ATMTHRD_LEN(ap))
+#define aar_tpa(ap) (aar_tsa(ap) + ATMTSLN(ap))
+};
+
+#define ATMSHA(ap) (aar_sha(ap))
+#define ATMSSA(ap) (aar_ssa(ap))
+#define ATMSPA(ap) (aar_spa(ap))
+#define ATMTHA(ap) (aar_tha(ap))
+#define ATMTSA(ap) (aar_tsa(ap))
+#define ATMTPA(ap) (aar_tpa(ap))
+
+static u_char ezero[6];
+
+static void
+atmarp_addr_print(netdissect_options *ndo,
+ const u_char *ha, u_int ha_len, const u_char *srca,
+ u_int srca_len)
+{
+ if (ha_len == 0)
+ ND_PRINT((ndo, "<No address>"));
+ else {
+ ND_PRINT((ndo, "%s", linkaddr_string(ndo, ha, LINKADDR_ATM, ha_len)));
+ if (srca_len != 0)
+ ND_PRINT((ndo, ",%s",
+ linkaddr_string(ndo, srca, LINKADDR_ATM, srca_len)));
+ }
+}
+
+static void
+atmarp_print(netdissect_options *ndo,
+ const u_char *bp, u_int length, u_int caplen)
+{
+ const struct atmarp_pkthdr *ap;
+ u_short pro, hrd, op;
+
+ ap = (const struct atmarp_pkthdr *)bp;
+ ND_TCHECK(*ap);
+
+ hrd = ATMHRD(ap);
+ pro = ATMPRO(ap);
+ op = ATMOP(ap);
+
+ if (!ND_TTEST2(*aar_tpa(ap), ATMTPROTO_LEN(ap))) {
+ ND_PRINT((ndo, "%s", tstr));
+ ND_DEFAULTPRINT((const u_char *)ap, length);
+ return;
+ }
+
+ if (!ndo->ndo_eflag) {
+ ND_PRINT((ndo, "ARP, "));
+ }
+
+ if ((pro != ETHERTYPE_IP && pro != ETHERTYPE_TRAIL) ||
+ ATMSPROTO_LEN(ap) != 4 ||
+ ATMTPROTO_LEN(ap) != 4 ||
+ ndo->ndo_vflag) {
+ ND_PRINT((ndo, "%s, %s (len %u/%u)",
+ tok2str(arphrd_values, "Unknown Hardware (%u)", hrd),
+ tok2str(ethertype_values, "Unknown Protocol (0x%04x)", pro),
+ ATMSPROTO_LEN(ap),
+ ATMTPROTO_LEN(ap)));
+
+ /* don't know know about the address formats */
+ if (!ndo->ndo_vflag) {
+ goto out;
+ }
+ }
+
+ /* print operation */
+ ND_PRINT((ndo, "%s%s ",
+ ndo->ndo_vflag ? ", " : "",
+ tok2str(arpop_values, "Unknown (%u)", op)));
+
+ switch (op) {
+
+ case ARPOP_REQUEST:
+ ND_PRINT((ndo, "who-has %s", ipaddr_string(ndo, ATMTPA(ap))));
+ if (ATMTHRD_LEN(ap) != 0) {
+ ND_PRINT((ndo, " ("));
+ atmarp_addr_print(ndo, ATMTHA(ap), ATMTHRD_LEN(ap),
+ ATMTSA(ap), ATMTSLN(ap));
+ ND_PRINT((ndo, ")"));
+ }
+ ND_PRINT((ndo, "tell %s", ipaddr_string(ndo, ATMSPA(ap))));
+ break;
+
+ case ARPOP_REPLY:
+ ND_PRINT((ndo, "%s is-at ", ipaddr_string(ndo, ATMSPA(ap))));
+ atmarp_addr_print(ndo, ATMSHA(ap), ATMSHRD_LEN(ap), ATMSSA(ap),
+ ATMSSLN(ap));
+ break;
+
+ case ARPOP_INVREQUEST:
+ ND_PRINT((ndo, "who-is "));
+ atmarp_addr_print(ndo, ATMTHA(ap), ATMTHRD_LEN(ap), ATMTSA(ap),
+ ATMTSLN(ap));
+ ND_PRINT((ndo, " tell "));
+ atmarp_addr_print(ndo, ATMSHA(ap), ATMSHRD_LEN(ap), ATMSSA(ap),
+ ATMSSLN(ap));
+ break;
+
+ case ARPOP_INVREPLY:
+ atmarp_addr_print(ndo, ATMSHA(ap), ATMSHRD_LEN(ap), ATMSSA(ap),
+ ATMSSLN(ap));
+ ND_PRINT((ndo, "at %s", ipaddr_string(ndo, ATMSPA(ap))));
+ break;
+
+ case ARPOP_NAK:
+ ND_PRINT((ndo, "for %s", ipaddr_string(ndo, ATMSPA(ap))));
+ break;
+
+ default:
+ ND_DEFAULTPRINT((const u_char *)ap, caplen);
+ return;
+ }
+
+ out:
+ ND_PRINT((ndo, ", length %u", length));
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+void
+arp_print(netdissect_options *ndo,
+ const u_char *bp, u_int length, u_int caplen)
+{
+ const struct arp_pkthdr *ap;
+ u_short pro, hrd, op, linkaddr;
+
+ ap = (const struct arp_pkthdr *)bp;
+ ND_TCHECK(*ap);
+
+ hrd = HRD(ap);
+ pro = PRO(ap);
+ op = OP(ap);
+
+
+ /* if its ATM then call the ATM ARP printer
+ for Frame-relay ARP most of the fields
+ are similar to Ethernet so overload the Ethernet Printer
+ and set the linkaddr type for linkaddr_string(ndo, ) accordingly */
+
+ switch(hrd) {
+ case ARPHRD_ATM2225:
+ atmarp_print(ndo, bp, length, caplen);
+ return;
+ case ARPHRD_FRELAY:
+ linkaddr = LINKADDR_FRELAY;
+ break;
+ default:
+ linkaddr = LINKADDR_ETHER;
+ break;
+ }
+
+ if (!ND_TTEST2(*ar_tpa(ap), PROTO_LEN(ap))) {
+ ND_PRINT((ndo, "%s", tstr));
+ ND_DEFAULTPRINT((const u_char *)ap, length);
+ return;
+ }
+
+ if (!ndo->ndo_eflag) {
+ ND_PRINT((ndo, "ARP, "));
+ }
+
+ /* print hardware type/len and proto type/len */
+ if ((pro != ETHERTYPE_IP && pro != ETHERTYPE_TRAIL) ||
+ PROTO_LEN(ap) != 4 ||
+ HRD_LEN(ap) == 0 ||
+ ndo->ndo_vflag) {
+ ND_PRINT((ndo, "%s (len %u), %s (len %u)",
+ tok2str(arphrd_values, "Unknown Hardware (%u)", hrd),
+ HRD_LEN(ap),
+ tok2str(ethertype_values, "Unknown Protocol (0x%04x)", pro),
+ PROTO_LEN(ap)));
+
+ /* don't know know about the address formats */
+ if (!ndo->ndo_vflag) {
+ goto out;
+ }
+ }
+
+ /* print operation */
+ ND_PRINT((ndo, "%s%s ",
+ ndo->ndo_vflag ? ", " : "",
+ tok2str(arpop_values, "Unknown (%u)", op)));
+
+ switch (op) {
+
+ case ARPOP_REQUEST:
+ ND_PRINT((ndo, "who-has %s", ipaddr_string(ndo, TPA(ap))));
+ if (memcmp((const char *)ezero, (const char *)THA(ap), HRD_LEN(ap)) != 0)
+ ND_PRINT((ndo, " (%s)",
+ linkaddr_string(ndo, THA(ap), linkaddr, HRD_LEN(ap))));
+ ND_PRINT((ndo, " tell %s", ipaddr_string(ndo, SPA(ap))));
+ break;
+
+ case ARPOP_REPLY:
+ ND_PRINT((ndo, "%s is-at %s",
+ ipaddr_string(ndo, SPA(ap)),
+ linkaddr_string(ndo, SHA(ap), linkaddr, HRD_LEN(ap))));
+ break;
+
+ case ARPOP_REVREQUEST:
+ ND_PRINT((ndo, "who-is %s tell %s",
+ linkaddr_string(ndo, THA(ap), linkaddr, HRD_LEN(ap)),
+ linkaddr_string(ndo, SHA(ap), linkaddr, HRD_LEN(ap))));
+ break;
+
+ case ARPOP_REVREPLY:
+ ND_PRINT((ndo, "%s at %s",
+ linkaddr_string(ndo, THA(ap), linkaddr, HRD_LEN(ap)),
+ ipaddr_string(ndo, TPA(ap))));
+ break;
+
+ case ARPOP_INVREQUEST:
+ ND_PRINT((ndo, "who-is %s tell %s",
+ linkaddr_string(ndo, THA(ap), linkaddr, HRD_LEN(ap)),
+ linkaddr_string(ndo, SHA(ap), linkaddr, HRD_LEN(ap))));
+ break;
+
+ case ARPOP_INVREPLY:
+ ND_PRINT((ndo,"%s at %s",
+ linkaddr_string(ndo, SHA(ap), linkaddr, HRD_LEN(ap)),
+ ipaddr_string(ndo, SPA(ap))));
+ break;
+
+ default:
+ ND_DEFAULTPRINT((const u_char *)ap, caplen);
+ return;
+ }
+
+ out:
+ ND_PRINT((ndo, ", length %u", length));
+
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/*
+ * Local Variables:
+ * c-style: bsd
+ * End:
+ */
+
--- /dev/null
+/* NetBSD: print-ascii.c,v 1.1 1999/09/30 14:49:12 sjg Exp */
+
+/*-
+ * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Alan Barrett and Simon J. Gerraty.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ascii.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+#include <stdio.h>
+
+#include "interface.h"
+
+#define ASCII_LINELENGTH 300
+#define HEXDUMP_BYTES_PER_LINE 16
+#define HEXDUMP_SHORTS_PER_LINE (HEXDUMP_BYTES_PER_LINE / 2)
+#define HEXDUMP_HEXSTUFF_PER_SHORT 5 /* 4 hex digits and a space */
+#define HEXDUMP_HEXSTUFF_PER_LINE \
+ (HEXDUMP_HEXSTUFF_PER_SHORT * HEXDUMP_SHORTS_PER_LINE)
+
+void
+ascii_print(netdissect_options *ndo,
+ const u_char *cp, u_int length)
+{
+ u_int caplength;
+ register u_char s;
+
+ caplength = (ndo->ndo_snapend >= cp) ? ndo->ndo_snapend - cp : 0;
+ if (length > caplength)
+ length = caplength;
+ ND_PRINT((ndo, "\n"));
+ while (length > 0) {
+ s = *cp++;
+ length--;
+ if (s == '\r') {
+ /*
+ * Don't print CRs at the end of the line; they
+ * don't belong at the ends of lines on UN*X,
+ * and the standard I/O library will give us one
+ * on Windows so we don't need to print one
+ * ourselves.
+ *
+ * In the middle of a line, just print a '.'.
+ */
+ if (length > 1 && *cp != '\n')
+ ND_PRINT((ndo, "."));
+ } else {
+ if (!ND_ISGRAPH(s) &&
+ (s != '\t' && s != ' ' && s != '\n'))
+ ND_PRINT((ndo, "."));
+ else
+ ND_PRINT((ndo, "%c", s));
+ }
+ }
+}
+
+void
+hex_and_ascii_print_with_offset(netdissect_options *ndo, register const char *ident,
+ register const u_char *cp, register u_int length, register u_int oset)
+{
+ u_int caplength;
+ register u_int i;
+ register int s1, s2;
+ register int nshorts;
+ char hexstuff[HEXDUMP_SHORTS_PER_LINE*HEXDUMP_HEXSTUFF_PER_SHORT+1], *hsp;
+ char asciistuff[ASCII_LINELENGTH+1], *asp;
+
+ caplength = (ndo->ndo_snapend >= cp) ? ndo->ndo_snapend - cp : 0;
+ if (length > caplength)
+ length = caplength;
+ nshorts = length / sizeof(u_short);
+ i = 0;
+ hsp = hexstuff; asp = asciistuff;
+ while (--nshorts >= 0) {
+ s1 = *cp++;
+ s2 = *cp++;
+ (void)snprintf(hsp, sizeof(hexstuff) - (hsp - hexstuff),
+ " %02x%02x", s1, s2);
+ hsp += HEXDUMP_HEXSTUFF_PER_SHORT;
+ *(asp++) = (ND_ISGRAPH(s1) ? s1 : '.');
+ *(asp++) = (ND_ISGRAPH(s2) ? s2 : '.');
+ i++;
+ if (i >= HEXDUMP_SHORTS_PER_LINE) {
+ *hsp = *asp = '\0';
+ ND_PRINT((ndo, "%s0x%04x: %-*s %s",
+ ident, oset, HEXDUMP_HEXSTUFF_PER_LINE,
+ hexstuff, asciistuff));
+ i = 0; hsp = hexstuff; asp = asciistuff;
+ oset += HEXDUMP_BYTES_PER_LINE;
+ }
+ }
+ if (length & 1) {
+ s1 = *cp++;
+ (void)snprintf(hsp, sizeof(hexstuff) - (hsp - hexstuff),
+ " %02x", s1);
+ hsp += 3;
+ *(asp++) = (ND_ISGRAPH(s1) ? s1 : '.');
+ ++i;
+ }
+ if (i > 0) {
+ *hsp = *asp = '\0';
+ ND_PRINT((ndo, "%s0x%04x: %-*s %s",
+ ident, oset, HEXDUMP_HEXSTUFF_PER_LINE,
+ hexstuff, asciistuff));
+ }
+}
+
+void
+hex_and_ascii_print(netdissect_options *ndo, register const char *ident,
+ register const u_char *cp, register u_int length)
+{
+ hex_and_ascii_print_with_offset(ndo, ident, cp, length, 0);
+}
+
+/*
+ * telnet_print() wants this. It is essentially default_print_unaligned()
+ */
+void
+hex_print_with_offset(netdissect_options *ndo,
+ const char *ident, const u_char *cp, u_int length,
+ u_int oset)
+{
+ u_int caplength;
+ register u_int i, s;
+ register int nshorts;
+
+ caplength = (ndo->ndo_snapend >= cp) ? ndo->ndo_snapend - cp : 0;
+ if (length > caplength)
+ length = caplength;
+ nshorts = (u_int) length / sizeof(u_short);
+ i = 0;
+ while (--nshorts >= 0) {
+ if ((i++ % 8) == 0) {
+ ND_PRINT((ndo,"%s0x%04x: ", ident, oset));
+ oset += HEXDUMP_BYTES_PER_LINE;
+ }
+ s = *cp++;
+ ND_PRINT((ndo," %02x%02x", s, *cp++));
+ }
+ if (length & 1) {
+ if ((i % 8) == 0)
+ ND_PRINT((ndo,"%s0x%04x: ", ident, oset));
+ ND_PRINT((ndo," %02x", *cp));
+ }
+}
+
+/*
+ * just for completeness
+ */
+void
+hex_print(netdissect_options *ndo,const char *ident, const u_char *cp, u_int length)
+{
+ hex_print_with_offset(ndo, ident, cp, length, 0);
+}
+
+#ifdef MAIN
+int
+main(int argc, char *argv[])
+{
+ hex_print("\n\t", "Hello, World!\n", 14);
+ printf("\n");
+ hex_and_ascii_print("\n\t", "Hello, World!\n", 14);
+ printf("\n");
+ ascii_print("Hello, World!\n", 14);
+ printf("\n");
+#define TMSG "Now is the winter of our discontent...\n"
+ hex_print_with_offset("\n\t", TMSG, sizeof(TMSG) - 1, 0x100);
+ printf("\n");
+ hex_and_ascii_print_with_offset("\n\t", TMSG, sizeof(TMSG) - 1, 0x100);
+ printf("\n");
+ exit(0);
+}
+#endif /* MAIN */
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * Format and print AppleTalk packets.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-atalk.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "ethertype.h"
+#include "extract.h" /* must come after interface.h */
+#include "appletalk.h"
+
+static const char tstr[] = "[|atalk]";
+
+static const struct tok type2str[] = {
+ { ddpRTMP, "rtmp" },
+ { ddpRTMPrequest, "rtmpReq" },
+ { ddpECHO, "echo" },
+ { ddpIP, "IP" },
+ { ddpARP, "ARP" },
+ { ddpKLAP, "KLAP" },
+ { 0, NULL }
+};
+
+struct aarp {
+ uint16_t htype, ptype;
+ uint8_t halen, palen;
+ uint16_t op;
+ uint8_t hsaddr[6];
+ uint8_t psaddr[4];
+ uint8_t hdaddr[6];
+ uint8_t pdaddr[4];
+};
+
+static void atp_print(netdissect_options *, const struct atATP *, u_int);
+static void atp_bitmap_print(netdissect_options *, u_char);
+static void nbp_print(netdissect_options *, const struct atNBP *, u_int, u_short, u_char, u_char);
+static const struct atNBPtuple *nbp_tuple_print(netdissect_options *ndo, const struct atNBPtuple *,
+ const u_char *,
+ u_short, u_char, u_char);
+static const struct atNBPtuple *nbp_name_print(netdissect_options *, const struct atNBPtuple *,
+ const u_char *);
+static const char *ataddr_string(netdissect_options *, u_short, u_char);
+static void ddp_print(netdissect_options *, const u_char *, u_int, int, u_short, u_char, u_char);
+static const char *ddpskt_string(netdissect_options *, int);
+
+/*
+ * Print LLAP packets received on a physical LocalTalk interface.
+ */
+u_int
+ltalk_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, const u_char *p)
+{
+ return (llap_print(ndo, p, h->caplen));
+}
+
+/*
+ * Print AppleTalk LLAP packets.
+ */
+u_int
+llap_print(netdissect_options *ndo,
+ register const u_char *bp, u_int length)
+{
+ register const struct LAP *lp;
+ register const struct atDDP *dp;
+ register const struct atShortDDP *sdp;
+ u_short snet;
+ u_int hdrlen;
+
+ if (length < sizeof(*lp)) {
+ ND_PRINT((ndo, " [|llap %u]", length));
+ return (length);
+ }
+ lp = (const struct LAP *)bp;
+ bp += sizeof(*lp);
+ length -= sizeof(*lp);
+ hdrlen = sizeof(*lp);
+ switch (lp->type) {
+
+ case lapShortDDP:
+ if (length < ddpSSize) {
+ ND_PRINT((ndo, " [|sddp %u]", length));
+ return (length);
+ }
+ sdp = (const struct atShortDDP *)bp;
+ ND_PRINT((ndo, "%s.%s",
+ ataddr_string(ndo, 0, lp->src), ddpskt_string(ndo, sdp->srcSkt)));
+ ND_PRINT((ndo, " > %s.%s:",
+ ataddr_string(ndo, 0, lp->dst), ddpskt_string(ndo, sdp->dstSkt)));
+ bp += ddpSSize;
+ length -= ddpSSize;
+ hdrlen += ddpSSize;
+ ddp_print(ndo, bp, length, sdp->type, 0, lp->src, sdp->srcSkt);
+ break;
+
+ case lapDDP:
+ if (length < ddpSize) {
+ ND_PRINT((ndo, " [|ddp %u]", length));
+ return (length);
+ }
+ dp = (const struct atDDP *)bp;
+ snet = EXTRACT_16BITS(&dp->srcNet);
+ ND_PRINT((ndo, "%s.%s", ataddr_string(ndo, snet, dp->srcNode),
+ ddpskt_string(ndo, dp->srcSkt)));
+ ND_PRINT((ndo, " > %s.%s:",
+ ataddr_string(ndo, EXTRACT_16BITS(&dp->dstNet), dp->dstNode),
+ ddpskt_string(ndo, dp->dstSkt)));
+ bp += ddpSize;
+ length -= ddpSize;
+ hdrlen += ddpSize;
+ ddp_print(ndo, bp, length, dp->type, snet, dp->srcNode, dp->srcSkt);
+ break;
+
+#ifdef notdef
+ case lapKLAP:
+ klap_print(bp, length);
+ break;
+#endif
+
+ default:
+ ND_PRINT((ndo, "%d > %d at-lap#%d %u",
+ lp->src, lp->dst, lp->type, length));
+ break;
+ }
+ return (hdrlen);
+}
+
+/*
+ * Print EtherTalk/TokenTalk packets (or FDDITalk, or whatever it's called
+ * when it runs over FDDI; yes, I've seen FDDI captures with AppleTalk
+ * packets in them).
+ */
+void
+atalk_print(netdissect_options *ndo,
+ register const u_char *bp, u_int length)
+{
+ register const struct atDDP *dp;
+ u_short snet;
+
+ if(!ndo->ndo_eflag)
+ ND_PRINT((ndo, "AT "));
+
+ if (length < ddpSize) {
+ ND_PRINT((ndo, " [|ddp %u]", length));
+ return;
+ }
+ dp = (const struct atDDP *)bp;
+ snet = EXTRACT_16BITS(&dp->srcNet);
+ ND_PRINT((ndo, "%s.%s", ataddr_string(ndo, snet, dp->srcNode),
+ ddpskt_string(ndo, dp->srcSkt)));
+ ND_PRINT((ndo, " > %s.%s: ",
+ ataddr_string(ndo, EXTRACT_16BITS(&dp->dstNet), dp->dstNode),
+ ddpskt_string(ndo, dp->dstSkt)));
+ bp += ddpSize;
+ length -= ddpSize;
+ ddp_print(ndo, bp, length, dp->type, snet, dp->srcNode, dp->srcSkt);
+}
+
+/* XXX should probably pass in the snap header and do checks like arp_print() */
+void
+aarp_print(netdissect_options *ndo,
+ register const u_char *bp, u_int length)
+{
+ register const struct aarp *ap;
+
+#define AT(member) ataddr_string(ndo, (ap->member[1]<<8)|ap->member[2],ap->member[3])
+
+ ND_PRINT((ndo, "aarp "));
+ ap = (const struct aarp *)bp;
+ if (EXTRACT_16BITS(&ap->htype) == 1 &&
+ EXTRACT_16BITS(&ap->ptype) == ETHERTYPE_ATALK &&
+ ap->halen == 6 && ap->palen == 4 )
+ switch (EXTRACT_16BITS(&ap->op)) {
+
+ case 1: /* request */
+ ND_PRINT((ndo, "who-has %s tell %s", AT(pdaddr), AT(psaddr)));
+ return;
+
+ case 2: /* response */
+ ND_PRINT((ndo, "reply %s is-at %s", AT(psaddr), etheraddr_string(ndo, ap->hsaddr)));
+ return;
+
+ case 3: /* probe (oy!) */
+ ND_PRINT((ndo, "probe %s tell %s", AT(pdaddr), AT(psaddr)));
+ return;
+ }
+ ND_PRINT((ndo, "len %u op %u htype %u ptype %#x halen %u palen %u",
+ length, EXTRACT_16BITS(&ap->op), EXTRACT_16BITS(&ap->htype),
+ EXTRACT_16BITS(&ap->ptype), ap->halen, ap->palen));
+}
+
+/*
+ * Print AppleTalk Datagram Delivery Protocol packets.
+ */
+static void
+ddp_print(netdissect_options *ndo,
+ register const u_char *bp, register u_int length, register int t,
+ register u_short snet, register u_char snode, u_char skt)
+{
+
+ switch (t) {
+
+ case ddpNBP:
+ nbp_print(ndo, (const struct atNBP *)bp, length, snet, snode, skt);
+ break;
+
+ case ddpATP:
+ atp_print(ndo, (const struct atATP *)bp, length);
+ break;
+
+ case ddpEIGRP:
+ eigrp_print(ndo, bp, length);
+ break;
+
+ default:
+ ND_PRINT((ndo, " at-%s %d", tok2str(type2str, NULL, t), length));
+ break;
+ }
+}
+
+static void
+atp_print(netdissect_options *ndo,
+ register const struct atATP *ap, u_int length)
+{
+ char c;
+ uint32_t data;
+
+ if ((const u_char *)(ap + 1) > ndo->ndo_snapend) {
+ /* Just bail if we don't have the whole chunk. */
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+ if (length < sizeof(*ap)) {
+ ND_PRINT((ndo, " [|atp %u]", length));
+ return;
+ }
+ length -= sizeof(*ap);
+ switch (ap->control & 0xc0) {
+
+ case atpReqCode:
+ ND_PRINT((ndo, " atp-req%s %d",
+ ap->control & atpXO? " " : "*",
+ EXTRACT_16BITS(&ap->transID)));
+
+ atp_bitmap_print(ndo, ap->bitmap);
+
+ if (length != 0)
+ ND_PRINT((ndo, " [len=%u]", length));
+
+ switch (ap->control & (atpEOM|atpSTS)) {
+ case atpEOM:
+ ND_PRINT((ndo, " [EOM]"));
+ break;
+ case atpSTS:
+ ND_PRINT((ndo, " [STS]"));
+ break;
+ case atpEOM|atpSTS:
+ ND_PRINT((ndo, " [EOM,STS]"));
+ break;
+ }
+ break;
+
+ case atpRspCode:
+ ND_PRINT((ndo, " atp-resp%s%d:%d (%u)",
+ ap->control & atpEOM? "*" : " ",
+ EXTRACT_16BITS(&ap->transID), ap->bitmap, length));
+ switch (ap->control & (atpXO|atpSTS)) {
+ case atpXO:
+ ND_PRINT((ndo, " [XO]"));
+ break;
+ case atpSTS:
+ ND_PRINT((ndo, " [STS]"));
+ break;
+ case atpXO|atpSTS:
+ ND_PRINT((ndo, " [XO,STS]"));
+ break;
+ }
+ break;
+
+ case atpRelCode:
+ ND_PRINT((ndo, " atp-rel %d", EXTRACT_16BITS(&ap->transID)));
+
+ atp_bitmap_print(ndo, ap->bitmap);
+
+ /* length should be zero */
+ if (length)
+ ND_PRINT((ndo, " [len=%u]", length));
+
+ /* there shouldn't be any control flags */
+ if (ap->control & (atpXO|atpEOM|atpSTS)) {
+ c = '[';
+ if (ap->control & atpXO) {
+ ND_PRINT((ndo, "%cXO", c));
+ c = ',';
+ }
+ if (ap->control & atpEOM) {
+ ND_PRINT((ndo, "%cEOM", c));
+ c = ',';
+ }
+ if (ap->control & atpSTS) {
+ ND_PRINT((ndo, "%cSTS", c));
+ c = ',';
+ }
+ ND_PRINT((ndo, "]"));
+ }
+ break;
+
+ default:
+ ND_PRINT((ndo, " atp-0x%x %d (%u)", ap->control,
+ EXTRACT_16BITS(&ap->transID), length));
+ break;
+ }
+ data = EXTRACT_32BITS(&ap->userData);
+ if (data != 0)
+ ND_PRINT((ndo, " 0x%x", data));
+}
+
+static void
+atp_bitmap_print(netdissect_options *ndo,
+ register u_char bm)
+{
+ register char c;
+ register int i;
+
+ /*
+ * The '& 0xff' below is needed for compilers that want to sign
+ * extend a u_char, which is the case with the Ultrix compiler.
+ * (gcc is smart enough to eliminate it, at least on the Sparc).
+ */
+ if ((bm + 1) & (bm & 0xff)) {
+ c = '<';
+ for (i = 0; bm; ++i) {
+ if (bm & 1) {
+ ND_PRINT((ndo, "%c%d", c, i));
+ c = ',';
+ }
+ bm >>= 1;
+ }
+ ND_PRINT((ndo, ">"));
+ } else {
+ for (i = 0; bm; ++i)
+ bm >>= 1;
+ if (i > 1)
+ ND_PRINT((ndo, "<0-%d>", i - 1));
+ else
+ ND_PRINT((ndo, "<0>"));
+ }
+}
+
+static void
+nbp_print(netdissect_options *ndo,
+ register const struct atNBP *np, u_int length, register u_short snet,
+ register u_char snode, register u_char skt)
+{
+ register const struct atNBPtuple *tp =
+ (const struct atNBPtuple *)((u_char *)np + nbpHeaderSize);
+ int i;
+ const u_char *ep;
+
+ if (length < nbpHeaderSize) {
+ ND_PRINT((ndo, " truncated-nbp %u", length));
+ return;
+ }
+
+ length -= nbpHeaderSize;
+ if (length < 8) {
+ /* must be room for at least one tuple */
+ ND_PRINT((ndo, " truncated-nbp %u", length + nbpHeaderSize));
+ return;
+ }
+ /* ep points to end of available data */
+ ep = ndo->ndo_snapend;
+ if ((const u_char *)tp > ep) {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+ switch (i = np->control & 0xf0) {
+
+ case nbpBrRq:
+ case nbpLkUp:
+ ND_PRINT((ndo, i == nbpLkUp? " nbp-lkup %d:":" nbp-brRq %d:", np->id));
+ if ((const u_char *)(tp + 1) > ep) {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+ (void)nbp_name_print(ndo, tp, ep);
+ /*
+ * look for anomalies: the spec says there can only
+ * be one tuple, the address must match the source
+ * address and the enumerator should be zero.
+ */
+ if ((np->control & 0xf) != 1)
+ ND_PRINT((ndo, " [ntup=%d]", np->control & 0xf));
+ if (tp->enumerator)
+ ND_PRINT((ndo, " [enum=%d]", tp->enumerator));
+ if (EXTRACT_16BITS(&tp->net) != snet ||
+ tp->node != snode || tp->skt != skt)
+ ND_PRINT((ndo, " [addr=%s.%d]",
+ ataddr_string(ndo, EXTRACT_16BITS(&tp->net),
+ tp->node), tp->skt));
+ break;
+
+ case nbpLkUpReply:
+ ND_PRINT((ndo, " nbp-reply %d:", np->id));
+
+ /* print each of the tuples in the reply */
+ for (i = np->control & 0xf; --i >= 0 && tp; )
+ tp = nbp_tuple_print(ndo, tp, ep, snet, snode, skt);
+ break;
+
+ default:
+ ND_PRINT((ndo, " nbp-0x%x %d (%u)", np->control, np->id, length));
+ break;
+ }
+}
+
+/* print a counted string */
+static const char *
+print_cstring(netdissect_options *ndo,
+ register const char *cp, register const u_char *ep)
+{
+ register u_int length;
+
+ if (cp >= (const char *)ep) {
+ ND_PRINT((ndo, "%s", tstr));
+ return (0);
+ }
+ length = *cp++;
+
+ /* Spec says string can be at most 32 bytes long */
+ if (length > 32) {
+ ND_PRINT((ndo, "[len=%u]", length));
+ return (0);
+ }
+ while ((int)--length >= 0) {
+ if (cp >= (const char *)ep) {
+ ND_PRINT((ndo, "%s", tstr));
+ return (0);
+ }
+ ND_PRINT((ndo, "%c", *cp++));
+ }
+ return (cp);
+}
+
+static const struct atNBPtuple *
+nbp_tuple_print(netdissect_options *ndo,
+ register const struct atNBPtuple *tp, register const u_char *ep,
+ register u_short snet, register u_char snode, register u_char skt)
+{
+ register const struct atNBPtuple *tpn;
+
+ if ((const u_char *)(tp + 1) > ep) {
+ ND_PRINT((ndo, "%s", tstr));
+ return 0;
+ }
+ tpn = nbp_name_print(ndo, tp, ep);
+
+ /* if the enumerator isn't 1, print it */
+ if (tp->enumerator != 1)
+ ND_PRINT((ndo, "(%d)", tp->enumerator));
+
+ /* if the socket doesn't match the src socket, print it */
+ if (tp->skt != skt)
+ ND_PRINT((ndo, " %d", tp->skt));
+
+ /* if the address doesn't match the src address, it's an anomaly */
+ if (EXTRACT_16BITS(&tp->net) != snet || tp->node != snode)
+ ND_PRINT((ndo, " [addr=%s]",
+ ataddr_string(ndo, EXTRACT_16BITS(&tp->net), tp->node)));
+
+ return (tpn);
+}
+
+static const struct atNBPtuple *
+nbp_name_print(netdissect_options *ndo,
+ const struct atNBPtuple *tp, register const u_char *ep)
+{
+ register const char *cp = (const char *)tp + nbpTupleSize;
+
+ ND_PRINT((ndo, " "));
+
+ /* Object */
+ ND_PRINT((ndo, "\""));
+ if ((cp = print_cstring(ndo, cp, ep)) != NULL) {
+ /* Type */
+ ND_PRINT((ndo, ":"));
+ if ((cp = print_cstring(ndo, cp, ep)) != NULL) {
+ /* Zone */
+ ND_PRINT((ndo, "@"));
+ if ((cp = print_cstring(ndo, cp, ep)) != NULL)
+ ND_PRINT((ndo, "\""));
+ }
+ }
+ return ((const struct atNBPtuple *)cp);
+}
+
+
+#define HASHNAMESIZE 4096
+
+struct hnamemem {
+ int addr;
+ char *name;
+ struct hnamemem *nxt;
+};
+
+static struct hnamemem hnametable[HASHNAMESIZE];
+
+static const char *
+ataddr_string(netdissect_options *ndo,
+ u_short atnet, u_char athost)
+{
+ register struct hnamemem *tp, *tp2;
+ register int i = (atnet << 8) | athost;
+ char nambuf[256+1];
+ static int first = 1;
+ FILE *fp;
+
+ /*
+ * if this is the first call, see if there's an AppleTalk
+ * number to name map file.
+ */
+ if (first && (first = 0, !ndo->ndo_nflag)
+ && (fp = fopen("/etc/atalk.names", "r"))) {
+ char line[256];
+ int i1, i2;
+
+ while (fgets(line, sizeof(line), fp)) {
+ if (line[0] == '\n' || line[0] == 0 || line[0] == '#')
+ continue;
+ if (sscanf(line, "%d.%d %256s", &i1, &i2, nambuf) == 3)
+ /* got a hostname. */
+ i2 |= (i1 << 8);
+ else if (sscanf(line, "%d %256s", &i1, nambuf) == 2)
+ /* got a net name */
+ i2 = (i1 << 8) | 255;
+ else
+ continue;
+
+ for (tp = &hnametable[i2 & (HASHNAMESIZE-1)];
+ tp->nxt; tp = tp->nxt)
+ ;
+ tp->addr = i2;
+ tp->nxt = newhnamemem();
+ tp->name = strdup(nambuf);
+ }
+ fclose(fp);
+ }
+
+ for (tp = &hnametable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
+ if (tp->addr == i)
+ return (tp->name);
+
+ /* didn't have the node name -- see if we've got the net name */
+ i |= 255;
+ for (tp2 = &hnametable[i & (HASHNAMESIZE-1)]; tp2->nxt; tp2 = tp2->nxt)
+ if (tp2->addr == i) {
+ tp->addr = (atnet << 8) | athost;
+ tp->nxt = newhnamemem();
+ (void)snprintf(nambuf, sizeof(nambuf), "%s.%d",
+ tp2->name, athost);
+ tp->name = strdup(nambuf);
+ return (tp->name);
+ }
+
+ tp->addr = (atnet << 8) | athost;
+ tp->nxt = newhnamemem();
+ if (athost != 255)
+ (void)snprintf(nambuf, sizeof(nambuf), "%d.%d", atnet, athost);
+ else
+ (void)snprintf(nambuf, sizeof(nambuf), "%d", atnet);
+ tp->name = strdup(nambuf);
+
+ return (tp->name);
+}
+
+static const struct tok skt2str[] = {
+ { rtmpSkt, "rtmp" }, /* routing table maintenance */
+ { nbpSkt, "nis" }, /* name info socket */
+ { echoSkt, "echo" }, /* AppleTalk echo protocol */
+ { zipSkt, "zip" }, /* zone info protocol */
+ { 0, NULL }
+};
+
+static const char *
+ddpskt_string(netdissect_options *ndo,
+ register int skt)
+{
+ static char buf[8];
+
+ if (ndo->ndo_nflag) {
+ (void)snprintf(buf, sizeof(buf), "%d", skt);
+ return (buf);
+ }
+ return (tok2str(skt2str, "%d", skt));
+}
--- /dev/null
+/*
+ * Copyright (c) 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-atm.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+#include "atm.h"
+#include "atmuni31.h"
+#include "llc.h"
+
+static const char tstr[] = "[|atm]";
+
+#define OAM_CRC10_MASK 0x3ff
+#define OAM_PAYLOAD_LEN 48
+#define OAM_FUNCTION_SPECIFIC_LEN 45 /* this excludes crc10 and cell-type/function-type */
+#define OAM_CELLTYPE_FUNCTYPE_LEN 1
+
+static const struct tok oam_f_values[] = {
+ { VCI_OAMF4SC, "OAM F4 (segment)" },
+ { VCI_OAMF4EC, "OAM F4 (end)" },
+ { 0, NULL }
+};
+
+static const struct tok atm_pty_values[] = {
+ { 0x0, "user data, uncongested, SDU 0" },
+ { 0x1, "user data, uncongested, SDU 1" },
+ { 0x2, "user data, congested, SDU 0" },
+ { 0x3, "user data, congested, SDU 1" },
+ { 0x4, "VCC OAM F5 flow segment" },
+ { 0x5, "VCC OAM F5 flow end-to-end" },
+ { 0x6, "Traffic Control and resource Mgmt" },
+ { 0, NULL }
+};
+
+#define OAM_CELLTYPE_FM 0x1
+#define OAM_CELLTYPE_PM 0x2
+#define OAM_CELLTYPE_AD 0x8
+#define OAM_CELLTYPE_SM 0xf
+
+static const struct tok oam_celltype_values[] = {
+ { OAM_CELLTYPE_FM, "Fault Management" },
+ { OAM_CELLTYPE_PM, "Performance Management" },
+ { OAM_CELLTYPE_AD, "activate/deactivate" },
+ { OAM_CELLTYPE_SM, "System Management" },
+ { 0, NULL }
+};
+
+#define OAM_FM_FUNCTYPE_AIS 0x0
+#define OAM_FM_FUNCTYPE_RDI 0x1
+#define OAM_FM_FUNCTYPE_CONTCHECK 0x4
+#define OAM_FM_FUNCTYPE_LOOPBACK 0x8
+
+static const struct tok oam_fm_functype_values[] = {
+ { OAM_FM_FUNCTYPE_AIS, "AIS" },
+ { OAM_FM_FUNCTYPE_RDI, "RDI" },
+ { OAM_FM_FUNCTYPE_CONTCHECK, "Continuity Check" },
+ { OAM_FM_FUNCTYPE_LOOPBACK, "Loopback" },
+ { 0, NULL }
+};
+
+static const struct tok oam_pm_functype_values[] = {
+ { 0x0, "Forward Monitoring" },
+ { 0x1, "Backward Reporting" },
+ { 0x2, "Monitoring and Reporting" },
+ { 0, NULL }
+};
+
+static const struct tok oam_ad_functype_values[] = {
+ { 0x0, "Performance Monitoring" },
+ { 0x1, "Continuity Check" },
+ { 0, NULL }
+};
+
+#define OAM_FM_LOOPBACK_INDICATOR_MASK 0x1
+
+static const struct tok oam_fm_loopback_indicator_values[] = {
+ { 0x0, "Reply" },
+ { 0x1, "Request" },
+ { 0, NULL }
+};
+
+static const struct tok *oam_functype_values[16] = {
+ NULL,
+ oam_fm_functype_values, /* 1 */
+ oam_pm_functype_values, /* 2 */
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ oam_ad_functype_values, /* 8 */
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+/*
+ * Print an RFC 1483 LLC-encapsulated ATM frame.
+ */
+static void
+atm_llc_print(netdissect_options *ndo,
+ const u_char *p, int length, int caplen)
+{
+ u_short extracted_ethertype;
+
+ if (!llc_print(ndo, p, length, caplen, NULL, NULL,
+ &extracted_ethertype)) {
+ /* ether_type not known, print raw packet */
+ if (extracted_ethertype) {
+ ND_PRINT((ndo, "(LLC %s) ",
+ etherproto_string(htons(extracted_ethertype))));
+ }
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+}
+
+/*
+ * Given a SAP value, generate the LLC header value for a UI packet
+ * with that SAP as the source and destination SAP.
+ */
+#define LLC_UI_HDR(sap) ((sap)<<16 | (sap<<8) | 0x03)
+
+/*
+ * This is the top level routine of the printer. 'p' points
+ * to the LLC/SNAP 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
+atm_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int caplen = h->caplen;
+ u_int length = h->len;
+ uint32_t llchdr;
+ u_int hdrlen = 0;
+
+ if (caplen < 1 || length < 1) {
+ ND_PRINT((ndo, "%s", tstr));
+ return (caplen);
+ }
+
+ /* Cisco Style NLPID ? */
+ if (*p == LLC_UI) {
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "CNLPID "));
+ isoclns_print(ndo, p + 1, length - 1, caplen - 1);
+ return hdrlen;
+ }
+
+ /*
+ * Must have at least a DSAP, an SSAP, and the first byte of the
+ * control field.
+ */
+ if (caplen < 3 || length < 3) {
+ ND_PRINT((ndo, "%s", tstr));
+ return (caplen);
+ }
+
+ /*
+ * Extract the presumed LLC header into a variable, for quick
+ * testing.
+ * Then check for a header that's neither a header for a SNAP
+ * packet nor an RFC 2684 routed NLPID-formatted PDU nor
+ * an 802.2-but-no-SNAP IP packet.
+ */
+ llchdr = EXTRACT_24BITS(p);
+ if (llchdr != LLC_UI_HDR(LLCSAP_SNAP) &&
+ llchdr != LLC_UI_HDR(LLCSAP_ISONS) &&
+ llchdr != LLC_UI_HDR(LLCSAP_IP)) {
+ /*
+ * XXX - assume 802.6 MAC header from Fore driver.
+ *
+ * Unfortunately, the above list doesn't check for
+ * all known SAPs, doesn't check for headers where
+ * the source and destination SAP aren't the same,
+ * and doesn't check for non-UI frames. It also
+ * runs the risk of an 802.6 MAC header that happens
+ * to begin with one of those values being
+ * incorrectly treated as an 802.2 header.
+ *
+ * So is that Fore driver still around? And, if so,
+ * is it still putting 802.6 MAC headers on ATM
+ * packets? If so, could it be changed to use a
+ * new DLT_IEEE802_6 value if we added it?
+ */
+ if (caplen < 20 || length < 20) {
+ ND_PRINT((ndo, "%s", tstr));
+ return (caplen);
+ }
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "%08x%08x %08x%08x ",
+ EXTRACT_32BITS(p),
+ EXTRACT_32BITS(p+4),
+ EXTRACT_32BITS(p+8),
+ EXTRACT_32BITS(p+12)));
+ p += 20;
+ length -= 20;
+ caplen -= 20;
+ hdrlen += 20;
+ }
+ atm_llc_print(ndo, p, length, caplen);
+ return (hdrlen);
+}
+
+/*
+ * ATM signalling.
+ */
+static const struct tok msgtype2str[] = {
+ { CALL_PROCEED, "Call_proceeding" },
+ { CONNECT, "Connect" },
+ { CONNECT_ACK, "Connect_ack" },
+ { SETUP, "Setup" },
+ { RELEASE, "Release" },
+ { RELEASE_DONE, "Release_complete" },
+ { RESTART, "Restart" },
+ { RESTART_ACK, "Restart_ack" },
+ { STATUS, "Status" },
+ { STATUS_ENQ, "Status_enquiry" },
+ { ADD_PARTY, "Add_party" },
+ { ADD_PARTY_ACK, "Add_party_ack" },
+ { ADD_PARTY_REJ, "Add_party_reject" },
+ { DROP_PARTY, "Drop_party" },
+ { DROP_PARTY_ACK, "Drop_party_ack" },
+ { 0, NULL }
+};
+
+static void
+sig_print(netdissect_options *ndo,
+ const u_char *p, int caplen)
+{
+ uint32_t call_ref;
+
+ if (caplen < PROTO_POS) {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+ if (p[PROTO_POS] == Q2931) {
+ /*
+ * protocol:Q.2931 for User to Network Interface
+ * (UNI 3.1) signalling
+ */
+ ND_PRINT((ndo, "Q.2931"));
+ if (caplen < MSG_TYPE_POS) {
+ ND_PRINT((ndo, " %s", tstr));
+ return;
+ }
+ ND_PRINT((ndo, ":%s ",
+ tok2str(msgtype2str, "msgtype#%d", p[MSG_TYPE_POS])));
+
+ /*
+ * 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]);
+ ND_PRINT((ndo, "CALL_REF:0x%06x", call_ref));
+ } else {
+ /* SCCOP with some unknown protocol atop it */
+ ND_PRINT((ndo, "SSCOP, proto %d ", p[PROTO_POS]));
+ }
+}
+
+/*
+ * Print an ATM PDU (such as an AAL5 PDU).
+ */
+void
+atm_print(netdissect_options *ndo,
+ u_int vpi, u_int vci, u_int traftype, const u_char *p, u_int length,
+ u_int caplen)
+{
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "VPI:%u VCI:%u ", vpi, vci));
+
+ if (vpi == 0) {
+ switch (vci) {
+
+ case VCI_PPC:
+ sig_print(ndo, p, caplen);
+ return;
+
+ case VCI_BCC:
+ ND_PRINT((ndo, "broadcast sig: "));
+ return;
+
+ case VCI_OAMF4SC: /* fall through */
+ case VCI_OAMF4EC:
+ oam_print(ndo, p, length, ATM_OAM_HEC);
+ return;
+
+ case VCI_METAC:
+ ND_PRINT((ndo, "meta: "));
+ return;
+
+ case VCI_ILMIC:
+ ND_PRINT((ndo, "ilmi: "));
+ snmp_print(ndo, p, length);
+ return;
+ }
+ }
+
+ switch (traftype) {
+
+ case ATM_LLC:
+ default:
+ /*
+ * Assumes traffic is LLC if unknown.
+ */
+ atm_llc_print(ndo, p, length, caplen);
+ break;
+
+ case ATM_LANE:
+ lane_print(ndo, p, length, caplen);
+ break;
+ }
+}
+
+struct oam_fm_loopback_t {
+ uint8_t loopback_indicator;
+ uint8_t correlation_tag[4];
+ uint8_t loopback_id[12];
+ uint8_t source_id[12];
+ uint8_t unused[16];
+};
+
+struct oam_fm_ais_rdi_t {
+ uint8_t failure_type;
+ uint8_t failure_location[16];
+ uint8_t unused[28];
+};
+
+int
+oam_print (netdissect_options *ndo,
+ const u_char *p, u_int length, u_int hec)
+{
+ uint32_t cell_header;
+ uint16_t vpi, vci, cksum, cksum_shouldbe, idx;
+ uint8_t cell_type, func_type, payload, clp;
+
+ union {
+ const struct oam_fm_loopback_t *oam_fm_loopback;
+ const struct oam_fm_ais_rdi_t *oam_fm_ais_rdi;
+ } oam_ptr;
+
+
+ cell_header = EXTRACT_32BITS(p+hec);
+ cell_type = ((*(p+ATM_HDR_LEN_NOHEC+hec))>>4) & 0x0f;
+ func_type = (*(p+ATM_HDR_LEN_NOHEC+hec)) & 0x0f;
+
+ vpi = (cell_header>>20)&0xff;
+ vci = (cell_header>>4)&0xffff;
+ payload = (cell_header>>1)&0x7;
+ clp = cell_header&0x1;
+
+ ND_PRINT((ndo, "%s, vpi %u, vci %u, payload [ %s ], clp %u, length %u",
+ tok2str(oam_f_values, "OAM F5", vci),
+ vpi, vci,
+ tok2str(atm_pty_values, "Unknown", payload),
+ clp, length));
+
+ if (!ndo->ndo_vflag) {
+ return 1;
+ }
+
+ ND_PRINT((ndo, "\n\tcell-type %s (%u)",
+ tok2str(oam_celltype_values, "unknown", cell_type),
+ cell_type));
+
+ if (oam_functype_values[cell_type] == NULL)
+ ND_PRINT((ndo, ", func-type unknown (%u)", func_type));
+ else
+ ND_PRINT((ndo, ", func-type %s (%u)",
+ tok2str(oam_functype_values[cell_type],"none",func_type),
+ func_type));
+
+ p += ATM_HDR_LEN_NOHEC + hec;
+
+ switch (cell_type << 4 | func_type) {
+ case (OAM_CELLTYPE_FM << 4 | OAM_FM_FUNCTYPE_LOOPBACK):
+ oam_ptr.oam_fm_loopback = (const struct oam_fm_loopback_t *)(p + OAM_CELLTYPE_FUNCTYPE_LEN);
+ ND_PRINT((ndo, "\n\tLoopback-Indicator %s, Correlation-Tag 0x%08x",
+ tok2str(oam_fm_loopback_indicator_values,
+ "Unknown",
+ oam_ptr.oam_fm_loopback->loopback_indicator & OAM_FM_LOOPBACK_INDICATOR_MASK),
+ EXTRACT_32BITS(&oam_ptr.oam_fm_loopback->correlation_tag)));
+ ND_PRINT((ndo, "\n\tLocation-ID "));
+ for (idx = 0; idx < sizeof(oam_ptr.oam_fm_loopback->loopback_id); idx++) {
+ if (idx % 2) {
+ ND_PRINT((ndo, "%04x ", EXTRACT_16BITS(&oam_ptr.oam_fm_loopback->loopback_id[idx])));
+ }
+ }
+ ND_PRINT((ndo, "\n\tSource-ID "));
+ for (idx = 0; idx < sizeof(oam_ptr.oam_fm_loopback->source_id); idx++) {
+ if (idx % 2) {
+ ND_PRINT((ndo, "%04x ", EXTRACT_16BITS(&oam_ptr.oam_fm_loopback->source_id[idx])));
+ }
+ }
+ break;
+
+ case (OAM_CELLTYPE_FM << 4 | OAM_FM_FUNCTYPE_AIS):
+ case (OAM_CELLTYPE_FM << 4 | OAM_FM_FUNCTYPE_RDI):
+ oam_ptr.oam_fm_ais_rdi = (const struct oam_fm_ais_rdi_t *)(p + OAM_CELLTYPE_FUNCTYPE_LEN);
+ ND_PRINT((ndo, "\n\tFailure-type 0x%02x", oam_ptr.oam_fm_ais_rdi->failure_type));
+ ND_PRINT((ndo, "\n\tLocation-ID "));
+ for (idx = 0; idx < sizeof(oam_ptr.oam_fm_ais_rdi->failure_location); idx++) {
+ if (idx % 2) {
+ ND_PRINT((ndo, "%04x ", EXTRACT_16BITS(&oam_ptr.oam_fm_ais_rdi->failure_location[idx])));
+ }
+ }
+ break;
+
+ case (OAM_CELLTYPE_FM << 4 | OAM_FM_FUNCTYPE_CONTCHECK):
+ /* FIXME */
+ break;
+
+ default:
+ break;
+ }
+
+ /* crc10 checksum verification */
+ cksum = EXTRACT_16BITS(p + OAM_CELLTYPE_FUNCTYPE_LEN + OAM_FUNCTION_SPECIFIC_LEN)
+ & OAM_CRC10_MASK;
+ cksum_shouldbe = verify_crc10_cksum(0, p, OAM_PAYLOAD_LEN);
+
+ ND_PRINT((ndo, "\n\tcksum 0x%03x (%scorrect)",
+ cksum,
+ cksum_shouldbe == 0 ? "" : "in"));
+
+ return 1;
+}
--- /dev/null
+/*
+ * 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.
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+static const char tstr[] = "[|babel]";
+
+static void babel_print_v2(netdissect_options *, const u_char *cp, u_int length);
+
+void
+babel_print(netdissect_options *ndo,
+ const u_char *cp, u_int length)
+{
+ ND_PRINT((ndo, "babel"));
+
+ ND_TCHECK2(*cp, 4);
+
+ if(cp[0] != 42) {
+ ND_PRINT((ndo, " malformed header"));
+ return;
+ } else {
+ ND_PRINT((ndo, " %d", cp[1]));
+ }
+
+ switch(cp[1]) {
+ case 2:
+ babel_print_v2(ndo, cp, length);
+ break;
+ default:
+ ND_PRINT((ndo, " unknown version"));
+ break;
+ }
+
+ return;
+
+ trunc:
+ ND_PRINT((ndo, " %s", tstr));
+ return;
+}
+
+/* TLVs */
+#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
+#define MESSAGE_TSPC 11
+#define MESSAGE_HMAC 12
+
+/* sub-TLVs */
+#define MESSAGE_SUB_PAD1 0
+#define MESSAGE_SUB_PADN 1
+#define MESSAGE_SUB_DIVERSITY 2
+#define MESSAGE_SUB_TIMESTAMP 3
+
+/* Diversity sub-TLV channel codes */
+static const struct tok diversity_str[] = {
+ { 0, "reserved" },
+ { 255, "all" },
+ { 0, NULL }
+};
+
+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(netdissect_options *ndo, 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(ndo, prefix + 12), plen - 96);
+ else
+#ifdef INET6
+ snprintf(buf, 50, "%s/%u", ip6addr_string(ndo, prefix), plen);
+#else
+ snprintf(buf, 50, "IPv6 addresses not supported");
+#endif
+ buf[49] = '\0';
+ return buf;
+}
+
+static const char *
+format_address(netdissect_options *ndo, const u_char *prefix)
+{
+ if(memcmp(prefix, v4prefix, 12) == 0)
+ return ipaddr_string(ndo, prefix + 12);
+ else
+#ifdef INET6
+ return ip6addr_string(ndo, prefix);
+#else
+ return "IPv6 addresses not supported";
+#endif
+}
+
+static const char *
+format_interval(const uint16_t i)
+{
+ static char buf[sizeof("000.00s")];
+
+ if (i == 0)
+ return "0.0s (bogus)";
+ snprintf(buf, sizeof(buf), "%u.%02us", i / 100, i % 100);
+ return buf;
+}
+
+static const char *
+format_interval_update(const uint16_t i)
+{
+ return i == 0xFFFF ? "infinity" : format_interval(i);
+}
+
+static const char *
+format_timestamp(const uint32_t i)
+{
+ static char buf[sizeof("0000.000000s")];
+ snprintf(buf, sizeof(buf), "%u.%06us", i / 1000000, i % 1000000);
+ return buf;
+}
+
+/* Return number of octets consumed from the input buffer (not the prefix length
+ * in bytes), or -1 for encoding error. */
+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];
+ int consumed = 0;
+
+ 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);
+ consumed = 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);
+ consumed = 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);
+ consumed = pb - 8;
+ }
+ break;
+ default:
+ return -1;
+ }
+
+ memcpy(p_r, prefix, 16);
+ return consumed;
+}
+
+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);
+}
+
+/*
+ * Sub-TLVs consume the "extra data" of Babel TLVs (see Section 4.3 of RFC6126),
+ * their encoding is similar to the encoding of TLVs, but the type namespace is
+ * different:
+ *
+ * o Type 0 stands for Pad1 sub-TLV with the same encoding as the Pad1 TLV.
+ * o Type 1 stands for PadN sub-TLV with the same encoding as the PadN TLV.
+ * o Type 2 stands for Diversity sub-TLV, which propagates diversity routing
+ * data. Its body is a variable-length sequence of 8-bit unsigned integers,
+ * each representing per-hop number of interferring radio channel for the
+ * prefix. Channel 0 is invalid and must not be used in the sub-TLV, channel
+ * 255 interferes with any other channel.
+ * o Type 3 stands for Timestamp sub-TLV, used to compute RTT between
+ * neighbours. In the case of a Hello TLV, the body stores a 32-bits
+ * timestamp, while in the case of a IHU TLV, two 32-bits timestamps are
+ * stored.
+ *
+ * Sub-TLV types 0 and 1 are valid for any TLV type, whether sub-TLV type 2 is
+ * only valid for TLV type 8 (Update). Note that within an Update TLV a missing
+ * Diversity sub-TLV is not the same as a Diversity sub-TLV with an empty body.
+ * The former would mean a lack of any claims about the interference, and the
+ * latter would state that interference is definitely absent.
+ * A type 3 sub-TLV is valid both for Hello and IHU TLVs, though the exact
+ * semantic of the sub-TLV is different in each case.
+ */
+static void
+subtlvs_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const uint8_t tlv_type)
+{
+ uint8_t subtype, sublen;
+ const char *sep;
+ uint32_t t1, t2;
+
+ while (cp < ep) {
+ subtype = *cp++;
+ if(subtype == MESSAGE_SUB_PAD1) {
+ ND_PRINT((ndo, " sub-pad1"));
+ continue;
+ }
+ if(cp == ep)
+ goto corrupt;
+ sublen = *cp++;
+ if(cp + sublen > ep)
+ goto corrupt;
+
+ switch(subtype) {
+ case MESSAGE_SUB_PADN:
+ ND_PRINT((ndo, " sub-padn"));
+ cp += sublen;
+ break;
+ case MESSAGE_SUB_DIVERSITY:
+ ND_PRINT((ndo, " sub-diversity"));
+ if (sublen == 0) {
+ ND_PRINT((ndo, " empty"));
+ break;
+ }
+ sep = " ";
+ while(sublen--) {
+ ND_PRINT((ndo, "%s%s", sep, tok2str(diversity_str, "%u", *cp++)));
+ sep = "-";
+ }
+ if(tlv_type != MESSAGE_UPDATE)
+ ND_PRINT((ndo, " (bogus)"));
+ break;
+ case MESSAGE_SUB_TIMESTAMP:
+ ND_PRINT((ndo, " sub-timestamp"));
+ if(tlv_type == MESSAGE_HELLO) {
+ if(sublen < 4)
+ goto corrupt;
+ t1 = EXTRACT_32BITS(cp);
+ ND_PRINT((ndo, " %s", format_timestamp(t1)));
+ } else if(tlv_type == MESSAGE_IHU) {
+ if(sublen < 8)
+ goto corrupt;
+ t1 = EXTRACT_32BITS(cp);
+ ND_PRINT((ndo, " %s", format_timestamp(t1)));
+ t2 = EXTRACT_32BITS(cp + 4);
+ ND_PRINT((ndo, "|%s", format_timestamp(t2)));
+ } else
+ ND_PRINT((ndo, " (bogus)"));
+ cp += sublen;
+ break;
+ default:
+ ND_PRINT((ndo, " sub-unknown-0x%02x", subtype));
+ cp += sublen;
+ } /* switch */
+ } /* while */
+ return;
+
+ corrupt:
+ ND_PRINT((ndo, " (corrupt)"));
+}
+
+#define ICHECK(i, l) \
+ if ((i) + (l) > bodylen || (i) + (l) > length) goto corrupt;
+
+static void
+babel_print_v2(netdissect_options *ndo,
+ 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};
+
+ ND_TCHECK2(*cp, 4);
+ if (length < 4)
+ goto corrupt;
+ bodylen = EXTRACT_16BITS(cp + 2);
+ ND_PRINT((ndo, " (%u)", bodylen));
+
+ /* Process the TLVs in the body */
+ i = 0;
+ while(i < bodylen) {
+ const u_char *message;
+ u_int type, len;
+
+ message = cp + 4 + i;
+
+ ND_TCHECK2(*message, 1);
+ if((type = message[0]) == MESSAGE_PAD1) {
+ ND_PRINT((ndo, ndo->ndo_vflag ? "\n\tPad 1" : " pad1"));
+ i += 1;
+ continue;
+ }
+
+ ND_TCHECK2(*message, 2);
+ ICHECK(i, 2);
+ len = message[1];
+
+ ND_TCHECK2(*message, 2 + len);
+ ICHECK(i, 2 + len);
+
+ switch(type) {
+ case MESSAGE_PADN: {
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, " padN"));
+ else
+ ND_PRINT((ndo, "\n\tPad %d", len + 2));
+ }
+ break;
+
+ case MESSAGE_ACK_REQ: {
+ u_short nonce, interval;
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, " ack-req"));
+ else {
+ ND_PRINT((ndo, "\n\tAcknowledgment Request "));
+ if(len < 6) goto corrupt;
+ nonce = EXTRACT_16BITS(message + 4);
+ interval = EXTRACT_16BITS(message + 6);
+ ND_PRINT((ndo, "%04x %s", nonce, format_interval(interval)));
+ }
+ }
+ break;
+
+ case MESSAGE_ACK: {
+ u_short nonce;
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, " ack"));
+ else {
+ ND_PRINT((ndo, "\n\tAcknowledgment "));
+ if(len < 2) goto corrupt;
+ nonce = EXTRACT_16BITS(message + 2);
+ ND_PRINT((ndo, "%04x", nonce));
+ }
+ }
+ break;
+
+ case MESSAGE_HELLO: {
+ u_short seqno, interval;
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, " hello"));
+ else {
+ ND_PRINT((ndo, "\n\tHello "));
+ if(len < 6) goto corrupt;
+ seqno = EXTRACT_16BITS(message + 4);
+ interval = EXTRACT_16BITS(message + 6);
+ ND_PRINT((ndo, "seqno %u interval %s", seqno, format_interval(interval)));
+ /* Extra data. */
+ if(len > 6)
+ subtlvs_print(ndo, message + 8, message + 2 + len, type);
+ }
+ }
+ break;
+
+ case MESSAGE_IHU: {
+ unsigned short txcost, interval;
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, " ihu"));
+ else {
+ u_char address[16];
+ int rc;
+ ND_PRINT((ndo, "\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) { ND_PRINT((ndo, "%s", tstr)); break; }
+ ND_PRINT((ndo, "%s txcost %u interval %s",
+ format_address(ndo, address), txcost, format_interval(interval)));
+ /* Extra data. */
+ if((u_int)rc < len - 6)
+ subtlvs_print(ndo, message + 8 + rc, message + 2 + len,
+ type);
+ }
+ }
+ break;
+
+ case MESSAGE_ROUTER_ID: {
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, " router-id"));
+ else {
+ ND_PRINT((ndo, "\n\tRouter Id"));
+ if(len < 10) goto corrupt;
+ ND_PRINT((ndo, " %s", format_id(message + 4)));
+ }
+ }
+ break;
+
+ case MESSAGE_NH: {
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, " nh"));
+ else {
+ int rc;
+ u_char nh[16];
+ ND_PRINT((ndo, "\n\tNext Hop"));
+ if(len < 2) goto corrupt;
+ rc = network_address(message[2], message + 4, len - 2, nh);
+ if(rc < 0) goto corrupt;
+ ND_PRINT((ndo, " %s", format_address(ndo, nh)));
+ }
+ }
+ break;
+
+ case MESSAGE_UPDATE: {
+ if (!ndo->ndo_vflag) {
+ ND_PRINT((ndo, " update"));
+ if(len < 1)
+ ND_PRINT((ndo, "/truncated"));
+ else
+ ND_PRINT((ndo, "%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];
+ ND_PRINT((ndo, "\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);
+ ND_PRINT((ndo, "%s%s%s %s metric %u seqno %u interval %s",
+ (message[3] & 0x80) ? "/prefix": "",
+ (message[3] & 0x40) ? "/id" : "",
+ (message[3] & 0x3f) ? "/unknown" : "",
+ format_prefix(ndo, prefix, plen),
+ metric, seqno, format_interval_update(interval)));
+ if(message[3] & 0x80) {
+ if(message[2] == 1)
+ memcpy(v4_prefix, prefix, 16);
+ else
+ memcpy(v6_prefix, prefix, 16);
+ }
+ /* extra data? */
+ if((u_int)rc < len - 10)
+ subtlvs_print(ndo, message + 12 + rc, message + 2 + len, type);
+ }
+ }
+ break;
+
+ case MESSAGE_REQUEST: {
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, " request"));
+ else {
+ int rc;
+ u_char prefix[16], plen;
+ ND_PRINT((ndo, "\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;
+ ND_PRINT((ndo, "for %s",
+ message[2] == 0 ? "any" : format_prefix(ndo, prefix, plen)));
+ }
+ }
+ break;
+
+ case MESSAGE_MH_REQUEST : {
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, " mh-request"));
+ else {
+ int rc;
+ u_short seqno;
+ u_char prefix[16], plen;
+ ND_PRINT((ndo, "\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);
+ ND_PRINT((ndo, "(%u hops) for %s seqno %u id %s",
+ message[6], format_prefix(ndo, prefix, plen),
+ seqno, format_id(message + 8)));
+ }
+ }
+ break;
+ case MESSAGE_TSPC :
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, " tspc"));
+ else {
+ ND_PRINT((ndo, "\n\tTS/PC "));
+ if(len < 6) goto corrupt;
+ ND_PRINT((ndo, "timestamp %u packetcounter %u", EXTRACT_32BITS (message + 4),
+ EXTRACT_16BITS(message + 2)));
+ }
+ break;
+ case MESSAGE_HMAC : {
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, " hmac"));
+ else {
+ unsigned j;
+ ND_PRINT((ndo, "\n\tHMAC "));
+ if(len < 18) goto corrupt;
+ ND_PRINT((ndo, "key-id %u digest-%u ", EXTRACT_16BITS(message + 2), len - 2));
+ for (j = 0; j < len - 2; j++)
+ ND_PRINT((ndo, "%02X", message[4 + j]));
+ }
+ }
+ break;
+ default:
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, " unknown"));
+ else
+ ND_PRINT((ndo, "\n\tUnknown message type %d", type));
+ }
+ i += len + 2;
+ }
+ return;
+
+ trunc:
+ ND_PRINT((ndo, " %s", tstr));
+ return;
+
+ corrupt:
+ ND_PRINT((ndo, " (corrupt)"));
+ return;
+}
--- /dev/null
+/*
+ * Copyright (C) 2000, Richard Sharpe
+ *
+ * This software may be distributed either under the terms of the
+ * BSD-style licence that accompanies tcpdump or under the GNU GPL
+ * version 2 or later.
+ *
+ * print-beep.c
+ *
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-beep.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+
+/* Check for a string but not go beyond length
+ * Return TRUE on match, FALSE otherwise
+ *
+ * Looks at the first few chars up to tl1 ...
+ */
+
+static int
+l_strnstart(const char *tstr1, u_int tl1, const char *str2, u_int l2)
+{
+
+ if (tl1 > l2)
+ return 0;
+
+ return (strncmp(tstr1, str2, tl1) == 0 ? 1 : 0);
+}
+
+void
+beep_print(netdissect_options *ndo, const u_char *bp, u_int length)
+{
+
+ if (l_strnstart("MSG", 4, (const char *)bp, length)) /* A REQuest */
+ ND_PRINT((ndo, " BEEP MSG"));
+ else if (l_strnstart("RPY ", 4, (const char *)bp, length))
+ ND_PRINT((ndo, " BEEP RPY"));
+ else if (l_strnstart("ERR ", 4, (const char *)bp, length))
+ ND_PRINT((ndo, " BEEP ERR"));
+ else if (l_strnstart("ANS ", 4, (const char *)bp, length))
+ ND_PRINT((ndo, " BEEP ANS"));
+ else if (l_strnstart("NUL ", 4, (const char *)bp, length))
+ ND_PRINT((ndo, " BEEP NUL"));
+ else if (l_strnstart("SEQ ", 4, (const char *)bp, length))
+ ND_PRINT((ndo, " BEEP SEQ"));
+ else if (l_strnstart("END", 4, (const char *)bp, length))
+ ND_PRINT((ndo, " BEEP END"));
+ else
+ ND_PRINT((ndo, " BEEP (payload or undecoded)"));
+}
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-bfd.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+#include "udp.h"
+
+/*
+ * Control packet, BFDv0, draft-katz-ward-bfd-01.txt
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |Vers | Diag |H|D|P|F| Rsvd | Detect Mult | Length |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | My Discriminator |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Your Discriminator |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Desired Min TX Interval |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Required Min RX Interval |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Required Min Echo RX Interval |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+/*
+ * Control packet, BFDv1, draft-ietf-bfd-base-02.txt
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |Vers | Diag |Sta|P|F|C|A|D|R| Detect Mult | Length |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | My Discriminator |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Your Discriminator |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Desired Min TX Interval |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Required Min RX Interval |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Required Min Echo RX Interval |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+struct bfd_header_t {
+ uint8_t version_diag;
+ uint8_t flags;
+ uint8_t detect_time_multiplier;
+ uint8_t length;
+ uint8_t my_discriminator[4];
+ uint8_t your_discriminator[4];
+ uint8_t desired_min_tx_interval[4];
+ uint8_t required_min_rx_interval[4];
+ uint8_t required_min_echo_interval[4];
+};
+
+/*
+ * An optional Authentication Header may be present
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Auth Type | Auth Len | Authentication Data... |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+struct bfd_auth_header_t {
+ uint8_t auth_type;
+ uint8_t auth_len;
+ uint8_t auth_data;
+};
+
+static const struct tok bfd_v1_authentication_values[] = {
+ { 0, "Reserved" },
+ { 1, "Simple Password" },
+ { 2, "Keyed MD5" },
+ { 3, "Meticulous Keyed MD5" },
+ { 4, "Keyed SHA1" },
+ { 5, "Meticulous Keyed SHA1" },
+ { 0, NULL }
+};
+
+#define BFD_EXTRACT_VERSION(x) (((x)&0xe0)>>5)
+#define BFD_EXTRACT_DIAG(x) ((x)&0x1f)
+
+static const struct tok bfd_port_values[] = {
+ { BFD_CONTROL_PORT, "Control" },
+ { BFD_ECHO_PORT, "Echo" },
+ { 0, NULL }
+};
+
+
+static const struct tok bfd_diag_values[] = {
+ { 0, "No Diagnostic" },
+ { 1, "Control Detection Time Expired" },
+ { 2, "Echo Function Failed" },
+ { 3, "Neighbor Signaled Session Down" },
+ { 4, "Forwarding Plane Reset" },
+ { 5, "Path Down" },
+ { 6, "Concatenated Path Down" },
+ { 7, "Administratively Down" },
+ { 8, "Reverse Concatenated Path Down" },
+ { 0, NULL }
+};
+
+static const struct tok bfd_v0_flag_values[] = {
+ { 0x80, "I Hear You" },
+ { 0x40, "Demand" },
+ { 0x20, "Poll" },
+ { 0x10, "Final" },
+ { 0x08, "Reserved" },
+ { 0x04, "Reserved" },
+ { 0x02, "Reserved" },
+ { 0x01, "Reserved" },
+ { 0, NULL }
+};
+
+#define BFD_FLAG_AUTH 0x04
+
+static const struct tok bfd_v1_flag_values[] = {
+ { 0x20, "Poll" },
+ { 0x10, "Final" },
+ { 0x08, "Control Plane Independent" },
+ { BFD_FLAG_AUTH, "Authentication Present" },
+ { 0x02, "Demand" },
+ { 0x01, "Reserved" },
+ { 0, NULL }
+};
+
+static const struct tok bfd_v1_state_values[] = {
+ { 0, "AdminDown" },
+ { 1, "Down" },
+ { 2, "Init" },
+ { 3, "Up" },
+ { 0, NULL }
+};
+
+void
+bfd_print(netdissect_options *ndo, register const u_char *pptr,
+ register u_int len, register u_int port)
+{
+ const struct bfd_header_t *bfd_header;
+ const struct bfd_auth_header_t *bfd_auth_header;
+ uint8_t version = 0;
+
+ bfd_header = (const struct bfd_header_t *)pptr;
+ if (port == BFD_CONTROL_PORT) {
+ ND_TCHECK(*bfd_header);
+ version = BFD_EXTRACT_VERSION(bfd_header->version_diag);
+ } else if (port == BFD_ECHO_PORT) {
+ /* Echo is BFD v1 only */
+ version = 1;
+ }
+ switch ((port << 8) | version) {
+
+ /* BFDv0 */
+ case (BFD_CONTROL_PORT << 8):
+ if (ndo->ndo_vflag < 1)
+ {
+ ND_PRINT((ndo, "BFDv%u, %s, Flags: [%s], length: %u",
+ version,
+ tok2str(bfd_port_values, "unknown (%u)", port),
+ bittok2str(bfd_v0_flag_values, "none", bfd_header->flags),
+ len));
+ return;
+ }
+
+ ND_PRINT((ndo, "BFDv%u, length: %u\n\t%s, Flags: [%s], Diagnostic: %s (0x%02x)",
+ version,
+ len,
+ tok2str(bfd_port_values, "unknown (%u)", port),
+ bittok2str(bfd_v0_flag_values, "none", bfd_header->flags),
+ tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(bfd_header->version_diag)),
+ BFD_EXTRACT_DIAG(bfd_header->version_diag)));
+
+ ND_PRINT((ndo, "\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u",
+ bfd_header->detect_time_multiplier,
+ bfd_header->detect_time_multiplier * EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000,
+ bfd_header->length));
+
+
+ ND_PRINT((ndo, "\n\tMy Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->my_discriminator)));
+ ND_PRINT((ndo, ", Your Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->your_discriminator)));
+ ND_PRINT((ndo, "\n\t Desired min Tx Interval: %4u ms", EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000));
+ ND_PRINT((ndo, "\n\t Required min Rx Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_rx_interval)/1000));
+ ND_PRINT((ndo, "\n\t Required min Echo Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_echo_interval)/1000));
+ break;
+
+ /* BFDv1 */
+ case (BFD_CONTROL_PORT << 8 | 1):
+ if (ndo->ndo_vflag < 1)
+ {
+ ND_PRINT((ndo, "BFDv%u, %s, State %s, Flags: [%s], length: %u",
+ version,
+ tok2str(bfd_port_values, "unknown (%u)", port),
+ tok2str(bfd_v1_state_values, "unknown (%u)", (bfd_header->flags & 0xc0) >> 6),
+ bittok2str(bfd_v1_flag_values, "none", bfd_header->flags & 0x3f),
+ len));
+ return;
+ }
+
+ ND_PRINT((ndo, "BFDv%u, length: %u\n\t%s, State %s, Flags: [%s], Diagnostic: %s (0x%02x)",
+ version,
+ len,
+ tok2str(bfd_port_values, "unknown (%u)", port),
+ tok2str(bfd_v1_state_values, "unknown (%u)", (bfd_header->flags & 0xc0) >> 6),
+ bittok2str(bfd_v1_flag_values, "none", bfd_header->flags & 0x3f),
+ tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(bfd_header->version_diag)),
+ BFD_EXTRACT_DIAG(bfd_header->version_diag)));
+
+ ND_PRINT((ndo, "\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u",
+ bfd_header->detect_time_multiplier,
+ bfd_header->detect_time_multiplier * EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000,
+ bfd_header->length));
+
+
+ ND_PRINT((ndo, "\n\tMy Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->my_discriminator)));
+ ND_PRINT((ndo, ", Your Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->your_discriminator)));
+ ND_PRINT((ndo, "\n\t Desired min Tx Interval: %4u ms", EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000));
+ ND_PRINT((ndo, "\n\t Required min Rx Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_rx_interval)/1000));
+ ND_PRINT((ndo, "\n\t Required min Echo Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_echo_interval)/1000));
+
+ if (bfd_header->flags & BFD_FLAG_AUTH) {
+ pptr += sizeof (const struct bfd_header_t);
+ bfd_auth_header = (const struct bfd_auth_header_t *)pptr;
+ ND_TCHECK2(*bfd_auth_header, sizeof(const struct bfd_auth_header_t));
+ ND_PRINT((ndo, "\n\t%s (%u) Authentication, length %u present",
+ tok2str(bfd_v1_authentication_values,"Unknown",bfd_auth_header->auth_type),
+ bfd_auth_header->auth_type,
+ bfd_auth_header->auth_len));
+ }
+ break;
+
+ /* BFDv0 */
+ case (BFD_ECHO_PORT << 8): /* not yet supported - fall through */
+ /* BFDv1 */
+ case (BFD_ECHO_PORT << 8 | 1):
+
+ default:
+ ND_PRINT((ndo, "BFD, %s, length: %u",
+ tok2str(bfd_port_values, "unknown (%u)", port),
+ len));
+ if (ndo->ndo_vflag >= 1) {
+ if(!print_unknown_data(ndo, pptr,"\n\t",len))
+ return;
+ }
+ break;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|BFD]"));
+}
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * 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.
+ *
+ * Extensively modified by Hannes Gredler (hannes@juniper.net) for more
+ * complete BGP support.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-bgp.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+#include "af.h"
+#include "l2vpn.h"
+
+struct bgp {
+ uint8_t bgp_marker[16];
+ uint16_t bgp_len;
+ uint8_t bgp_type;
+};
+#define BGP_SIZE 19 /* unaligned */
+
+#define BGP_OPEN 1
+#define BGP_UPDATE 2
+#define BGP_NOTIFICATION 3
+#define BGP_KEEPALIVE 4
+#define BGP_ROUTE_REFRESH 5
+
+static const struct tok bgp_msg_values[] = {
+ { BGP_OPEN, "Open"},
+ { BGP_UPDATE, "Update"},
+ { BGP_NOTIFICATION, "Notification"},
+ { BGP_KEEPALIVE, "Keepalive"},
+ { BGP_ROUTE_REFRESH, "Route Refresh"},
+ { 0, NULL}
+};
+
+struct bgp_open {
+ uint8_t bgpo_marker[16];
+ uint16_t bgpo_len;
+ uint8_t bgpo_type;
+ uint8_t bgpo_version;
+ uint16_t bgpo_myas;
+ uint16_t bgpo_holdtime;
+ uint32_t bgpo_id;
+ uint8_t bgpo_optlen;
+ /* options should follow */
+};
+#define BGP_OPEN_SIZE 29 /* unaligned */
+
+struct bgp_opt {
+ uint8_t bgpopt_type;
+ uint8_t bgpopt_len;
+ /* variable length */
+};
+#define BGP_OPT_SIZE 2 /* some compilers may pad to 4 bytes */
+#define BGP_CAP_HEADER_SIZE 2 /* some compilers may pad to 4 bytes */
+
+struct bgp_notification {
+ uint8_t bgpn_marker[16];
+ uint16_t bgpn_len;
+ uint8_t bgpn_type;
+ uint8_t bgpn_major;
+ uint8_t bgpn_minor;
+};
+#define BGP_NOTIFICATION_SIZE 21 /* unaligned */
+
+struct bgp_route_refresh {
+ uint8_t bgp_marker[16];
+ uint16_t len;
+ uint8_t type;
+ uint8_t afi[2]; /* the compiler messes this structure up */
+ uint8_t res; /* when doing misaligned sequences of int8 and int16 */
+ uint8_t safi; /* afi should be int16 - so we have to access it using */
+}; /* EXTRACT_16BITS(&bgp_route_refresh->afi) (sigh) */
+#define BGP_ROUTE_REFRESH_SIZE 23
+
+#define bgp_attr_lenlen(flags, p) \
+ (((flags) & 0x10) ? 2 : 1)
+#define bgp_attr_len(flags, p) \
+ (((flags) & 0x10) ? EXTRACT_16BITS(p) : *(p))
+
+#define BGPTYPE_ORIGIN 1
+#define BGPTYPE_AS_PATH 2
+#define BGPTYPE_NEXT_HOP 3
+#define BGPTYPE_MULTI_EXIT_DISC 4
+#define BGPTYPE_LOCAL_PREF 5
+#define BGPTYPE_ATOMIC_AGGREGATE 6
+#define BGPTYPE_AGGREGATOR 7
+#define BGPTYPE_COMMUNITIES 8 /* RFC1997 */
+#define BGPTYPE_ORIGINATOR_ID 9 /* RFC1998 */
+#define BGPTYPE_CLUSTER_LIST 10 /* RFC1998 */
+#define BGPTYPE_DPA 11 /* draft-ietf-idr-bgp-dpa */
+#define BGPTYPE_ADVERTISERS 12 /* RFC1863 */
+#define BGPTYPE_RCID_PATH 13 /* RFC1863 */
+#define BGPTYPE_MP_REACH_NLRI 14 /* RFC2283 */
+#define BGPTYPE_MP_UNREACH_NLRI 15 /* RFC2283 */
+#define BGPTYPE_EXTD_COMMUNITIES 16 /* draft-ietf-idr-bgp-ext-communities */
+#define BGPTYPE_AS4_PATH 17 /* RFC4893 */
+#define BGPTYPE_AGGREGATOR4 18 /* RFC4893 */
+#define BGPTYPE_PMSI_TUNNEL 22 /* draft-ietf-l3vpn-2547bis-mcast-bgp-02.txt */
+#define BGPTYPE_ATTR_SET 128 /* draft-marques-ppvpn-ibgp */
+
+#define BGP_MP_NLRI_MINSIZE 3 /* End of RIB Marker detection */
+
+static const struct tok bgp_attr_values[] = {
+ { BGPTYPE_ORIGIN, "Origin"},
+ { BGPTYPE_AS_PATH, "AS Path"},
+ { BGPTYPE_AS4_PATH, "AS4 Path"},
+ { BGPTYPE_NEXT_HOP, "Next Hop"},
+ { BGPTYPE_MULTI_EXIT_DISC, "Multi Exit Discriminator"},
+ { BGPTYPE_LOCAL_PREF, "Local Preference"},
+ { BGPTYPE_ATOMIC_AGGREGATE, "Atomic Aggregate"},
+ { BGPTYPE_AGGREGATOR, "Aggregator"},
+ { BGPTYPE_AGGREGATOR4, "Aggregator4"},
+ { BGPTYPE_COMMUNITIES, "Community"},
+ { BGPTYPE_ORIGINATOR_ID, "Originator ID"},
+ { BGPTYPE_CLUSTER_LIST, "Cluster List"},
+ { BGPTYPE_DPA, "DPA"},
+ { BGPTYPE_ADVERTISERS, "Advertisers"},
+ { BGPTYPE_RCID_PATH, "RCID Path / Cluster ID"},
+ { BGPTYPE_MP_REACH_NLRI, "Multi-Protocol Reach NLRI"},
+ { BGPTYPE_MP_UNREACH_NLRI, "Multi-Protocol Unreach NLRI"},
+ { BGPTYPE_EXTD_COMMUNITIES, "Extended Community"},
+ { BGPTYPE_PMSI_TUNNEL, "PMSI Tunnel"},
+ { BGPTYPE_ATTR_SET, "Attribute Set"},
+ { 255, "Reserved for development"},
+ { 0, NULL}
+};
+
+#define BGP_AS_SET 1
+#define BGP_AS_SEQUENCE 2
+#define BGP_CONFED_AS_SEQUENCE 3 /* draft-ietf-idr-rfc3065bis-01 */
+#define BGP_CONFED_AS_SET 4 /* draft-ietf-idr-rfc3065bis-01 */
+
+#define BGP_AS_SEG_TYPE_MIN BGP_AS_SET
+#define BGP_AS_SEG_TYPE_MAX BGP_CONFED_AS_SET
+
+static const struct tok bgp_as_path_segment_open_values[] = {
+ { BGP_AS_SEQUENCE, ""},
+ { BGP_AS_SET, "{ "},
+ { BGP_CONFED_AS_SEQUENCE, "( "},
+ { BGP_CONFED_AS_SET, "({ "},
+ { 0, NULL}
+};
+
+static const struct tok bgp_as_path_segment_close_values[] = {
+ { BGP_AS_SEQUENCE, ""},
+ { BGP_AS_SET, "}"},
+ { BGP_CONFED_AS_SEQUENCE, ")"},
+ { BGP_CONFED_AS_SET, "})"},
+ { 0, NULL}
+};
+
+#define BGP_OPT_AUTH 1
+#define BGP_OPT_CAP 2
+
+
+static const struct tok bgp_opt_values[] = {
+ { BGP_OPT_AUTH, "Authentication Information"},
+ { BGP_OPT_CAP, "Capabilities Advertisement"},
+ { 0, NULL}
+};
+
+#define BGP_CAPCODE_MP 1
+#define BGP_CAPCODE_RR 2
+#define BGP_CAPCODE_ORF 3 /* XXX */
+#define BGP_CAPCODE_RESTART 64 /* draft-ietf-idr-restart-05 */
+#define BGP_CAPCODE_AS_NEW 65 /* XXX */
+#define BGP_CAPCODE_DYN_CAP 67 /* XXX */
+#define BGP_CAPCODE_RR_CISCO 128
+
+static const struct tok bgp_capcode_values[] = {
+ { BGP_CAPCODE_MP, "Multiprotocol Extensions"},
+ { BGP_CAPCODE_RR, "Route Refresh"},
+ { BGP_CAPCODE_ORF, "Cooperative Route Filtering"},
+ { BGP_CAPCODE_RESTART, "Graceful Restart"},
+ { BGP_CAPCODE_AS_NEW, "32-Bit AS Number"},
+ { BGP_CAPCODE_DYN_CAP, "Dynamic Capability"},
+ { BGP_CAPCODE_RR_CISCO, "Route Refresh (Cisco)"},
+ { 0, NULL}
+};
+
+#define BGP_NOTIFY_MAJOR_MSG 1
+#define BGP_NOTIFY_MAJOR_OPEN 2
+#define BGP_NOTIFY_MAJOR_UPDATE 3
+#define BGP_NOTIFY_MAJOR_HOLDTIME 4
+#define BGP_NOTIFY_MAJOR_FSM 5
+#define BGP_NOTIFY_MAJOR_CEASE 6
+#define BGP_NOTIFY_MAJOR_CAP 7
+
+static const struct tok bgp_notify_major_values[] = {
+ { BGP_NOTIFY_MAJOR_MSG, "Message Header Error"},
+ { BGP_NOTIFY_MAJOR_OPEN, "OPEN Message Error"},
+ { BGP_NOTIFY_MAJOR_UPDATE, "UPDATE Message Error"},
+ { BGP_NOTIFY_MAJOR_HOLDTIME,"Hold Timer Expired"},
+ { BGP_NOTIFY_MAJOR_FSM, "Finite State Machine Error"},
+ { BGP_NOTIFY_MAJOR_CEASE, "Cease"},
+ { BGP_NOTIFY_MAJOR_CAP, "Capability Message Error"},
+ { 0, NULL}
+};
+
+/* draft-ietf-idr-cease-subcode-02 */
+#define BGP_NOTIFY_MINOR_CEASE_MAXPRFX 1
+static const struct tok bgp_notify_minor_cease_values[] = {
+ { BGP_NOTIFY_MINOR_CEASE_MAXPRFX, "Maximum Number of Prefixes Reached"},
+ { 2, "Administratively Shutdown"},
+ { 3, "Peer Unconfigured"},
+ { 4, "Administratively Reset"},
+ { 5, "Connection Rejected"},
+ { 6, "Other Configuration Change"},
+ { 7, "Connection Collision Resolution"},
+ { 0, NULL}
+};
+
+static const struct tok bgp_notify_minor_msg_values[] = {
+ { 1, "Connection Not Synchronized"},
+ { 2, "Bad Message Length"},
+ { 3, "Bad Message Type"},
+ { 0, NULL}
+};
+
+static const struct tok bgp_notify_minor_open_values[] = {
+ { 1, "Unsupported Version Number"},
+ { 2, "Bad Peer AS"},
+ { 3, "Bad BGP Identifier"},
+ { 4, "Unsupported Optional Parameter"},
+ { 5, "Authentication Failure"},
+ { 6, "Unacceptable Hold Time"},
+ { 7, "Capability Message Error"},
+ { 0, NULL}
+};
+
+static const struct tok bgp_notify_minor_update_values[] = {
+ { 1, "Malformed Attribute List"},
+ { 2, "Unrecognized Well-known Attribute"},
+ { 3, "Missing Well-known Attribute"},
+ { 4, "Attribute Flags Error"},
+ { 5, "Attribute Length Error"},
+ { 6, "Invalid ORIGIN Attribute"},
+ { 7, "AS Routing Loop"},
+ { 8, "Invalid NEXT_HOP Attribute"},
+ { 9, "Optional Attribute Error"},
+ { 10, "Invalid Network Field"},
+ { 11, "Malformed AS_PATH"},
+ { 0, NULL}
+};
+
+static const struct tok bgp_notify_minor_cap_values[] = {
+ { 1, "Invalid Action Value" },
+ { 2, "Invalid Capability Length" },
+ { 3, "Malformed Capability Value" },
+ { 4, "Unsupported Capability Code" },
+ { 0, NULL }
+};
+
+static const struct tok bgp_origin_values[] = {
+ { 0, "IGP"},
+ { 1, "EGP"},
+ { 2, "Incomplete"},
+ { 0, NULL}
+};
+
+#define BGP_PMSI_TUNNEL_RSVP_P2MP 1
+#define BGP_PMSI_TUNNEL_LDP_P2MP 2
+#define BGP_PMSI_TUNNEL_PIM_SSM 3
+#define BGP_PMSI_TUNNEL_PIM_SM 4
+#define BGP_PMSI_TUNNEL_PIM_BIDIR 5
+#define BGP_PMSI_TUNNEL_INGRESS 6
+#define BGP_PMSI_TUNNEL_LDP_MP2MP 7
+
+static const struct tok bgp_pmsi_tunnel_values[] = {
+ { BGP_PMSI_TUNNEL_RSVP_P2MP, "RSVP-TE P2MP LSP"},
+ { BGP_PMSI_TUNNEL_LDP_P2MP, "LDP P2MP LSP"},
+ { BGP_PMSI_TUNNEL_PIM_SSM, "PIM-SSM Tree"},
+ { BGP_PMSI_TUNNEL_PIM_SM, "PIM-SM Tree"},
+ { BGP_PMSI_TUNNEL_PIM_BIDIR, "PIM-Bidir Tree"},
+ { BGP_PMSI_TUNNEL_INGRESS, "Ingress Replication"},
+ { BGP_PMSI_TUNNEL_LDP_MP2MP, "LDP MP2MP LSP"},
+ { 0, NULL}
+};
+
+static const struct tok bgp_pmsi_flag_values[] = {
+ { 0x01, "Leaf Information required"},
+ { 0, NULL}
+};
+
+
+/* Subsequent address family identifier, RFC2283 section 7 */
+#define SAFNUM_RES 0
+#define SAFNUM_UNICAST 1
+#define SAFNUM_MULTICAST 2
+#define SAFNUM_UNIMULTICAST 3
+/* labeled BGP RFC3107 */
+#define SAFNUM_LABUNICAST 4
+/* draft-ietf-l3vpn-2547bis-mcast-bgp-02.txt */
+#define SAFNUM_MULTICAST_VPN 5
+#define SAFNUM_TUNNEL 64 /* XXX */
+#define SAFNUM_VPLS 65 /* XXX */
+/* draft-nalawade-idr-mdt-safi-03 */
+#define SAFNUM_MDT 66
+/* Section 4.3.4 of draft-rosen-rfc2547bis-03.txt */
+#define SAFNUM_VPNUNICAST 128
+#define SAFNUM_VPNMULTICAST 129
+#define SAFNUM_VPNUNIMULTICAST 130
+/* draft-marques-ppvpn-rt-constrain-01.txt */
+#define SAFNUM_RT_ROUTING_INFO 132
+
+#define BGP_VPN_RD_LEN 8
+
+static const struct tok bgp_safi_values[] = {
+ { SAFNUM_RES, "Reserved"},
+ { SAFNUM_UNICAST, "Unicast"},
+ { SAFNUM_MULTICAST, "Multicast"},
+ { SAFNUM_UNIMULTICAST, "Unicast+Multicast"},
+ { SAFNUM_LABUNICAST, "labeled Unicast"},
+ { SAFNUM_TUNNEL, "Tunnel"},
+ { SAFNUM_VPLS, "VPLS"},
+ { SAFNUM_MDT, "MDT"},
+ { SAFNUM_VPNUNICAST, "labeled VPN Unicast"},
+ { SAFNUM_VPNMULTICAST, "labeled VPN Multicast"},
+ { SAFNUM_VPNUNIMULTICAST, "labeled VPN Unicast+Multicast"},
+ { SAFNUM_RT_ROUTING_INFO, "Route Target Routing Information"},
+ { SAFNUM_MULTICAST_VPN, "Multicast VPN"},
+ { 0, NULL }
+};
+
+/* well-known community */
+#define BGP_COMMUNITY_NO_EXPORT 0xffffff01
+#define BGP_COMMUNITY_NO_ADVERT 0xffffff02
+#define BGP_COMMUNITY_NO_EXPORT_SUBCONFED 0xffffff03
+
+/* Extended community type - draft-ietf-idr-bgp-ext-communities-05 */
+#define BGP_EXT_COM_RT_0 0x0002 /* Route Target,Format AS(2bytes):AN(4bytes) */
+#define BGP_EXT_COM_RT_1 0x0102 /* Route Target,Format IP address:AN(2bytes) */
+#define BGP_EXT_COM_RT_2 0x0202 /* Route Target,Format AN(4bytes):local(2bytes) */
+#define BGP_EXT_COM_RO_0 0x0003 /* Route Origin,Format AS(2bytes):AN(4bytes) */
+#define BGP_EXT_COM_RO_1 0x0103 /* Route Origin,Format IP address:AN(2bytes) */
+#define BGP_EXT_COM_RO_2 0x0203 /* Route Origin,Format AN(4bytes):local(2bytes) */
+#define BGP_EXT_COM_LINKBAND 0x4004 /* Link Bandwidth,Format AS(2B):Bandwidth(4B) */
+ /* rfc2547 bgp-mpls-vpns */
+#define BGP_EXT_COM_VPN_ORIGIN 0x0005 /* OSPF Domain ID / VPN of Origin - draft-rosen-vpns-ospf-bgp-mpls */
+#define BGP_EXT_COM_VPN_ORIGIN2 0x0105 /* duplicate - keep for backwards compatability */
+#define BGP_EXT_COM_VPN_ORIGIN3 0x0205 /* duplicate - keep for backwards compatability */
+#define BGP_EXT_COM_VPN_ORIGIN4 0x8005 /* duplicate - keep for backwards compatability */
+
+#define BGP_EXT_COM_OSPF_RTYPE 0x0306 /* OSPF Route Type,Format Area(4B):RouteType(1B):Options(1B) */
+#define BGP_EXT_COM_OSPF_RTYPE2 0x8000 /* duplicate - keep for backwards compatability */
+
+#define BGP_EXT_COM_OSPF_RID 0x0107 /* OSPF Router ID,Format RouterID(4B):Unused(2B) */
+#define BGP_EXT_COM_OSPF_RID2 0x8001 /* duplicate - keep for backwards compatability */
+
+#define BGP_EXT_COM_L2INFO 0x800a /* draft-kompella-ppvpn-l2vpn */
+
+#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
+#define BGP_EXT_COM_EIGRP_METRIC_AS_DELAY 0x8801
+#define BGP_EXT_COM_EIGRP_METRIC_REL_NH_BW 0x8802
+#define BGP_EXT_COM_EIGRP_METRIC_LOAD_MTU 0x8803
+#define BGP_EXT_COM_EIGRP_EXT_REMAS_REMID 0x8804
+#define BGP_EXT_COM_EIGRP_EXT_REMPROTO_REMMETRIC 0x8805
+
+static const struct tok bgp_extd_comm_flag_values[] = {
+ { 0x8000, "vendor-specific"},
+ { 0x4000, "non-transitive"},
+ { 0, NULL},
+};
+
+static const struct tok bgp_extd_comm_subtype_values[] = {
+ { BGP_EXT_COM_RT_0, "target"},
+ { BGP_EXT_COM_RT_1, "target"},
+ { BGP_EXT_COM_RT_2, "target"},
+ { BGP_EXT_COM_RO_0, "origin"},
+ { BGP_EXT_COM_RO_1, "origin"},
+ { BGP_EXT_COM_RO_2, "origin"},
+ { BGP_EXT_COM_LINKBAND, "link-BW"},
+ { BGP_EXT_COM_VPN_ORIGIN, "ospf-domain"},
+ { BGP_EXT_COM_VPN_ORIGIN2, "ospf-domain"},
+ { BGP_EXT_COM_VPN_ORIGIN3, "ospf-domain"},
+ { BGP_EXT_COM_VPN_ORIGIN4, "ospf-domain"},
+ { BGP_EXT_COM_OSPF_RTYPE, "ospf-route-type"},
+ { BGP_EXT_COM_OSPF_RTYPE2, "ospf-route-type"},
+ { BGP_EXT_COM_OSPF_RID, "ospf-router-id"},
+ { BGP_EXT_COM_OSPF_RID2, "ospf-router-id"},
+ { BGP_EXT_COM_L2INFO, "layer2-info"},
+ { BGP_EXT_COM_EIGRP_GEN , "eigrp-general-route (flag, tag)" },
+ { BGP_EXT_COM_EIGRP_METRIC_AS_DELAY , "eigrp-route-metric (AS, delay)" },
+ { BGP_EXT_COM_EIGRP_METRIC_REL_NH_BW , "eigrp-route-metric (reliability, nexthop, bandwidth)" },
+ { BGP_EXT_COM_EIGRP_METRIC_LOAD_MTU , "eigrp-route-metric (load, MTU)" },
+ { BGP_EXT_COM_EIGRP_EXT_REMAS_REMID , "eigrp-external-route (remote-AS, remote-ID)" },
+ { 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},
+};
+
+/* OSPF codes for BGP_EXT_COM_OSPF_RTYPE draft-rosen-vpns-ospf-bgp-mpls */
+#define BGP_OSPF_RTYPE_RTR 1 /* OSPF Router LSA */
+#define BGP_OSPF_RTYPE_NET 2 /* OSPF Network LSA */
+#define BGP_OSPF_RTYPE_SUM 3 /* OSPF Summary LSA */
+#define BGP_OSPF_RTYPE_EXT 5 /* OSPF External LSA, note that ASBR doesn't apply to MPLS-VPN */
+#define BGP_OSPF_RTYPE_NSSA 7 /* OSPF NSSA External*/
+#define BGP_OSPF_RTYPE_SHAM 129 /* OSPF-MPLS-VPN Sham link */
+#define BGP_OSPF_RTYPE_METRIC_TYPE 0x1 /* LSB of RTYPE Options Field */
+
+static const struct tok bgp_extd_comm_ospf_rtype_values[] = {
+ { BGP_OSPF_RTYPE_RTR, "Router" },
+ { BGP_OSPF_RTYPE_NET, "Network" },
+ { BGP_OSPF_RTYPE_SUM, "Summary" },
+ { BGP_OSPF_RTYPE_EXT, "External" },
+ { BGP_OSPF_RTYPE_NSSA,"NSSA External" },
+ { BGP_OSPF_RTYPE_SHAM,"MPLS-VPN Sham" },
+ { 0, NULL },
+};
+
+#define TOKBUFSIZE 128
+static char astostr[20];
+
+/*
+ * as_printf
+ *
+ * Convert an AS number into a string and return string pointer.
+ *
+ * Depending on bflag is set or not, AS number is converted into ASDOT notation
+ * or plain number notation.
+ *
+ */
+static char *
+as_printf(netdissect_options *ndo,
+ char *str, int size, u_int asnum)
+{
+ if (!ndo->ndo_bflag || asnum <= 0xFFFF) {
+ snprintf(str, size, "%u", asnum);
+ } else {
+ snprintf(str, size, "%u.%u", asnum >> 16, asnum & 0xFFFF);
+ }
+ return str;
+}
+
+#define ITEMCHECK(minlen) if (itemlen < minlen) goto badtlv;
+
+int
+decode_prefix4(netdissect_options *ndo,
+ const u_char *pptr, u_int itemlen, char *buf, u_int buflen)
+{
+ struct in_addr addr;
+ u_int plen, plenbytes;
+
+ ND_TCHECK(pptr[0]);
+ ITEMCHECK(1);
+ plen = pptr[0];
+ if (32 < plen)
+ return -1;
+ itemlen -= 1;
+
+ memset(&addr, 0, sizeof(addr));
+ plenbytes = (plen + 7) / 8;
+ ND_TCHECK2(pptr[1], plenbytes);
+ ITEMCHECK(plenbytes);
+ memcpy(&addr, &pptr[1], plenbytes);
+ if (plen % 8) {
+ ((u_char *)&addr)[plenbytes - 1] &=
+ ((0xff00 >> (plen % 8)) & 0xff);
+ }
+ snprintf(buf, buflen, "%s/%d", getname(ndo, (u_char *)&addr), plen);
+ return 1 + plenbytes;
+
+trunc:
+ return -2;
+
+badtlv:
+ return -3;
+}
+
+static int
+decode_labeled_prefix4(netdissect_options *ndo,
+ const u_char *pptr, u_int itemlen, char *buf, u_int buflen)
+{
+ struct in_addr addr;
+ u_int plen, plenbytes;
+
+ /* prefix length and label = 4 bytes */
+ ND_TCHECK2(pptr[0], 4);
+ ITEMCHECK(4);
+ plen = pptr[0]; /* get prefix length */
+
+ /* this is one of the weirdnesses of rfc3107
+ the label length (actually the label + COS bits)
+ is added to the prefix length;
+ we also do only read out just one label -
+ there is no real application for advertisement of
+ stacked labels in a single BGP message
+ */
+
+ if (24 > plen)
+ return -1;
+
+ plen-=24; /* adjust prefixlen - labellength */
+
+ if (32 < plen)
+ return -1;
+ itemlen -= 4;
+
+ memset(&addr, 0, sizeof(addr));
+ plenbytes = (plen + 7) / 8;
+ ND_TCHECK2(pptr[4], plenbytes);
+ ITEMCHECK(plenbytes);
+ memcpy(&addr, &pptr[4], plenbytes);
+ if (plen % 8) {
+ ((u_char *)&addr)[plenbytes - 1] &=
+ ((0xff00 >> (plen % 8)) & 0xff);
+ }
+ /* the label may get offsetted by 4 bits so lets shift it right */
+ snprintf(buf, buflen, "%s/%d, label:%u %s",
+ getname(ndo, (u_char *)&addr),
+ plen,
+ EXTRACT_24BITS(pptr+1)>>4,
+ ((pptr[3]&1)==0) ? "(BOGUS: Bottom of Stack NOT set!)" : "(bottom)" );
+
+ return 4 + plenbytes;
+
+trunc:
+ return -2;
+
+badtlv:
+ return -3;
+}
+
+/*
+ * bgp_vpn_ip_print
+ *
+ * print an ipv4 or ipv6 address into a buffer dependend on address length.
+ */
+static char *
+bgp_vpn_ip_print(netdissect_options *ndo,
+ const u_char *pptr, u_int addr_length)
+{
+
+ /* worst case string is s fully formatted v6 address */
+ static char addr[sizeof("1234:5678:89ab:cdef:1234:5678:89ab:cdef")];
+ char *pos = addr;
+
+ switch(addr_length) {
+ case (sizeof(struct in_addr) << 3): /* 32 */
+ ND_TCHECK2(pptr[0], sizeof(struct in_addr));
+ snprintf(pos, sizeof(addr), "%s", ipaddr_string(ndo, pptr));
+ break;
+#ifdef INET6
+ case (sizeof(struct in6_addr) << 3): /* 128 */
+ ND_TCHECK2(pptr[0], sizeof(struct in6_addr));
+ snprintf(pos, sizeof(addr), "%s", ip6addr_string(ndo, pptr));
+ break;
+#endif
+ default:
+ snprintf(pos, sizeof(addr), "bogus address length %u", addr_length);
+ break;
+ }
+ pos += strlen(pos);
+
+trunc:
+ *(pos) = '\0';
+ return (addr);
+}
+
+/*
+ * bgp_vpn_sg_print
+ *
+ * print an multicast s,g entry into a buffer.
+ * the s,g entry is encoded like this.
+ *
+ * +-----------------------------------+
+ * | Multicast Source Length (1 octet) |
+ * +-----------------------------------+
+ * | Multicast Source (Variable) |
+ * +-----------------------------------+
+ * | Multicast Group Length (1 octet) |
+ * +-----------------------------------+
+ * | Multicast Group (Variable) |
+ * +-----------------------------------+
+ *
+ * return the number of bytes read from the wire.
+ */
+static int
+bgp_vpn_sg_print(netdissect_options *ndo,
+ const u_char *pptr, char *buf, u_int buflen)
+{
+ uint8_t addr_length;
+ u_int total_length, offset;
+
+ total_length = 0;
+
+ /* Source address length, encoded in bits */
+ ND_TCHECK2(pptr[0], 1);
+ addr_length = *pptr++;
+
+ /* Source address */
+ ND_TCHECK2(pptr[0], (addr_length >> 3));
+ total_length += (addr_length >> 3) + 1;
+ offset = strlen(buf);
+ if (addr_length) {
+ snprintf(buf + offset, buflen - offset, ", Source %s",
+ bgp_vpn_ip_print(ndo, pptr, addr_length));
+ pptr += (addr_length >> 3);
+ }
+
+ /* Group address length, encoded in bits */
+ ND_TCHECK2(pptr[0], 1);
+ addr_length = *pptr++;
+
+ /* Group address */
+ ND_TCHECK2(pptr[0], (addr_length >> 3));
+ total_length += (addr_length >> 3) + 1;
+ offset = strlen(buf);
+ if (addr_length) {
+ snprintf(buf + offset, buflen - offset, ", Group %s",
+ bgp_vpn_ip_print(ndo, pptr, addr_length));
+ pptr += (addr_length >> 3);
+ }
+
+trunc:
+ return (total_length);
+}
+
+
+/* RDs and RTs share the same semantics
+ * we use bgp_vpn_rd_print for
+ * printing route targets inside a NLRI */
+char *
+bgp_vpn_rd_print(netdissect_options *ndo,
+ const u_char *pptr)
+{
+ /* allocate space for the largest possible string */
+ static char rd[sizeof("xxxxxxxxxx:xxxxx (xxx.xxx.xxx.xxx:xxxxx)")];
+ char *pos = rd;
+
+ /* ok lets load the RD format */
+ switch (EXTRACT_16BITS(pptr)) {
+
+ /* 2-byte-AS:number fmt*/
+ case 0:
+ snprintf(pos, sizeof(rd) - (pos - rd), "%u:%u (= %u.%u.%u.%u)",
+ EXTRACT_16BITS(pptr+2),
+ EXTRACT_32BITS(pptr+4),
+ *(pptr+4), *(pptr+5), *(pptr+6), *(pptr+7));
+ break;
+ /* IP-address:AS fmt*/
+
+ case 1:
+ snprintf(pos, sizeof(rd) - (pos - rd), "%u.%u.%u.%u:%u",
+ *(pptr+2), *(pptr+3), *(pptr+4), *(pptr+5), EXTRACT_16BITS(pptr+6));
+ break;
+
+ /* 4-byte-AS:number fmt*/
+ case 2:
+ snprintf(pos, sizeof(rd) - (pos - rd), "%s:%u (%u.%u.%u.%u:%u)",
+ as_printf(ndo, astostr, sizeof(astostr), EXTRACT_32BITS(pptr+2)),
+ EXTRACT_16BITS(pptr+6), *(pptr+2), *(pptr+3), *(pptr+4),
+ *(pptr+5), EXTRACT_16BITS(pptr+6));
+ break;
+ default:
+ snprintf(pos, sizeof(rd) - (pos - rd), "unknown RD format");
+ break;
+ }
+ pos += strlen(pos);
+ *(pos) = '\0';
+ return (rd);
+}
+
+static int
+decode_rt_routing_info(netdissect_options *ndo,
+ const u_char *pptr, char *buf, u_int buflen)
+{
+ uint8_t route_target[8];
+ u_int plen;
+
+ ND_TCHECK(pptr[0]);
+ plen = pptr[0]; /* get prefix length */
+
+ if (0 == plen) {
+ snprintf(buf, buflen, "default route target");
+ return 1;
+ }
+
+ if (32 > plen)
+ return -1;
+
+ plen-=32; /* adjust prefix length */
+
+ if (64 < plen)
+ return -1;
+
+ memset(&route_target, 0, sizeof(route_target));
+ ND_TCHECK2(pptr[1], (plen + 7) / 8);
+ memcpy(&route_target, &pptr[1], (plen + 7) / 8);
+ if (plen % 8) {
+ ((u_char *)&route_target)[(plen + 7) / 8 - 1] &=
+ ((0xff00 >> (plen % 8)) & 0xff);
+ }
+ snprintf(buf, buflen, "origin AS: %s, route target %s",
+ as_printf(ndo, astostr, sizeof(astostr), EXTRACT_32BITS(pptr+1)),
+ bgp_vpn_rd_print(ndo, (u_char *)&route_target));
+
+ return 5 + (plen + 7) / 8;
+
+trunc:
+ return -2;
+}
+
+static int
+decode_labeled_vpn_prefix4(netdissect_options *ndo,
+ const u_char *pptr, char *buf, u_int buflen)
+{
+ struct in_addr addr;
+ u_int plen;
+
+ ND_TCHECK(pptr[0]);
+ plen = pptr[0]; /* get prefix length */
+
+ if ((24+64) > plen)
+ return -1;
+
+ plen-=(24+64); /* adjust prefixlen - labellength - RD len*/
+
+ if (32 < plen)
+ return -1;
+
+ memset(&addr, 0, sizeof(addr));
+ ND_TCHECK2(pptr[12], (plen + 7) / 8);
+ memcpy(&addr, &pptr[12], (plen + 7) / 8);
+ if (plen % 8) {
+ ((u_char *)&addr)[(plen + 7) / 8 - 1] &=
+ ((0xff00 >> (plen % 8)) & 0xff);
+ }
+ /* the label may get offsetted by 4 bits so lets shift it right */
+ snprintf(buf, buflen, "RD: %s, %s/%d, label:%u %s",
+ bgp_vpn_rd_print(ndo, pptr+4),
+ getname(ndo, (u_char *)&addr),
+ plen,
+ EXTRACT_24BITS(pptr+1)>>4,
+ ((pptr[3]&1)==0) ? "(BOGUS: Bottom of Stack NOT set!)" : "(bottom)" );
+
+ return 12 + (plen + 7) / 8;
+
+trunc:
+ return -2;
+}
+
+/*
+ * +-------------------------------+
+ * | |
+ * | RD:IPv4-address (12 octets) |
+ * | |
+ * +-------------------------------+
+ * | MDT Group-address (4 octets) |
+ * +-------------------------------+
+ */
+
+#define MDT_VPN_NLRI_LEN 16
+
+static int
+decode_mdt_vpn_nlri(netdissect_options *ndo,
+ const u_char *pptr, char *buf, u_int buflen)
+{
+
+ const u_char *rd;
+ const u_char *vpn_ip;
+
+ ND_TCHECK(pptr[0]);
+
+ /* if the NLRI is not predefined length, quit.*/
+ if (*pptr != MDT_VPN_NLRI_LEN * 8)
+ return -1;
+ pptr++;
+
+ /* RD */
+ ND_TCHECK2(pptr[0], 8);
+ rd = pptr;
+ pptr+=8;
+
+ /* IPv4 address */
+ ND_TCHECK2(pptr[0], sizeof(struct in_addr));
+ vpn_ip = pptr;
+ pptr+=sizeof(struct in_addr);
+
+ /* MDT Group Address */
+ ND_TCHECK2(pptr[0], sizeof(struct in_addr));
+
+ snprintf(buf, buflen, "RD: %s, VPN IP Address: %s, MC Group Address: %s",
+ bgp_vpn_rd_print(ndo, rd), ipaddr_string(ndo, vpn_ip), ipaddr_string(ndo, pptr));
+
+ return MDT_VPN_NLRI_LEN + 1;
+
+ trunc:
+
+return -2;
+}
+
+#define BGP_MULTICAST_VPN_ROUTE_TYPE_INTRA_AS_I_PMSI 1
+#define BGP_MULTICAST_VPN_ROUTE_TYPE_INTER_AS_I_PMSI 2
+#define BGP_MULTICAST_VPN_ROUTE_TYPE_S_PMSI 3
+#define BGP_MULTICAST_VPN_ROUTE_TYPE_INTRA_AS_SEG_LEAF 4
+#define BGP_MULTICAST_VPN_ROUTE_TYPE_SOURCE_ACTIVE 5
+#define BGP_MULTICAST_VPN_ROUTE_TYPE_SHARED_TREE_JOIN 6
+#define BGP_MULTICAST_VPN_ROUTE_TYPE_SOURCE_TREE_JOIN 7
+
+static const struct tok bgp_multicast_vpn_route_type_values[] = {
+ { BGP_MULTICAST_VPN_ROUTE_TYPE_INTRA_AS_I_PMSI, "Intra-AS I-PMSI"},
+ { BGP_MULTICAST_VPN_ROUTE_TYPE_INTER_AS_I_PMSI, "Inter-AS I-PMSI"},
+ { BGP_MULTICAST_VPN_ROUTE_TYPE_S_PMSI, "S-PMSI"},
+ { BGP_MULTICAST_VPN_ROUTE_TYPE_INTRA_AS_SEG_LEAF, "Intra-AS Segment-Leaf"},
+ { BGP_MULTICAST_VPN_ROUTE_TYPE_SOURCE_ACTIVE, "Source-Active"},
+ { BGP_MULTICAST_VPN_ROUTE_TYPE_SHARED_TREE_JOIN, "Shared Tree Join"},
+ { BGP_MULTICAST_VPN_ROUTE_TYPE_SOURCE_TREE_JOIN, "Source Tree Join"},
+};
+
+static int
+decode_multicast_vpn(netdissect_options *ndo,
+ const u_char *pptr, char *buf, u_int buflen)
+{
+ uint8_t route_type, route_length, addr_length, sg_length;
+ u_int offset;
+
+ ND_TCHECK2(pptr[0], 2);
+ route_type = *pptr++;
+ route_length = *pptr++;
+
+ snprintf(buf, buflen, "Route-Type: %s (%u), length: %u",
+ tok2str(bgp_multicast_vpn_route_type_values,
+ "Unknown", route_type),
+ route_type, route_length);
+
+ switch(route_type) {
+ case BGP_MULTICAST_VPN_ROUTE_TYPE_INTRA_AS_I_PMSI:
+ ND_TCHECK2(pptr[0], BGP_VPN_RD_LEN);
+ offset = strlen(buf);
+ snprintf(buf + offset, buflen - offset, ", RD: %s, Originator %s",
+ bgp_vpn_rd_print(ndo, pptr),
+ bgp_vpn_ip_print(ndo, pptr + BGP_VPN_RD_LEN,
+ (route_length - BGP_VPN_RD_LEN) << 3));
+ break;
+ case BGP_MULTICAST_VPN_ROUTE_TYPE_INTER_AS_I_PMSI:
+ ND_TCHECK2(pptr[0], BGP_VPN_RD_LEN + 4);
+ offset = strlen(buf);
+ snprintf(buf + offset, buflen - offset, ", RD: %s, Source-AS %s",
+ bgp_vpn_rd_print(ndo, pptr),
+ as_printf(ndo, astostr, sizeof(astostr),
+ EXTRACT_32BITS(pptr + BGP_VPN_RD_LEN)));
+ break;
+
+ case BGP_MULTICAST_VPN_ROUTE_TYPE_S_PMSI:
+ ND_TCHECK2(pptr[0], BGP_VPN_RD_LEN);
+ offset = strlen(buf);
+ snprintf(buf + offset, buflen - offset, ", RD: %s",
+ bgp_vpn_rd_print(ndo, pptr));
+ pptr += BGP_VPN_RD_LEN;
+
+ sg_length = bgp_vpn_sg_print(ndo, pptr, buf, buflen);
+ addr_length = route_length - sg_length;
+
+ ND_TCHECK2(pptr[0], addr_length);
+ offset = strlen(buf);
+ snprintf(buf + offset, buflen - offset, ", Originator %s",
+ bgp_vpn_ip_print(ndo, pptr, addr_length << 3));
+ break;
+
+ case BGP_MULTICAST_VPN_ROUTE_TYPE_SOURCE_ACTIVE:
+ ND_TCHECK2(pptr[0], BGP_VPN_RD_LEN);
+ offset = strlen(buf);
+ snprintf(buf + offset, buflen - offset, ", RD: %s",
+ bgp_vpn_rd_print(ndo, pptr));
+ pptr += BGP_VPN_RD_LEN;
+
+ bgp_vpn_sg_print(ndo, pptr, buf, buflen);
+ break;
+
+ case BGP_MULTICAST_VPN_ROUTE_TYPE_SHARED_TREE_JOIN: /* fall through */
+ case BGP_MULTICAST_VPN_ROUTE_TYPE_SOURCE_TREE_JOIN:
+ ND_TCHECK2(pptr[0], BGP_VPN_RD_LEN);
+ offset = strlen(buf);
+ snprintf(buf + offset, buflen - offset, ", RD: %s, Source-AS %s",
+ bgp_vpn_rd_print(ndo, pptr),
+ as_printf(ndo, astostr, sizeof(astostr),
+ EXTRACT_32BITS(pptr + BGP_VPN_RD_LEN)));
+ pptr += BGP_VPN_RD_LEN;
+
+ bgp_vpn_sg_print(ndo, pptr, buf, buflen);
+ break;
+
+ /*
+ * no per route-type printing yet.
+ */
+ case BGP_MULTICAST_VPN_ROUTE_TYPE_INTRA_AS_SEG_LEAF:
+ default:
+ break;
+ }
+
+ return route_length + 2;
+
+trunc:
+ return -2;
+}
+
+/*
+ * As I remember, some versions of systems have an snprintf() that
+ * returns -1 if the buffer would have overflowed. If the return
+ * value is negative, set buflen to 0, to indicate that we've filled
+ * the buffer up.
+ *
+ * If the return value is greater than buflen, that means that
+ * the buffer would have overflowed; again, set buflen to 0 in
+ * that case.
+ */
+#define UPDATE_BUF_BUFLEN(buf, buflen, strlen) \
+ if (strlen<0) \
+ buflen=0; \
+ else if ((u_int)strlen>buflen) \
+ buflen=0; \
+ else { \
+ buflen-=strlen; \
+ buf+=strlen; \
+ }
+
+static int
+decode_labeled_vpn_l2(netdissect_options *ndo,
+ const u_char *pptr, char *buf, u_int buflen)
+{
+ int plen,tlen,strlen,tlv_type,tlv_len,ttlv_len;
+
+ ND_TCHECK2(pptr[0], 2);
+ 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 */
+ ND_TCHECK2(pptr[0],12);
+ buf[0]='\0';
+ strlen=snprintf(buf, buflen, "RD: %s, BGPNH: %s",
+ bgp_vpn_rd_print(ndo, pptr),
+ /* need something like getname(ndo, ) here */
+ getname(ndo, 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 */
+
+ ND_TCHECK2(pptr[0],15);
+ buf[0]='\0';
+ strlen=snprintf(buf, buflen, "RD: %s, CE-ID: %u, Label-Block Offset: %u, Label Base %u",
+ bgp_vpn_rd_print(ndo, pptr),
+ EXTRACT_16BITS(pptr+8),
+ EXTRACT_16BITS(pptr+10),
+ EXTRACT_24BITS(pptr+12)>>4); /* the label is offsetted by 4 bits so lets shift it right */
+ UPDATE_BUF_BUFLEN(buf, buflen, strlen);
+ pptr+=15;
+ tlen-=15;
+
+ /* ok now the variable part - lets read out TLVs*/
+ while (tlen>0) {
+ if (tlen < 3)
+ return -1;
+ ND_TCHECK2(pptr[0], 3);
+ tlv_type=*pptr++;
+ tlv_len=EXTRACT_16BITS(pptr);
+ ttlv_len=tlv_len;
+ pptr+=2;
+
+ switch(tlv_type) {
+ case 1:
+ if (buflen!=0) {
+ strlen=snprintf(buf,buflen, "\n\t\tcircuit status vector (%u) length: %u: 0x",
+ tlv_type,
+ tlv_len);
+ UPDATE_BUF_BUFLEN(buf, buflen, strlen);
+ }
+ ttlv_len=ttlv_len/8+1; /* how many bytes do we need to read ? */
+ while (ttlv_len>0) {
+ ND_TCHECK(pptr[0]);
+ if (buflen!=0) {
+ strlen=snprintf(buf,buflen, "%02x",*pptr++);
+ UPDATE_BUF_BUFLEN(buf, buflen, strlen);
+ }
+ ttlv_len--;
+ }
+ break;
+ default:
+ if (buflen!=0) {
+ strlen=snprintf(buf,buflen, "\n\t\tunknown TLV #%u, length: %u",
+ tlv_type,
+ tlv_len);
+ UPDATE_BUF_BUFLEN(buf, buflen, strlen);
+ }
+ break;
+ }
+ tlen-=(tlv_len<<3); /* the tlv-length is expressed in bits so lets shift it right */
+ }
+ return plen+2;
+
+ } else {
+ /* complain bitterly ? */
+ /* fall through */
+ goto trunc;
+ }
+
+trunc:
+ return -2;
+}
+
+#ifdef INET6
+int
+decode_prefix6(netdissect_options *ndo,
+ const u_char *pd, u_int itemlen, char *buf, u_int buflen)
+{
+ struct in6_addr addr;
+ u_int plen, plenbytes;
+
+ ND_TCHECK(pd[0]);
+ ITEMCHECK(1);
+ plen = pd[0];
+ if (128 < plen)
+ return -1;
+ itemlen -= 1;
+
+ memset(&addr, 0, sizeof(addr));
+ plenbytes = (plen + 7) / 8;
+ ND_TCHECK2(pd[1], plenbytes);
+ ITEMCHECK(plenbytes);
+ memcpy(&addr, &pd[1], plenbytes);
+ if (plen % 8) {
+ addr.s6_addr[plenbytes - 1] &=
+ ((0xff00 >> (plen % 8)) & 0xff);
+ }
+ snprintf(buf, buflen, "%s/%d", getname6(ndo, (u_char *)&addr), plen);
+ return 1 + plenbytes;
+
+trunc:
+ return -2;
+
+badtlv:
+ return -3;
+}
+
+static int
+decode_labeled_prefix6(netdissect_options *ndo,
+ const u_char *pptr, u_int itemlen, char *buf, u_int buflen)
+{
+ struct in6_addr addr;
+ u_int plen, plenbytes;
+
+ /* prefix length and label = 4 bytes */
+ ND_TCHECK2(pptr[0], 4);
+ ITEMCHECK(4);
+ plen = pptr[0]; /* get prefix length */
+
+ if (24 > plen)
+ return -1;
+
+ plen-=24; /* adjust prefixlen - labellength */
+
+ if (128 < plen)
+ return -1;
+ itemlen -= 4;
+
+ memset(&addr, 0, sizeof(addr));
+ plenbytes = (plen + 7) / 8;
+ ND_TCHECK2(pptr[4], plenbytes);
+ memcpy(&addr, &pptr[4], plenbytes);
+ if (plen % 8) {
+ addr.s6_addr[plenbytes - 1] &=
+ ((0xff00 >> (plen % 8)) & 0xff);
+ }
+ /* the label may get offsetted by 4 bits so lets shift it right */
+ snprintf(buf, buflen, "%s/%d, label:%u %s",
+ getname6(ndo, (u_char *)&addr),
+ plen,
+ EXTRACT_24BITS(pptr+1)>>4,
+ ((pptr[3]&1)==0) ? "(BOGUS: Bottom of Stack NOT set!)" : "(bottom)" );
+
+ return 4 + plenbytes;
+
+trunc:
+ return -2;
+
+badtlv:
+ return -3;
+}
+
+static int
+decode_labeled_vpn_prefix6(netdissect_options *ndo,
+ const u_char *pptr, char *buf, u_int buflen)
+{
+ struct in6_addr addr;
+ u_int plen;
+
+ ND_TCHECK(pptr[0]);
+ plen = pptr[0]; /* get prefix length */
+
+ if ((24+64) > plen)
+ return -1;
+
+ plen-=(24+64); /* adjust prefixlen - labellength - RD len*/
+
+ if (128 < plen)
+ return -1;
+
+ memset(&addr, 0, sizeof(addr));
+ ND_TCHECK2(pptr[12], (plen + 7) / 8);
+ memcpy(&addr, &pptr[12], (plen + 7) / 8);
+ if (plen % 8) {
+ addr.s6_addr[(plen + 7) / 8 - 1] &=
+ ((0xff00 >> (plen % 8)) & 0xff);
+ }
+ /* the label may get offsetted by 4 bits so lets shift it right */
+ snprintf(buf, buflen, "RD: %s, %s/%d, label:%u %s",
+ bgp_vpn_rd_print(ndo, pptr+4),
+ getname6(ndo, (u_char *)&addr),
+ plen,
+ EXTRACT_24BITS(pptr+1)>>4,
+ ((pptr[3]&1)==0) ? "(BOGUS: Bottom of Stack NOT set!)" : "(bottom)" );
+
+ return 12 + (plen + 7) / 8;
+
+trunc:
+ return -2;
+}
+#endif
+
+static int
+decode_clnp_prefix(netdissect_options *ndo,
+ const u_char *pptr, char *buf, u_int buflen)
+{
+ uint8_t addr[19];
+ u_int plen;
+
+ ND_TCHECK(pptr[0]);
+ plen = pptr[0]; /* get prefix length */
+
+ if (152 < plen)
+ return -1;
+
+ memset(&addr, 0, sizeof(addr));
+ ND_TCHECK2(pptr[4], (plen + 7) / 8);
+ memcpy(&addr, &pptr[4], (plen + 7) / 8);
+ if (plen % 8) {
+ addr[(plen + 7) / 8 - 1] &=
+ ((0xff00 >> (plen % 8)) & 0xff);
+ }
+ snprintf(buf, buflen, "%s/%d",
+ isonsap_string(addr,(plen + 7) / 8),
+ plen);
+
+ return 1 + (plen + 7) / 8;
+
+trunc:
+ return -2;
+}
+
+static int
+decode_labeled_vpn_clnp_prefix(netdissect_options *ndo,
+ const u_char *pptr, char *buf, u_int buflen)
+{
+ uint8_t addr[19];
+ u_int plen;
+
+ ND_TCHECK(pptr[0]);
+ plen = pptr[0]; /* get prefix length */
+
+ if ((24+64) > plen)
+ return -1;
+
+ plen-=(24+64); /* adjust prefixlen - labellength - RD len*/
+
+ if (152 < plen)
+ return -1;
+
+ memset(&addr, 0, sizeof(addr));
+ ND_TCHECK2(pptr[12], (plen + 7) / 8);
+ memcpy(&addr, &pptr[12], (plen + 7) / 8);
+ if (plen % 8) {
+ addr[(plen + 7) / 8 - 1] &=
+ ((0xff00 >> (plen % 8)) & 0xff);
+ }
+ /* the label may get offsetted by 4 bits so lets shift it right */
+ snprintf(buf, buflen, "RD: %s, %s/%d, label:%u %s",
+ bgp_vpn_rd_print(ndo, pptr+4),
+ isonsap_string(addr,(plen + 7) / 8),
+ plen,
+ EXTRACT_24BITS(pptr+1)>>4,
+ ((pptr[3]&1)==0) ? "(BOGUS: Bottom of Stack NOT set!)" : "(bottom)" );
+
+ return 12 + (plen + 7) / 8;
+
+trunc:
+ return -2;
+}
+
+/*
+ * bgp_attr_get_as_size
+ *
+ * Try to find the size of the ASs encoded in an as-path. It is not obvious, as
+ * both Old speakers that do not support 4 byte AS, and the new speakers that do
+ * support, exchange AS-Path with the same path-attribute type value 0x02.
+ */
+static int
+bgp_attr_get_as_size(netdissect_options *ndo,
+ uint8_t bgpa_type, const u_char *pptr, int len)
+{
+ const u_char *tptr = pptr;
+
+ /*
+ * If the path attribute is the optional AS4 path type, then we already
+ * know, that ASs must be encoded in 4 byte format.
+ */
+ if (bgpa_type == BGPTYPE_AS4_PATH) {
+ return 4;
+ }
+
+ /*
+ * Let us assume that ASs are of 2 bytes in size, and check if the AS-Path
+ * TLV is good. If not, ask the caller to try with AS encoded as 4 bytes
+ * each.
+ */
+ while (tptr < pptr + len) {
+ ND_TCHECK(tptr[0]);
+
+ /*
+ * If we do not find a valid segment type, our guess might be wrong.
+ */
+ if (tptr[0] < BGP_AS_SEG_TYPE_MIN || tptr[0] > BGP_AS_SEG_TYPE_MAX) {
+ goto trunc;
+ }
+ ND_TCHECK(tptr[1]);
+ tptr += 2 + tptr[1] * 2;
+ }
+
+ /*
+ * If we correctly reached end of the AS path attribute data content,
+ * then most likely ASs were indeed encoded as 2 bytes.
+ */
+ if (tptr == pptr + len) {
+ return 2;
+ }
+
+trunc:
+
+ /*
+ * We can come here, either we did not have enough data, or if we
+ * try to decode 4 byte ASs in 2 byte format. Either way, return 4,
+ * so that calller can try to decode each AS as of 4 bytes. If indeed
+ * there was not enough data, it will crib and end the parse anyways.
+ */
+ return 4;
+}
+
+static int
+bgp_attr_print(netdissect_options *ndo,
+ u_int atype, const u_char *pptr, u_int len)
+{
+ int i;
+ uint16_t af;
+ uint8_t safi, snpa, nhlen;
+ union { /* copy buffer for bandwidth values */
+ float f;
+ uint32_t i;
+ } bw;
+ int advance;
+ u_int tlen;
+ const u_char *tptr;
+ char buf[MAXHOSTNAMELEN + 100];
+ char tokbuf[TOKBUFSIZE];
+ int as_size;
+
+ tptr = pptr;
+ tlen=len;
+
+ switch (atype) {
+ case BGPTYPE_ORIGIN:
+ if (len != 1)
+ ND_PRINT((ndo, "invalid len"));
+ else {
+ ND_TCHECK(*tptr);
+ ND_PRINT((ndo, "%s", tok2strbuf(bgp_origin_values,
+ "Unknown Origin Typecode",
+ tptr[0],
+ tokbuf, sizeof(tokbuf))));
+ }
+ break;
+
+
+ /*
+ * Process AS4 byte path and AS2 byte path attributes here.
+ */
+ case BGPTYPE_AS4_PATH:
+ case BGPTYPE_AS_PATH:
+ if (len % 2) {
+ ND_PRINT((ndo, "invalid len"));
+ break;
+ }
+ if (!len) {
+ ND_PRINT((ndo, "empty"));
+ break;
+ }
+
+ /*
+ * BGP updates exchanged between New speakers that support 4
+ * byte AS, ASs are always encoded in 4 bytes. There is no
+ * definitive way to find this, just by the packet's
+ * contents. So, check for packet's TLV's sanity assuming
+ * 2 bytes first, and it does not pass, assume that ASs are
+ * encoded in 4 bytes format and move on.
+ */
+ as_size = bgp_attr_get_as_size(ndo, atype, pptr, len);
+
+ while (tptr < pptr + len) {
+ ND_TCHECK(tptr[0]);
+ ND_PRINT((ndo, "%s", tok2strbuf(bgp_as_path_segment_open_values,
+ "?", tptr[0],
+ tokbuf, sizeof(tokbuf))));
+ for (i = 0; i < tptr[1] * as_size; i += as_size) {
+ ND_TCHECK2(tptr[2 + i], as_size);
+ ND_PRINT((ndo, "%s ",
+ as_printf(ndo, astostr, sizeof(astostr),
+ as_size == 2 ?
+ EXTRACT_16BITS(&tptr[2 + i]) :
+ EXTRACT_32BITS(&tptr[2 + i]))));
+ }
+ ND_TCHECK(tptr[0]);
+ ND_PRINT((ndo, "%s", tok2strbuf(bgp_as_path_segment_close_values,
+ "?", tptr[0],
+ tokbuf, sizeof(tokbuf))));
+ ND_TCHECK(tptr[1]);
+ tptr += 2 + tptr[1] * as_size;
+ }
+ break;
+ case BGPTYPE_NEXT_HOP:
+ if (len != 4)
+ ND_PRINT((ndo, "invalid len"));
+ else {
+ ND_TCHECK2(tptr[0], 4);
+ ND_PRINT((ndo, "%s", getname(ndo, tptr)));
+ }
+ break;
+ case BGPTYPE_MULTI_EXIT_DISC:
+ case BGPTYPE_LOCAL_PREF:
+ if (len != 4)
+ ND_PRINT((ndo, "invalid len"));
+ else {
+ ND_TCHECK2(tptr[0], 4);
+ ND_PRINT((ndo, "%u", EXTRACT_32BITS(tptr)));
+ }
+ break;
+ case BGPTYPE_ATOMIC_AGGREGATE:
+ if (len != 0)
+ ND_PRINT((ndo, "invalid len"));
+ break;
+ case BGPTYPE_AGGREGATOR:
+
+ /*
+ * Depending on the AS encoded is of 2 bytes or of 4 bytes,
+ * the length of this PA can be either 6 bytes or 8 bytes.
+ */
+ if (len != 6 && len != 8) {
+ ND_PRINT((ndo, "invalid len"));
+ break;
+ }
+ ND_TCHECK2(tptr[0], len);
+ if (len == 6) {
+ ND_PRINT((ndo, " AS #%s, origin %s",
+ as_printf(ndo, astostr, sizeof(astostr), EXTRACT_16BITS(tptr)),
+ getname(ndo, tptr + 2)));
+ } else {
+ ND_PRINT((ndo, " AS #%s, origin %s",
+ as_printf(ndo, astostr, sizeof(astostr),
+ EXTRACT_32BITS(tptr)), getname(ndo, tptr + 4)));
+ }
+ break;
+ case BGPTYPE_AGGREGATOR4:
+ if (len != 8) {
+ ND_PRINT((ndo, "invalid len"));
+ break;
+ }
+ ND_TCHECK2(tptr[0], 8);
+ ND_PRINT((ndo, " AS #%s, origin %s",
+ as_printf(ndo, astostr, sizeof(astostr), EXTRACT_32BITS(tptr)),
+ getname(ndo, tptr + 4)));
+ break;
+ case BGPTYPE_COMMUNITIES:
+ if (len % 4) {
+ ND_PRINT((ndo, "invalid len"));
+ break;
+ }
+ while (tlen>0) {
+ uint32_t comm;
+ ND_TCHECK2(tptr[0], 4);
+ comm = EXTRACT_32BITS(tptr);
+ switch (comm) {
+ case BGP_COMMUNITY_NO_EXPORT:
+ ND_PRINT((ndo, " NO_EXPORT"));
+ break;
+ case BGP_COMMUNITY_NO_ADVERT:
+ ND_PRINT((ndo, " NO_ADVERTISE"));
+ break;
+ case BGP_COMMUNITY_NO_EXPORT_SUBCONFED:
+ ND_PRINT((ndo, " NO_EXPORT_SUBCONFED"));
+ break;
+ default:
+ ND_PRINT((ndo, "%u:%u%s",
+ (comm >> 16) & 0xffff,
+ comm & 0xffff,
+ (tlen>4) ? ", " : ""));
+ break;
+ }
+ tlen -=4;
+ tptr +=4;
+ }
+ break;
+ case BGPTYPE_ORIGINATOR_ID:
+ if (len != 4) {
+ ND_PRINT((ndo, "invalid len"));
+ break;
+ }
+ ND_TCHECK2(tptr[0], 4);
+ ND_PRINT((ndo, "%s",getname(ndo, tptr)));
+ break;
+ case BGPTYPE_CLUSTER_LIST:
+ if (len % 4) {
+ ND_PRINT((ndo, "invalid len"));
+ break;
+ }
+ while (tlen>0) {
+ ND_TCHECK2(tptr[0], 4);
+ ND_PRINT((ndo, "%s%s",
+ getname(ndo, tptr),
+ (tlen>4) ? ", " : ""));
+ tlen -=4;
+ tptr +=4;
+ }
+ break;
+ case BGPTYPE_MP_REACH_NLRI:
+ ND_TCHECK2(tptr[0], 3);
+ af = EXTRACT_16BITS(tptr);
+ safi = tptr[2];
+
+ ND_PRINT((ndo, "\n\t AFI: %s (%u), %sSAFI: %s (%u)",
+ tok2strbuf(af_values, "Unknown AFI", af,
+ tokbuf, sizeof(tokbuf)),
+ af,
+ (safi>128) ? "vendor specific " : "", /* 128 is meanwhile wellknown */
+ tok2strbuf(bgp_safi_values, "Unknown SAFI", safi,
+ tokbuf, sizeof(tokbuf)),
+ safi));
+
+ switch(af<<8 | safi) {
+ case (AFNUM_INET<<8 | SAFNUM_UNICAST):
+ case (AFNUM_INET<<8 | SAFNUM_MULTICAST):
+ case (AFNUM_INET<<8 | SAFNUM_UNIMULTICAST):
+ case (AFNUM_INET<<8 | SAFNUM_LABUNICAST):
+ case (AFNUM_INET<<8 | SAFNUM_RT_ROUTING_INFO):
+ case (AFNUM_INET<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_INET<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_INET<<8 | SAFNUM_VPNUNIMULTICAST):
+ case (AFNUM_INET<<8 | SAFNUM_MULTICAST_VPN):
+ case (AFNUM_INET<<8 | SAFNUM_MDT):
+#ifdef INET6
+ case (AFNUM_INET6<<8 | SAFNUM_UNICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_MULTICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_VPNUNIMULTICAST):
+#endif
+ case (AFNUM_NSAP<<8 | SAFNUM_UNICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_MULTICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_UNIMULTICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_VPNUNIMULTICAST):
+ case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_L2VPN<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNIMULTICAST):
+ case (AFNUM_VPLS<<8 | SAFNUM_VPLS):
+ break;
+ default:
+ ND_TCHECK2(tptr[0], tlen);
+ ND_PRINT((ndo, "\n\t no AFI %u / SAFI %u decoder", af, safi));
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, tptr, "\n\t ", tlen);
+ goto done;
+ break;
+ }
+
+ tptr +=3;
+
+ ND_TCHECK(tptr[0]);
+ nhlen = tptr[0];
+ tlen = nhlen;
+ tptr++;
+
+ if (tlen) {
+ int nnh = 0;
+ ND_PRINT((ndo, "\n\t nexthop: "));
+ while (tlen > 0) {
+ if ( nnh++ > 0 ) {
+ ND_PRINT((ndo, ", " ));
+ }
+ switch(af<<8 | safi) {
+ case (AFNUM_INET<<8 | SAFNUM_UNICAST):
+ case (AFNUM_INET<<8 | SAFNUM_MULTICAST):
+ case (AFNUM_INET<<8 | SAFNUM_UNIMULTICAST):
+ case (AFNUM_INET<<8 | SAFNUM_LABUNICAST):
+ case (AFNUM_INET<<8 | SAFNUM_RT_ROUTING_INFO):
+ case (AFNUM_INET<<8 | SAFNUM_MULTICAST_VPN):
+ case (AFNUM_INET<<8 | SAFNUM_MDT):
+ if (tlen < (int)sizeof(struct in_addr)) {
+ ND_PRINT((ndo, "invalid len"));
+ tlen = 0;
+ } else {
+ ND_TCHECK2(tptr[0], sizeof(struct in_addr));
+ ND_PRINT((ndo, "%s",getname(ndo, tptr)));
+ tlen -= sizeof(struct in_addr);
+ tptr += sizeof(struct in_addr);
+ }
+ break;
+ case (AFNUM_INET<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_INET<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_INET<<8 | SAFNUM_VPNUNIMULTICAST):
+ if (tlen < (int)(sizeof(struct in_addr)+BGP_VPN_RD_LEN)) {
+ ND_PRINT((ndo, "invalid len"));
+ tlen = 0;
+ } else {
+ ND_TCHECK2(tptr[0], sizeof(struct in_addr)+BGP_VPN_RD_LEN);
+ ND_PRINT((ndo, "RD: %s, %s",
+ bgp_vpn_rd_print(ndo, tptr),
+ getname(ndo, tptr+BGP_VPN_RD_LEN)));
+ tlen -= (sizeof(struct in_addr)+BGP_VPN_RD_LEN);
+ tptr += (sizeof(struct in_addr)+BGP_VPN_RD_LEN);
+ }
+ break;
+#ifdef INET6
+ case (AFNUM_INET6<<8 | SAFNUM_UNICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_MULTICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST):
+ if (tlen < (int)sizeof(struct in6_addr)) {
+ ND_PRINT((ndo, "invalid len"));
+ tlen = 0;
+ } else {
+ ND_TCHECK2(tptr[0], sizeof(struct in6_addr));
+ ND_PRINT((ndo, "%s", getname6(ndo, tptr)));
+ tlen -= sizeof(struct in6_addr);
+ tptr += sizeof(struct in6_addr);
+ }
+ break;
+ case (AFNUM_INET6<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_VPNUNIMULTICAST):
+ if (tlen < (int)(sizeof(struct in6_addr)+BGP_VPN_RD_LEN)) {
+ ND_PRINT((ndo, "invalid len"));
+ tlen = 0;
+ } else {
+ ND_TCHECK2(tptr[0], sizeof(struct in6_addr)+BGP_VPN_RD_LEN);
+ ND_PRINT((ndo, "RD: %s, %s",
+ bgp_vpn_rd_print(ndo, tptr),
+ getname6(ndo, tptr+BGP_VPN_RD_LEN)));
+ tlen -= (sizeof(struct in6_addr)+BGP_VPN_RD_LEN);
+ tptr += (sizeof(struct in6_addr)+BGP_VPN_RD_LEN);
+ }
+ break;
+#endif
+ case (AFNUM_VPLS<<8 | SAFNUM_VPLS):
+ case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_L2VPN<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNIMULTICAST):
+ if (tlen < (int)sizeof(struct in_addr)) {
+ ND_PRINT((ndo, "invalid len"));
+ tlen = 0;
+ } else {
+ ND_TCHECK2(tptr[0], sizeof(struct in_addr));
+ ND_PRINT((ndo, "%s", getname(ndo, tptr)));
+ tlen -= (sizeof(struct in_addr));
+ tptr += (sizeof(struct in_addr));
+ }
+ break;
+ case (AFNUM_NSAP<<8 | SAFNUM_UNICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_MULTICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_UNIMULTICAST):
+ ND_TCHECK2(tptr[0], tlen);
+ ND_PRINT((ndo, "%s", isonsap_string(tptr, tlen)));
+ tptr += tlen;
+ tlen = 0;
+ break;
+
+ case (AFNUM_NSAP<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_VPNUNIMULTICAST):
+ if (tlen < BGP_VPN_RD_LEN+1) {
+ ND_PRINT((ndo, "invalid len"));
+ tlen = 0;
+ } else {
+ ND_TCHECK2(tptr[0], tlen);
+ ND_PRINT((ndo, "RD: %s, %s",
+ bgp_vpn_rd_print(ndo, tptr),
+ isonsap_string(tptr+BGP_VPN_RD_LEN,tlen-BGP_VPN_RD_LEN)));
+ /* rfc986 mapped IPv4 address ? */
+ if (EXTRACT_32BITS(tptr+BGP_VPN_RD_LEN) == 0x47000601)
+ ND_PRINT((ndo, " = %s", getname(ndo, tptr+BGP_VPN_RD_LEN+4)));
+#ifdef INET6
+ /* rfc1888 mapped IPv6 address ? */
+ else if (EXTRACT_24BITS(tptr+BGP_VPN_RD_LEN) == 0x350000)
+ ND_PRINT((ndo, " = %s", getname6(ndo, tptr+BGP_VPN_RD_LEN+3)));
+#endif
+ tptr += tlen;
+ tlen = 0;
+ }
+ break;
+ default:
+ ND_TCHECK2(tptr[0], tlen);
+ ND_PRINT((ndo, "no AFI %u/SAFI %u decoder", af, safi));
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, tptr, "\n\t ", tlen);
+ tptr += tlen;
+ tlen = 0;
+ goto done;
+ break;
+ }
+ }
+ }
+ ND_PRINT((ndo, ", nh-length: %u", nhlen));
+ tptr += tlen;
+
+ ND_TCHECK(tptr[0]);
+ snpa = tptr[0];
+ tptr++;
+
+ if (snpa) {
+ ND_PRINT((ndo, "\n\t %u SNPA", snpa));
+ for (/*nothing*/; snpa > 0; snpa--) {
+ ND_TCHECK(tptr[0]);
+ ND_PRINT((ndo, "\n\t %d bytes", tptr[0]));
+ tptr += tptr[0] + 1;
+ }
+ } else {
+ ND_PRINT((ndo, ", no SNPA"));
+ }
+
+ while (len - (tptr - pptr) > 0) {
+ switch (af<<8 | safi) {
+ case (AFNUM_INET<<8 | SAFNUM_UNICAST):
+ case (AFNUM_INET<<8 | SAFNUM_MULTICAST):
+ case (AFNUM_INET<<8 | SAFNUM_UNIMULTICAST):
+ advance = decode_prefix4(ndo, tptr, len, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else if (advance == -3)
+ break; /* bytes left, but not enough */
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_INET<<8 | SAFNUM_LABUNICAST):
+ advance = decode_labeled_prefix4(ndo, tptr, len, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else if (advance == -3)
+ break; /* bytes left, but not enough */
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_INET<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_INET<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_INET<<8 | SAFNUM_VPNUNIMULTICAST):
+ advance = decode_labeled_vpn_prefix4(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_INET<<8 | SAFNUM_RT_ROUTING_INFO):
+ advance = decode_rt_routing_info(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_INET<<8 | SAFNUM_MULTICAST_VPN): /* fall through */
+ case (AFNUM_INET6<<8 | SAFNUM_MULTICAST_VPN):
+ advance = decode_multicast_vpn(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+
+ case (AFNUM_INET<<8 | SAFNUM_MDT):
+ advance = decode_mdt_vpn_nlri(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+#ifdef INET6
+ case (AFNUM_INET6<<8 | SAFNUM_UNICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_MULTICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST):
+ advance = decode_prefix6(ndo, tptr, len, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else if (advance == -3)
+ break; /* bytes left, but not enough */
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST):
+ advance = decode_labeled_prefix6(ndo, tptr, len, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else if (advance == -3)
+ break; /* bytes left, but not enough */
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_INET6<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_VPNUNIMULTICAST):
+ advance = decode_labeled_vpn_prefix6(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+#endif
+ case (AFNUM_VPLS<<8 | SAFNUM_VPLS):
+ case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_L2VPN<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNIMULTICAST):
+ advance = decode_labeled_vpn_l2(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_NSAP<<8 | SAFNUM_UNICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_MULTICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_UNIMULTICAST):
+ advance = decode_clnp_prefix(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_NSAP<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_VPNUNIMULTICAST):
+ advance = decode_labeled_vpn_clnp_prefix(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ default:
+ ND_TCHECK2(*tptr,tlen);
+ ND_PRINT((ndo, "\n\t no AFI %u / SAFI %u decoder", af, safi));
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, tptr, "\n\t ", tlen);
+ advance = 0;
+ tptr = pptr + len;
+ break;
+ }
+ if (advance < 0)
+ break;
+ tptr += advance;
+ }
+ done:
+ break;
+
+ case BGPTYPE_MP_UNREACH_NLRI:
+ ND_TCHECK2(tptr[0], BGP_MP_NLRI_MINSIZE);
+ af = EXTRACT_16BITS(tptr);
+ safi = tptr[2];
+
+ ND_PRINT((ndo, "\n\t AFI: %s (%u), %sSAFI: %s (%u)",
+ tok2strbuf(af_values, "Unknown AFI", af,
+ tokbuf, sizeof(tokbuf)),
+ af,
+ (safi>128) ? "vendor specific " : "", /* 128 is meanwhile wellknown */
+ tok2strbuf(bgp_safi_values, "Unknown SAFI", safi,
+ tokbuf, sizeof(tokbuf)),
+ safi));
+
+ if (len == BGP_MP_NLRI_MINSIZE)
+ ND_PRINT((ndo, "\n\t End-of-Rib Marker (empty NLRI)"));
+
+ tptr += 3;
+
+ while (len - (tptr - pptr) > 0) {
+ switch (af<<8 | safi) {
+ case (AFNUM_INET<<8 | SAFNUM_UNICAST):
+ case (AFNUM_INET<<8 | SAFNUM_MULTICAST):
+ case (AFNUM_INET<<8 | SAFNUM_UNIMULTICAST):
+ advance = decode_prefix4(ndo, tptr, len, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else if (advance == -3)
+ break; /* bytes left, but not enough */
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_INET<<8 | SAFNUM_LABUNICAST):
+ advance = decode_labeled_prefix4(ndo, tptr, len, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else if (advance == -3)
+ break; /* bytes left, but not enough */
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_INET<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_INET<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_INET<<8 | SAFNUM_VPNUNIMULTICAST):
+ advance = decode_labeled_vpn_prefix4(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+#ifdef INET6
+ case (AFNUM_INET6<<8 | SAFNUM_UNICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_MULTICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST):
+ advance = decode_prefix6(ndo, tptr, len, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else if (advance == -3)
+ break; /* bytes left, but not enough */
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST):
+ advance = decode_labeled_prefix6(ndo, tptr, len, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else if (advance == -3)
+ break; /* bytes left, but not enough */
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_INET6<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_INET6<<8 | SAFNUM_VPNUNIMULTICAST):
+ advance = decode_labeled_vpn_prefix6(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+#endif
+ case (AFNUM_VPLS<<8 | SAFNUM_VPLS):
+ case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_L2VPN<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNIMULTICAST):
+ advance = decode_labeled_vpn_l2(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_NSAP<<8 | SAFNUM_UNICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_MULTICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_UNIMULTICAST):
+ advance = decode_clnp_prefix(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_NSAP<<8 | SAFNUM_VPNUNICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_VPNMULTICAST):
+ case (AFNUM_NSAP<<8 | SAFNUM_VPNUNIMULTICAST):
+ advance = decode_labeled_vpn_clnp_prefix(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_INET<<8 | SAFNUM_MDT):
+ advance = decode_mdt_vpn_nlri(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ case (AFNUM_INET<<8 | SAFNUM_MULTICAST_VPN): /* fall through */
+ case (AFNUM_INET6<<8 | SAFNUM_MULTICAST_VPN):
+ advance = decode_multicast_vpn(ndo, tptr, buf, sizeof(buf));
+ if (advance == -1)
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ else if (advance == -2)
+ goto trunc;
+ else
+ ND_PRINT((ndo, "\n\t %s", buf));
+ break;
+ default:
+ ND_TCHECK2(*(tptr-3),tlen);
+ ND_PRINT((ndo, "no AFI %u / SAFI %u decoder", af, safi));
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, tptr-3, "\n\t ", tlen);
+ advance = 0;
+ tptr = pptr + len;
+ break;
+ }
+ if (advance < 0)
+ break;
+ tptr += advance;
+ }
+ break;
+ case BGPTYPE_EXTD_COMMUNITIES:
+ if (len % 8) {
+ ND_PRINT((ndo, "invalid len"));
+ break;
+ }
+ while (tlen>0) {
+ uint16_t extd_comm;
+
+ ND_TCHECK2(tptr[0], 2);
+ extd_comm=EXTRACT_16BITS(tptr);
+
+ ND_PRINT((ndo, "\n\t %s (0x%04x), Flags [%s]",
+ tok2strbuf(bgp_extd_comm_subtype_values,
+ "unknown extd community typecode",
+ extd_comm, tokbuf, sizeof(tokbuf)),
+ extd_comm,
+ bittok2str(bgp_extd_comm_flag_values, "none", extd_comm)));
+
+ ND_TCHECK2(*(tptr+2), 6);
+ switch(extd_comm) {
+ case BGP_EXT_COM_RT_0:
+ case BGP_EXT_COM_RO_0:
+ case BGP_EXT_COM_L2VPN_RT_0:
+ ND_PRINT((ndo, ": %u:%u (= %s)",
+ EXTRACT_16BITS(tptr+2),
+ EXTRACT_32BITS(tptr+4),
+ getname(ndo, tptr+4)));
+ 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:
+ ND_PRINT((ndo, ": %s:%u",
+ getname(ndo, tptr+2),
+ EXTRACT_16BITS(tptr+6)));
+ break;
+ case BGP_EXT_COM_RT_2:
+ case BGP_EXT_COM_RO_2:
+ ND_PRINT((ndo, ": %s:%u",
+ as_printf(ndo, astostr, sizeof(astostr),
+ EXTRACT_32BITS(tptr+2)), EXTRACT_16BITS(tptr+6)));
+ break;
+ case BGP_EXT_COM_LINKBAND:
+ bw.i = EXTRACT_32BITS(tptr+2);
+ ND_PRINT((ndo, ": bandwidth: %.3f Mbps",
+ bw.f*8/1000000));
+ break;
+ case BGP_EXT_COM_VPN_ORIGIN:
+ case BGP_EXT_COM_VPN_ORIGIN2:
+ case BGP_EXT_COM_VPN_ORIGIN3:
+ case BGP_EXT_COM_VPN_ORIGIN4:
+ case BGP_EXT_COM_OSPF_RID:
+ case BGP_EXT_COM_OSPF_RID2:
+ ND_PRINT((ndo, "%s", getname(ndo, tptr+2)));
+ break;
+ case BGP_EXT_COM_OSPF_RTYPE:
+ case BGP_EXT_COM_OSPF_RTYPE2:
+ ND_PRINT((ndo, ": area:%s, router-type:%s, metric-type:%s%s",
+ getname(ndo, tptr+2),
+ tok2strbuf(bgp_extd_comm_ospf_rtype_values,
+ "unknown (0x%02x)",
+ *(tptr+6),
+ tokbuf, sizeof(tokbuf)),
+ (*(tptr+7) & BGP_OSPF_RTYPE_METRIC_TYPE) ? "E2" : "",
+ ((*(tptr+6) == BGP_OSPF_RTYPE_EXT) || (*(tptr+6) == BGP_OSPF_RTYPE_NSSA)) ? "E1" : ""));
+ break;
+ case BGP_EXT_COM_L2INFO:
+ ND_PRINT((ndo, ": %s Control Flags [0x%02x]:MTU %u",
+ tok2strbuf(l2vpn_encaps_values,
+ "unknown encaps",
+ *(tptr+2),
+ tokbuf, sizeof(tokbuf)),
+ *(tptr+3),
+ EXTRACT_16BITS(tptr+4)));
+ break;
+ case BGP_EXT_COM_SOURCE_AS:
+ ND_PRINT((ndo, ": AS %u", EXTRACT_16BITS(tptr+2)));
+ break;
+ default:
+ ND_TCHECK2(*tptr,8);
+ print_unknown_data(ndo, tptr, "\n\t ", 8);
+ break;
+ }
+ tlen -=8;
+ tptr +=8;
+ }
+ break;
+
+ case BGPTYPE_PMSI_TUNNEL:
+ {
+ uint8_t tunnel_type, flags;
+
+ tunnel_type = *(tptr+1);
+ flags = *tptr;
+ tlen = len;
+
+ ND_TCHECK2(tptr[0], 5);
+ ND_PRINT((ndo, "\n\t Tunnel-type %s (%u), Flags [%s], MPLS Label %u",
+ tok2str(bgp_pmsi_tunnel_values, "Unknown", tunnel_type),
+ tunnel_type,
+ bittok2str(bgp_pmsi_flag_values, "none", flags),
+ EXTRACT_24BITS(tptr+2)>>4));
+
+ tptr +=5;
+ tlen -= 5;
+
+ switch (tunnel_type) {
+ case BGP_PMSI_TUNNEL_PIM_SM: /* fall through */
+ case BGP_PMSI_TUNNEL_PIM_BIDIR:
+ ND_TCHECK2(tptr[0], 8);
+ ND_PRINT((ndo, "\n\t Sender %s, P-Group %s",
+ ipaddr_string(ndo, tptr),
+ ipaddr_string(ndo, tptr+4)));
+ break;
+
+ case BGP_PMSI_TUNNEL_PIM_SSM:
+ ND_TCHECK2(tptr[0], 8);
+ ND_PRINT((ndo, "\n\t Root-Node %s, P-Group %s",
+ ipaddr_string(ndo, tptr),
+ ipaddr_string(ndo, tptr+4)));
+ break;
+ case BGP_PMSI_TUNNEL_INGRESS:
+ ND_TCHECK2(tptr[0], 4);
+ ND_PRINT((ndo, "\n\t Tunnel-Endpoint %s",
+ ipaddr_string(ndo, tptr)));
+ break;
+ case BGP_PMSI_TUNNEL_LDP_P2MP: /* fall through */
+ case BGP_PMSI_TUNNEL_LDP_MP2MP:
+ ND_TCHECK2(tptr[0], 8);
+ ND_PRINT((ndo, "\n\t Root-Node %s, LSP-ID 0x%08x",
+ ipaddr_string(ndo, tptr),
+ EXTRACT_32BITS(tptr+4)));
+ break;
+ case BGP_PMSI_TUNNEL_RSVP_P2MP:
+ ND_TCHECK2(tptr[0], 8);
+ ND_PRINT((ndo, "\n\t Extended-Tunnel-ID %s, P2MP-ID 0x%08x",
+ ipaddr_string(ndo, tptr),
+ EXTRACT_32BITS(tptr+4)));
+ break;
+ default:
+ if (ndo->ndo_vflag <= 1) {
+ print_unknown_data(ndo, tptr, "\n\t ", tlen);
+ }
+ }
+ break;
+ }
+ case BGPTYPE_ATTR_SET:
+ ND_TCHECK2(tptr[0], 4);
+ if (len < 4)
+ goto trunc;
+ ND_PRINT((ndo, "\n\t Origin AS: %s",
+ as_printf(ndo, astostr, sizeof(astostr), EXTRACT_32BITS(tptr))));
+ tptr+=4;
+ len -=4;
+
+ while (len) {
+ u_int aflags, atype, alenlen, alen;
+
+ ND_TCHECK2(tptr[0], 2);
+ if (len < 2)
+ goto trunc;
+ aflags = *tptr;
+ atype = *(tptr + 1);
+ tptr += 2;
+ len -= 2;
+ alenlen = bgp_attr_lenlen(aflags, tptr);
+ ND_TCHECK2(tptr[0], alenlen);
+ if (len < alenlen)
+ goto trunc;
+ alen = bgp_attr_len(aflags, tptr);
+ tptr += alenlen;
+ len -= alenlen;
+
+ ND_PRINT((ndo, "\n\t %s (%u), length: %u",
+ tok2strbuf(bgp_attr_values,
+ "Unknown Attribute", atype,
+ tokbuf, sizeof(tokbuf)),
+ atype,
+ alen));
+
+ if (aflags) {
+ ND_PRINT((ndo, ", Flags [%s%s%s%s",
+ aflags & 0x80 ? "O" : "",
+ aflags & 0x40 ? "T" : "",
+ aflags & 0x20 ? "P" : "",
+ aflags & 0x10 ? "E" : ""));
+ if (aflags & 0xf)
+ ND_PRINT((ndo, "+%x", aflags & 0xf));
+ ND_PRINT((ndo, "]: "));
+ }
+ /* FIXME check for recursion */
+ if (!bgp_attr_print(ndo, atype, tptr, alen))
+ return 0;
+ tptr += alen;
+ len -= alen;
+ }
+ break;
+
+
+ default:
+ ND_TCHECK2(*pptr,len);
+ ND_PRINT((ndo, "\n\t no Attribute %u decoder", atype)); /* we have no decoder for the attribute */
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, pptr, "\n\t ", len);
+ break;
+ }
+ if (ndo->ndo_vflag > 1 && len) { /* omit zero length attributes*/
+ ND_TCHECK2(*pptr,len);
+ print_unknown_data(ndo, pptr, "\n\t ", len);
+ }
+ return 1;
+
+trunc:
+ return 0;
+}
+
+static void
+bgp_capabilities_print(netdissect_options *ndo,
+ const u_char *opt, int caps_len)
+{
+ char tokbuf[TOKBUFSIZE];
+ char tokbuf2[TOKBUFSIZE];
+ int cap_type, cap_len, tcap_len, cap_offset;
+ int i = 0;
+
+ while (i < caps_len) {
+ ND_TCHECK2(opt[i], BGP_CAP_HEADER_SIZE);
+ cap_type=opt[i];
+ cap_len=opt[i+1];
+ tcap_len=cap_len;
+ ND_PRINT((ndo, "\n\t %s (%u), length: %u",
+ tok2strbuf(bgp_capcode_values, "Unknown",
+ cap_type, tokbuf, sizeof(tokbuf)),
+ cap_type,
+ cap_len));
+ ND_TCHECK2(opt[i+2], cap_len);
+ switch (cap_type) {
+ case BGP_CAPCODE_MP:
+ ND_PRINT((ndo, "\n\t\tAFI %s (%u), SAFI %s (%u)",
+ tok2strbuf(af_values, "Unknown",
+ EXTRACT_16BITS(opt+i+2),
+ tokbuf, sizeof(tokbuf)),
+ EXTRACT_16BITS(opt+i+2),
+ tok2strbuf(bgp_safi_values, "Unknown",
+ opt[i+5],
+ tokbuf, sizeof(tokbuf)),
+ opt[i+5]));
+ break;
+ case BGP_CAPCODE_RESTART:
+ ND_PRINT((ndo, "\n\t\tRestart Flags: [%s], Restart Time %us",
+ ((opt[i+2])&0x80) ? "R" : "none",
+ EXTRACT_16BITS(opt+i+2)&0xfff));
+ tcap_len-=2;
+ cap_offset=4;
+ while(tcap_len>=4) {
+ ND_PRINT((ndo, "\n\t\t AFI %s (%u), SAFI %s (%u), Forwarding state preserved: %s",
+ tok2strbuf(af_values,"Unknown",
+ EXTRACT_16BITS(opt+i+cap_offset),
+ tokbuf, sizeof(tokbuf)),
+ EXTRACT_16BITS(opt+i+cap_offset),
+ tok2strbuf(bgp_safi_values,"Unknown",
+ opt[i+cap_offset+2],
+ tokbuf2, sizeof(tokbuf2)),
+ opt[i+cap_offset+2],
+ ((opt[i+cap_offset+3])&0x80) ? "yes" : "no" ));
+ tcap_len-=4;
+ cap_offset+=4;
+ }
+ break;
+ case BGP_CAPCODE_RR:
+ case BGP_CAPCODE_RR_CISCO:
+ break;
+ case BGP_CAPCODE_AS_NEW:
+
+ /*
+ * Extract the 4 byte AS number encoded.
+ */
+ if (cap_len == 4) {
+ ND_PRINT((ndo, "\n\t\t 4 Byte AS %s",
+ as_printf(ndo, astostr, sizeof(astostr),
+ EXTRACT_32BITS(opt + i + 2))));
+ }
+ break;
+ default:
+ ND_PRINT((ndo, "\n\t\tno decoder for Capability %u",
+ cap_type));
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, &opt[i+2], "\n\t\t", cap_len);
+ break;
+ }
+ if (ndo->ndo_vflag > 1 && cap_len > 0) {
+ print_unknown_data(ndo, &opt[i+2], "\n\t\t", cap_len);
+ }
+ i += BGP_CAP_HEADER_SIZE + cap_len;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|BGP]"));
+}
+
+static void
+bgp_open_print(netdissect_options *ndo,
+ const u_char *dat, int length)
+{
+ struct bgp_open bgpo;
+ struct bgp_opt bgpopt;
+ const u_char *opt;
+ int i;
+ char tokbuf[TOKBUFSIZE];
+
+ ND_TCHECK2(dat[0], BGP_OPEN_SIZE);
+ memcpy(&bgpo, dat, BGP_OPEN_SIZE);
+
+ ND_PRINT((ndo, "\n\t Version %d, ", bgpo.bgpo_version));
+ ND_PRINT((ndo, "my AS %s, ",
+ as_printf(ndo, astostr, sizeof(astostr), ntohs(bgpo.bgpo_myas))));
+ ND_PRINT((ndo, "Holdtime %us, ", ntohs(bgpo.bgpo_holdtime)));
+ ND_PRINT((ndo, "ID %s", getname(ndo, (u_char *)&bgpo.bgpo_id)));
+ ND_PRINT((ndo, "\n\t Optional parameters, length: %u", bgpo.bgpo_optlen));
+
+ /* some little sanity checking */
+ if (length < bgpo.bgpo_optlen+BGP_OPEN_SIZE)
+ return;
+
+ /* ugly! */
+ opt = &((const struct bgp_open *)dat)->bgpo_optlen;
+ opt++;
+
+ i = 0;
+ while (i < bgpo.bgpo_optlen) {
+ ND_TCHECK2(opt[i], BGP_OPT_SIZE);
+ memcpy(&bgpopt, &opt[i], BGP_OPT_SIZE);
+ if (i + 2 + bgpopt.bgpopt_len > bgpo.bgpo_optlen) {
+ ND_PRINT((ndo, "\n\t Option %d, length: %u", bgpopt.bgpopt_type, bgpopt.bgpopt_len));
+ break;
+ }
+
+ ND_PRINT((ndo, "\n\t Option %s (%u), length: %u",
+ tok2strbuf(bgp_opt_values,"Unknown",
+ bgpopt.bgpopt_type,
+ tokbuf, sizeof(tokbuf)),
+ bgpopt.bgpopt_type,
+ bgpopt.bgpopt_len));
+
+ /* now let's decode the options we know*/
+ switch(bgpopt.bgpopt_type) {
+
+ case BGP_OPT_CAP:
+ bgp_capabilities_print(ndo, &opt[i+BGP_OPT_SIZE],
+ bgpopt.bgpopt_len);
+ break;
+
+ case BGP_OPT_AUTH:
+ default:
+ ND_PRINT((ndo, "\n\t no decoder for option %u",
+ bgpopt.bgpopt_type));
+ break;
+ }
+ i += BGP_OPT_SIZE + bgpopt.bgpopt_len;
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "[|BGP]"));
+}
+
+static void
+bgp_update_print(netdissect_options *ndo,
+ const u_char *dat, int length)
+{
+ struct bgp bgp;
+ const u_char *p;
+ int withdrawn_routes_len;
+ int len;
+ int i;
+ char tokbuf[TOKBUFSIZE];
+#ifndef INET6
+ char buf[MAXHOSTNAMELEN + 100];
+ int wpfx;
+#endif
+
+ ND_TCHECK2(dat[0], BGP_SIZE);
+ if (length < BGP_SIZE)
+ goto trunc;
+ memcpy(&bgp, dat, BGP_SIZE);
+ p = dat + BGP_SIZE; /*XXX*/
+ length -= BGP_SIZE;
+
+ /* Unfeasible routes */
+ ND_TCHECK2(p[0], 2);
+ if (length < 2)
+ goto trunc;
+ withdrawn_routes_len = EXTRACT_16BITS(p);
+ p += 2;
+ length -= 2;
+ if (withdrawn_routes_len) {
+ /*
+ * Without keeping state from the original NLRI message,
+ * it's not possible to tell if this a v4 or v6 route,
+ * so only try to decode it if we're not v6 enabled.
+ */
+ ND_TCHECK2(p[0], withdrawn_routes_len);
+ if (length < withdrawn_routes_len)
+ goto trunc;
+#ifdef INET6
+ ND_PRINT((ndo, "\n\t Withdrawn routes: %d bytes", withdrawn_routes_len));
+ p += withdrawn_routes_len;
+ length -= withdrawn_routes_len;
+#else
+ if (withdrawn_routes_len < 2)
+ goto trunc;
+ length -= 2;
+ withdrawn_routes_len -= 2;
+
+
+ ND_PRINT((ndo, "\n\t Withdrawn routes:"));
+
+ while(withdrawn_routes_len > 0) {
+ wpfx = decode_prefix4(ndo, p, withdrawn_routes_len, buf, sizeof(buf));
+ if (wpfx == -1) {
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ break;
+ } else if (wpfx == -2)
+ goto trunc;
+ else if (wpfx == -3)
+ goto trunc; /* bytes left, but not enough */
+ else {
+ ND_PRINT((ndo, "\n\t %s", buf));
+ p += wpfx;
+ length -= wpfx;
+ withdrawn_routes_len -= wpfx;
+ }
+ }
+#endif
+ }
+
+ ND_TCHECK2(p[0], 2);
+ if (length < 2)
+ goto trunc;
+ len = EXTRACT_16BITS(p);
+ p += 2;
+ length -= 2;
+
+ if (withdrawn_routes_len == 0 && len == 0 && length == 0) {
+ /* No withdrawn routes, no path attributes, no NLRI */
+ ND_PRINT((ndo, "\n\t End-of-Rib Marker (empty NLRI)"));
+ return;
+ }
+
+ if (len) {
+ /* do something more useful!*/
+ while (len) {
+ int aflags, atype, alenlen, alen;
+
+ ND_TCHECK2(p[0], 2);
+ if (len < 2)
+ goto trunc;
+ if (length < 2)
+ goto trunc;
+ aflags = *p;
+ atype = *(p + 1);
+ p += 2;
+ len -= 2;
+ length -= 2;
+ alenlen = bgp_attr_lenlen(aflags, p);
+ ND_TCHECK2(p[0], alenlen);
+ if (len < alenlen)
+ goto trunc;
+ if (length < alenlen)
+ goto trunc;
+ alen = bgp_attr_len(aflags, p);
+ p += alenlen;
+ len -= alenlen;
+ length -= alenlen;
+
+ ND_PRINT((ndo, "\n\t %s (%u), length: %u",
+ tok2strbuf(bgp_attr_values, "Unknown Attribute",
+ atype,
+ tokbuf, sizeof(tokbuf)),
+ atype,
+ alen));
+
+ if (aflags) {
+ ND_PRINT((ndo, ", Flags [%s%s%s%s",
+ aflags & 0x80 ? "O" : "",
+ aflags & 0x40 ? "T" : "",
+ aflags & 0x20 ? "P" : "",
+ aflags & 0x10 ? "E" : ""));
+ if (aflags & 0xf)
+ ND_PRINT((ndo, "+%x", aflags & 0xf));
+ ND_PRINT((ndo, "]: "));
+ }
+ if (len < alen)
+ goto trunc;
+ if (length < alen)
+ goto trunc;
+ if (!bgp_attr_print(ndo, atype, p, alen))
+ goto trunc;
+ p += alen;
+ len -= alen;
+ length -= alen;
+ }
+ }
+
+ if (length) {
+ /*
+ * XXX - what if they're using the "Advertisement of
+ * Multiple Paths in BGP" feature:
+ *
+ * https://datatracker.ietf.org/doc/draft-ietf-idr-add-paths/
+ *
+ * http://tools.ietf.org/html/draft-ietf-idr-add-paths-06
+ */
+ ND_PRINT((ndo, "\n\t Updated routes:"));
+ while (length) {
+ char buf[MAXHOSTNAMELEN + 100];
+ i = decode_prefix4(ndo, p, length, buf, sizeof(buf));
+ if (i == -1) {
+ ND_PRINT((ndo, "\n\t (illegal prefix length)"));
+ break;
+ } else if (i == -2)
+ goto trunc;
+ else if (i == -3)
+ goto trunc; /* bytes left, but not enough */
+ else {
+ ND_PRINT((ndo, "\n\t %s", buf));
+ p += i;
+ length -= i;
+ }
+ }
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "[|BGP]"));
+}
+
+static void
+bgp_notification_print(netdissect_options *ndo,
+ const u_char *dat, int length)
+{
+ struct bgp_notification bgpn;
+ const u_char *tptr;
+ char tokbuf[TOKBUFSIZE];
+ char tokbuf2[TOKBUFSIZE];
+
+ ND_TCHECK2(dat[0], BGP_NOTIFICATION_SIZE);
+ memcpy(&bgpn, dat, BGP_NOTIFICATION_SIZE);
+
+ /* some little sanity checking */
+ if (length<BGP_NOTIFICATION_SIZE)
+ return;
+
+ ND_PRINT((ndo, ", %s (%u)",
+ tok2strbuf(bgp_notify_major_values, "Unknown Error",
+ bgpn.bgpn_major, tokbuf, sizeof(tokbuf)),
+ bgpn.bgpn_major));
+
+ switch (bgpn.bgpn_major) {
+
+ case BGP_NOTIFY_MAJOR_MSG:
+ ND_PRINT((ndo, ", subcode %s (%u)",
+ tok2strbuf(bgp_notify_minor_msg_values, "Unknown",
+ bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
+ bgpn.bgpn_minor));
+ break;
+ case BGP_NOTIFY_MAJOR_OPEN:
+ ND_PRINT((ndo, ", subcode %s (%u)",
+ tok2strbuf(bgp_notify_minor_open_values, "Unknown",
+ bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
+ bgpn.bgpn_minor));
+ break;
+ case BGP_NOTIFY_MAJOR_UPDATE:
+ ND_PRINT((ndo, ", subcode %s (%u)",
+ tok2strbuf(bgp_notify_minor_update_values, "Unknown",
+ bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
+ bgpn.bgpn_minor));
+ break;
+ case BGP_NOTIFY_MAJOR_CAP:
+ ND_PRINT((ndo, " subcode %s (%u)",
+ tok2strbuf(bgp_notify_minor_cap_values, "Unknown",
+ bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
+ bgpn.bgpn_minor));
+ case BGP_NOTIFY_MAJOR_CEASE:
+ ND_PRINT((ndo, ", subcode %s (%u)",
+ tok2strbuf(bgp_notify_minor_cease_values, "Unknown",
+ bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
+ bgpn.bgpn_minor));
+
+ /* draft-ietf-idr-cease-subcode-02 mentions optionally 7 bytes
+ * for the maxprefix subtype, which may contain AFI, SAFI and MAXPREFIXES
+ */
+ if(bgpn.bgpn_minor == BGP_NOTIFY_MINOR_CEASE_MAXPRFX && length >= BGP_NOTIFICATION_SIZE + 7) {
+ tptr = dat + BGP_NOTIFICATION_SIZE;
+ ND_TCHECK2(*tptr, 7);
+ ND_PRINT((ndo, ", AFI %s (%u), SAFI %s (%u), Max Prefixes: %u",
+ tok2strbuf(af_values, "Unknown",
+ EXTRACT_16BITS(tptr), tokbuf, sizeof(tokbuf)),
+ EXTRACT_16BITS(tptr),
+ tok2strbuf(bgp_safi_values, "Unknown", *(tptr+2),
+ tokbuf2, sizeof(tokbuf)),
+ *(tptr+2),
+ EXTRACT_32BITS(tptr+3)));
+ }
+ break;
+ default:
+ break;
+ }
+
+ return;
+trunc:
+ ND_PRINT((ndo, "[|BGP]"));
+}
+
+static void
+bgp_route_refresh_print(netdissect_options *ndo,
+ const u_char *pptr, int len)
+{
+ const struct bgp_route_refresh *bgp_route_refresh_header;
+ char tokbuf[TOKBUFSIZE];
+ char tokbuf2[TOKBUFSIZE];
+
+ ND_TCHECK2(pptr[0], BGP_ROUTE_REFRESH_SIZE);
+
+ /* some little sanity checking */
+ if (len<BGP_ROUTE_REFRESH_SIZE)
+ return;
+
+ bgp_route_refresh_header = (const struct bgp_route_refresh *)pptr;
+
+ ND_PRINT((ndo, "\n\t AFI %s (%u), SAFI %s (%u)",
+ tok2strbuf(af_values,"Unknown",
+ /* this stinks but the compiler pads the structure
+ * weird */
+ EXTRACT_16BITS(&bgp_route_refresh_header->afi),
+ tokbuf, sizeof(tokbuf)),
+ EXTRACT_16BITS(&bgp_route_refresh_header->afi),
+ tok2strbuf(bgp_safi_values,"Unknown",
+ bgp_route_refresh_header->safi,
+ tokbuf2, sizeof(tokbuf2)),
+ bgp_route_refresh_header->safi));
+
+ if (ndo->ndo_vflag > 1) {
+ ND_TCHECK2(*pptr, len);
+ print_unknown_data(ndo, pptr, "\n\t ", len);
+ }
+
+ return;
+trunc:
+ ND_PRINT((ndo, "[|BGP]"));
+}
+
+static int
+bgp_header_print(netdissect_options *ndo,
+ const u_char *dat, int length)
+{
+ struct bgp bgp;
+ char tokbuf[TOKBUFSIZE];
+
+ ND_TCHECK2(dat[0], BGP_SIZE);
+ memcpy(&bgp, dat, BGP_SIZE);
+ ND_PRINT((ndo, "\n\t%s Message (%u), length: %u",
+ tok2strbuf(bgp_msg_values, "Unknown", bgp.bgp_type,
+ tokbuf, sizeof(tokbuf)),
+ bgp.bgp_type,
+ length));
+
+ switch (bgp.bgp_type) {
+ case BGP_OPEN:
+ bgp_open_print(ndo, dat, length);
+ break;
+ case BGP_UPDATE:
+ bgp_update_print(ndo, dat, length);
+ break;
+ case BGP_NOTIFICATION:
+ bgp_notification_print(ndo, dat, length);
+ break;
+ case BGP_KEEPALIVE:
+ break;
+ case BGP_ROUTE_REFRESH:
+ bgp_route_refresh_print(ndo, dat, length);
+ break;
+ default:
+ /* we have no decoder for the BGP message */
+ ND_TCHECK2(*dat, length);
+ ND_PRINT((ndo, "\n\t no Message %u decoder", bgp.bgp_type));
+ print_unknown_data(ndo, dat, "\n\t ", length);
+ break;
+ }
+ return 1;
+trunc:
+ ND_PRINT((ndo, "[|BGP]"));
+ return 0;
+}
+
+void
+bgp_print(netdissect_options *ndo,
+ const u_char *dat, int length)
+{
+ const u_char *p;
+ const u_char *ep;
+ const u_char *start;
+ const u_char marker[] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ };
+ struct bgp bgp;
+ uint16_t hlen;
+ char tokbuf[TOKBUFSIZE];
+
+ ep = dat + length;
+ if (ndo->ndo_snapend < dat + length)
+ ep = ndo->ndo_snapend;
+
+ ND_PRINT((ndo, ": BGP"));
+
+ if (ndo->ndo_vflag < 1) /* lets be less chatty */
+ return;
+
+ p = dat;
+ start = p;
+ while (p < ep) {
+ if (!ND_TTEST2(p[0], 1))
+ break;
+ if (p[0] != 0xff) {
+ p++;
+ continue;
+ }
+
+ if (!ND_TTEST2(p[0], sizeof(marker)))
+ break;
+ if (memcmp(p, marker, sizeof(marker)) != 0) {
+ p++;
+ continue;
+ }
+
+ /* found BGP header */
+ ND_TCHECK2(p[0], BGP_SIZE); /*XXX*/
+ memcpy(&bgp, p, BGP_SIZE);
+
+ if (start != p)
+ ND_PRINT((ndo, " [|BGP]"));
+
+ hlen = ntohs(bgp.bgp_len);
+ if (hlen < BGP_SIZE) {
+ ND_PRINT((ndo, "\n[|BGP Bogus header length %u < %u]", hlen,
+ BGP_SIZE));
+ break;
+ }
+
+ if (ND_TTEST2(p[0], hlen)) {
+ if (!bgp_header_print(ndo, p, hlen))
+ return;
+ p += hlen;
+ start = p;
+ } else {
+ ND_PRINT((ndo, "\n[|BGP %s]",
+ tok2strbuf(bgp_msg_values,
+ "Unknown Message Type",
+ bgp.bgp_type,
+ tokbuf, sizeof(tokbuf))));
+ break;
+ }
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|BGP]"));
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * Format and print bootp packets.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-bootp.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+static const char tstr[] = " [|bootp]";
+
+/*
+ * Bootstrap Protocol (BOOTP). RFC951 and RFC1048.
+ *
+ * This file specifies the "implementation-independent" BOOTP protocol
+ * information which is common to both client and server.
+ *
+ * Copyright 1988 by Carnegie Mellon.
+ *
+ * Permission to use, copy, modify, and distribute this program for any
+ * purpose and without fee is hereby granted, provided that this copyright
+ * and permission notice appear on all copies and supporting documentation,
+ * the name of Carnegie Mellon not be used in advertising or publicity
+ * pertaining to distribution of the program without specific prior
+ * permission, and notice be given in supporting documentation that copying
+ * and distribution is by permission of Carnegie Mellon and Stanford
+ * University. Carnegie Mellon makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ */
+
+struct bootp {
+ uint8_t bp_op; /* packet opcode type */
+ uint8_t bp_htype; /* hardware addr type */
+ uint8_t bp_hlen; /* hardware addr length */
+ uint8_t bp_hops; /* gateway hops */
+ uint32_t bp_xid; /* transaction ID */
+ uint16_t bp_secs; /* seconds since boot began */
+ uint16_t bp_flags; /* flags - see bootp_flag_values[]
+ in print-bootp.c */
+ struct in_addr bp_ciaddr; /* client IP address */
+ struct in_addr bp_yiaddr; /* 'your' IP address */
+ struct in_addr bp_siaddr; /* server IP address */
+ struct in_addr bp_giaddr; /* gateway IP address */
+ uint8_t bp_chaddr[16]; /* client hardware address */
+ uint8_t bp_sname[64]; /* server host name */
+ uint8_t bp_file[128]; /* boot file name */
+ uint8_t bp_vend[64]; /* vendor-specific area */
+} UNALIGNED;
+
+#define BOOTPREPLY 2
+#define BOOTPREQUEST 1
+
+/*
+ * Vendor magic cookie (v_magic) for CMU
+ */
+#define VM_CMU "CMU"
+
+/*
+ * Vendor magic cookie (v_magic) for RFC1048
+ */
+#define VM_RFC1048 { 99, 130, 83, 99 }
+
+/*
+ * RFC1048 tag values used to specify what information is being supplied in
+ * the vendor field of the packet.
+ */
+
+#define TAG_PAD ((uint8_t) 0)
+#define TAG_SUBNET_MASK ((uint8_t) 1)
+#define TAG_TIME_OFFSET ((uint8_t) 2)
+#define TAG_GATEWAY ((uint8_t) 3)
+#define TAG_TIME_SERVER ((uint8_t) 4)
+#define TAG_NAME_SERVER ((uint8_t) 5)
+#define TAG_DOMAIN_SERVER ((uint8_t) 6)
+#define TAG_LOG_SERVER ((uint8_t) 7)
+#define TAG_COOKIE_SERVER ((uint8_t) 8)
+#define TAG_LPR_SERVER ((uint8_t) 9)
+#define TAG_IMPRESS_SERVER ((uint8_t) 10)
+#define TAG_RLP_SERVER ((uint8_t) 11)
+#define TAG_HOSTNAME ((uint8_t) 12)
+#define TAG_BOOTSIZE ((uint8_t) 13)
+#define TAG_END ((uint8_t) 255)
+/* RFC1497 tags */
+#define TAG_DUMPPATH ((uint8_t) 14)
+#define TAG_DOMAINNAME ((uint8_t) 15)
+#define TAG_SWAP_SERVER ((uint8_t) 16)
+#define TAG_ROOTPATH ((uint8_t) 17)
+#define TAG_EXTPATH ((uint8_t) 18)
+/* RFC2132 */
+#define TAG_IP_FORWARD ((uint8_t) 19)
+#define TAG_NL_SRCRT ((uint8_t) 20)
+#define TAG_PFILTERS ((uint8_t) 21)
+#define TAG_REASS_SIZE ((uint8_t) 22)
+#define TAG_DEF_TTL ((uint8_t) 23)
+#define TAG_MTU_TIMEOUT ((uint8_t) 24)
+#define TAG_MTU_TABLE ((uint8_t) 25)
+#define TAG_INT_MTU ((uint8_t) 26)
+#define TAG_LOCAL_SUBNETS ((uint8_t) 27)
+#define TAG_BROAD_ADDR ((uint8_t) 28)
+#define TAG_DO_MASK_DISC ((uint8_t) 29)
+#define TAG_SUPPLY_MASK ((uint8_t) 30)
+#define TAG_DO_RDISC ((uint8_t) 31)
+#define TAG_RTR_SOL_ADDR ((uint8_t) 32)
+#define TAG_STATIC_ROUTE ((uint8_t) 33)
+#define TAG_USE_TRAILERS ((uint8_t) 34)
+#define TAG_ARP_TIMEOUT ((uint8_t) 35)
+#define TAG_ETH_ENCAP ((uint8_t) 36)
+#define TAG_TCP_TTL ((uint8_t) 37)
+#define TAG_TCP_KEEPALIVE ((uint8_t) 38)
+#define TAG_KEEPALIVE_GO ((uint8_t) 39)
+#define TAG_NIS_DOMAIN ((uint8_t) 40)
+#define TAG_NIS_SERVERS ((uint8_t) 41)
+#define TAG_NTP_SERVERS ((uint8_t) 42)
+#define TAG_VENDOR_OPTS ((uint8_t) 43)
+#define TAG_NETBIOS_NS ((uint8_t) 44)
+#define TAG_NETBIOS_DDS ((uint8_t) 45)
+#define TAG_NETBIOS_NODE ((uint8_t) 46)
+#define TAG_NETBIOS_SCOPE ((uint8_t) 47)
+#define TAG_XWIN_FS ((uint8_t) 48)
+#define TAG_XWIN_DM ((uint8_t) 49)
+#define TAG_NIS_P_DOMAIN ((uint8_t) 64)
+#define TAG_NIS_P_SERVERS ((uint8_t) 65)
+#define TAG_MOBILE_HOME ((uint8_t) 68)
+#define TAG_SMPT_SERVER ((uint8_t) 69)
+#define TAG_POP3_SERVER ((uint8_t) 70)
+#define TAG_NNTP_SERVER ((uint8_t) 71)
+#define TAG_WWW_SERVER ((uint8_t) 72)
+#define TAG_FINGER_SERVER ((uint8_t) 73)
+#define TAG_IRC_SERVER ((uint8_t) 74)
+#define TAG_STREETTALK_SRVR ((uint8_t) 75)
+#define TAG_STREETTALK_STDA ((uint8_t) 76)
+/* DHCP options */
+#define TAG_REQUESTED_IP ((uint8_t) 50)
+#define TAG_IP_LEASE ((uint8_t) 51)
+#define TAG_OPT_OVERLOAD ((uint8_t) 52)
+#define TAG_TFTP_SERVER ((uint8_t) 66)
+#define TAG_BOOTFILENAME ((uint8_t) 67)
+#define TAG_DHCP_MESSAGE ((uint8_t) 53)
+#define TAG_SERVER_ID ((uint8_t) 54)
+#define TAG_PARM_REQUEST ((uint8_t) 55)
+#define TAG_MESSAGE ((uint8_t) 56)
+#define TAG_MAX_MSG_SIZE ((uint8_t) 57)
+#define TAG_RENEWAL_TIME ((uint8_t) 58)
+#define TAG_REBIND_TIME ((uint8_t) 59)
+#define TAG_VENDOR_CLASS ((uint8_t) 60)
+#define TAG_CLIENT_ID ((uint8_t) 61)
+/* RFC 2241 */
+#define TAG_NDS_SERVERS ((uint8_t) 85)
+#define TAG_NDS_TREE_NAME ((uint8_t) 86)
+#define TAG_NDS_CONTEXT ((uint8_t) 87)
+/* RFC 2242 */
+#define TAG_NDS_IPDOMAIN ((uint8_t) 62)
+#define TAG_NDS_IPINFO ((uint8_t) 63)
+/* RFC 2485 */
+#define TAG_OPEN_GROUP_UAP ((uint8_t) 98)
+/* RFC 2563 */
+#define TAG_DISABLE_AUTOCONF ((uint8_t) 116)
+/* RFC 2610 */
+#define TAG_SLP_DA ((uint8_t) 78)
+#define TAG_SLP_SCOPE ((uint8_t) 79)
+/* RFC 2937 */
+#define TAG_NS_SEARCH ((uint8_t) 117)
+/* RFC 3004 - The User Class Option for DHCP */
+#define TAG_USER_CLASS ((uint8_t) 77)
+/* RFC 3011 */
+#define TAG_IP4_SUBNET_SELECT ((uint8_t) 118)
+/* RFC 3442 */
+#define TAG_CLASSLESS_STATIC_RT ((uint8_t) 121)
+#define TAG_CLASSLESS_STA_RT_MS ((uint8_t) 249)
+/* RFC 5859 - TFTP Server Address Option for DHCPv4 */
+#define TAG_TFTP_SERVER_ADDRESS ((uint8_t) 150)
+/* ftp://ftp.isi.edu/.../assignments/bootp-dhcp-extensions */
+#define TAG_SLP_NAMING_AUTH ((uint8_t) 80)
+#define TAG_CLIENT_FQDN ((uint8_t) 81)
+#define TAG_AGENT_CIRCUIT ((uint8_t) 82)
+#define TAG_AGENT_REMOTE ((uint8_t) 83)
+#define TAG_AGENT_MASK ((uint8_t) 84)
+#define TAG_TZ_STRING ((uint8_t) 88)
+#define TAG_FQDN_OPTION ((uint8_t) 89)
+#define TAG_AUTH ((uint8_t) 90)
+#define TAG_VINES_SERVERS ((uint8_t) 91)
+#define TAG_SERVER_RANK ((uint8_t) 92)
+#define TAG_CLIENT_ARCH ((uint8_t) 93)
+#define TAG_CLIENT_NDI ((uint8_t) 94)
+#define TAG_CLIENT_GUID ((uint8_t) 97)
+#define TAG_LDAP_URL ((uint8_t) 95)
+#define TAG_6OVER4 ((uint8_t) 96)
+#define TAG_PRINTER_NAME ((uint8_t) 100)
+#define TAG_MDHCP_SERVER ((uint8_t) 101)
+#define TAG_IPX_COMPAT ((uint8_t) 110)
+#define TAG_NETINFO_PARENT ((uint8_t) 112)
+#define TAG_NETINFO_PARENT_TAG ((uint8_t) 113)
+#define TAG_URL ((uint8_t) 114)
+#define TAG_FAILOVER ((uint8_t) 115)
+#define TAG_EXTENDED_REQUEST ((uint8_t) 126)
+#define TAG_EXTENDED_OPTION ((uint8_t) 127)
+
+/* DHCP Message types (values for TAG_DHCP_MESSAGE option) */
+#define DHCPDISCOVER 1
+#define DHCPOFFER 2
+#define DHCPREQUEST 3
+#define DHCPDECLINE 4
+#define DHCPACK 5
+#define DHCPNAK 6
+#define DHCPRELEASE 7
+#define DHCPINFORM 8
+
+/*
+ * "vendor" data permitted for CMU bootp clients.
+ */
+
+struct cmu_vend {
+ uint8_t v_magic[4]; /* magic number */
+ uint32_t v_flags; /* flags/opcodes, etc. */
+ struct in_addr v_smask; /* Subnet mask */
+ struct in_addr v_dgate; /* Default gateway */
+ struct in_addr v_dns1, v_dns2; /* Domain name servers */
+ struct in_addr v_ins1, v_ins2; /* IEN-116 name servers */
+ struct in_addr v_ts1, v_ts2; /* Time servers */
+ uint8_t v_unused[24]; /* currently unused */
+} UNALIGNED;
+
+
+/* v_flags values */
+#define VF_SMASK 1 /* Subnet mask field contains valid data */
+
+/* RFC 4702 DHCP Client FQDN Option */
+
+#define CLIENT_FQDN_FLAGS_S 0x01
+#define CLIENT_FQDN_FLAGS_O 0x02
+#define CLIENT_FQDN_FLAGS_E 0x04
+#define CLIENT_FQDN_FLAGS_N 0x08
+/* end of original bootp.h */
+
+static void rfc1048_print(netdissect_options *, const u_char *);
+static void cmu_print(netdissect_options *, const u_char *);
+static char *client_fqdn_flags(u_int flags);
+
+static const struct tok bootp_flag_values[] = {
+ { 0x8000, "Broadcast" },
+ { 0, NULL}
+};
+
+static const struct tok bootp_op_values[] = {
+ { BOOTPREQUEST, "Request" },
+ { BOOTPREPLY, "Reply" },
+ { 0, NULL}
+};
+
+/*
+ * Print bootp requests
+ */
+void
+bootp_print(netdissect_options *ndo,
+ register const u_char *cp, u_int length)
+{
+ register const struct bootp *bp;
+ static const u_char vm_cmu[4] = VM_CMU;
+ static const u_char vm_rfc1048[4] = VM_RFC1048;
+
+ bp = (const struct bootp *)cp;
+ ND_TCHECK(bp->bp_op);
+
+ ND_PRINT((ndo, "BOOTP/DHCP, %s",
+ tok2str(bootp_op_values, "unknown (0x%02x)", bp->bp_op)));
+
+ if (bp->bp_htype == 1 && bp->bp_hlen == 6 && bp->bp_op == BOOTPREQUEST) {
+ ND_TCHECK2(bp->bp_chaddr[0], 6);
+ ND_PRINT((ndo, " from %s", etheraddr_string(ndo, bp->bp_chaddr)));
+ }
+
+ ND_PRINT((ndo, ", length %u", length));
+
+ if (!ndo->ndo_vflag)
+ return;
+
+ ND_TCHECK(bp->bp_secs);
+
+ /* The usual hardware address type is 1 (10Mb Ethernet) */
+ if (bp->bp_htype != 1)
+ ND_PRINT((ndo, ", htype %d", bp->bp_htype));
+
+ /* The usual length for 10Mb Ethernet address is 6 bytes */
+ if (bp->bp_htype != 1 || bp->bp_hlen != 6)
+ ND_PRINT((ndo, ", hlen %d", bp->bp_hlen));
+
+ /* Only print interesting fields */
+ if (bp->bp_hops)
+ ND_PRINT((ndo, ", hops %d", bp->bp_hops));
+ if (EXTRACT_32BITS(&bp->bp_xid))
+ ND_PRINT((ndo, ", xid 0x%x", EXTRACT_32BITS(&bp->bp_xid)));
+ if (EXTRACT_16BITS(&bp->bp_secs))
+ ND_PRINT((ndo, ", secs %d", EXTRACT_16BITS(&bp->bp_secs)));
+
+ ND_PRINT((ndo, ", Flags [%s]",
+ bittok2str(bootp_flag_values, "none", EXTRACT_16BITS(&bp->bp_flags))));
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, " (0x%04x)", EXTRACT_16BITS(&bp->bp_flags)));
+
+ /* Client's ip address */
+ ND_TCHECK(bp->bp_ciaddr);
+ if (EXTRACT_32BITS(&bp->bp_ciaddr.s_addr))
+ ND_PRINT((ndo, "\n\t Client-IP %s", ipaddr_string(ndo, &bp->bp_ciaddr)));
+
+ /* 'your' ip address (bootp client) */
+ ND_TCHECK(bp->bp_yiaddr);
+ if (EXTRACT_32BITS(&bp->bp_yiaddr.s_addr))
+ ND_PRINT((ndo, "\n\t Your-IP %s", ipaddr_string(ndo, &bp->bp_yiaddr)));
+
+ /* Server's ip address */
+ ND_TCHECK(bp->bp_siaddr);
+ if (EXTRACT_32BITS(&bp->bp_siaddr.s_addr))
+ ND_PRINT((ndo, "\n\t Server-IP %s", ipaddr_string(ndo, &bp->bp_siaddr)));
+
+ /* Gateway's ip address */
+ ND_TCHECK(bp->bp_giaddr);
+ if (EXTRACT_32BITS(&bp->bp_giaddr.s_addr))
+ ND_PRINT((ndo, "\n\t Gateway-IP %s", ipaddr_string(ndo, &bp->bp_giaddr)));
+
+ /* Client's Ethernet address */
+ if (bp->bp_htype == 1 && bp->bp_hlen == 6) {
+ ND_TCHECK2(bp->bp_chaddr[0], 6);
+ ND_PRINT((ndo, "\n\t Client-Ethernet-Address %s", etheraddr_string(ndo, bp->bp_chaddr)));
+ }
+
+ ND_TCHECK2(bp->bp_sname[0], 1); /* check first char only */
+ if (*bp->bp_sname) {
+ ND_PRINT((ndo, "\n\t sname \""));
+ if (fn_print(ndo, bp->bp_sname, ndo->ndo_snapend)) {
+ ND_PRINT((ndo, "\""));
+ ND_PRINT((ndo, "%s", tstr + 1));
+ return;
+ }
+ ND_PRINT((ndo, "\""));
+ }
+ ND_TCHECK2(bp->bp_file[0], 1); /* check first char only */
+ if (*bp->bp_file) {
+ ND_PRINT((ndo, "\n\t file \""));
+ if (fn_print(ndo, bp->bp_file, ndo->ndo_snapend)) {
+ ND_PRINT((ndo, "\""));
+ ND_PRINT((ndo, "%s", tstr + 1));
+ return;
+ }
+ ND_PRINT((ndo, "\""));
+ }
+
+ /* Decode the vendor buffer */
+ ND_TCHECK(bp->bp_vend[0]);
+ if (memcmp((const char *)bp->bp_vend, vm_rfc1048,
+ sizeof(uint32_t)) == 0)
+ rfc1048_print(ndo, bp->bp_vend);
+ else if (memcmp((const char *)bp->bp_vend, vm_cmu,
+ sizeof(uint32_t)) == 0)
+ cmu_print(ndo, bp->bp_vend);
+ else {
+ uint32_t ul;
+
+ ul = EXTRACT_32BITS(&bp->bp_vend);
+ if (ul != 0)
+ ND_PRINT((ndo, "\n\t Vendor-#0x%x", ul));
+ }
+
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/*
+ * The first character specifies the format to print:
+ * i - ip address (32 bits)
+ * p - ip address pairs (32 bits + 32 bits)
+ * l - long (32 bits)
+ * L - unsigned long (32 bits)
+ * s - short (16 bits)
+ * b - period-seperated decimal bytes (variable length)
+ * x - colon-seperated hex bytes (variable length)
+ * a - ascii string (variable length)
+ * B - on/off (8 bits)
+ * $ - special (explicit code to handle)
+ */
+static const struct tok tag2str[] = {
+/* RFC1048 tags */
+ { TAG_PAD, " PAD" },
+ { TAG_SUBNET_MASK, "iSubnet-Mask" }, /* subnet mask (RFC950) */
+ { TAG_TIME_OFFSET, "LTime-Zone" }, /* seconds from UTC */
+ { TAG_GATEWAY, "iDefault-Gateway" }, /* default gateway */
+ { TAG_TIME_SERVER, "iTime-Server" }, /* time servers (RFC868) */
+ { TAG_NAME_SERVER, "iIEN-Name-Server" }, /* IEN name servers (IEN116) */
+ { TAG_DOMAIN_SERVER, "iDomain-Name-Server" }, /* domain name (RFC1035) */
+ { TAG_LOG_SERVER, "iLOG" }, /* MIT log servers */
+ { TAG_COOKIE_SERVER, "iCS" }, /* cookie servers (RFC865) */
+ { TAG_LPR_SERVER, "iLPR-Server" }, /* lpr server (RFC1179) */
+ { TAG_IMPRESS_SERVER, "iIM" }, /* impress servers (Imagen) */
+ { TAG_RLP_SERVER, "iRL" }, /* resource location (RFC887) */
+ { TAG_HOSTNAME, "aHostname" }, /* ascii hostname */
+ { TAG_BOOTSIZE, "sBS" }, /* 512 byte blocks */
+ { TAG_END, " END" },
+/* RFC1497 tags */
+ { TAG_DUMPPATH, "aDP" },
+ { TAG_DOMAINNAME, "aDomain-Name" },
+ { TAG_SWAP_SERVER, "iSS" },
+ { TAG_ROOTPATH, "aRP" },
+ { TAG_EXTPATH, "aEP" },
+/* RFC2132 tags */
+ { TAG_IP_FORWARD, "BIPF" },
+ { TAG_NL_SRCRT, "BSRT" },
+ { TAG_PFILTERS, "pPF" },
+ { TAG_REASS_SIZE, "sRSZ" },
+ { TAG_DEF_TTL, "bTTL" },
+ { TAG_MTU_TIMEOUT, "lMTU-Timeout" },
+ { TAG_MTU_TABLE, "sMTU-Table" },
+ { TAG_INT_MTU, "sMTU" },
+ { TAG_LOCAL_SUBNETS, "BLSN" },
+ { TAG_BROAD_ADDR, "iBR" },
+ { TAG_DO_MASK_DISC, "BMD" },
+ { TAG_SUPPLY_MASK, "BMS" },
+ { TAG_DO_RDISC, "BRouter-Discovery" },
+ { TAG_RTR_SOL_ADDR, "iRSA" },
+ { TAG_STATIC_ROUTE, "pStatic-Route" },
+ { TAG_USE_TRAILERS, "BUT" },
+ { TAG_ARP_TIMEOUT, "lAT" },
+ { TAG_ETH_ENCAP, "BIE" },
+ { TAG_TCP_TTL, "bTT" },
+ { TAG_TCP_KEEPALIVE, "lKI" },
+ { TAG_KEEPALIVE_GO, "BKG" },
+ { TAG_NIS_DOMAIN, "aYD" },
+ { TAG_NIS_SERVERS, "iYS" },
+ { TAG_NTP_SERVERS, "iNTP" },
+ { TAG_VENDOR_OPTS, "bVendor-Option" },
+ { TAG_NETBIOS_NS, "iNetbios-Name-Server" },
+ { TAG_NETBIOS_DDS, "iWDD" },
+ { TAG_NETBIOS_NODE, "$Netbios-Node" },
+ { TAG_NETBIOS_SCOPE, "aNetbios-Scope" },
+ { TAG_XWIN_FS, "iXFS" },
+ { TAG_XWIN_DM, "iXDM" },
+ { TAG_NIS_P_DOMAIN, "sN+D" },
+ { TAG_NIS_P_SERVERS, "iN+S" },
+ { TAG_MOBILE_HOME, "iMH" },
+ { TAG_SMPT_SERVER, "iSMTP" },
+ { TAG_POP3_SERVER, "iPOP3" },
+ { TAG_NNTP_SERVER, "iNNTP" },
+ { TAG_WWW_SERVER, "iWWW" },
+ { TAG_FINGER_SERVER, "iFG" },
+ { TAG_IRC_SERVER, "iIRC" },
+ { TAG_STREETTALK_SRVR, "iSTS" },
+ { TAG_STREETTALK_STDA, "iSTDA" },
+ { TAG_REQUESTED_IP, "iRequested-IP" },
+ { TAG_IP_LEASE, "lLease-Time" },
+ { TAG_OPT_OVERLOAD, "$OO" },
+ { TAG_TFTP_SERVER, "aTFTP" },
+ { TAG_BOOTFILENAME, "aBF" },
+ { TAG_DHCP_MESSAGE, " DHCP-Message" },
+ { TAG_SERVER_ID, "iServer-ID" },
+ { TAG_PARM_REQUEST, "bParameter-Request" },
+ { TAG_MESSAGE, "aMSG" },
+ { TAG_MAX_MSG_SIZE, "sMSZ" },
+ { TAG_RENEWAL_TIME, "lRN" },
+ { TAG_REBIND_TIME, "lRB" },
+ { TAG_VENDOR_CLASS, "aVendor-Class" },
+ { TAG_CLIENT_ID, "$Client-ID" },
+/* RFC 2485 */
+ { TAG_OPEN_GROUP_UAP, "aUAP" },
+/* RFC 2563 */
+ { TAG_DISABLE_AUTOCONF, "BNOAUTO" },
+/* RFC 2610 */
+ { TAG_SLP_DA, "bSLP-DA" }, /*"b" is a little wrong */
+ { TAG_SLP_SCOPE, "bSLP-SCOPE" }, /*"b" is a little wrong */
+/* RFC 2937 */
+ { TAG_NS_SEARCH, "sNSSEARCH" }, /* XXX 's' */
+/* RFC 3004 - The User Class Option for DHCP */
+ { TAG_USER_CLASS, "$User-Class" },
+/* RFC 3011 */
+ { TAG_IP4_SUBNET_SELECT, "iSUBNET" },
+/* RFC 3442 */
+ { TAG_CLASSLESS_STATIC_RT, "$Classless-Static-Route" },
+ { TAG_CLASSLESS_STA_RT_MS, "$Classless-Static-Route-Microsoft" },
+/* RFC 5859 - TFTP Server Address Option for DHCPv4 */
+ { TAG_TFTP_SERVER_ADDRESS, "iTFTP-Server-Address" },
+/* http://www.iana.org/assignments/bootp-dhcp-extensions/index.htm */
+ { TAG_SLP_NAMING_AUTH, "aSLP-NA" },
+ { TAG_CLIENT_FQDN, "$FQDN" },
+ { TAG_AGENT_CIRCUIT, "$Agent-Information" },
+ { TAG_AGENT_REMOTE, "bARMT" },
+ { TAG_AGENT_MASK, "bAMSK" },
+ { TAG_TZ_STRING, "aTZSTR" },
+ { TAG_FQDN_OPTION, "bFQDNS" }, /* XXX 'b' */
+ { TAG_AUTH, "bAUTH" }, /* XXX 'b' */
+ { TAG_VINES_SERVERS, "iVINES" },
+ { TAG_SERVER_RANK, "sRANK" },
+ { TAG_CLIENT_ARCH, "sARCH" },
+ { TAG_CLIENT_NDI, "bNDI" }, /* XXX 'b' */
+ { TAG_CLIENT_GUID, "bGUID" }, /* XXX 'b' */
+ { TAG_LDAP_URL, "aLDAP" },
+ { TAG_6OVER4, "i6o4" },
+ { TAG_PRINTER_NAME, "aPRTR" },
+ { TAG_MDHCP_SERVER, "bMDHCP" }, /* XXX 'b' */
+ { TAG_IPX_COMPAT, "bIPX" }, /* XXX 'b' */
+ { TAG_NETINFO_PARENT, "iNI" },
+ { TAG_NETINFO_PARENT_TAG, "aNITAG" },
+ { TAG_URL, "aURL" },
+ { TAG_FAILOVER, "bFAIL" }, /* XXX 'b' */
+ { 0, NULL }
+};
+/* 2-byte extended tags */
+static const struct tok xtag2str[] = {
+ { 0, NULL }
+};
+
+/* DHCP "options overload" types */
+static const struct tok oo2str[] = {
+ { 1, "file" },
+ { 2, "sname" },
+ { 3, "file+sname" },
+ { 0, NULL }
+};
+
+/* NETBIOS over TCP/IP node type options */
+static const struct tok nbo2str[] = {
+ { 0x1, "b-node" },
+ { 0x2, "p-node" },
+ { 0x4, "m-node" },
+ { 0x8, "h-node" },
+ { 0, NULL }
+};
+
+/* ARP Hardware types, for Client-ID option */
+static const struct tok arp2str[] = {
+ { 0x1, "ether" },
+ { 0x6, "ieee802" },
+ { 0x7, "arcnet" },
+ { 0xf, "frelay" },
+ { 0x17, "strip" },
+ { 0x18, "ieee1394" },
+ { 0, NULL }
+};
+
+static const struct tok dhcp_msg_values[] = {
+ { DHCPDISCOVER, "Discover" },
+ { DHCPOFFER, "Offer" },
+ { DHCPREQUEST, "Request" },
+ { DHCPDECLINE, "Decline" },
+ { DHCPACK, "ACK" },
+ { DHCPNAK, "NACK" },
+ { DHCPRELEASE, "Release" },
+ { DHCPINFORM, "Inform" },
+ { 0, NULL }
+};
+
+#define AGENT_SUBOPTION_CIRCUIT_ID 1 /* RFC 3046 */
+#define AGENT_SUBOPTION_REMOTE_ID 2 /* RFC 3046 */
+#define AGENT_SUBOPTION_SUBSCRIBER_ID 6 /* RFC 3993 */
+static const struct tok agent_suboption_values[] = {
+ { AGENT_SUBOPTION_CIRCUIT_ID, "Circuit-ID" },
+ { AGENT_SUBOPTION_REMOTE_ID, "Remote-ID" },
+ { AGENT_SUBOPTION_SUBSCRIBER_ID, "Subscriber-ID" },
+ { 0, NULL }
+};
+
+
+static void
+rfc1048_print(netdissect_options *ndo,
+ register const u_char *bp)
+{
+ register uint16_t tag;
+ register u_int len;
+ register const char *cp;
+ register char c;
+ int first, idx;
+ uint32_t ul;
+ uint16_t us;
+ uint8_t uc, subopt, suboptlen;
+
+ ND_PRINT((ndo, "\n\t Vendor-rfc1048 Extensions"));
+
+ /* Step over magic cookie */
+ ND_PRINT((ndo, "\n\t Magic Cookie 0x%08x", EXTRACT_32BITS(bp)));
+ bp += sizeof(int32_t);
+
+ /* Loop while we there is a tag left in the buffer */
+ while (ND_TTEST2(*bp, 1)) {
+ tag = *bp++;
+ if (tag == TAG_PAD && ndo->ndo_vflag < 3)
+ continue;
+ if (tag == TAG_END && ndo->ndo_vflag < 3)
+ return;
+ if (tag == TAG_EXTENDED_OPTION) {
+ ND_TCHECK2(*(bp + 1), 2);
+ tag = EXTRACT_16BITS(bp + 1);
+ /* XXX we don't know yet if the IANA will
+ * preclude overlap of 1-byte and 2-byte spaces.
+ * If not, we need to offset tag after this step.
+ */
+ cp = tok2str(xtag2str, "?xT%u", tag);
+ } else
+ cp = tok2str(tag2str, "?T%u", tag);
+ c = *cp++;
+
+ if (tag == TAG_PAD || tag == TAG_END)
+ len = 0;
+ else {
+ /* Get the length; check for truncation */
+ ND_TCHECK2(*bp, 1);
+ len = *bp++;
+ }
+
+ ND_PRINT((ndo, "\n\t %s Option %u, length %u%s", cp, tag, len,
+ len > 0 ? ": " : ""));
+
+ if (tag == TAG_PAD && ndo->ndo_vflag > 2) {
+ u_int ntag = 1;
+ while (ND_TTEST2(*bp, 1) && *bp == TAG_PAD) {
+ bp++;
+ ntag++;
+ }
+ if (ntag > 1)
+ ND_PRINT((ndo, ", occurs %u", ntag));
+ }
+
+ if (!ND_TTEST2(*bp, len)) {
+ ND_PRINT((ndo, "[|rfc1048 %u]", len));
+ return;
+ }
+
+ if (tag == TAG_DHCP_MESSAGE && len == 1) {
+ uc = *bp++;
+ ND_PRINT((ndo, "%s", tok2str(dhcp_msg_values, "Unknown (%u)", uc)));
+ continue;
+ }
+
+ if (tag == TAG_PARM_REQUEST) {
+ idx = 0;
+ while (len-- > 0) {
+ uc = *bp++;
+ cp = tok2str(tag2str, "?Option %u", uc);
+ if (idx % 4 == 0)
+ ND_PRINT((ndo, "\n\t "));
+ else
+ ND_PRINT((ndo, ", "));
+ ND_PRINT((ndo, "%s", cp + 1));
+ idx++;
+ }
+ continue;
+ }
+
+ if (tag == TAG_EXTENDED_REQUEST) {
+ first = 1;
+ while (len > 1) {
+ len -= 2;
+ us = EXTRACT_16BITS(bp);
+ bp += 2;
+ cp = tok2str(xtag2str, "?xT%u", us);
+ if (!first)
+ ND_PRINT((ndo, "+"));
+ ND_PRINT((ndo, "%s", cp + 1));
+ first = 0;
+ }
+ continue;
+ }
+
+ /* Print data */
+ if (c == '?') {
+ /* Base default formats for unknown tags on data size */
+ if (len & 1)
+ c = 'b';
+ else if (len & 2)
+ c = 's';
+ else
+ c = 'l';
+ }
+ first = 1;
+ switch (c) {
+
+ case 'a':
+ /* ascii strings */
+ ND_PRINT((ndo, "\""));
+ if (fn_printn(ndo, bp, len, ndo->ndo_snapend)) {
+ ND_PRINT((ndo, "\""));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "\""));
+ bp += len;
+ len = 0;
+ break;
+
+ case 'i':
+ case 'l':
+ case 'L':
+ /* ip addresses/32-bit words */
+ while (len >= sizeof(ul)) {
+ if (!first)
+ ND_PRINT((ndo, ","));
+ ul = EXTRACT_32BITS(bp);
+ if (c == 'i') {
+ ul = htonl(ul);
+ ND_PRINT((ndo, "%s", ipaddr_string(ndo, &ul)));
+ } else if (c == 'L')
+ ND_PRINT((ndo, "%d", ul));
+ else
+ ND_PRINT((ndo, "%u", ul));
+ bp += sizeof(ul);
+ len -= sizeof(ul);
+ first = 0;
+ }
+ break;
+
+ case 'p':
+ /* IP address pairs */
+ while (len >= 2*sizeof(ul)) {
+ if (!first)
+ ND_PRINT((ndo, ","));
+ memcpy((char *)&ul, (const char *)bp, sizeof(ul));
+ ND_PRINT((ndo, "(%s:", ipaddr_string(ndo, &ul)));
+ bp += sizeof(ul);
+ memcpy((char *)&ul, (const char *)bp, sizeof(ul));
+ ND_PRINT((ndo, "%s)", ipaddr_string(ndo, &ul)));
+ bp += sizeof(ul);
+ len -= 2*sizeof(ul);
+ first = 0;
+ }
+ break;
+
+ case 's':
+ /* shorts */
+ while (len >= sizeof(us)) {
+ if (!first)
+ ND_PRINT((ndo, ","));
+ us = EXTRACT_16BITS(bp);
+ ND_PRINT((ndo, "%u", us));
+ bp += sizeof(us);
+ len -= sizeof(us);
+ first = 0;
+ }
+ break;
+
+ case 'B':
+ /* boolean */
+ while (len > 0) {
+ if (!first)
+ ND_PRINT((ndo, ","));
+ switch (*bp) {
+ case 0:
+ ND_PRINT((ndo, "N"));
+ break;
+ case 1:
+ ND_PRINT((ndo, "Y"));
+ break;
+ default:
+ ND_PRINT((ndo, "%u?", *bp));
+ break;
+ }
+ ++bp;
+ --len;
+ first = 0;
+ }
+ break;
+
+ case 'b':
+ case 'x':
+ default:
+ /* Bytes */
+ while (len > 0) {
+ if (!first)
+ ND_PRINT((ndo, c == 'x' ? ":" : "."));
+ if (c == 'x')
+ ND_PRINT((ndo, "%02x", *bp));
+ else
+ ND_PRINT((ndo, "%u", *bp));
+ ++bp;
+ --len;
+ first = 0;
+ }
+ break;
+
+ case '$':
+ /* Guys we can't handle with one of the usual cases */
+ switch (tag) {
+
+ case TAG_NETBIOS_NODE:
+ /* this option should be at least 1 byte long */
+ if (len < 1) {
+ ND_PRINT((ndo, "ERROR: length < 1 bytes"));
+ break;
+ }
+ tag = *bp++;
+ --len;
+ ND_PRINT((ndo, "%s", tok2str(nbo2str, NULL, tag)));
+ break;
+
+ case TAG_OPT_OVERLOAD:
+ /* this option should be at least 1 byte long */
+ if (len < 1) {
+ ND_PRINT((ndo, "ERROR: length < 1 bytes"));
+ break;
+ }
+ tag = *bp++;
+ --len;
+ ND_PRINT((ndo, "%s", tok2str(oo2str, NULL, tag)));
+ break;
+
+ case TAG_CLIENT_FQDN:
+ /* this option should be at least 3 bytes long */
+ if (len < 3) {
+ ND_PRINT((ndo, "ERROR: length < 3 bytes"));
+ bp += len;
+ len = 0;
+ break;
+ }
+ if (*bp)
+ ND_PRINT((ndo, "[%s] ", client_fqdn_flags(*bp)));
+ bp++;
+ if (*bp || *(bp+1))
+ ND_PRINT((ndo, "%u/%u ", *bp, *(bp+1)));
+ bp += 2;
+ ND_PRINT((ndo, "\""));
+ if (fn_printn(ndo, bp, len - 3, ndo->ndo_snapend)) {
+ ND_PRINT((ndo, "\""));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "\""));
+ bp += len - 3;
+ len = 0;
+ break;
+
+ case TAG_CLIENT_ID:
+ {
+ int type;
+
+ /* this option should be at least 1 byte long */
+ if (len < 1) {
+ ND_PRINT((ndo, "ERROR: length < 1 bytes"));
+ break;
+ }
+ type = *bp++;
+ len--;
+ if (type == 0) {
+ ND_PRINT((ndo, "\""));
+ if (fn_printn(ndo, bp, len, ndo->ndo_snapend)) {
+ ND_PRINT((ndo, "\""));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "\""));
+ bp += len;
+ len = 0;
+ break;
+ } else {
+ ND_PRINT((ndo, "%s ", tok2str(arp2str, "hardware-type %u,", type)));
+ while (len > 0) {
+ if (!first)
+ ND_PRINT((ndo, ":"));
+ ND_PRINT((ndo, "%02x", *bp));
+ ++bp;
+ --len;
+ first = 0;
+ }
+ }
+ break;
+ }
+
+ case TAG_AGENT_CIRCUIT:
+ while (len >= 2) {
+ subopt = *bp++;
+ suboptlen = *bp++;
+ len -= 2;
+ if (suboptlen > len) {
+ ND_PRINT((ndo, "\n\t %s SubOption %u, length %u: length goes past end of option",
+ tok2str(agent_suboption_values, "Unknown", subopt),
+ subopt,
+ suboptlen));
+ bp += len;
+ len = 0;
+ break;
+ }
+ ND_PRINT((ndo, "\n\t %s SubOption %u, length %u: ",
+ tok2str(agent_suboption_values, "Unknown", subopt),
+ subopt,
+ suboptlen));
+ switch (subopt) {
+
+ case AGENT_SUBOPTION_CIRCUIT_ID: /* fall through */
+ case AGENT_SUBOPTION_REMOTE_ID:
+ case AGENT_SUBOPTION_SUBSCRIBER_ID:
+ if (fn_printn(ndo, bp, suboptlen, ndo->ndo_snapend))
+ goto trunc;
+ break;
+
+ default:
+ print_unknown_data(ndo, bp, "\n\t\t", suboptlen);
+ }
+
+ len -= suboptlen;
+ bp += suboptlen;
+ }
+ break;
+
+ case TAG_CLASSLESS_STATIC_RT:
+ case TAG_CLASSLESS_STA_RT_MS:
+ {
+ u_int mask_width, significant_octets, i;
+
+ /* this option should be at least 5 bytes long */
+ if (len < 5) {
+ ND_PRINT((ndo, "ERROR: length < 5 bytes"));
+ bp += len;
+ len = 0;
+ break;
+ }
+ while (len > 0) {
+ if (!first)
+ ND_PRINT((ndo, ","));
+ mask_width = *bp++;
+ len--;
+ /* mask_width <= 32 */
+ if (mask_width > 32) {
+ ND_PRINT((ndo, "[ERROR: Mask width (%d) > 32]", mask_width));
+ bp += len;
+ len = 0;
+ break;
+ }
+ significant_octets = (mask_width + 7) / 8;
+ /* significant octets + router(4) */
+ if (len < significant_octets + 4) {
+ ND_PRINT((ndo, "[ERROR: Remaining length (%u) < %u bytes]", len, significant_octets + 4));
+ bp += len;
+ len = 0;
+ break;
+ }
+ ND_PRINT((ndo, "("));
+ if (mask_width == 0)
+ ND_PRINT((ndo, "default"));
+ else {
+ for (i = 0; i < significant_octets ; i++) {
+ if (i > 0)
+ ND_PRINT((ndo, "."));
+ ND_PRINT((ndo, "%d", *bp++));
+ }
+ for (i = significant_octets ; i < 4 ; i++)
+ ND_PRINT((ndo, ".0"));
+ ND_PRINT((ndo, "/%d", mask_width));
+ }
+ memcpy((char *)&ul, (const char *)bp, sizeof(ul));
+ ND_PRINT((ndo, ":%s)", ipaddr_string(ndo, &ul)));
+ bp += sizeof(ul);
+ len -= (significant_octets + 4);
+ first = 0;
+ }
+ break;
+ }
+
+ case TAG_USER_CLASS:
+ {
+ u_int suboptnumber = 1;
+
+ first = 1;
+ if (len < 2) {
+ ND_PRINT((ndo, "ERROR: length < 2 bytes"));
+ bp += len;
+ len = 0;
+ break;
+ }
+ while (len > 0) {
+ suboptlen = *bp++;
+ len--;
+ ND_PRINT((ndo, "\n\t "));
+ ND_PRINT((ndo, "instance#%u: ", suboptnumber));
+ if (suboptlen == 0) {
+ ND_PRINT((ndo, "ERROR: suboption length must be non-zero"));
+ bp += len;
+ len = 0;
+ break;
+ }
+ if (len < suboptlen) {
+ ND_PRINT((ndo, "ERROR: malformed option"));
+ bp += len;
+ len = 0;
+ break;
+ }
+ ND_PRINT((ndo, "\""));
+ if (fn_printn(ndo, bp, suboptlen, ndo->ndo_snapend)) {
+ ND_PRINT((ndo, "\""));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "\""));
+ ND_PRINT((ndo, ", length %d", suboptlen));
+ suboptnumber++;
+ len -= suboptlen;
+ bp += suboptlen;
+ }
+ break;
+ }
+
+ default:
+ ND_PRINT((ndo, "[unknown special tag %u, size %u]",
+ tag, len));
+ bp += len;
+ len = 0;
+ break;
+ }
+ break;
+ }
+ /* Data left over? */
+ if (len) {
+ ND_PRINT((ndo, "\n\t trailing data length %u", len));
+ bp += len;
+ }
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "|[rfc1048]"));
+}
+
+static void
+cmu_print(netdissect_options *ndo,
+ register const u_char *bp)
+{
+ register const struct cmu_vend *cmu;
+
+#define PRINTCMUADDR(m, s) { ND_TCHECK(cmu->m); \
+ if (cmu->m.s_addr != 0) \
+ ND_PRINT((ndo, " %s:%s", s, ipaddr_string(ndo, &cmu->m.s_addr))); }
+
+ ND_PRINT((ndo, " vend-cmu"));
+ cmu = (const struct cmu_vend *)bp;
+
+ /* Only print if there are unknown bits */
+ ND_TCHECK(cmu->v_flags);
+ if ((cmu->v_flags & ~(VF_SMASK)) != 0)
+ ND_PRINT((ndo, " F:0x%x", cmu->v_flags));
+ PRINTCMUADDR(v_dgate, "DG");
+ PRINTCMUADDR(v_smask, cmu->v_flags & VF_SMASK ? "SM" : "SM*");
+ PRINTCMUADDR(v_dns1, "NS1");
+ PRINTCMUADDR(v_dns2, "NS2");
+ PRINTCMUADDR(v_ins1, "IEN1");
+ PRINTCMUADDR(v_ins2, "IEN2");
+ PRINTCMUADDR(v_ts1, "TS1");
+ PRINTCMUADDR(v_ts2, "TS2");
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+#undef PRINTCMUADDR
+}
+
+static char *
+client_fqdn_flags(u_int flags)
+{
+ static char buf[8+1];
+ int i = 0;
+
+ if (flags & CLIENT_FQDN_FLAGS_S)
+ buf[i++] = 'S';
+ if (flags & CLIENT_FQDN_FLAGS_O)
+ buf[i++] = 'O';
+ if (flags & CLIENT_FQDN_FLAGS_E)
+ buf[i++] = 'E';
+ if (flags & CLIENT_FQDN_FLAGS_N)
+ buf[i++] = 'N';
+ buf[i] = '\0';
+
+ return buf;
+}
--- /dev/null
+/*
+ * Copyright (c) 2007
+ * paolo.abeni@email.it All rights reserved.
+ *
+ * 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 Paolo Abeni.''
+ * The name of author 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-bt.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+#if defined(DLT_BLUETOOTH_HCI_H4_WITH_PHDR) && defined(HAVE_PCAP_BLUETOOTH_H)
+#include <pcap/bluetooth.h>
+
+#define BT_HDRLEN sizeof(pcap_bluetooth_h4_header)
+/*
+ * This is the top level routine of the printer. 'p' points
+ * to the bluetooth 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
+bt_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int length = h->len;
+ u_int caplen = h->caplen;
+ const pcap_bluetooth_h4_header* hdr = (const pcap_bluetooth_h4_header*)p;
+
+ if (caplen < BT_HDRLEN) {
+ ND_PRINT((ndo, "[|bt]"));
+ return (BT_HDRLEN);
+ }
+ caplen -= BT_HDRLEN;
+ length -= BT_HDRLEN;
+ p += BT_HDRLEN;
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "hci length %d, direction %s, ", length, (EXTRACT_32BITS(&hdr->direction)&0x1)?"in":"out"));
+
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+
+ return (BT_HDRLEN);
+}
+#endif
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 2013 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.
+ *
+ * Original code by Ola Martin Lykkja (ola.lykkja@q-free.com)
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+
+/*
+ ISO 29281:2009
+ Intelligent Transport Systems . Communications access for land mobiles (CALM)
+ CALM non-IP networking
+*/
+
+/*
+ * This is the top level routine of the printer. 'bp' points
+ * to the calm header of the packet.
+ */
+void
+calm_fast_print(netdissect_options *ndo, const u_char *eth, const u_char *bp, u_int length)
+{
+ int srcNwref = bp[0];
+ int dstNwref = bp[1];
+ length -= 2;
+ bp += 2;
+
+ ND_PRINT((ndo, "CALM FAST src:%s; ", etheraddr_string(ndo, eth+6)));
+ ND_PRINT((ndo, "SrcNwref:%d; ", srcNwref));
+ ND_PRINT((ndo, "DstNwref:%d; ", dstNwref));
+
+ if (ndo->ndo_vflag)
+ ND_DEFAULTPRINT(bp, length);
+}
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/* $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.
+ *
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h" /* for checksum structure and functions */
+#include "extract.h"
+
+void
+carp_print(netdissect_options *ndo, register const u_char *bp, register u_int len, int ttl)
+{
+ int version, type;
+ const char *type_s;
+
+ ND_TCHECK(bp[0]);
+ version = (bp[0] & 0xf0) >> 4;
+ type = bp[0] & 0x0f;
+ if (type == 1)
+ type_s = "advertise";
+ else
+ type_s = "unknown";
+ ND_PRINT((ndo, "CARPv%d-%s %d: ", version, type_s, len));
+ if (ttl != 255)
+ ND_PRINT((ndo, "[ttl=%d!] ", ttl));
+ if (version != 2 || type != 1)
+ return;
+ ND_TCHECK(bp[2]);
+ ND_TCHECK(bp[5]);
+ ND_PRINT((ndo, "vhid=%d advbase=%d advskew=%d authlen=%d ",
+ bp[1], bp[5], bp[2], bp[3]));
+ if (ndo->ndo_vflag) {
+ struct cksum_vec vec[1];
+ vec[0].ptr = (const uint8_t *)bp;
+ vec[0].len = len;
+ if (ND_TTEST2(bp[0], len) && in_cksum(vec, 1))
+ ND_PRINT((ndo, " (bad carp cksum %x!)",
+ EXTRACT_16BITS(&bp[6])));
+ }
+ ND_PRINT((ndo, "counter=%" PRIu64, EXTRACT_64BITS(&bp[8])));
+
+ return;
+trunc:
+ ND_PRINT((ndo, "[|carp]"));
+}
--- /dev/null
+/*
+ * Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * Code by Gert Doering, SpaceNet GmbH, gert@space.net
+ *
+ * Reference documentation:
+ * http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-cdp.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+#include "nlpid.h"
+
+static const char tstr[] = "[|cdp]";
+
+#define CDP_HEADER_LEN 4
+#define CDP_HEADER_VERSION_OFFSET 0
+#define CDP_HEADER_TTL_OFFSET 1
+#define CDP_HEADER_CHECKSUM_OFFSET 2
+
+#define CDP_TLV_HEADER_LEN 4
+#define CDP_TLV_TYPE_OFFSET 0
+#define CDP_TLV_LEN_OFFSET 2
+
+static const struct tok cdp_tlv_values[] = {
+ { 0x01, "Device-ID"},
+ { 0x02, "Address"},
+ { 0x03, "Port-ID"},
+ { 0x04, "Capability"},
+ { 0x05, "Version String"},
+ { 0x06, "Platform"},
+ { 0x07, "Prefixes"},
+ { 0x08, "Protocol-Hello option"},
+ { 0x09, "VTP Management Domain"},
+ { 0x0a, "Native VLAN ID"},
+ { 0x0b, "Duplex"},
+ { 0x0e, "ATA-186 VoIP VLAN request"},
+ { 0x0f, "ATA-186 VoIP VLAN assignment"},
+ { 0x10, "power consumption"},
+ { 0x11, "MTU"},
+ { 0x12, "AVVID trust bitmap"},
+ { 0x13, "AVVID untrusted ports CoS"},
+ { 0x14, "System Name"},
+ { 0x15, "System Object ID (not decoded)"},
+ { 0x16, "Management Addresses"},
+ { 0x17, "Physical Location"},
+ { 0, NULL}
+};
+
+static const struct tok cdp_capability_values[] = {
+ { 0x01, "Router" },
+ { 0x02, "Transparent Bridge" },
+ { 0x04, "Source Route Bridge" },
+ { 0x08, "L2 Switch" },
+ { 0x10, "L3 capable" },
+ { 0x20, "IGMP snooping" },
+ { 0x40, "L1 capable" },
+ { 0, NULL }
+};
+
+static int cdp_print_addr(netdissect_options *, const u_char *, int);
+static int cdp_print_prefixes(netdissect_options *, const u_char *, int);
+static unsigned long cdp_get_number(const u_char *, int);
+
+void
+cdp_print(netdissect_options *ndo,
+ const u_char *pptr, u_int length, u_int caplen)
+{
+ int type, len, i, j;
+ const u_char *tptr;
+
+ if (caplen < CDP_HEADER_LEN) {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+
+ tptr = pptr; /* temporary pointer */
+
+ ND_TCHECK2(*tptr, CDP_HEADER_LEN);
+ ND_PRINT((ndo, "CDPv%u, ttl: %us", *(tptr + CDP_HEADER_VERSION_OFFSET),
+ *(tptr + CDP_HEADER_TTL_OFFSET)));
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, ", checksum: 0x%04x (unverified), length %u", EXTRACT_16BITS(tptr+CDP_HEADER_CHECKSUM_OFFSET), length));
+ tptr += CDP_HEADER_LEN;
+
+ while (tptr < (pptr+length)) {
+ ND_TCHECK2(*tptr, CDP_TLV_HEADER_LEN); /* read out Type and Length */
+ type = EXTRACT_16BITS(tptr+CDP_TLV_TYPE_OFFSET);
+ len = EXTRACT_16BITS(tptr+CDP_TLV_LEN_OFFSET); /* object length includes the 4 bytes header length */
+ if (len < CDP_TLV_HEADER_LEN) {
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "\n\t%s (0x%02x), TLV length: %u byte%s (too short)",
+ tok2str(cdp_tlv_values,"unknown field type", type),
+ type,
+ len,
+ PLURAL_SUFFIX(len))); /* plural */
+ else
+ ND_PRINT((ndo, ", %s TLV length %u too short",
+ tok2str(cdp_tlv_values,"unknown field type", type),
+ len));
+ break;
+ }
+ tptr += CDP_TLV_HEADER_LEN;
+ len -= CDP_TLV_HEADER_LEN;
+
+ ND_TCHECK2(*tptr, len);
+
+ if (ndo->ndo_vflag || type == 1) { /* in non-verbose mode just print Device-ID */
+
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "\n\t%s (0x%02x), value length: %u byte%s: ",
+ tok2str(cdp_tlv_values,"unknown field type", type),
+ type,
+ len,
+ PLURAL_SUFFIX(len))); /* plural */
+
+ switch (type) {
+
+ case 0x01: /* Device-ID */
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, ", Device-ID "));
+ ND_PRINT((ndo, "'"));
+ (void)fn_printn(ndo, tptr, len, NULL);
+ ND_PRINT((ndo, "'"));
+ break;
+ case 0x02: /* Address */
+ if (cdp_print_addr(ndo, tptr, len) < 0)
+ goto trunc;
+ break;
+ case 0x03: /* Port-ID */
+ ND_PRINT((ndo, "'"));
+ (void)fn_printn(ndo, tptr, len, NULL);
+ ND_PRINT((ndo, "'"));
+ break;
+ case 0x04: /* Capabilities */
+ if (len < 4)
+ goto trunc;
+ ND_PRINT((ndo, "(0x%08x): %s",
+ EXTRACT_32BITS(tptr),
+ bittok2str(cdp_capability_values, "none", EXTRACT_32BITS(tptr))));
+ break;
+ case 0x05: /* Version */
+ ND_PRINT((ndo, "\n\t "));
+ for (i=0;i<len;i++) {
+ j = *(tptr+i);
+ ND_PRINT((ndo, "%c", j));
+ if (j == 0x0a) /* lets rework the version string to get a nice indentation */
+ ND_PRINT((ndo, "\t "));
+ }
+ break;
+ case 0x06: /* Platform */
+ ND_PRINT((ndo, "'"));
+ (void)fn_printn(ndo, tptr, len, NULL);
+ ND_PRINT((ndo, "'"));
+ break;
+ case 0x07: /* Prefixes */
+ if (cdp_print_prefixes(ndo, tptr, len) < 0)
+ goto trunc;
+ break;
+ case 0x08: /* Protocol Hello Option - not documented */
+ break;
+ case 0x09: /* VTP Mgmt Domain - CDPv2 */
+ ND_PRINT((ndo, "'"));
+ (void)fn_printn(ndo, tptr, len, NULL);
+ ND_PRINT((ndo, "'"));
+ break;
+ case 0x0a: /* Native VLAN ID - CDPv2 */
+ if (len < 2)
+ goto trunc;
+ ND_PRINT((ndo, "%d", EXTRACT_16BITS(tptr)));
+ break;
+ case 0x0b: /* Duplex - CDPv2 */
+ if (len < 1)
+ goto trunc;
+ ND_PRINT((ndo, "%s", *(tptr) ? "full": "half"));
+ break;
+
+ /* http://www.cisco.com/c/en/us/td/docs/voice_ip_comm/cata/186/2_12_m/english/release/notes/186rn21m.html
+ * plus more details from other sources
+ */
+ case 0x0e: /* ATA-186 VoIP VLAN request - incomplete doc. */
+ if (len < 3)
+ goto trunc;
+ ND_PRINT((ndo, "app %d, vlan %d", *(tptr), EXTRACT_16BITS(tptr + 1)));
+ break;
+ case 0x10: /* ATA-186 VoIP VLAN assignment - incomplete doc. */
+ ND_PRINT((ndo, "%1.2fW", cdp_get_number(tptr, len) / 1000.0));
+ break;
+ case 0x11: /* MTU - not documented */
+ if (len < 4)
+ goto trunc;
+ ND_PRINT((ndo, "%u bytes", EXTRACT_32BITS(tptr)));
+ break;
+ case 0x12: /* AVVID trust bitmap - not documented */
+ if (len < 1)
+ goto trunc;
+ ND_PRINT((ndo, "0x%02x", *(tptr)));
+ break;
+ case 0x13: /* AVVID untrusted port CoS - not documented */
+ if (len < 1)
+ goto trunc;
+ ND_PRINT((ndo, "0x%02x", *(tptr)));
+ break;
+ case 0x14: /* System Name - not documented */
+ ND_PRINT((ndo, "'"));
+ (void)fn_printn(ndo, tptr, len, NULL);
+ ND_PRINT((ndo, "'"));
+ break;
+ case 0x16: /* System Object ID - not documented */
+ if (cdp_print_addr(ndo, tptr, len) < 0)
+ goto trunc;
+ break;
+ case 0x17: /* Physical Location - not documented */
+ if (len < 1)
+ goto trunc;
+ ND_PRINT((ndo, "0x%02x", *(tptr)));
+ if (len > 1) {
+ ND_PRINT((ndo, "/"));
+ (void)fn_printn(ndo, tptr + 1, len - 1, NULL);
+ }
+ break;
+ default:
+ print_unknown_data(ndo, tptr, "\n\t ", len);
+ break;
+ }
+ }
+ tptr = tptr+len;
+ }
+ if (ndo->ndo_vflag < 1)
+ ND_PRINT((ndo, ", length %u", caplen));
+
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/*
+ * Protocol type values.
+ *
+ * PT_NLPID means that the protocol type field contains an OSI NLPID.
+ *
+ * PT_IEEE_802_2 means that the protocol type field contains an IEEE 802.2
+ * LLC header that specifies that the payload is for that protocol.
+ */
+#define PT_NLPID 1 /* OSI NLPID */
+#define PT_IEEE_802_2 2 /* IEEE 802.2 LLC header */
+
+static int
+cdp_print_addr(netdissect_options *ndo,
+ const u_char * p, int l)
+{
+ int pt, pl, al, num;
+ const u_char *endp = p + l;
+#ifdef INET6
+ static const u_char prot_ipv6[] = {
+ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x86, 0xdd
+ };
+#endif
+
+ ND_TCHECK2(*p, 4);
+ if (p + 4 > endp)
+ goto trunc;
+ num = EXTRACT_32BITS(p);
+ p += 4;
+
+ while (p < endp && num >= 0) {
+ ND_TCHECK2(*p, 2);
+ if (p + 2 > endp)
+ goto trunc;
+ pt = p[0]; /* type of "protocol" field */
+ pl = p[1]; /* length of "protocol" field */
+ p += 2;
+
+ ND_TCHECK2(p[pl], 2);
+ if (p + pl + 2 > endp)
+ goto trunc;
+ al = EXTRACT_16BITS(&p[pl]); /* address length */
+
+ if (pt == PT_NLPID && pl == 1 && *p == NLPID_IP && al == 4) {
+ /*
+ * IPv4: protocol type = NLPID, protocol length = 1
+ * (1-byte NLPID), protocol = 0xcc (NLPID for IPv4),
+ * address length = 4
+ */
+ p += 3;
+
+ ND_TCHECK2(*p, 4);
+ if (p + 4 > endp)
+ goto trunc;
+ ND_PRINT((ndo, "IPv4 (%u) %s", num, ipaddr_string(ndo, p)));
+ p += 4;
+ }
+#ifdef INET6
+ else if (pt == PT_IEEE_802_2 && pl == 8 &&
+ memcmp(p, prot_ipv6, 8) == 0 && al == 16) {
+ /*
+ * IPv6: protocol type = IEEE 802.2 header,
+ * protocol length = 8 (size of LLC+SNAP header),
+ * protocol = LLC+SNAP header with the IPv6
+ * Ethertype, address length = 16
+ */
+ p += 10;
+ ND_TCHECK2(*p, al);
+ if (p + al > endp)
+ goto trunc;
+
+ ND_PRINT((ndo, "IPv6 (%u) %s", num, ip6addr_string(ndo, p)));
+ p += al;
+ }
+#endif
+ else {
+ /*
+ * Generic case: just print raw data
+ */
+ ND_TCHECK2(*p, pl);
+ if (p + pl > endp)
+ goto trunc;
+ ND_PRINT((ndo, "pt=0x%02x, pl=%d, pb=", *(p - 2), pl));
+ while (pl-- > 0)
+ ND_PRINT((ndo, " %02x", *p++));
+ ND_TCHECK2(*p, 2);
+ if (p + 2 > endp)
+ goto trunc;
+ al = (*p << 8) + *(p + 1);
+ ND_PRINT((ndo, ", al=%d, a=", al));
+ p += 2;
+ ND_TCHECK2(*p, al);
+ if (p + al > endp)
+ goto trunc;
+ while (al-- > 0)
+ ND_PRINT((ndo, " %02x", *p++));
+ }
+ num--;
+ if (num)
+ ND_PRINT((ndo, " "));
+ }
+
+ return 0;
+
+trunc:
+ return -1;
+}
+
+
+static int
+cdp_print_prefixes(netdissect_options *ndo,
+ const u_char * p, int l)
+{
+ if (l % 5)
+ goto trunc;
+
+ ND_PRINT((ndo, " IPv4 Prefixes (%d):", l / 5));
+
+ while (l > 0) {
+ ND_PRINT((ndo, " %u.%u.%u.%u/%u", p[0], p[1], p[2], p[3], p[4]));
+ l -= 5;
+ p += 5;
+ }
+
+ return 0;
+
+trunc:
+ return -1;
+}
+
+/* read in a <n>-byte number, MSB first
+ * (of course this can handle max sizeof(long))
+ */
+static unsigned long cdp_get_number(const u_char * p, int l)
+{
+ unsigned long res=0;
+ while( l>0 )
+ {
+ res = (res<<8) + *p;
+ p++; l--;
+ }
+ return res;
+}
--- /dev/null
+/*
+ * Copyright (c) 1998-2006 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 IEEE Connectivity Fault Management Protocols as per 802.1ag.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-cfm.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "ether.h"
+#include "addrtoname.h"
+#include "oui.h"
+#include "af.h"
+
+struct cfm_common_header_t {
+ uint8_t mdlevel_version;
+ uint8_t opcode;
+ uint8_t flags;
+ uint8_t first_tlv_offset;
+};
+
+#define CFM_VERSION 0
+#define CFM_EXTRACT_VERSION(x) (((x)&0x1f))
+#define CFM_EXTRACT_MD_LEVEL(x) (((x)&0xe0)>>5)
+
+#define CFM_OPCODE_CCM 1
+#define CFM_OPCODE_LBR 2
+#define CFM_OPCODE_LBM 3
+#define CFM_OPCODE_LTR 4
+#define CFM_OPCODE_LTM 5
+
+static const struct tok cfm_opcode_values[] = {
+ { CFM_OPCODE_CCM, "Continouity Check Message"},
+ { CFM_OPCODE_LBR, "Loopback Reply"},
+ { CFM_OPCODE_LBM, "Loopback Message"},
+ { CFM_OPCODE_LTR, "Linktrace Reply"},
+ { CFM_OPCODE_LTM, "Linktrace Message"},
+ { 0, NULL}
+};
+
+/*
+ * Message Formats.
+ */
+struct cfm_ccm_t {
+ uint8_t sequence[4];
+ uint8_t ma_epi[2];
+ uint8_t md_nameformat;
+ uint8_t md_namelength;
+ uint8_t md_name[46]; /* md name and short ma name */
+ uint8_t reserved_itu[16];
+ uint8_t reserved[6];
+};
+
+/*
+ * Timer Bases for the CCM Interval field.
+ * Expressed in units of seconds.
+ */
+const float ccm_interval_base[8] = {0, 0.003333, 0.01, 0.1, 1, 10, 60, 600};
+#define CCM_INTERVAL_MIN_MULTIPLIER 3.25
+#define CCM_INTERVAL_MAX_MULTIPLIER 3.5
+
+#define CFM_CCM_RDI_FLAG 0x80
+#define CFM_EXTRACT_CCM_INTERVAL(x) (((x)&0x07))
+
+#define CFM_CCM_MD_FORMAT_8021 0
+#define CFM_CCM_MD_FORMAT_NONE 1
+#define CFM_CCM_MD_FORMAT_DNS 2
+#define CFM_CCM_MD_FORMAT_MAC 3
+#define CFM_CCM_MD_FORMAT_CHAR 4
+
+static const struct tok cfm_md_nameformat_values[] = {
+ { CFM_CCM_MD_FORMAT_8021, "IEEE 802.1"},
+ { CFM_CCM_MD_FORMAT_NONE, "No MD Name present"},
+ { CFM_CCM_MD_FORMAT_DNS, "DNS string"},
+ { CFM_CCM_MD_FORMAT_MAC, "MAC + 16Bit Integer"},
+ { CFM_CCM_MD_FORMAT_CHAR, "Character string"},
+ { 0, NULL}
+};
+
+#define CFM_CCM_MA_FORMAT_8021 0
+#define CFM_CCM_MA_FORMAT_VID 1
+#define CFM_CCM_MA_FORMAT_CHAR 2
+#define CFM_CCM_MA_FORMAT_INT 3
+#define CFM_CCM_MA_FORMAT_VPN 4
+
+static const struct tok cfm_ma_nameformat_values[] = {
+ { CFM_CCM_MA_FORMAT_8021, "IEEE 802.1"},
+ { CFM_CCM_MA_FORMAT_VID, "Primary VID"},
+ { CFM_CCM_MA_FORMAT_CHAR, "Character string"},
+ { CFM_CCM_MA_FORMAT_INT, "16Bit Integer"},
+ { CFM_CCM_MA_FORMAT_VPN, "RFC2685 VPN-ID"},
+ { 0, NULL}
+};
+
+struct cfm_lbm_t {
+ uint8_t transaction_id[4];
+ uint8_t reserved[4];
+};
+
+struct cfm_ltm_t {
+ uint8_t transaction_id[4];
+ uint8_t egress_id[8];
+ uint8_t ttl;
+ uint8_t original_mac[ETHER_ADDR_LEN];
+ uint8_t target_mac[ETHER_ADDR_LEN];
+ uint8_t reserved[3];
+};
+
+static const struct tok cfm_ltm_flag_values[] = {
+ { 0x80, "Use Forwarding-DB only"},
+ { 0, NULL}
+};
+
+struct cfm_ltr_t {
+ uint8_t transaction_id[4];
+ uint8_t last_egress_id[8];
+ uint8_t next_egress_id[8];
+ uint8_t ttl;
+ uint8_t replay_action;
+ uint8_t reserved[6];
+};
+
+static const struct tok cfm_ltr_flag_values[] = {
+ { 0x80, "UseFDB Only"},
+ { 0x40, "FwdYes"},
+ { 0x20, "Terminal MEP"},
+ { 0, NULL}
+};
+
+static const struct tok cfm_ltr_replay_action_values[] = {
+ { 1, "Exact Match"},
+ { 2, "Filtering DB"},
+ { 3, "MIP CCM DB"},
+ { 0, NULL}
+};
+
+
+#define CFM_TLV_END 0
+#define CFM_TLV_SENDER_ID 1
+#define CFM_TLV_PORT_STATUS 2
+#define CFM_TLV_INTERFACE_STATUS 3
+#define CFM_TLV_DATA 4
+#define CFM_TLV_REPLY_INGRESS 5
+#define CFM_TLV_REPLY_EGRESS 6
+#define CFM_TLV_PRIVATE 31
+
+static const struct tok cfm_tlv_values[] = {
+ { CFM_TLV_END, "End"},
+ { CFM_TLV_SENDER_ID, "Sender ID"},
+ { CFM_TLV_PORT_STATUS, "Port status"},
+ { CFM_TLV_INTERFACE_STATUS, "Interface status"},
+ { CFM_TLV_DATA, "Data"},
+ { CFM_TLV_REPLY_INGRESS, "Reply Ingress"},
+ { CFM_TLV_REPLY_EGRESS, "Reply Egress"},
+ { CFM_TLV_PRIVATE, "Organization Specific"},
+ { 0, NULL}
+};
+
+/*
+ * TLVs
+ */
+
+struct cfm_tlv_header_t {
+ uint8_t type;
+ uint8_t length[2];
+};
+
+/* FIXME define TLV formats */
+
+static const struct tok cfm_tlv_port_status_values[] = {
+ { 1, "Blocked"},
+ { 2, "Up"},
+ { 0, NULL}
+};
+
+static const struct tok cfm_tlv_interface_status_values[] = {
+ { 1, "Up"},
+ { 2, "Down"},
+ { 3, "Testing"},
+ { 5, "Dormant"},
+ { 6, "not present"},
+ { 7, "lower Layer down"},
+ { 0, NULL}
+};
+
+#define CFM_CHASSIS_ID_CHASSIS_COMPONENT 1
+#define CFM_CHASSIS_ID_INTERFACE_ALIAS 2
+#define CFM_CHASSIS_ID_PORT_COMPONENT 3
+#define CFM_CHASSIS_ID_MAC_ADDRESS 4
+#define CFM_CHASSIS_ID_NETWORK_ADDRESS 5
+#define CFM_CHASSIS_ID_INTERFACE_NAME 6
+#define CFM_CHASSIS_ID_LOCAL 7
+
+static const struct tok cfm_tlv_senderid_chassisid_values[] = {
+ { 0, "Reserved"},
+ { CFM_CHASSIS_ID_CHASSIS_COMPONENT, "Chassis component"},
+ { CFM_CHASSIS_ID_INTERFACE_ALIAS, "Interface alias"},
+ { CFM_CHASSIS_ID_PORT_COMPONENT, "Port component"},
+ { CFM_CHASSIS_ID_MAC_ADDRESS, "MAC address"},
+ { CFM_CHASSIS_ID_NETWORK_ADDRESS, "Network address"},
+ { CFM_CHASSIS_ID_INTERFACE_NAME, "Interface name"},
+ { CFM_CHASSIS_ID_LOCAL, "Locally assigned"},
+ { 0, NULL}
+};
+
+
+static int
+cfm_mgmt_addr_print(netdissect_options *ndo,
+ register const u_char *tptr)
+{
+ u_int mgmt_addr_type;
+ u_int hexdump = FALSE;
+
+ /*
+ * Altough AFIs are tpically 2 octects wide,
+ * 802.1ab specifies that this field width
+ * is only once octet
+ */
+ mgmt_addr_type = *tptr;
+ ND_PRINT((ndo, "\n\t Management Address Type %s (%u)",
+ tok2str(af_values, "Unknown", mgmt_addr_type),
+ mgmt_addr_type));
+
+ /*
+ * Resolve the passed in Address.
+ */
+ switch(mgmt_addr_type) {
+ case AFNUM_INET:
+ ND_PRINT((ndo, ", %s", ipaddr_string(ndo, tptr + 1)));
+ break;
+
+#ifdef INET6
+ case AFNUM_INET6:
+ ND_PRINT((ndo, ", %s", ip6addr_string(ndo, tptr + 1)));
+ break;
+#endif
+
+ default:
+ hexdump = TRUE;
+ break;
+ }
+
+ return hexdump;
+}
+
+/*
+ * The egress-ID string is a 16-Bit string plus a MAC address.
+ */
+static const char *
+cfm_egress_id_string(netdissect_options *ndo, register const u_char *tptr)
+{
+ static char egress_id_buffer[80];
+
+ snprintf(egress_id_buffer, sizeof(egress_id_buffer),
+ "MAC 0x%4x-%s",
+ EXTRACT_16BITS(tptr),
+ etheraddr_string(ndo, tptr+2));
+
+ return egress_id_buffer;
+}
+
+void
+cfm_print(netdissect_options *ndo,
+ register const u_char *pptr, register u_int length)
+{
+ const struct cfm_common_header_t *cfm_common_header;
+ const struct cfm_tlv_header_t *cfm_tlv_header;
+ const uint8_t *tptr, *tlv_ptr, *ma_name, *ma_nameformat, *ma_namelength;
+ u_int hexdump, tlen, cfm_tlv_len, cfm_tlv_type, ccm_interval;
+
+
+ union {
+ const struct cfm_ccm_t *cfm_ccm;
+ const struct cfm_lbm_t *cfm_lbm;
+ const struct cfm_ltm_t *cfm_ltm;
+ const struct cfm_ltr_t *cfm_ltr;
+ } msg_ptr;
+
+ tptr=pptr;
+ cfm_common_header = (const struct cfm_common_header_t *)pptr;
+ ND_TCHECK(*cfm_common_header);
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (CFM_EXTRACT_VERSION(cfm_common_header->mdlevel_version) != CFM_VERSION) {
+ ND_PRINT((ndo, "CFMv%u not supported, length %u",
+ CFM_EXTRACT_VERSION(cfm_common_header->mdlevel_version), length));
+ return;
+ }
+
+ ND_PRINT((ndo, "CFMv%u %s, MD Level %u, length %u",
+ CFM_EXTRACT_VERSION(cfm_common_header->mdlevel_version),
+ tok2str(cfm_opcode_values, "unknown (%u)", cfm_common_header->opcode),
+ CFM_EXTRACT_MD_LEVEL(cfm_common_header->mdlevel_version),
+ length));
+
+ /*
+ * In non-verbose mode just print the opcode and md-level.
+ */
+ if (ndo->ndo_vflag < 1) {
+ return;
+ }
+
+ ND_PRINT((ndo, "\n\tFirst TLV offset %u", cfm_common_header->first_tlv_offset));
+
+ tptr += sizeof(const struct cfm_common_header_t);
+ tlen = length - sizeof(struct cfm_common_header_t);
+
+ switch (cfm_common_header->opcode) {
+ case CFM_OPCODE_CCM:
+ msg_ptr.cfm_ccm = (const struct cfm_ccm_t *)tptr;
+
+ ccm_interval = CFM_EXTRACT_CCM_INTERVAL(cfm_common_header->flags);
+ ND_PRINT((ndo, ", Flags [CCM Interval %u%s]",
+ ccm_interval,
+ cfm_common_header->flags & CFM_CCM_RDI_FLAG ?
+ ", RDI" : ""));
+
+ /*
+ * Resolve the CCM interval field.
+ */
+ if (ccm_interval) {
+ ND_PRINT((ndo, "\n\t CCM Interval %.3fs"
+ ", min CCM Lifetime %.3fs, max CCM Lifetime %.3fs",
+ ccm_interval_base[ccm_interval],
+ ccm_interval_base[ccm_interval] * CCM_INTERVAL_MIN_MULTIPLIER,
+ ccm_interval_base[ccm_interval] * CCM_INTERVAL_MAX_MULTIPLIER));
+ }
+
+ ND_PRINT((ndo, "\n\t Sequence Number 0x%08x, MA-End-Point-ID 0x%04x",
+ EXTRACT_32BITS(msg_ptr.cfm_ccm->sequence),
+ EXTRACT_16BITS(msg_ptr.cfm_ccm->ma_epi)));
+
+
+ /*
+ * Resolve the MD fields.
+ */
+ ND_PRINT((ndo, "\n\t MD Name Format %s (%u), MD Name length %u",
+ tok2str(cfm_md_nameformat_values, "Unknown",
+ msg_ptr.cfm_ccm->md_nameformat),
+ msg_ptr.cfm_ccm->md_nameformat,
+ msg_ptr.cfm_ccm->md_namelength));
+
+ if (msg_ptr.cfm_ccm->md_nameformat != CFM_CCM_MD_FORMAT_NONE) {
+ ND_PRINT((ndo, "\n\t MD Name: "));
+ switch (msg_ptr.cfm_ccm->md_nameformat) {
+ case CFM_CCM_MD_FORMAT_DNS:
+ case CFM_CCM_MD_FORMAT_CHAR:
+ safeputs(ndo, msg_ptr.cfm_ccm->md_name, msg_ptr.cfm_ccm->md_namelength);
+ break;
+
+ case CFM_CCM_MD_FORMAT_MAC:
+ ND_PRINT((ndo, "\n\t MAC %s", etheraddr_string(ndo,
+ msg_ptr.cfm_ccm->md_name)));
+ break;
+
+ /* FIXME add printers for those MD formats - hexdump for now */
+ case CFM_CCM_MA_FORMAT_8021:
+ default:
+ print_unknown_data(ndo, msg_ptr.cfm_ccm->md_name, "\n\t ",
+ msg_ptr.cfm_ccm->md_namelength);
+ }
+ }
+
+
+ /*
+ * Resolve the MA fields.
+ */
+ ma_nameformat = msg_ptr.cfm_ccm->md_name + msg_ptr.cfm_ccm->md_namelength;
+ ma_namelength = msg_ptr.cfm_ccm->md_name + msg_ptr.cfm_ccm->md_namelength + 1;
+ ma_name = msg_ptr.cfm_ccm->md_name + msg_ptr.cfm_ccm->md_namelength + 2;
+
+ ND_PRINT((ndo, "\n\t MA Name-Format %s (%u), MA name length %u",
+ tok2str(cfm_ma_nameformat_values, "Unknown",
+ *ma_nameformat),
+ *ma_nameformat,
+ *ma_namelength));
+
+ ND_PRINT((ndo, "\n\t MA Name: "));
+ switch (*ma_nameformat) {
+ case CFM_CCM_MA_FORMAT_CHAR:
+ safeputs(ndo, ma_name, *ma_namelength);
+ break;
+
+ /* FIXME add printers for those MA formats - hexdump for now */
+ case CFM_CCM_MA_FORMAT_8021:
+ case CFM_CCM_MA_FORMAT_VID:
+ case CFM_CCM_MA_FORMAT_INT:
+ case CFM_CCM_MA_FORMAT_VPN:
+ default:
+ print_unknown_data(ndo, ma_name, "\n\t ", *ma_namelength);
+ }
+ break;
+
+ case CFM_OPCODE_LTM:
+ msg_ptr.cfm_ltm = (const struct cfm_ltm_t *)tptr;
+
+ ND_PRINT((ndo, ", Flags [%s]",
+ bittok2str(cfm_ltm_flag_values, "none", cfm_common_header->flags)));
+
+ ND_PRINT((ndo, "\n\t Transaction-ID 0x%08x, Egress-ID %s, ttl %u",
+ EXTRACT_32BITS(msg_ptr.cfm_ltm->transaction_id),
+ cfm_egress_id_string(ndo, msg_ptr.cfm_ltm->egress_id),
+ msg_ptr.cfm_ltm->ttl));
+
+ ND_PRINT((ndo, "\n\t Original-MAC %s, Target-MAC %s",
+ etheraddr_string(ndo, msg_ptr.cfm_ltm->original_mac),
+ etheraddr_string(ndo, msg_ptr.cfm_ltm->target_mac)));
+ break;
+
+ case CFM_OPCODE_LTR:
+ msg_ptr.cfm_ltr = (const struct cfm_ltr_t *)tptr;
+
+ ND_PRINT((ndo, ", Flags [%s]",
+ bittok2str(cfm_ltr_flag_values, "none", cfm_common_header->flags)));
+
+ ND_PRINT((ndo, "\n\t Transaction-ID 0x%08x, Last-Egress-ID %s",
+ EXTRACT_32BITS(msg_ptr.cfm_ltr->transaction_id),
+ cfm_egress_id_string(ndo, msg_ptr.cfm_ltr->last_egress_id)));
+
+ ND_PRINT((ndo, "\n\t Next-Egress-ID %s, ttl %u",
+ cfm_egress_id_string(ndo, msg_ptr.cfm_ltr->next_egress_id),
+ msg_ptr.cfm_ltr->ttl));
+
+ ND_PRINT((ndo, "\n\t Replay-Action %s (%u)",
+ tok2str(cfm_ltr_replay_action_values,
+ "Unknown",
+ msg_ptr.cfm_ltr->replay_action),
+ msg_ptr.cfm_ltr->replay_action));
+ break;
+
+ /*
+ * No message decoder yet.
+ * Hexdump everything up until the start of the TLVs
+ */
+ case CFM_OPCODE_LBR:
+ case CFM_OPCODE_LBM:
+ default:
+ if (tlen > cfm_common_header->first_tlv_offset) {
+ print_unknown_data(ndo, tptr, "\n\t ",
+ tlen - cfm_common_header->first_tlv_offset);
+ }
+ break;
+ }
+
+ /*
+ * Sanity check for not walking off.
+ */
+ if (tlen <= cfm_common_header->first_tlv_offset) {
+ return;
+ }
+
+ tptr += cfm_common_header->first_tlv_offset;
+ tlen -= cfm_common_header->first_tlv_offset;
+
+ while (tlen > 0) {
+ cfm_tlv_header = (const struct cfm_tlv_header_t *)tptr;
+
+ /* Enough to read the tlv type ? */
+ ND_TCHECK2(*tptr, 1);
+ cfm_tlv_type=cfm_tlv_header->type;
+
+ if (cfm_tlv_type != CFM_TLV_END) {
+ /* did we capture enough for fully decoding the object header ? */
+ ND_TCHECK2(*tptr, sizeof(struct cfm_tlv_header_t));
+ cfm_tlv_len=EXTRACT_16BITS(&cfm_tlv_header->length);
+ } else {
+ cfm_tlv_len = 0;
+ }
+
+ ND_PRINT((ndo, "\n\t%s TLV (0x%02x), length %u",
+ tok2str(cfm_tlv_values, "Unknown", cfm_tlv_type),
+ cfm_tlv_type,
+ cfm_tlv_len));
+
+ /* sanity check for not walking off and infinite loop check. */
+ if ((cfm_tlv_type != CFM_TLV_END) &&
+ ((cfm_tlv_len + sizeof(struct cfm_tlv_header_t) > tlen) ||
+ (!cfm_tlv_len))) {
+ print_unknown_data(ndo, tptr, "\n\t ", tlen);
+ return;
+ }
+
+ tptr += sizeof(struct cfm_tlv_header_t);
+ tlen -= sizeof(struct cfm_tlv_header_t);
+ tlv_ptr = tptr;
+
+ /* did we capture enough for fully decoding the object ? */
+ if (cfm_tlv_type != CFM_TLV_END) {
+ ND_TCHECK2(*tptr, cfm_tlv_len);
+ }
+ hexdump = FALSE;
+
+ switch(cfm_tlv_type) {
+ case CFM_TLV_END:
+ /* we are done - bail out */
+ return;
+
+ case CFM_TLV_PORT_STATUS:
+ ND_PRINT((ndo, ", Status: %s (%u)",
+ tok2str(cfm_tlv_port_status_values, "Unknown", *tptr),
+ *tptr));
+ break;
+
+ case CFM_TLV_INTERFACE_STATUS:
+ ND_PRINT((ndo, ", Status: %s (%u)",
+ tok2str(cfm_tlv_interface_status_values, "Unknown", *tptr),
+ *tptr));
+ break;
+
+ case CFM_TLV_PRIVATE:
+ ND_PRINT((ndo, ", Vendor: %s (%u), Sub-Type %u",
+ tok2str(oui_values,"Unknown", EXTRACT_24BITS(tptr)),
+ EXTRACT_24BITS(tptr),
+ *(tptr + 3)));
+ hexdump = TRUE;
+ break;
+
+ case CFM_TLV_SENDER_ID:
+ {
+ u_int chassis_id_type, chassis_id_length;
+ u_int mgmt_addr_length;
+
+ /*
+ * Check if there is a Chassis-ID.
+ */
+ chassis_id_length = *tptr;
+ if (chassis_id_length > tlen) {
+ hexdump = TRUE;
+ break;
+ }
+
+ tptr++;
+ tlen--;
+
+ if (chassis_id_length) {
+ chassis_id_type = *tptr;
+ ND_PRINT((ndo, "\n\t Chassis-ID Type %s (%u), Chassis-ID length %u",
+ tok2str(cfm_tlv_senderid_chassisid_values,
+ "Unknown",
+ chassis_id_type),
+ chassis_id_type,
+ chassis_id_length));
+
+ switch (chassis_id_type) {
+ case CFM_CHASSIS_ID_MAC_ADDRESS:
+ ND_PRINT((ndo, "\n\t MAC %s", etheraddr_string(ndo, tptr + 1)));
+ break;
+
+ case CFM_CHASSIS_ID_NETWORK_ADDRESS:
+ hexdump |= cfm_mgmt_addr_print(ndo, tptr);
+ break;
+
+ case CFM_CHASSIS_ID_INTERFACE_NAME: /* fall through */
+ case CFM_CHASSIS_ID_INTERFACE_ALIAS:
+ case CFM_CHASSIS_ID_LOCAL:
+ case CFM_CHASSIS_ID_CHASSIS_COMPONENT:
+ case CFM_CHASSIS_ID_PORT_COMPONENT:
+ safeputs(ndo, tptr + 1, chassis_id_length);
+ break;
+
+ default:
+ hexdump = TRUE;
+ break;
+ }
+ }
+
+ tptr += chassis_id_length;
+ tlen -= chassis_id_length;
+
+ /*
+ * Check if there is a Management Address.
+ */
+ mgmt_addr_length = *tptr;
+ if (mgmt_addr_length > tlen) {
+ hexdump = TRUE;
+ break;
+ }
+
+ tptr++;
+ tlen--;
+
+ if (mgmt_addr_length) {
+ hexdump |= cfm_mgmt_addr_print(ndo, tptr);
+ }
+
+ tptr += mgmt_addr_length;
+ tlen -= mgmt_addr_length;
+
+ }
+ break;
+
+ /*
+ * FIXME those are the defined TLVs that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+
+ case CFM_TLV_DATA:
+ case CFM_TLV_REPLY_INGRESS:
+ case CFM_TLV_REPLY_EGRESS:
+ default:
+ hexdump = TRUE;
+ break;
+ }
+ /* do we want to see an additional hexdump ? */
+ if (hexdump || ndo->ndo_vflag > 1)
+ print_unknown_data(ndo, tlv_ptr, "\n\t ", cfm_tlv_len);
+
+ tptr+=cfm_tlv_len;
+ tlen-=cfm_tlv_len;
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+}
--- /dev/null
+/*
+ * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-chdlc.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "ethertype.h"
+#include "extract.h"
+#include "chdlc.h"
+
+static void chdlc_slarp_print(netdissect_options *, const u_char *, u_int);
+
+static const struct tok chdlc_cast_values[] = {
+ { CHDLC_UNICAST, "unicast" },
+ { CHDLC_BCAST, "bcast" },
+ { 0, NULL}
+};
+
+
+/* Standard CHDLC printer */
+u_int
+chdlc_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, register const u_char *p)
+{
+ register u_int length = h->len;
+ register u_int caplen = h->caplen;
+
+ if (caplen < CHDLC_HDRLEN) {
+ ND_PRINT((ndo, "[|chdlc]"));
+ return (caplen);
+ }
+ return (chdlc_print(ndo, p,length));
+}
+
+u_int
+chdlc_print(netdissect_options *ndo, register const u_char *p, u_int length)
+{
+ u_int proto;
+
+ proto = EXTRACT_16BITS(&p[2]);
+ if (ndo->ndo_eflag) {
+ ND_PRINT((ndo, "%s, ethertype %s (0x%04x), length %u: ",
+ tok2str(chdlc_cast_values, "0x%02x", p[0]),
+ tok2str(ethertype_values, "Unknown", proto),
+ proto,
+ length));
+ }
+
+ length -= CHDLC_HDRLEN;
+ p += CHDLC_HDRLEN;
+
+ switch (proto) {
+ case ETHERTYPE_IP:
+ ip_print(ndo, p, length);
+ break;
+ case ETHERTYPE_IPV6:
+ ip6_print(ndo, p, length);
+ break;
+ case CHDLC_TYPE_SLARP:
+ chdlc_slarp_print(ndo, p, length);
+ break;
+#if 0
+ case CHDLC_TYPE_CDP:
+ chdlc_cdp_print(p, length);
+ break;
+#endif
+ case ETHERTYPE_MPLS:
+ case ETHERTYPE_MPLS_MULTI:
+ mpls_print(ndo, p, length);
+ break;
+ case ETHERTYPE_ISO:
+ /* is the fudge byte set ? lets verify by spotting ISO headers */
+ if (*(p+1) == 0x81 ||
+ *(p+1) == 0x82 ||
+ *(p+1) == 0x83)
+ isoclns_print(ndo, p + 1, length - 1, length - 1);
+ else
+ isoclns_print(ndo, p, length, length);
+ break;
+ default:
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, "unknown CHDLC protocol (0x%04x)", proto));
+ break;
+ }
+
+ return (CHDLC_HDRLEN);
+}
+
+/*
+ * The fixed-length portion of a SLARP packet.
+ */
+struct cisco_slarp {
+ uint8_t code[4];
+#define SLARP_REQUEST 0
+#define SLARP_REPLY 1
+#define SLARP_KEEPALIVE 2
+ union {
+ struct {
+ uint8_t addr[4];
+ uint8_t mask[4];
+ } addr;
+ struct {
+ uint8_t myseq[4];
+ uint8_t yourseq[4];
+ uint8_t rel[2];
+ } keep;
+ } un;
+};
+
+#define SLARP_MIN_LEN 14
+#define SLARP_MAX_LEN 18
+
+static void
+chdlc_slarp_print(netdissect_options *ndo, const u_char *cp, u_int length)
+{
+ const struct cisco_slarp *slarp;
+ u_int sec,min,hrs,days;
+
+ ND_PRINT((ndo, "SLARP (length: %u), ",length));
+ if (length < SLARP_MIN_LEN)
+ goto trunc;
+
+ slarp = (const struct cisco_slarp *)cp;
+ ND_TCHECK2(*slarp, SLARP_MIN_LEN);
+ switch (EXTRACT_32BITS(&slarp->code)) {
+ case SLARP_REQUEST:
+ ND_PRINT((ndo, "request"));
+ /*
+ * At least according to William "Chops" Westfield's
+ * message in
+ *
+ * http://www.nethelp.no/net/cisco-hdlc.txt
+ *
+ * the address and mask aren't used in requests -
+ * they're just zero.
+ */
+ break;
+ case SLARP_REPLY:
+ ND_PRINT((ndo, "reply %s/%s",
+ ipaddr_string(ndo, &slarp->un.addr.addr),
+ ipaddr_string(ndo, &slarp->un.addr.mask)));
+ break;
+ case SLARP_KEEPALIVE:
+ ND_PRINT((ndo, "keepalive: mineseen=0x%08x, yourseen=0x%08x, reliability=0x%04x",
+ EXTRACT_32BITS(&slarp->un.keep.myseq),
+ EXTRACT_32BITS(&slarp->un.keep.yourseq),
+ EXTRACT_16BITS(&slarp->un.keep.rel)));
+
+ if (length >= SLARP_MAX_LEN) { /* uptime-stamp is optional */
+ cp += SLARP_MIN_LEN;
+ ND_TCHECK2(*cp, 4);
+ sec = EXTRACT_32BITS(cp) / 1000;
+ min = sec / 60; sec -= min * 60;
+ hrs = min / 60; min -= hrs * 60;
+ days = hrs / 24; hrs -= days * 24;
+ ND_PRINT((ndo, ", link uptime=%ud%uh%um%us",days,hrs,min,sec));
+ }
+ break;
+ default:
+ ND_PRINT((ndo, "0x%02x unknown", EXTRACT_32BITS(&slarp->code)));
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo,cp+4,"\n\t",length-4);
+ break;
+ }
+
+ if (SLARP_MAX_LEN < length && ndo->ndo_vflag)
+ ND_PRINT((ndo, ", (trailing junk: %d bytes)", length - SLARP_MAX_LEN));
+ if (ndo->ndo_vflag > 1)
+ print_unknown_data(ndo,cp+4,"\n\t",length-4);
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|slarp]"));
+}
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Marko Kiiskila carnil@cs.tut.fi
+ *
+ * Tampere University of Technology - Telecommunications Laboratory
+ *
+ * Permission to use, copy, modify and distribute this
+ * software and its documentation is hereby granted,
+ * provided that both the copyright notice and this
+ * permission notice appear in all copies of the software,
+ * derivative works or modified versions, and any portions
+ * thereof, that both notices appear in supporting
+ * documentation, and that the use of this software is
+ * acknowledged in any publications resulting from using
+ * the software.
+ *
+ * TUT ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION AND DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS
+ * SOFTWARE.
+ *
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-cip.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+
+#define RFC1483LLC_LEN 8
+
+static const unsigned char rfcllc[] = {
+ 0xaa, /* DSAP: non-ISO */
+ 0xaa, /* SSAP: non-ISO */
+ 0x03, /* Ctrl: Unnumbered Information Command PDU */
+ 0x00, /* OUI: EtherType */
+ 0x00,
+ 0x00 };
+
+static inline void
+cip_print(netdissect_options *ndo, int length)
+{
+ /*
+ * There is no MAC-layer header, so just print the length.
+ */
+ ND_PRINT((ndo, "%d: ", length));
+}
+
+/*
+ * This is the top level routine of the printer. 'p' points
+ * to the LLC/SNAP or raw 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
+cip_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int caplen = h->caplen;
+ u_int length = h->len;
+ u_short extracted_ethertype;
+
+ if (memcmp(rfcllc, p, sizeof(rfcllc))==0 && caplen < RFC1483LLC_LEN) {
+ ND_PRINT((ndo, "[|cip]"));
+ return (0);
+ }
+
+ if (ndo->ndo_eflag)
+ cip_print(ndo, length);
+
+ if (memcmp(rfcllc, p, sizeof(rfcllc)) == 0) {
+ /*
+ * LLC header is present. Try to print it & higher layers.
+ */
+ if (llc_print(ndo, p, length, caplen, NULL, NULL,
+ &extracted_ethertype) == 0) {
+ /* ether_type not known, print raw packet */
+ if (!ndo->ndo_eflag)
+ cip_print(ndo, length);
+ if (extracted_ethertype) {
+ ND_PRINT((ndo, "(LLC %s) ",
+ etherproto_string(htons(extracted_ethertype))));
+ }
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+ } else {
+ /*
+ * LLC header is absent; treat it as just IP.
+ */
+ ip_print(ndo, p, length);
+ }
+
+ return (0);
+}
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/* $OpenBSD: print-cnfp.c,v 1.2 1998/06/25 20:26:59 mickey Exp $ */
+
+/*
+ * Copyright (c) 1998 Michael Shalayeff
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+/*
+ * Cisco NetFlow protocol
+ *
+ * See
+ *
+ * http://www.cisco.com/c/en/us/td/docs/net_mgmt/netflow_collection_engine/3-6/user/guide/format.html#wp1005892
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-cnfp.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#include "tcp.h"
+#include "ipproto.h"
+
+struct nfhdr_v1 {
+ uint16_t version; /* version number */
+ uint16_t count; /* # of records */
+ uint32_t msys_uptime;
+ uint32_t utc_sec;
+ uint32_t utc_nsec;
+};
+
+struct nfrec_v1 {
+ struct in_addr src_ina;
+ struct in_addr dst_ina;
+ struct in_addr nhop_ina;
+ uint16_t input; /* SNMP index of input interface */
+ uint16_t output; /* SNMP index of output interface */
+ uint32_t packets; /* packets in the flow */
+ uint32_t octets; /* layer 3 octets in the packets of the flow */
+ uint32_t start_time; /* sys_uptime value at start of flow */
+ uint32_t last_time; /* sys_uptime value when last packet of flow was received */
+ uint16_t srcport; /* TCP/UDP source port or equivalent */
+ uint16_t dstport; /* TCP/UDP source port or equivalent */
+ uint16_t pad1; /* pad */
+ uint8_t proto; /* IP protocol type */
+ uint8_t tos; /* IP type of service */
+ uint8_t tcp_flags; /* cumulative OR of TCP flags */
+ uint8_t pad[3]; /* padding */
+ uint32_t reserved; /* unused */
+};
+
+struct nfhdr_v5 {
+ uint16_t version; /* version number */
+ uint16_t count; /* # of records */
+ uint32_t msys_uptime;
+ uint32_t utc_sec;
+ uint32_t utc_nsec;
+ uint32_t sequence; /* flow sequence number */
+ uint8_t engine_type; /* type of flow-switching engine */
+ uint8_t engine_id; /* slot number of the flow-switching engine */
+ uint16_t sampling_interval; /* sampling mode and interval */
+};
+
+struct nfrec_v5 {
+ struct in_addr src_ina;
+ struct in_addr dst_ina;
+ struct in_addr nhop_ina;
+ uint16_t input; /* SNMP index of input interface */
+ uint16_t output; /* SNMP index of output interface */
+ uint32_t packets; /* packets in the flow */
+ uint32_t octets; /* layer 3 octets in the packets of the flow */
+ uint32_t start_time; /* sys_uptime value at start of flow */
+ uint32_t last_time; /* sys_uptime value when last packet of flow was received */
+ uint16_t srcport; /* TCP/UDP source port or equivalent */
+ uint16_t dstport; /* TCP/UDP source port or equivalent */
+ uint8_t pad1; /* pad */
+ uint8_t tcp_flags; /* cumulative OR of TCP flags */
+ uint8_t proto; /* IP protocol type */
+ uint8_t tos; /* IP type of service */
+ uint16_t src_as; /* AS number of the source */
+ uint16_t dst_as; /* AS number of the destination */
+ uint8_t src_mask; /* source address mask bits */
+ uint8_t dst_mask; /* destination address prefix mask bits */
+ uint16_t pad2;
+ struct in_addr peer_nexthop; /* v6: IP address of the nexthop within the peer (FIB)*/
+};
+
+struct nfhdr_v6 {
+ uint16_t version; /* version number */
+ uint16_t count; /* # of records */
+ uint32_t msys_uptime;
+ uint32_t utc_sec;
+ uint32_t utc_nsec;
+ uint32_t sequence; /* v5 flow sequence number */
+ uint32_t reserved; /* v5 only */
+};
+
+struct nfrec_v6 {
+ struct in_addr src_ina;
+ struct in_addr dst_ina;
+ struct in_addr nhop_ina;
+ uint16_t input; /* SNMP index of input interface */
+ uint16_t output; /* SNMP index of output interface */
+ uint32_t packets; /* packets in the flow */
+ uint32_t octets; /* layer 3 octets in the packets of the flow */
+ uint32_t start_time; /* sys_uptime value at start of flow */
+ uint32_t last_time; /* sys_uptime value when last packet of flow was received */
+ uint16_t srcport; /* TCP/UDP source port or equivalent */
+ uint16_t dstport; /* TCP/UDP source port or equivalent */
+ uint8_t pad1; /* pad */
+ uint8_t tcp_flags; /* cumulative OR of TCP flags */
+ uint8_t proto; /* IP protocol type */
+ uint8_t tos; /* IP type of service */
+ uint16_t src_as; /* AS number of the source */
+ uint16_t dst_as; /* AS number of the destination */
+ uint8_t src_mask; /* source address mask bits */
+ uint8_t dst_mask; /* destination address prefix mask bits */
+ uint16_t flags;
+ struct in_addr peer_nexthop; /* v6: IP address of the nexthop within the peer (FIB)*/
+};
+
+static void
+cnfp_v1_print(netdissect_options *ndo, const u_char *cp)
+{
+ register const struct nfhdr_v1 *nh;
+ register const struct nfrec_v1 *nr;
+ struct protoent *pent;
+ int nrecs, ver;
+#if 0
+ time_t t;
+#endif
+
+ nh = (const struct nfhdr_v1 *)cp;
+ ND_TCHECK(*nh);
+
+ ver = EXTRACT_16BITS(&nh->version);
+ nrecs = EXTRACT_32BITS(&nh->count);
+#if 0
+ /*
+ * This is seconds since the UN*X epoch, and is followed by
+ * nanoseconds. XXX - format it, rather than just dumping the
+ * raw seconds-since-the-Epoch.
+ */
+ t = EXTRACT_32BITS(&nh->utc_sec);
+#endif
+
+ ND_PRINT((ndo, "NetFlow v%x, %u.%03u uptime, %u.%09u, ", ver,
+ EXTRACT_32BITS(&nh->msys_uptime)/1000,
+ EXTRACT_32BITS(&nh->msys_uptime)%1000,
+ EXTRACT_32BITS(&nh->utc_sec), EXTRACT_32BITS(&nh->utc_nsec)));
+
+ nr = (const struct nfrec_v1 *)&nh[1];
+
+ ND_PRINT((ndo, "%2u recs", nrecs));
+
+ for (; nrecs != 0; nr++, nrecs--) {
+ char buf[20];
+ char asbuf[20];
+
+ /*
+ * Make sure we have the entire record.
+ */
+ ND_TCHECK(*nr);
+ ND_PRINT((ndo, "\n started %u.%03u, last %u.%03u",
+ EXTRACT_32BITS(&nr->start_time)/1000,
+ EXTRACT_32BITS(&nr->start_time)%1000,
+ EXTRACT_32BITS(&nr->last_time)/1000,
+ EXTRACT_32BITS(&nr->last_time)%1000));
+
+ asbuf[0] = buf[0] = '\0';
+ ND_PRINT((ndo, "\n %s%s%s:%u ", intoa(nr->src_ina.s_addr), buf, asbuf,
+ EXTRACT_16BITS(&nr->srcport)));
+
+ ND_PRINT((ndo, "> %s%s%s:%u ", intoa(nr->dst_ina.s_addr), buf, asbuf,
+ EXTRACT_16BITS(&nr->dstport)));
+
+ ND_PRINT((ndo, ">> %s\n ", intoa(nr->nhop_ina.s_addr)));
+
+ pent = getprotobynumber(nr->proto);
+ if (!pent || ndo->ndo_nflag)
+ ND_PRINT((ndo, "%u ", nr->proto));
+ else
+ ND_PRINT((ndo, "%s ", pent->p_name));
+
+ /* tcp flags for tcp only */
+ if (pent && pent->p_proto == IPPROTO_TCP) {
+ int flags;
+ flags = nr->tcp_flags;
+ ND_PRINT((ndo, "%s%s%s%s%s%s%s",
+ flags & TH_FIN ? "F" : "",
+ flags & TH_SYN ? "S" : "",
+ flags & TH_RST ? "R" : "",
+ flags & TH_PUSH ? "P" : "",
+ flags & TH_ACK ? "A" : "",
+ flags & TH_URG ? "U" : "",
+ flags ? " " : ""));
+ }
+
+ buf[0]='\0';
+ ND_PRINT((ndo, "tos %u, %u (%u octets) %s",
+ nr->tos,
+ EXTRACT_32BITS(&nr->packets),
+ EXTRACT_32BITS(&nr->octets), buf));
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|cnfp]"));
+ return;
+}
+
+static void
+cnfp_v5_print(netdissect_options *ndo, const u_char *cp)
+{
+ register const struct nfhdr_v5 *nh;
+ register const struct nfrec_v5 *nr;
+ struct protoent *pent;
+ int nrecs, ver;
+#if 0
+ time_t t;
+#endif
+
+ nh = (const struct nfhdr_v5 *)cp;
+ ND_TCHECK(*nh);
+
+ ver = EXTRACT_16BITS(&nh->version);
+ nrecs = EXTRACT_32BITS(&nh->count);
+#if 0
+ /*
+ * This is seconds since the UN*X epoch, and is followed by
+ * nanoseconds. XXX - format it, rather than just dumping the
+ * raw seconds-since-the-Epoch.
+ */
+ t = EXTRACT_32BITS(&nh->utc_sec);
+#endif
+
+ ND_PRINT((ndo, "NetFlow v%x, %u.%03u uptime, %u.%09u, ", ver,
+ EXTRACT_32BITS(&nh->msys_uptime)/1000,
+ EXTRACT_32BITS(&nh->msys_uptime)%1000,
+ EXTRACT_32BITS(&nh->utc_sec), EXTRACT_32BITS(&nh->utc_nsec)));
+
+ ND_PRINT((ndo, "#%u, ", EXTRACT_32BITS(&nh->sequence)));
+ nr = (const struct nfrec_v5 *)&nh[1];
+
+ ND_PRINT((ndo, "%2u recs", nrecs));
+
+ for (; nrecs != 0; nr++, nrecs--) {
+ char buf[20];
+ char asbuf[20];
+
+ /*
+ * Make sure we have the entire record.
+ */
+ ND_TCHECK(*nr);
+ ND_PRINT((ndo, "\n started %u.%03u, last %u.%03u",
+ EXTRACT_32BITS(&nr->start_time)/1000,
+ EXTRACT_32BITS(&nr->start_time)%1000,
+ EXTRACT_32BITS(&nr->last_time)/1000,
+ EXTRACT_32BITS(&nr->last_time)%1000));
+
+ asbuf[0] = buf[0] = '\0';
+ snprintf(buf, sizeof(buf), "/%u", nr->src_mask);
+ snprintf(asbuf, sizeof(asbuf), ":%u",
+ EXTRACT_16BITS(&nr->src_as));
+ ND_PRINT((ndo, "\n %s%s%s:%u ", intoa(nr->src_ina.s_addr), buf, asbuf,
+ EXTRACT_16BITS(&nr->srcport)));
+
+ snprintf(buf, sizeof(buf), "/%d", nr->dst_mask);
+ snprintf(asbuf, sizeof(asbuf), ":%u",
+ EXTRACT_16BITS(&nr->dst_as));
+ ND_PRINT((ndo, "> %s%s%s:%u ", intoa(nr->dst_ina.s_addr), buf, asbuf,
+ EXTRACT_16BITS(&nr->dstport)));
+
+ ND_PRINT((ndo, ">> %s\n ", intoa(nr->nhop_ina.s_addr)));
+
+ pent = getprotobynumber(nr->proto);
+ if (!pent || ndo->ndo_nflag)
+ ND_PRINT((ndo, "%u ", nr->proto));
+ else
+ ND_PRINT((ndo, "%s ", pent->p_name));
+
+ /* tcp flags for tcp only */
+ if (pent && pent->p_proto == IPPROTO_TCP) {
+ int flags;
+ flags = nr->tcp_flags;
+ ND_PRINT((ndo, "%s%s%s%s%s%s%s",
+ flags & TH_FIN ? "F" : "",
+ flags & TH_SYN ? "S" : "",
+ flags & TH_RST ? "R" : "",
+ flags & TH_PUSH ? "P" : "",
+ flags & TH_ACK ? "A" : "",
+ flags & TH_URG ? "U" : "",
+ flags ? " " : ""));
+ }
+
+ buf[0]='\0';
+ ND_PRINT((ndo, "tos %u, %u (%u octets) %s",
+ nr->tos,
+ EXTRACT_32BITS(&nr->packets),
+ EXTRACT_32BITS(&nr->octets), buf));
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|cnfp]"));
+ return;
+}
+
+static void
+cnfp_v6_print(netdissect_options *ndo, const u_char *cp)
+{
+ register const struct nfhdr_v6 *nh;
+ register const struct nfrec_v6 *nr;
+ struct protoent *pent;
+ int nrecs, ver;
+#if 0
+ time_t t;
+#endif
+
+ nh = (const struct nfhdr_v6 *)cp;
+ ND_TCHECK(*nh);
+
+ ver = EXTRACT_16BITS(&nh->version);
+ nrecs = EXTRACT_32BITS(&nh->count);
+#if 0
+ /*
+ * This is seconds since the UN*X epoch, and is followed by
+ * nanoseconds. XXX - format it, rather than just dumping the
+ * raw seconds-since-the-Epoch.
+ */
+ t = EXTRACT_32BITS(&nh->utc_sec);
+#endif
+
+ ND_PRINT((ndo, "NetFlow v%x, %u.%03u uptime, %u.%09u, ", ver,
+ EXTRACT_32BITS(&nh->msys_uptime)/1000,
+ EXTRACT_32BITS(&nh->msys_uptime)%1000,
+ EXTRACT_32BITS(&nh->utc_sec), EXTRACT_32BITS(&nh->utc_nsec)));
+
+ ND_PRINT((ndo, "#%u, ", EXTRACT_32BITS(&nh->sequence)));
+ nr = (const struct nfrec_v6 *)&nh[1];
+
+ ND_PRINT((ndo, "%2u recs", nrecs));
+
+ for (; nrecs != 0; nr++, nrecs--) {
+ char buf[20];
+ char asbuf[20];
+
+ /*
+ * Make sure we have the entire record.
+ */
+ ND_TCHECK(*nr);
+ ND_PRINT((ndo, "\n started %u.%03u, last %u.%03u",
+ EXTRACT_32BITS(&nr->start_time)/1000,
+ EXTRACT_32BITS(&nr->start_time)%1000,
+ EXTRACT_32BITS(&nr->last_time)/1000,
+ EXTRACT_32BITS(&nr->last_time)%1000));
+
+ asbuf[0] = buf[0] = '\0';
+ snprintf(buf, sizeof(buf), "/%u", nr->src_mask);
+ snprintf(asbuf, sizeof(asbuf), ":%u",
+ EXTRACT_16BITS(&nr->src_as));
+ ND_PRINT((ndo, "\n %s%s%s:%u ", intoa(nr->src_ina.s_addr), buf, asbuf,
+ EXTRACT_16BITS(&nr->srcport)));
+
+ snprintf(buf, sizeof(buf), "/%d", nr->dst_mask);
+ snprintf(asbuf, sizeof(asbuf), ":%u",
+ EXTRACT_16BITS(&nr->dst_as));
+ ND_PRINT((ndo, "> %s%s%s:%u ", intoa(nr->dst_ina.s_addr), buf, asbuf,
+ EXTRACT_16BITS(&nr->dstport)));
+
+ ND_PRINT((ndo, ">> %s\n ", intoa(nr->nhop_ina.s_addr)));
+
+ pent = getprotobynumber(nr->proto);
+ if (!pent || ndo->ndo_nflag)
+ ND_PRINT((ndo, "%u ", nr->proto));
+ else
+ ND_PRINT((ndo, "%s ", pent->p_name));
+
+ /* tcp flags for tcp only */
+ if (pent && pent->p_proto == IPPROTO_TCP) {
+ int flags;
+ flags = nr->tcp_flags;
+ ND_PRINT((ndo, "%s%s%s%s%s%s%s",
+ flags & TH_FIN ? "F" : "",
+ flags & TH_SYN ? "S" : "",
+ flags & TH_RST ? "R" : "",
+ flags & TH_PUSH ? "P" : "",
+ flags & TH_ACK ? "A" : "",
+ flags & TH_URG ? "U" : "",
+ flags ? " " : ""));
+ }
+
+ buf[0]='\0';
+ snprintf(buf, sizeof(buf), "(%u<>%u encaps)",
+ (EXTRACT_16BITS(&nr->flags) >> 8) & 0xff,
+ (EXTRACT_16BITS(&nr->flags)) & 0xff);
+ ND_PRINT((ndo, "tos %u, %u (%u octets) %s",
+ nr->tos,
+ EXTRACT_32BITS(&nr->packets),
+ EXTRACT_32BITS(&nr->octets), buf));
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|cnfp]"));
+ return;
+}
+
+void
+cnfp_print(netdissect_options *ndo, const u_char *cp)
+{
+ int ver;
+
+ /*
+ * First 2 bytes are the version number.
+ */
+ ND_TCHECK2(*cp, 2);
+ ver = EXTRACT_16BITS(cp);
+ switch (ver) {
+
+ case 1:
+ cnfp_v1_print(ndo, cp);
+ break;
+
+ case 5:
+ cnfp_v5_print(ndo, cp);
+ break;
+
+ case 6:
+ cnfp_v6_print(ndo, cp);
+ break;
+
+ default:
+ ND_PRINT((ndo, "NetFlow v%x", ver));
+ break;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|cnfp]"));
+ return;
+}
--- /dev/null
+/*
+ * Copyright (C) Arnaldo Carvalho de Melo 2004
+ * Copyright (C) Ian McDonald 2005
+ * Copyright (C) Yoshifumi Nishida 2005
+ *
+ * This software may be distributed either under the terms of the
+ * BSD-style license that accompanies tcpdump or the GNU GPL version 2
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-dccp.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+#include "ip.h"
+#ifdef INET6
+#include "ip6.h"
+#endif
+#include "ipproto.h"
+
+/* RFC4340: Datagram Congestion Control Protocol (DCCP) */
+
+/**
+ * struct dccp_hdr - generic part of DCCP packet header, with a 24-bit
+ * sequence number
+ *
+ * @dccph_sport - Relevant port on the endpoint that sent this packet
+ * @dccph_dport - Relevant port on the other endpoint
+ * @dccph_doff - Data Offset from the start of the DCCP header, in 32-bit words
+ * @dccph_ccval - Used by the HC-Sender CCID
+ * @dccph_cscov - Parts of the packet that are covered by the Checksum field
+ * @dccph_checksum - Internet checksum, depends on dccph_cscov
+ * @dccph_x - 0 = 24 bit sequence number, 1 = 48
+ * @dccph_type - packet type, see DCCP_PKT_ prefixed macros
+ * @dccph_seq - 24-bit sequence number
+ */
+struct dccp_hdr {
+ uint16_t dccph_sport,
+ dccph_dport;
+ uint8_t dccph_doff;
+ uint8_t dccph_ccval_cscov;
+ uint16_t dccph_checksum;
+ uint8_t dccph_xtr;
+ uint8_t dccph_seq[3];
+} UNALIGNED;
+
+/**
+ * struct dccp_hdr_ext - generic part of DCCP packet header, with a 48-bit
+ * sequence number
+ *
+ * @dccph_sport - Relevant port on the endpoint that sent this packet
+ * @dccph_dport - Relevant port on the other endpoint
+ * @dccph_doff - Data Offset from the start of the DCCP header, in 32-bit words
+ * @dccph_ccval - Used by the HC-Sender CCID
+ * @dccph_cscov - Parts of the packet that are covered by the Checksum field
+ * @dccph_checksum - Internet checksum, depends on dccph_cscov
+ * @dccph_x - 0 = 24 bit sequence number, 1 = 48
+ * @dccph_type - packet type, see DCCP_PKT_ prefixed macros
+ * @dccph_seq - 48-bit sequence number
+ */
+struct dccp_hdr_ext {
+ uint16_t dccph_sport,
+ dccph_dport;
+ uint8_t dccph_doff;
+ uint8_t dccph_ccval_cscov;
+ uint16_t dccph_checksum;
+ uint8_t dccph_xtr;
+ uint8_t reserved;
+ uint8_t dccph_seq[6];
+} UNALIGNED;
+
+#define DCCPH_CCVAL(dh) (((dh)->dccph_ccval_cscov >> 4) & 0xF)
+#define DCCPH_CSCOV(dh) (((dh)->dccph_ccval_cscov) & 0xF)
+
+#define DCCPH_X(dh) ((dh)->dccph_xtr & 1)
+#define DCCPH_TYPE(dh) (((dh)->dccph_xtr >> 1) & 0xF)
+
+/**
+ * struct dccp_hdr_request - Conection initiation request header
+ *
+ * @dccph_req_service - Service to which the client app wants to connect
+ */
+struct dccp_hdr_request {
+ uint32_t dccph_req_service;
+} UNALIGNED;
+
+/**
+ * struct dccp_hdr_response - Conection initiation response header
+ *
+ * @dccph_resp_ack - 48 bit ack number, contains GSR
+ * @dccph_resp_service - Echoes the Service Code on a received DCCP-Request
+ */
+struct dccp_hdr_response {
+ uint8_t dccph_resp_ack[8]; /* always 8 bytes */
+ uint32_t dccph_resp_service;
+} UNALIGNED;
+
+/**
+ * struct dccp_hdr_reset - Unconditionally shut down a connection
+ *
+ * @dccph_resp_ack - 48 bit ack number
+ * @dccph_reset_service - Echoes the Service Code on a received DCCP-Request
+ */
+struct dccp_hdr_reset {
+ uint8_t dccph_reset_ack[8]; /* always 8 bytes */
+ uint8_t dccph_reset_code,
+ dccph_reset_data[3];
+} UNALIGNED;
+
+enum dccp_pkt_type {
+ DCCP_PKT_REQUEST = 0,
+ DCCP_PKT_RESPONSE,
+ DCCP_PKT_DATA,
+ DCCP_PKT_ACK,
+ DCCP_PKT_DATAACK,
+ DCCP_PKT_CLOSEREQ,
+ DCCP_PKT_CLOSE,
+ DCCP_PKT_RESET,
+ DCCP_PKT_SYNC,
+ DCCP_PKT_SYNCACK
+};
+
+static const struct tok dccp_pkt_type_str[] = {
+ { DCCP_PKT_REQUEST, "DCCP-Request" },
+ { DCCP_PKT_RESPONSE, "DCCP-Response" },
+ { DCCP_PKT_DATA, "DCCP-Data" },
+ { DCCP_PKT_ACK, "DCCP-Ack" },
+ { DCCP_PKT_DATAACK, "DCCP-DataAck" },
+ { DCCP_PKT_CLOSEREQ, "DCCP-CloseReq" },
+ { DCCP_PKT_CLOSE, "DCCP-Close" },
+ { DCCP_PKT_RESET, "DCCP-Reset" },
+ { DCCP_PKT_SYNC, "DCCP-Sync" },
+ { DCCP_PKT_SYNCACK, "DCCP-SyncAck" },
+ { 0, NULL}
+};
+
+enum dccp_reset_codes {
+ DCCP_RESET_CODE_UNSPECIFIED = 0,
+ DCCP_RESET_CODE_CLOSED,
+ DCCP_RESET_CODE_ABORTED,
+ DCCP_RESET_CODE_NO_CONNECTION,
+ DCCP_RESET_CODE_PACKET_ERROR,
+ DCCP_RESET_CODE_OPTION_ERROR,
+ DCCP_RESET_CODE_MANDATORY_ERROR,
+ DCCP_RESET_CODE_CONNECTION_REFUSED,
+ DCCP_RESET_CODE_BAD_SERVICE_CODE,
+ DCCP_RESET_CODE_TOO_BUSY,
+ DCCP_RESET_CODE_BAD_INIT_COOKIE,
+ DCCP_RESET_CODE_AGGRESSION_PENALTY,
+ __DCCP_RESET_CODE_LAST
+};
+
+static const char tstr[] = "[|dccp]";
+
+static const char *dccp_reset_codes[] = {
+ "unspecified",
+ "closed",
+ "aborted",
+ "no_connection",
+ "packet_error",
+ "option_error",
+ "mandatory_error",
+ "connection_refused",
+ "bad_service_code",
+ "too_busy",
+ "bad_init_cookie",
+ "aggression_penalty",
+};
+
+static const char *dccp_feature_nums[] = {
+ "reserved",
+ "ccid",
+ "allow_short_seqno",
+ "sequence_window",
+ "ecn_incapable",
+ "ack_ratio",
+ "send_ack_vector",
+ "send_ndp_count",
+ "minimum checksum coverage",
+ "check data checksum",
+};
+
+static inline u_int dccp_csum_coverage(const struct dccp_hdr* dh, u_int len)
+{
+ u_int cov;
+
+ if (DCCPH_CSCOV(dh) == 0)
+ return len;
+ cov = (dh->dccph_doff + DCCPH_CSCOV(dh) - 1) * sizeof(uint32_t);
+ return (cov > len)? len : cov;
+}
+
+static int dccp_cksum(netdissect_options *ndo, const struct ip *ip,
+ const struct dccp_hdr *dh, u_int len)
+{
+ return nextproto4_cksum(ndo, ip, (const uint8_t *)(void *)dh, len,
+ 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)
+{
+ return nextproto6_cksum(ip6, (const uint8_t *)(void *)dh, len,
+ dccp_csum_coverage(dh, len), IPPROTO_DCCP);
+}
+#endif
+
+static const char *dccp_reset_code(uint8_t code)
+{
+ if (code >= __DCCP_RESET_CODE_LAST)
+ return "invalid";
+ return dccp_reset_codes[code];
+}
+
+static uint64_t dccp_seqno(const u_char *bp)
+{
+ const struct dccp_hdr *dh = (const struct dccp_hdr *)bp;
+ uint64_t seqno;
+
+ if (DCCPH_X(dh) != 0) {
+ const struct dccp_hdr_ext *dhx = (const struct dccp_hdr_ext *)bp;
+ seqno = EXTRACT_48BITS(dhx->dccph_seq);
+ } else {
+ seqno = EXTRACT_24BITS(dh->dccph_seq);
+ }
+
+ return seqno;
+}
+
+static inline unsigned int dccp_basic_hdr_len(const struct dccp_hdr *dh)
+{
+ return DCCPH_X(dh) ? sizeof(struct dccp_hdr_ext) : sizeof(struct dccp_hdr);
+}
+
+static void dccp_print_ack_no(netdissect_options *ndo, const u_char *bp)
+{
+ const struct dccp_hdr *dh = (const struct dccp_hdr *)bp;
+ const u_char *ackp = bp + dccp_basic_hdr_len(dh);
+ uint64_t ackno;
+
+ if (DCCPH_X(dh) != 0) {
+ ND_TCHECK2(*ackp, 8);
+ ackno = EXTRACT_48BITS(ackp + 2);
+ } else {
+ ND_TCHECK2(*ackp, 4);
+ ackno = EXTRACT_24BITS(ackp + 1);
+ }
+
+ ND_PRINT((ndo, "(ack=%" PRIu64 ") ", ackno));
+trunc:
+ return;
+}
+
+static int dccp_print_option(netdissect_options *, const u_char *, u_int);
+
+/**
+ * dccp_print - show dccp packet
+ * @bp - beginning of dccp packet
+ * @data2 - beginning of enclosing
+ * @len - lenght of ip packet
+ */
+void dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2,
+ u_int len)
+{
+ const struct dccp_hdr *dh;
+ const struct ip *ip;
+#ifdef INET6
+ const struct ip6_hdr *ip6;
+#endif
+ const u_char *cp;
+ u_short sport, dport;
+ u_int hlen;
+ u_int fixed_hdrlen;
+ uint8_t dccph_type;
+
+ dh = (const struct dccp_hdr *)bp;
+
+ ip = (struct ip *)data2;
+#ifdef INET6
+ if (IP_V(ip) == 6)
+ ip6 = (const struct ip6_hdr *)data2;
+ else
+ ip6 = NULL;
+#endif /*INET6*/
+
+ /* make sure we have enough data to look at the X bit */
+ cp = (const u_char *)(dh + 1);
+ if (cp > ndo->ndo_snapend) {
+ ND_PRINT((ndo, "[Invalid packet|dccp]"));
+ return;
+ }
+ if (len < sizeof(struct dccp_hdr)) {
+ ND_PRINT((ndo, "truncated-dccp - %u bytes missing!",
+ len - (u_int)sizeof(struct dccp_hdr)));
+ return;
+ }
+
+ /* get the length of the generic header */
+ fixed_hdrlen = dccp_basic_hdr_len(dh);
+ if (len < fixed_hdrlen) {
+ ND_PRINT((ndo, "truncated-dccp - %u bytes missing!",
+ len - fixed_hdrlen));
+ return;
+ }
+ ND_TCHECK2(*dh, fixed_hdrlen);
+
+ sport = EXTRACT_16BITS(&dh->dccph_sport);
+ dport = EXTRACT_16BITS(&dh->dccph_dport);
+ hlen = dh->dccph_doff * 4;
+
+#ifdef INET6
+ if (ip6) {
+ ND_PRINT((ndo, "%s.%d > %s.%d: ",
+ ip6addr_string(ndo, &ip6->ip6_src), sport,
+ ip6addr_string(ndo, &ip6->ip6_dst), dport));
+ } else
+#endif /*INET6*/
+ {
+ ND_PRINT((ndo, "%s.%d > %s.%d: ",
+ ipaddr_string(ndo, &ip->ip_src), sport,
+ ipaddr_string(ndo, &ip->ip_dst), dport));
+ }
+
+ ND_PRINT((ndo, "DCCP"));
+
+ if (ndo->ndo_qflag) {
+ ND_PRINT((ndo, " %d", len - hlen));
+ if (hlen > len) {
+ ND_PRINT((ndo, " [bad hdr length %u - too long, > %u]",
+ hlen, len));
+ }
+ return;
+ }
+
+ /* other variables in generic header */
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, " (CCVal %d, CsCov %d, ", DCCPH_CCVAL(dh), DCCPH_CSCOV(dh)));
+ }
+
+ /* checksum calculation */
+ if (ndo->ndo_vflag && ND_TTEST2(bp[0], len)) {
+ uint16_t sum = 0, dccp_sum;
+
+ dccp_sum = EXTRACT_16BITS(&dh->dccph_checksum);
+ ND_PRINT((ndo, "cksum 0x%04x ", dccp_sum));
+ if (IP_V(ip) == 4)
+ sum = dccp_cksum(ndo, ip, dh, len);
+#ifdef INET6
+ else if (IP_V(ip) == 6)
+ sum = dccp6_cksum(ip6, dh, len);
+#endif
+ if (sum != 0)
+ ND_PRINT((ndo, "(incorrect -> 0x%04x)",in_cksum_shouldbe(dccp_sum, sum)));
+ else
+ ND_PRINT((ndo, "(correct)"));
+ }
+
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, ")"));
+ ND_PRINT((ndo, " "));
+
+ dccph_type = DCCPH_TYPE(dh);
+ switch (dccph_type) {
+ case DCCP_PKT_REQUEST: {
+ struct dccp_hdr_request *dhr =
+ (struct dccp_hdr_request *)(bp + fixed_hdrlen);
+ fixed_hdrlen += 4;
+ if (len < fixed_hdrlen) {
+ ND_PRINT((ndo, "truncated-%s - %u bytes missing!",
+ tok2str(dccp_pkt_type_str, "", dccph_type),
+ len - fixed_hdrlen));
+ return;
+ }
+ ND_TCHECK(*dhr);
+ ND_PRINT((ndo, "%s (service=%d) ",
+ tok2str(dccp_pkt_type_str, "", dccph_type),
+ EXTRACT_32BITS(&dhr->dccph_req_service)));
+ break;
+ }
+ case DCCP_PKT_RESPONSE: {
+ struct dccp_hdr_response *dhr =
+ (struct dccp_hdr_response *)(bp + fixed_hdrlen);
+ fixed_hdrlen += 12;
+ if (len < fixed_hdrlen) {
+ ND_PRINT((ndo, "truncated-%s - %u bytes missing!",
+ tok2str(dccp_pkt_type_str, "", dccph_type),
+ len - fixed_hdrlen));
+ return;
+ }
+ ND_TCHECK(*dhr);
+ ND_PRINT((ndo, "%s (service=%d) ",
+ tok2str(dccp_pkt_type_str, "", dccph_type),
+ EXTRACT_32BITS(&dhr->dccph_resp_service)));
+ break;
+ }
+ case DCCP_PKT_DATA:
+ ND_PRINT((ndo, "%s ", tok2str(dccp_pkt_type_str, "", dccph_type)));
+ break;
+ case DCCP_PKT_ACK: {
+ fixed_hdrlen += 8;
+ if (len < fixed_hdrlen) {
+ ND_PRINT((ndo, "truncated-%s - %u bytes missing!",
+ tok2str(dccp_pkt_type_str, "", dccph_type),
+ len - fixed_hdrlen));
+ return;
+ }
+ ND_PRINT((ndo, "%s ", tok2str(dccp_pkt_type_str, "", dccph_type)));
+ break;
+ }
+ case DCCP_PKT_DATAACK: {
+ fixed_hdrlen += 8;
+ if (len < fixed_hdrlen) {
+ ND_PRINT((ndo, "truncated-%s - %u bytes missing!",
+ tok2str(dccp_pkt_type_str, "", dccph_type),
+ len - fixed_hdrlen));
+ return;
+ }
+ ND_PRINT((ndo, "%s ", tok2str(dccp_pkt_type_str, "", dccph_type)));
+ break;
+ }
+ case DCCP_PKT_CLOSEREQ:
+ fixed_hdrlen += 8;
+ if (len < fixed_hdrlen) {
+ ND_PRINT((ndo, "truncated-%s - %u bytes missing!",
+ tok2str(dccp_pkt_type_str, "", dccph_type),
+ len - fixed_hdrlen));
+ return;
+ }
+ ND_PRINT((ndo, "%s ", tok2str(dccp_pkt_type_str, "", dccph_type)));
+ break;
+ case DCCP_PKT_CLOSE:
+ fixed_hdrlen += 8;
+ if (len < fixed_hdrlen) {
+ ND_PRINT((ndo, "truncated-%s - %u bytes missing!",
+ tok2str(dccp_pkt_type_str, "", dccph_type),
+ len - fixed_hdrlen));
+ return;
+ }
+ ND_PRINT((ndo, "%s ", tok2str(dccp_pkt_type_str, "", dccph_type)));
+ break;
+ case DCCP_PKT_RESET: {
+ struct dccp_hdr_reset *dhr =
+ (struct dccp_hdr_reset *)(bp + fixed_hdrlen);
+ fixed_hdrlen += 12;
+ if (len < fixed_hdrlen) {
+ ND_PRINT((ndo, "truncated-%s - %u bytes missing!",
+ tok2str(dccp_pkt_type_str, "", dccph_type),
+ len - fixed_hdrlen));
+ return;
+ }
+ ND_TCHECK(*dhr);
+ ND_PRINT((ndo, "%s (code=%s) ",
+ tok2str(dccp_pkt_type_str, "", dccph_type),
+ dccp_reset_code(dhr->dccph_reset_code)));
+ break;
+ }
+ case DCCP_PKT_SYNC:
+ fixed_hdrlen += 8;
+ if (len < fixed_hdrlen) {
+ ND_PRINT((ndo, "truncated-%s - %u bytes missing!",
+ tok2str(dccp_pkt_type_str, "", dccph_type),
+ len - fixed_hdrlen));
+ return;
+ }
+ ND_PRINT((ndo, "%s ", tok2str(dccp_pkt_type_str, "", dccph_type)));
+ break;
+ case DCCP_PKT_SYNCACK:
+ fixed_hdrlen += 8;
+ if (len < fixed_hdrlen) {
+ ND_PRINT((ndo, "truncated-%s - %u bytes missing!",
+ tok2str(dccp_pkt_type_str, "", dccph_type),
+ len - fixed_hdrlen));
+ return;
+ }
+ ND_PRINT((ndo, "%s ", tok2str(dccp_pkt_type_str, "", dccph_type)));
+ break;
+ default:
+ ND_PRINT((ndo, "%s ", tok2str(dccp_pkt_type_str, "unknown-type-%u", dccph_type)));
+ break;
+ }
+
+ if ((DCCPH_TYPE(dh) != DCCP_PKT_DATA) &&
+ (DCCPH_TYPE(dh) != DCCP_PKT_REQUEST))
+ dccp_print_ack_no(ndo, bp);
+
+ if (ndo->ndo_vflag < 2)
+ return;
+
+ ND_PRINT((ndo, "seq %" PRIu64, dccp_seqno(bp)));
+
+ /* process options */
+ if (hlen > fixed_hdrlen){
+ const u_char *cp;
+ u_int optlen;
+ cp = bp + fixed_hdrlen;
+ ND_PRINT((ndo, " <"));
+
+ hlen -= fixed_hdrlen;
+ while(1){
+ optlen = dccp_print_option(ndo, cp, hlen);
+ if (!optlen)
+ break;
+ if (hlen <= optlen)
+ break;
+ hlen -= optlen;
+ cp += optlen;
+ ND_PRINT((ndo, ", "));
+ }
+ ND_PRINT((ndo, ">"));
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+}
+
+static const struct tok dccp_option_values[] = {
+ { 0, "nop" },
+ { 1, "mandatory" },
+ { 2, "slowreceiver" },
+ { 32, "change_l" },
+ { 33, "confirm_l" },
+ { 34, "change_r" },
+ { 35, "confirm_r" },
+ { 36, "initcookie" },
+ { 37, "ndp_count" },
+ { 38, "ack_vector0" },
+ { 39, "ack_vector1" },
+ { 40, "data_dropped" },
+ { 41, "timestamp" },
+ { 42, "timestamp_echo" },
+ { 43, "elapsed_time" },
+ { 44, "data_checksum" },
+ { 0, NULL }
+};
+
+static int dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen)
+{
+ uint8_t optlen, i;
+
+ ND_TCHECK(*option);
+
+ if (*option >= 32) {
+ ND_TCHECK(*(option+1));
+ optlen = *(option +1);
+ if (optlen < 2) {
+ if (*option >= 128)
+ ND_PRINT((ndo, "CCID option %u optlen too short", *option));
+ else
+ ND_PRINT((ndo, "%s optlen too short",
+ tok2str(dccp_option_values, "Option %u", *option)));
+ return 0;
+ }
+ } else
+ optlen = 1;
+
+ if (hlen < optlen) {
+ if (*option >= 128)
+ ND_PRINT((ndo, "CCID option %u optlen goes past header length",
+ *option));
+ else
+ ND_PRINT((ndo, "%s optlen goes past header length",
+ tok2str(dccp_option_values, "Option %u", *option)));
+ return 0;
+ }
+ ND_TCHECK2(*option, optlen);
+
+ if (*option >= 128) {
+ ND_PRINT((ndo, "CCID option %d", *option));
+ switch (optlen) {
+ case 4:
+ ND_PRINT((ndo, " %u", EXTRACT_16BITS(option + 2)));
+ break;
+ case 6:
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2)));
+ break;
+ default:
+ break;
+ }
+ } else {
+ ND_PRINT((ndo, "%s", tok2str(dccp_option_values, "Option %u", *option)));
+ switch (*option) {
+ case 32:
+ case 33:
+ case 34:
+ case 35:
+ if (optlen < 3) {
+ ND_PRINT((ndo, " optlen too short"));
+ return optlen;
+ }
+ if (*(option + 2) < 10){
+ ND_PRINT((ndo, " %s", dccp_feature_nums[*(option + 2)]));
+ for (i = 0; i < optlen - 3; i++)
+ ND_PRINT((ndo, " %d", *(option + 3 + i)));
+ }
+ break;
+ case 36:
+ if (optlen > 2) {
+ ND_PRINT((ndo, " 0x"));
+ for (i = 0; i < optlen - 2; i++)
+ ND_PRINT((ndo, "%02x", *(option + 2 + i)));
+ }
+ break;
+ case 37:
+ for (i = 0; i < optlen - 2; i++)
+ ND_PRINT((ndo, " %d", *(option + 2 + i)));
+ break;
+ case 38:
+ if (optlen > 2) {
+ ND_PRINT((ndo, " 0x"));
+ for (i = 0; i < optlen - 2; i++)
+ ND_PRINT((ndo, "%02x", *(option + 2 + i)));
+ }
+ break;
+ case 39:
+ if (optlen > 2) {
+ ND_PRINT((ndo, " 0x"));
+ for (i = 0; i < optlen - 2; i++)
+ ND_PRINT((ndo, "%02x", *(option + 2 + i)));
+ }
+ break;
+ case 40:
+ if (optlen > 2) {
+ ND_PRINT((ndo, " 0x"));
+ for (i = 0; i < optlen - 2; i++)
+ ND_PRINT((ndo, "%02x", *(option + 2 + i)));
+ }
+ break;
+ case 41:
+ if (optlen == 4)
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2)));
+ else
+ ND_PRINT((ndo, " optlen != 4"));
+ break;
+ case 42:
+ if (optlen == 4)
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2)));
+ else
+ ND_PRINT((ndo, " optlen != 4"));
+ break;
+ case 43:
+ if (optlen == 6)
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2)));
+ else if (optlen == 4)
+ ND_PRINT((ndo, " %u", EXTRACT_16BITS(option + 2)));
+ else
+ ND_PRINT((ndo, " optlen != 4 or 6"));
+ break;
+ case 44:
+ if (optlen > 2) {
+ ND_PRINT((ndo, " "));
+ for (i = 0; i < optlen - 2; i++)
+ ND_PRINT((ndo, "%02x", *(option + 2 + i)));
+ }
+ break;
+ }
+ }
+
+ return optlen;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-decnet.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+struct mbuf;
+struct rtentry;
+
+#ifdef HAVE_NETDNET_DNETDB_H
+#include <netdnet/dnetdb.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "extract.h"
+#include "interface.h"
+#include "addrtoname.h"
+
+static const char tstr[] = "[|decnet]";
+
+#ifndef WIN32
+typedef uint8_t byte[1]; /* single byte field */
+#else
+/*
+ * the keyword 'byte' generates conflicts in Windows
+ */
+typedef unsigned char Byte[1]; /* single byte field */
+#define byte Byte
+#endif /* WIN32 */
+typedef uint8_t word[2]; /* 2 byte field */
+typedef uint8_t longword[4]; /* 4 bytes field */
+
+/*
+ * Definitions for DECNET Phase IV protocol headers
+ */
+union etheraddress {
+ uint8_t dne_addr[6]; /* full ethernet address */
+ struct {
+ uint8_t dne_hiord[4]; /* DECnet HIORD prefix */
+ uint8_t dne_nodeaddr[2]; /* DECnet node address */
+ } dne_remote;
+};
+
+typedef union etheraddress etheraddr; /* Ethernet address */
+
+#define HIORD 0x000400aa /* high 32-bits of address (swapped) */
+
+#define AREAMASK 0176000 /* mask for area field */
+#define AREASHIFT 10 /* bit-offset for area field */
+#define NODEMASK 01777 /* mask for node address field */
+
+#define DN_MAXADDL 20 /* max size of DECnet address */
+struct dn_naddr {
+ uint16_t a_len; /* length of address */
+ uint8_t a_addr[DN_MAXADDL]; /* address as bytes */
+};
+
+/*
+ * Define long and short header formats.
+ */
+struct shorthdr
+ {
+ byte sh_flags; /* route flags */
+ word sh_dst; /* destination node address */
+ word sh_src; /* source node address */
+ byte sh_visits; /* visit count */
+ };
+
+struct longhdr
+ {
+ byte lg_flags; /* route flags */
+ byte lg_darea; /* destination area (reserved) */
+ byte lg_dsarea; /* destination subarea (reserved) */
+ etheraddr lg_dst; /* destination id */
+ byte lg_sarea; /* source area (reserved) */
+ byte lg_ssarea; /* source subarea (reserved) */
+ etheraddr lg_src; /* source id */
+ byte lg_nextl2; /* next level 2 router (reserved) */
+ byte lg_visits; /* visit count */
+ byte lg_service; /* service class (reserved) */
+ byte lg_pt; /* protocol type (reserved) */
+ };
+
+union routehdr
+ {
+ struct shorthdr rh_short; /* short route header */
+ struct longhdr rh_long; /* long route header */
+ };
+
+/*
+ * Define the values of various fields in the protocol messages.
+ *
+ * 1. Data packet formats.
+ */
+#define RMF_MASK 7 /* mask for message type */
+#define RMF_SHORT 2 /* short message format */
+#define RMF_LONG 6 /* long message format */
+#ifndef RMF_RQR
+#define RMF_RQR 010 /* request return to sender */
+#define RMF_RTS 020 /* returning to sender */
+#define RMF_IE 040 /* intra-ethernet packet */
+#endif /* RMR_RQR */
+#define RMF_FVER 0100 /* future version flag */
+#define RMF_PAD 0200 /* pad field */
+#define RMF_PADMASK 0177 /* pad field mask */
+
+#define VIS_MASK 077 /* visit field mask */
+
+/*
+ * 2. Control packet formats.
+ */
+#define RMF_CTLMASK 017 /* mask for message type */
+#define RMF_CTLMSG 01 /* control message indicator */
+#define RMF_INIT 01 /* initialization message */
+#define RMF_VER 03 /* verification message */
+#define RMF_TEST 05 /* hello and test message */
+#define RMF_L1ROUT 07 /* level 1 routing message */
+#define RMF_L2ROUT 011 /* level 2 routing message */
+#define RMF_RHELLO 013 /* router hello message */
+#define RMF_EHELLO 015 /* endnode hello message */
+
+#define TI_L2ROUT 01 /* level 2 router */
+#define TI_L1ROUT 02 /* level 1 router */
+#define TI_ENDNODE 03 /* endnode */
+#define TI_VERIF 04 /* verification required */
+#define TI_BLOCK 010 /* blocking requested */
+
+#define VE_VERS 2 /* version number (2) */
+#define VE_ECO 0 /* ECO number */
+#define VE_UECO 0 /* user ECO number (0) */
+
+#define P3_VERS 1 /* phase III version number (1) */
+#define P3_ECO 3 /* ECO number (3) */
+#define P3_UECO 0 /* user ECO number (0) */
+
+#define II_L2ROUT 01 /* level 2 router */
+#define II_L1ROUT 02 /* level 1 router */
+#define II_ENDNODE 03 /* endnode */
+#define II_VERIF 04 /* verification required */
+#define II_NOMCAST 040 /* no multicast traffic accepted */
+#define II_BLOCK 0100 /* blocking requested */
+#define II_TYPEMASK 03 /* mask for node type */
+
+#define TESTDATA 0252 /* test data bytes */
+#define TESTLEN 1 /* length of transmitted test data */
+
+/*
+ * Define control message formats.
+ */
+struct initmsgIII /* phase III initialization message */
+ {
+ byte inIII_flags; /* route flags */
+ word inIII_src; /* source node address */
+ byte inIII_info; /* routing layer information */
+ word inIII_blksize; /* maximum data link block size */
+ byte inIII_vers; /* version number */
+ byte inIII_eco; /* ECO number */
+ byte inIII_ueco; /* user ECO number */
+ byte inIII_rsvd; /* reserved image field */
+ };
+
+struct initmsg /* initialization message */
+ {
+ byte in_flags; /* route flags */
+ word in_src; /* source node address */
+ byte in_info; /* routing layer information */
+ word in_blksize; /* maximum data link block size */
+ byte in_vers; /* version number */
+ byte in_eco; /* ECO number */
+ byte in_ueco; /* user ECO number */
+ word in_hello; /* hello timer */
+ byte in_rsvd; /* reserved image field */
+ };
+
+struct verifmsg /* verification message */
+ {
+ byte ve_flags; /* route flags */
+ word ve_src; /* source node address */
+ byte ve_fcnval; /* function value image field */
+ };
+
+struct testmsg /* hello and test message */
+ {
+ byte te_flags; /* route flags */
+ word te_src; /* source node address */
+ byte te_data; /* test data image field */
+ };
+
+struct l1rout /* level 1 routing message */
+ {
+ byte r1_flags; /* route flags */
+ word r1_src; /* source node address */
+ byte r1_rsvd; /* reserved field */
+ };
+
+struct l2rout /* level 2 routing message */
+ {
+ byte r2_flags; /* route flags */
+ word r2_src; /* source node address */
+ byte r2_rsvd; /* reserved field */
+ };
+
+struct rhellomsg /* router hello message */
+ {
+ byte rh_flags; /* route flags */
+ byte rh_vers; /* version number */
+ byte rh_eco; /* ECO number */
+ byte rh_ueco; /* user ECO number */
+ etheraddr rh_src; /* source id */
+ byte rh_info; /* routing layer information */
+ word rh_blksize; /* maximum data link block size */
+ byte rh_priority; /* router's priority */
+ byte rh_area; /* reserved */
+ word rh_hello; /* hello timer */
+ byte rh_mpd; /* reserved */
+ };
+
+struct ehellomsg /* endnode hello message */
+ {
+ byte eh_flags; /* route flags */
+ byte eh_vers; /* version number */
+ byte eh_eco; /* ECO number */
+ byte eh_ueco; /* user ECO number */
+ etheraddr eh_src; /* source id */
+ byte eh_info; /* routing layer information */
+ word eh_blksize; /* maximum data link block size */
+ byte eh_area; /* area (reserved) */
+ byte eh_seed[8]; /* verification seed */
+ etheraddr eh_router; /* designated router */
+ word eh_hello; /* hello timer */
+ byte eh_mpd; /* (reserved) */
+ byte eh_data; /* test data image field */
+ };
+
+union controlmsg
+ {
+ struct initmsg cm_init; /* initialization message */
+ struct verifmsg cm_ver; /* verification message */
+ struct testmsg cm_test; /* hello and test message */
+ struct l1rout cm_l1rou; /* level 1 routing message */
+ struct l2rout cm_l2rout; /* level 2 routing message */
+ struct rhellomsg cm_rhello; /* router hello message */
+ struct ehellomsg cm_ehello; /* endnode hello message */
+ };
+
+/* Macros for decoding routing-info fields */
+#define RI_COST(x) ((x)&0777)
+#define RI_HOPS(x) (((x)>>10)&037)
+
+/*
+ * NSP protocol fields and values.
+ */
+
+#define NSP_TYPEMASK 014 /* mask to isolate type code */
+#define NSP_SUBMASK 0160 /* mask to isolate subtype code */
+#define NSP_SUBSHFT 4 /* shift to move subtype code */
+
+#define MFT_DATA 0 /* data message */
+#define MFT_ACK 04 /* acknowledgement message */
+#define MFT_CTL 010 /* control message */
+
+#define MFS_ILS 020 /* data or I/LS indicator */
+#define MFS_BOM 040 /* beginning of message (data) */
+#define MFS_MOM 0 /* middle of message (data) */
+#define MFS_EOM 0100 /* end of message (data) */
+#define MFS_INT 040 /* interrupt message */
+
+#define MFS_DACK 0 /* data acknowledgement */
+#define MFS_IACK 020 /* I/LS acknowledgement */
+#define MFS_CACK 040 /* connect acknowledgement */
+
+#define MFS_NOP 0 /* no operation */
+#define MFS_CI 020 /* connect initiate */
+#define MFS_CC 040 /* connect confirm */
+#define MFS_DI 060 /* disconnect initiate */
+#define MFS_DC 0100 /* disconnect confirm */
+#define MFS_RCI 0140 /* retransmitted connect initiate */
+
+#define SGQ_ACK 0100000 /* ack */
+#define SGQ_NAK 0110000 /* negative ack */
+#define SGQ_OACK 0120000 /* other channel ack */
+#define SGQ_ONAK 0130000 /* other channel negative ack */
+#define SGQ_MASK 07777 /* mask to isolate seq # */
+#define SGQ_OTHER 020000 /* other channel qualifier */
+#define SGQ_DELAY 010000 /* ack delay flag */
+
+#define SGQ_EOM 0100000 /* pseudo flag for end-of-message */
+
+#define LSM_MASK 03 /* mask for modifier field */
+#define LSM_NOCHANGE 0 /* no change */
+#define LSM_DONOTSEND 1 /* do not send data */
+#define LSM_SEND 2 /* send data */
+
+#define LSI_MASK 014 /* mask for interpretation field */
+#define LSI_DATA 0 /* data segment or message count */
+#define LSI_INTR 4 /* interrupt request count */
+#define LSI_INTM 0377 /* funny marker for int. message */
+
+#define COS_MASK 014 /* mask for flow control field */
+#define COS_NONE 0 /* no flow control */
+#define COS_SEGMENT 04 /* segment flow control */
+#define COS_MESSAGE 010 /* message flow control */
+#define COS_CRYPTSER 020 /* cryptographic services requested */
+#define COS_DEFAULT 1 /* default value for field */
+
+#define COI_MASK 3 /* mask for version field */
+#define COI_32 0 /* version 3.2 */
+#define COI_31 1 /* version 3.1 */
+#define COI_40 2 /* version 4.0 */
+#define COI_41 3 /* version 4.1 */
+
+#define MNU_MASK 140 /* mask for session control version */
+#define MNU_10 000 /* session V1.0 */
+#define MNU_20 040 /* session V2.0 */
+#define MNU_ACCESS 1 /* access control present */
+#define MNU_USRDATA 2 /* user data field present */
+#define MNU_INVKPROXY 4 /* invoke proxy field present */
+#define MNU_UICPROXY 8 /* use uic-based proxy */
+
+#define DC_NORESOURCES 1 /* no resource reason code */
+#define DC_NOLINK 41 /* no link terminate reason code */
+#define DC_COMPLETE 42 /* disconnect complete reason code */
+
+#define DI_NOERROR 0 /* user disconnect */
+#define DI_SHUT 3 /* node is shutting down */
+#define DI_NOUSER 4 /* destination end user does not exist */
+#define DI_INVDEST 5 /* invalid end user destination */
+#define DI_REMRESRC 6 /* insufficient remote resources */
+#define DI_TPA 8 /* third party abort */
+#define DI_PROTOCOL 7 /* protocol error discovered */
+#define DI_ABORT 9 /* user abort */
+#define DI_LOCALRESRC 32 /* insufficient local resources */
+#define DI_REMUSERRESRC 33 /* insufficient remote user resources */
+#define DI_BADACCESS 34 /* bad access control information */
+#define DI_BADACCNT 36 /* bad ACCOUNT information */
+#define DI_CONNECTABORT 38 /* connect request cancelled */
+#define DI_TIMEDOUT 38 /* remote node or user crashed */
+#define DI_UNREACHABLE 39 /* local timers expired due to ... */
+#define DI_BADIMAGE 43 /* bad image data in connect */
+#define DI_SERVMISMATCH 54 /* cryptographic service mismatch */
+
+#define UC_OBJREJECT 0 /* object rejected connect */
+#define UC_USERDISCONNECT 0 /* user disconnect */
+#define UC_RESOURCES 1 /* insufficient resources (local or remote) */
+#define UC_NOSUCHNODE 2 /* unrecognized node name */
+#define UC_REMOTESHUT 3 /* remote node shutting down */
+#define UC_NOSUCHOBJ 4 /* unrecognized object */
+#define UC_INVOBJFORMAT 5 /* invalid object name format */
+#define UC_OBJTOOBUSY 6 /* object too busy */
+#define UC_NETWORKABORT 8 /* network abort */
+#define UC_USERABORT 9 /* user abort */
+#define UC_INVNODEFORMAT 10 /* invalid node name format */
+#define UC_LOCALSHUT 11 /* local node shutting down */
+#define UC_ACCESSREJECT 34 /* invalid access control information */
+#define UC_NORESPONSE 38 /* no response from object */
+#define UC_UNREACHABLE 39 /* node unreachable */
+
+/*
+ * NSP message formats.
+ */
+struct nsphdr /* general nsp header */
+ {
+ byte nh_flags; /* message flags */
+ word nh_dst; /* destination link address */
+ word nh_src; /* source link address */
+ };
+
+struct seghdr /* data segment header */
+ {
+ byte sh_flags; /* message flags */
+ word sh_dst; /* destination link address */
+ word sh_src; /* source link address */
+ word sh_seq[3]; /* sequence numbers */
+ };
+
+struct minseghdr /* minimum data segment header */
+ {
+ byte ms_flags; /* message flags */
+ word ms_dst; /* destination link address */
+ word ms_src; /* source link address */
+ word ms_seq; /* sequence number */
+ };
+
+struct lsmsg /* link service message (after hdr) */
+ {
+ byte ls_lsflags; /* link service flags */
+ byte ls_fcval; /* flow control value */
+ };
+
+struct ackmsg /* acknowledgement message */
+ {
+ byte ak_flags; /* message flags */
+ word ak_dst; /* destination link address */
+ word ak_src; /* source link address */
+ word ak_acknum[2]; /* acknowledgement numbers */
+ };
+
+struct minackmsg /* minimum acknowledgement message */
+ {
+ byte mk_flags; /* message flags */
+ word mk_dst; /* destination link address */
+ word mk_src; /* source link address */
+ word mk_acknum; /* acknowledgement number */
+ };
+
+struct ciackmsg /* connect acknowledgement message */
+ {
+ byte ck_flags; /* message flags */
+ word ck_dst; /* destination link address */
+ };
+
+struct cimsg /* connect initiate message */
+ {
+ byte ci_flags; /* message flags */
+ word ci_dst; /* destination link address (0) */
+ word ci_src; /* source link address */
+ byte ci_services; /* requested services */
+ byte ci_info; /* information */
+ word ci_segsize; /* maximum segment size */
+ };
+
+struct ccmsg /* connect confirm message */
+ {
+ byte cc_flags; /* message flags */
+ word cc_dst; /* destination link address */
+ word cc_src; /* source link address */
+ byte cc_services; /* requested services */
+ byte cc_info; /* information */
+ word cc_segsize; /* maximum segment size */
+ byte cc_optlen; /* optional data length */
+ };
+
+struct cnmsg /* generic connect message */
+ {
+ byte cn_flags; /* message flags */
+ word cn_dst; /* destination link address */
+ word cn_src; /* source link address */
+ byte cn_services; /* requested services */
+ byte cn_info; /* information */
+ word cn_segsize; /* maximum segment size */
+ };
+
+struct dimsg /* disconnect initiate message */
+ {
+ byte di_flags; /* message flags */
+ word di_dst; /* destination link address */
+ word di_src; /* source link address */
+ word di_reason; /* reason code */
+ byte di_optlen; /* optional data length */
+ };
+
+struct dcmsg /* disconnect confirm message */
+ {
+ byte dc_flags; /* message flags */
+ word dc_dst; /* destination link address */
+ word dc_src; /* source link address */
+ word dc_reason; /* reason code */
+ };
+
+/* Forwards */
+static int print_decnet_ctlmsg(netdissect_options *, const union routehdr *, u_int, u_int);
+static void print_t_info(netdissect_options *, int);
+static int print_l1_routes(netdissect_options *, const char *, u_int);
+static int print_l2_routes(netdissect_options *, const char *, u_int);
+static void print_i_info(netdissect_options *, int);
+static int print_elist(const char *, u_int);
+static int print_nsp(netdissect_options *, const u_char *, u_int);
+static void print_reason(netdissect_options *, int);
+#ifdef PRINT_NSPDATA
+static void pdata(netdissect_options *, u_char *, u_int);
+#endif
+
+#ifndef HAVE_NETDNET_DNETDB_H_DNET_HTOA
+extern char *dnet_htoa(struct dn_naddr *);
+#endif
+
+void
+decnet_print(netdissect_options *ndo,
+ register const u_char *ap, register u_int length,
+ register u_int caplen)
+{
+ register const union routehdr *rhp;
+ register int mflags;
+ int dst, src, hops;
+ u_int nsplen, pktlen;
+ const u_char *nspp;
+
+ if (length < sizeof(struct shorthdr)) {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+
+ ND_TCHECK2(*ap, sizeof(short));
+ pktlen = EXTRACT_LE_16BITS(ap);
+ if (pktlen < sizeof(struct shorthdr)) {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+ if (pktlen > length) {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+ length = pktlen;
+
+ rhp = (const union routehdr *)&(ap[sizeof(short)]);
+ ND_TCHECK(rhp->rh_short.sh_flags);
+ mflags = EXTRACT_LE_8BITS(rhp->rh_short.sh_flags);
+
+ if (mflags & RMF_PAD) {
+ /* pad bytes of some sort in front of message */
+ u_int padlen = mflags & RMF_PADMASK;
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "[pad:%d] ", padlen));
+ if (length < padlen + 2) {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+ ND_TCHECK2(ap[sizeof(short)], padlen);
+ ap += padlen;
+ length -= padlen;
+ caplen -= padlen;
+ rhp = (const union routehdr *)&(ap[sizeof(short)]);
+ mflags = EXTRACT_LE_8BITS(rhp->rh_short.sh_flags);
+ }
+
+ if (mflags & RMF_FVER) {
+ ND_PRINT((ndo, "future-version-decnet"));
+ ND_DEFAULTPRINT(ap, min(length, caplen));
+ return;
+ }
+
+ /* is it a control message? */
+ if (mflags & RMF_CTLMSG) {
+ if (!print_decnet_ctlmsg(ndo, rhp, length, caplen))
+ goto trunc;
+ return;
+ }
+
+ switch (mflags & RMF_MASK) {
+ case RMF_LONG:
+ if (length < sizeof(struct longhdr)) {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+ ND_TCHECK(rhp->rh_long);
+ dst =
+ EXTRACT_LE_16BITS(rhp->rh_long.lg_dst.dne_remote.dne_nodeaddr);
+ src =
+ EXTRACT_LE_16BITS(rhp->rh_long.lg_src.dne_remote.dne_nodeaddr);
+ hops = EXTRACT_LE_8BITS(rhp->rh_long.lg_visits);
+ nspp = &(ap[sizeof(short) + sizeof(struct longhdr)]);
+ nsplen = length - sizeof(struct longhdr);
+ break;
+ case RMF_SHORT:
+ ND_TCHECK(rhp->rh_short);
+ dst = EXTRACT_LE_16BITS(rhp->rh_short.sh_dst);
+ src = EXTRACT_LE_16BITS(rhp->rh_short.sh_src);
+ hops = (EXTRACT_LE_8BITS(rhp->rh_short.sh_visits) & VIS_MASK)+1;
+ nspp = &(ap[sizeof(short) + sizeof(struct shorthdr)]);
+ nsplen = length - sizeof(struct shorthdr);
+ break;
+ default:
+ ND_PRINT((ndo, "unknown message flags under mask"));
+ ND_DEFAULTPRINT((u_char *)ap, min(length, caplen));
+ return;
+ }
+
+ ND_PRINT((ndo, "%s > %s %d ",
+ dnaddr_string(ndo, src), dnaddr_string(ndo, dst), pktlen));
+ if (ndo->ndo_vflag) {
+ if (mflags & RMF_RQR)
+ ND_PRINT((ndo, "RQR "));
+ if (mflags & RMF_RTS)
+ ND_PRINT((ndo, "RTS "));
+ if (mflags & RMF_IE)
+ ND_PRINT((ndo, "IE "));
+ ND_PRINT((ndo, "%d hops ", hops));
+ }
+
+ if (!print_nsp(ndo, nspp, nsplen))
+ goto trunc;
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+}
+
+static int
+print_decnet_ctlmsg(netdissect_options *ndo,
+ register const union routehdr *rhp, u_int length,
+ u_int caplen)
+{
+ int mflags = EXTRACT_LE_8BITS(rhp->rh_short.sh_flags);
+ register union controlmsg *cmp = (union controlmsg *)rhp;
+ int src, dst, info, blksize, eco, ueco, hello, other, vers;
+ etheraddr srcea, rtea;
+ int priority;
+ char *rhpx = (char *)rhp;
+ int ret;
+
+ switch (mflags & RMF_CTLMASK) {
+ case RMF_INIT:
+ ND_PRINT((ndo, "init "));
+ if (length < sizeof(struct initmsg))
+ goto trunc;
+ ND_TCHECK(cmp->cm_init);
+ src = EXTRACT_LE_16BITS(cmp->cm_init.in_src);
+ info = EXTRACT_LE_8BITS(cmp->cm_init.in_info);
+ blksize = EXTRACT_LE_16BITS(cmp->cm_init.in_blksize);
+ vers = EXTRACT_LE_8BITS(cmp->cm_init.in_vers);
+ eco = EXTRACT_LE_8BITS(cmp->cm_init.in_eco);
+ ueco = EXTRACT_LE_8BITS(cmp->cm_init.in_ueco);
+ hello = EXTRACT_LE_16BITS(cmp->cm_init.in_hello);
+ print_t_info(ndo, info);
+ ND_PRINT((ndo,
+ "src %sblksize %d vers %d eco %d ueco %d hello %d",
+ dnaddr_string(ndo, src), blksize, vers, eco, ueco,
+ hello));
+ ret = 1;
+ break;
+ case RMF_VER:
+ ND_PRINT((ndo, "verification "));
+ if (length < sizeof(struct verifmsg))
+ goto trunc;
+ ND_TCHECK(cmp->cm_ver);
+ src = EXTRACT_LE_16BITS(cmp->cm_ver.ve_src);
+ other = EXTRACT_LE_8BITS(cmp->cm_ver.ve_fcnval);
+ ND_PRINT((ndo, "src %s fcnval %o", dnaddr_string(ndo, src), other));
+ ret = 1;
+ break;
+ case RMF_TEST:
+ ND_PRINT((ndo, "test "));
+ if (length < sizeof(struct testmsg))
+ goto trunc;
+ ND_TCHECK(cmp->cm_test);
+ src = EXTRACT_LE_16BITS(cmp->cm_test.te_src);
+ other = EXTRACT_LE_8BITS(cmp->cm_test.te_data);
+ ND_PRINT((ndo, "src %s data %o", dnaddr_string(ndo, src), other));
+ ret = 1;
+ break;
+ case RMF_L1ROUT:
+ ND_PRINT((ndo, "lev-1-routing "));
+ if (length < sizeof(struct l1rout))
+ goto trunc;
+ ND_TCHECK(cmp->cm_l1rou);
+ src = EXTRACT_LE_16BITS(cmp->cm_l1rou.r1_src);
+ ND_PRINT((ndo, "src %s ", dnaddr_string(ndo, src)));
+ ret = print_l1_routes(ndo, &(rhpx[sizeof(struct l1rout)]),
+ length - sizeof(struct l1rout));
+ break;
+ case RMF_L2ROUT:
+ ND_PRINT((ndo, "lev-2-routing "));
+ if (length < sizeof(struct l2rout))
+ goto trunc;
+ ND_TCHECK(cmp->cm_l2rout);
+ src = EXTRACT_LE_16BITS(cmp->cm_l2rout.r2_src);
+ ND_PRINT((ndo, "src %s ", dnaddr_string(ndo, src)));
+ ret = print_l2_routes(ndo, &(rhpx[sizeof(struct l2rout)]),
+ length - sizeof(struct l2rout));
+ break;
+ case RMF_RHELLO:
+ ND_PRINT((ndo, "router-hello "));
+ if (length < sizeof(struct rhellomsg))
+ goto trunc;
+ ND_TCHECK(cmp->cm_rhello);
+ vers = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_vers);
+ eco = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_eco);
+ ueco = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_ueco);
+ memcpy((char *)&srcea, (char *)&(cmp->cm_rhello.rh_src),
+ sizeof(srcea));
+ src = EXTRACT_LE_16BITS(srcea.dne_remote.dne_nodeaddr);
+ info = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_info);
+ blksize = EXTRACT_LE_16BITS(cmp->cm_rhello.rh_blksize);
+ priority = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_priority);
+ hello = EXTRACT_LE_16BITS(cmp->cm_rhello.rh_hello);
+ print_i_info(ndo, info);
+ ND_PRINT((ndo,
+ "vers %d eco %d ueco %d src %s blksize %d pri %d hello %d",
+ vers, eco, ueco, dnaddr_string(ndo, src),
+ blksize, priority, hello));
+ ret = print_elist(&(rhpx[sizeof(struct rhellomsg)]),
+ length - sizeof(struct rhellomsg));
+ break;
+ case RMF_EHELLO:
+ ND_PRINT((ndo, "endnode-hello "));
+ if (length < sizeof(struct ehellomsg))
+ goto trunc;
+ ND_TCHECK(cmp->cm_ehello);
+ vers = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_vers);
+ eco = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_eco);
+ ueco = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_ueco);
+ memcpy((char *)&srcea, (char *)&(cmp->cm_ehello.eh_src),
+ sizeof(srcea));
+ src = EXTRACT_LE_16BITS(srcea.dne_remote.dne_nodeaddr);
+ info = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_info);
+ blksize = EXTRACT_LE_16BITS(cmp->cm_ehello.eh_blksize);
+ /*seed*/
+ memcpy((char *)&rtea, (char *)&(cmp->cm_ehello.eh_router),
+ sizeof(rtea));
+ dst = EXTRACT_LE_16BITS(rtea.dne_remote.dne_nodeaddr);
+ hello = EXTRACT_LE_16BITS(cmp->cm_ehello.eh_hello);
+ other = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_data);
+ print_i_info(ndo, info);
+ ND_PRINT((ndo,
+ "vers %d eco %d ueco %d src %s blksize %d rtr %s hello %d data %o",
+ vers, eco, ueco, dnaddr_string(ndo, src),
+ blksize, dnaddr_string(ndo, dst), hello, other));
+ ret = 1;
+ break;
+
+ default:
+ ND_PRINT((ndo, "unknown control message"));
+ ND_DEFAULTPRINT((u_char *)rhp, min(length, caplen));
+ ret = 1;
+ break;
+ }
+ return (ret);
+
+trunc:
+ return (0);
+}
+
+static void
+print_t_info(netdissect_options *ndo,
+ int info)
+{
+ int ntype = info & 3;
+ switch (ntype) {
+ case 0: ND_PRINT((ndo, "reserved-ntype? ")); break;
+ case TI_L2ROUT: ND_PRINT((ndo, "l2rout ")); break;
+ case TI_L1ROUT: ND_PRINT((ndo, "l1rout ")); break;
+ case TI_ENDNODE: ND_PRINT((ndo, "endnode ")); break;
+ }
+ if (info & TI_VERIF)
+ ND_PRINT((ndo, "verif "));
+ if (info & TI_BLOCK)
+ ND_PRINT((ndo, "blo "));
+}
+
+static int
+print_l1_routes(netdissect_options *ndo,
+ const char *rp, u_int len)
+{
+ int count;
+ int id;
+ int info;
+
+ /* The last short is a checksum */
+ while (len > (3 * sizeof(short))) {
+ ND_TCHECK2(*rp, 3 * sizeof(short));
+ count = EXTRACT_LE_16BITS(rp);
+ if (count > 1024)
+ return (1); /* seems to be bogus from here on */
+ rp += sizeof(short);
+ len -= sizeof(short);
+ id = EXTRACT_LE_16BITS(rp);
+ rp += sizeof(short);
+ len -= sizeof(short);
+ info = EXTRACT_LE_16BITS(rp);
+ rp += sizeof(short);
+ len -= sizeof(short);
+ ND_PRINT((ndo, "{ids %d-%d cost %d hops %d} ", id, id + count,
+ RI_COST(info), RI_HOPS(info)));
+ }
+ return (1);
+
+trunc:
+ return (0);
+}
+
+static int
+print_l2_routes(netdissect_options *ndo,
+ const char *rp, u_int len)
+{
+ int count;
+ int area;
+ int info;
+
+ /* The last short is a checksum */
+ while (len > (3 * sizeof(short))) {
+ ND_TCHECK2(*rp, 3 * sizeof(short));
+ count = EXTRACT_LE_16BITS(rp);
+ if (count > 1024)
+ return (1); /* seems to be bogus from here on */
+ rp += sizeof(short);
+ len -= sizeof(short);
+ area = EXTRACT_LE_16BITS(rp);
+ rp += sizeof(short);
+ len -= sizeof(short);
+ info = EXTRACT_LE_16BITS(rp);
+ rp += sizeof(short);
+ len -= sizeof(short);
+ ND_PRINT((ndo, "{areas %d-%d cost %d hops %d} ", area, area + count,
+ RI_COST(info), RI_HOPS(info)));
+ }
+ return (1);
+
+trunc:
+ return (0);
+}
+
+static void
+print_i_info(netdissect_options *ndo,
+ int info)
+{
+ int ntype = info & II_TYPEMASK;
+ switch (ntype) {
+ case 0: ND_PRINT((ndo, "reserved-ntype? ")); break;
+ case II_L2ROUT: ND_PRINT((ndo, "l2rout ")); break;
+ case II_L1ROUT: ND_PRINT((ndo, "l1rout ")); break;
+ case II_ENDNODE: ND_PRINT((ndo, "endnode ")); break;
+ }
+ if (info & II_VERIF)
+ ND_PRINT((ndo, "verif "));
+ if (info & II_NOMCAST)
+ ND_PRINT((ndo, "nomcast "));
+ if (info & II_BLOCK)
+ ND_PRINT((ndo, "blo "));
+}
+
+static int
+print_elist(const char *elp _U_, u_int len _U_)
+{
+ /* Not enough examples available for me to debug this */
+ return (1);
+}
+
+static int
+print_nsp(netdissect_options *ndo,
+ const u_char *nspp, u_int nsplen)
+{
+ const struct nsphdr *nsphp = (struct nsphdr *)nspp;
+ int dst, src, flags;
+
+ if (nsplen < sizeof(struct nsphdr))
+ goto trunc;
+ ND_TCHECK(*nsphp);
+ flags = EXTRACT_LE_8BITS(nsphp->nh_flags);
+ dst = EXTRACT_LE_16BITS(nsphp->nh_dst);
+ src = EXTRACT_LE_16BITS(nsphp->nh_src);
+
+ switch (flags & NSP_TYPEMASK) {
+ case MFT_DATA:
+ switch (flags & NSP_SUBMASK) {
+ case MFS_BOM:
+ case MFS_MOM:
+ case MFS_EOM:
+ case MFS_BOM+MFS_EOM:
+ ND_PRINT((ndo, "data %d>%d ", src, dst));
+ {
+ struct seghdr *shp = (struct seghdr *)nspp;
+ int ack;
+#ifdef PRINT_NSPDATA
+ u_char *dp;
+#endif
+ u_int data_off = sizeof(struct minseghdr);
+
+ if (nsplen < data_off)
+ goto trunc;
+ ND_TCHECK(shp->sh_seq[0]);
+ ack = EXTRACT_LE_16BITS(shp->sh_seq[0]);
+ if (ack & SGQ_ACK) { /* acknum field */
+ if ((ack & SGQ_NAK) == SGQ_NAK)
+ ND_PRINT((ndo, "nak %d ", ack & SGQ_MASK));
+ else
+ ND_PRINT((ndo, "ack %d ", ack & SGQ_MASK));
+ data_off += sizeof(short);
+ if (nsplen < data_off)
+ goto trunc;
+ ND_TCHECK(shp->sh_seq[1]);
+ ack = EXTRACT_LE_16BITS(shp->sh_seq[1]);
+ if (ack & SGQ_OACK) { /* ackoth field */
+ if ((ack & SGQ_ONAK) == SGQ_ONAK)
+ ND_PRINT((ndo, "onak %d ", ack & SGQ_MASK));
+ else
+ ND_PRINT((ndo, "oack %d ", ack & SGQ_MASK));
+ data_off += sizeof(short);
+ if (nsplen < data_off)
+ goto trunc;
+ ND_TCHECK(shp->sh_seq[2]);
+ ack = EXTRACT_LE_16BITS(shp->sh_seq[2]);
+ }
+ }
+ ND_PRINT((ndo, "seg %d ", ack & SGQ_MASK));
+#ifdef PRINT_NSPDATA
+ if (nsplen > data_off) {
+ dp = &(nspp[data_off]);
+ ND_TCHECK2(*dp, nsplen - data_off);
+ pdata(ndo, dp, nsplen - data_off);
+ }
+#endif
+ }
+ break;
+ case MFS_ILS+MFS_INT:
+ ND_PRINT((ndo, "intr "));
+ {
+ struct seghdr *shp = (struct seghdr *)nspp;
+ int ack;
+#ifdef PRINT_NSPDATA
+ u_char *dp;
+#endif
+ u_int data_off = sizeof(struct minseghdr);
+
+ if (nsplen < data_off)
+ goto trunc;
+ ND_TCHECK(shp->sh_seq[0]);
+ ack = EXTRACT_LE_16BITS(shp->sh_seq[0]);
+ if (ack & SGQ_ACK) { /* acknum field */
+ if ((ack & SGQ_NAK) == SGQ_NAK)
+ ND_PRINT((ndo, "nak %d ", ack & SGQ_MASK));
+ else
+ ND_PRINT((ndo, "ack %d ", ack & SGQ_MASK));
+ data_off += sizeof(short);
+ if (nsplen < data_off)
+ goto trunc;
+ ND_TCHECK(shp->sh_seq[1]);
+ ack = EXTRACT_LE_16BITS(shp->sh_seq[1]);
+ if (ack & SGQ_OACK) { /* ackdat field */
+ if ((ack & SGQ_ONAK) == SGQ_ONAK)
+ ND_PRINT((ndo, "nakdat %d ", ack & SGQ_MASK));
+ else
+ ND_PRINT((ndo, "ackdat %d ", ack & SGQ_MASK));
+ data_off += sizeof(short);
+ if (nsplen < data_off)
+ goto trunc;
+ ND_TCHECK(shp->sh_seq[2]);
+ ack = EXTRACT_LE_16BITS(shp->sh_seq[2]);
+ }
+ }
+ ND_PRINT((ndo, "seg %d ", ack & SGQ_MASK));
+#ifdef PRINT_NSPDATA
+ if (nsplen > data_off) {
+ dp = &(nspp[data_off]);
+ ND_TCHECK2(*dp, nsplen - data_off);
+ pdata(ndo, dp, nsplen - data_off);
+ }
+#endif
+ }
+ break;
+ case MFS_ILS:
+ ND_PRINT((ndo, "link-service %d>%d ", src, dst));
+ {
+ struct seghdr *shp = (struct seghdr *)nspp;
+ struct lsmsg *lsmp =
+ (struct lsmsg *)&(nspp[sizeof(struct seghdr)]);
+ int ack;
+ int lsflags, fcval;
+
+ if (nsplen < sizeof(struct seghdr) + sizeof(struct lsmsg))
+ goto trunc;
+ ND_TCHECK(shp->sh_seq[0]);
+ ack = EXTRACT_LE_16BITS(shp->sh_seq[0]);
+ if (ack & SGQ_ACK) { /* acknum field */
+ if ((ack & SGQ_NAK) == SGQ_NAK)
+ ND_PRINT((ndo, "nak %d ", ack & SGQ_MASK));
+ else
+ ND_PRINT((ndo, "ack %d ", ack & SGQ_MASK));
+ ND_TCHECK(shp->sh_seq[1]);
+ ack = EXTRACT_LE_16BITS(shp->sh_seq[1]);
+ if (ack & SGQ_OACK) { /* ackdat field */
+ if ((ack & SGQ_ONAK) == SGQ_ONAK)
+ ND_PRINT((ndo, "nakdat %d ", ack & SGQ_MASK));
+ else
+ ND_PRINT((ndo, "ackdat %d ", ack & SGQ_MASK));
+ ND_TCHECK(shp->sh_seq[2]);
+ ack = EXTRACT_LE_16BITS(shp->sh_seq[2]);
+ }
+ }
+ ND_PRINT((ndo, "seg %d ", ack & SGQ_MASK));
+ ND_TCHECK(*lsmp);
+ lsflags = EXTRACT_LE_8BITS(lsmp->ls_lsflags);
+ fcval = EXTRACT_LE_8BITS(lsmp->ls_fcval);
+ switch (lsflags & LSI_MASK) {
+ case LSI_DATA:
+ ND_PRINT((ndo, "dat seg count %d ", fcval));
+ switch (lsflags & LSM_MASK) {
+ case LSM_NOCHANGE:
+ break;
+ case LSM_DONOTSEND:
+ ND_PRINT((ndo, "donotsend-data "));
+ break;
+ case LSM_SEND:
+ ND_PRINT((ndo, "send-data "));
+ break;
+ default:
+ ND_PRINT((ndo, "reserved-fcmod? %x", lsflags));
+ break;
+ }
+ break;
+ case LSI_INTR:
+ ND_PRINT((ndo, "intr req count %d ", fcval));
+ break;
+ default:
+ ND_PRINT((ndo, "reserved-fcval-int? %x", lsflags));
+ break;
+ }
+ }
+ break;
+ default:
+ ND_PRINT((ndo, "reserved-subtype? %x %d > %d", flags, src, dst));
+ break;
+ }
+ break;
+ case MFT_ACK:
+ switch (flags & NSP_SUBMASK) {
+ case MFS_DACK:
+ ND_PRINT((ndo, "data-ack %d>%d ", src, dst));
+ {
+ struct ackmsg *amp = (struct ackmsg *)nspp;
+ int ack;
+
+ if (nsplen < sizeof(struct ackmsg))
+ goto trunc;
+ ND_TCHECK(*amp);
+ ack = EXTRACT_LE_16BITS(amp->ak_acknum[0]);
+ if (ack & SGQ_ACK) { /* acknum field */
+ if ((ack & SGQ_NAK) == SGQ_NAK)
+ ND_PRINT((ndo, "nak %d ", ack & SGQ_MASK));
+ else
+ ND_PRINT((ndo, "ack %d ", ack & SGQ_MASK));
+ ack = EXTRACT_LE_16BITS(amp->ak_acknum[1]);
+ if (ack & SGQ_OACK) { /* ackoth field */
+ if ((ack & SGQ_ONAK) == SGQ_ONAK)
+ ND_PRINT((ndo, "onak %d ", ack & SGQ_MASK));
+ else
+ ND_PRINT((ndo, "oack %d ", ack & SGQ_MASK));
+ }
+ }
+ }
+ break;
+ case MFS_IACK:
+ ND_PRINT((ndo, "ils-ack %d>%d ", src, dst));
+ {
+ struct ackmsg *amp = (struct ackmsg *)nspp;
+ int ack;
+
+ if (nsplen < sizeof(struct ackmsg))
+ goto trunc;
+ ND_TCHECK(*amp);
+ ack = EXTRACT_LE_16BITS(amp->ak_acknum[0]);
+ if (ack & SGQ_ACK) { /* acknum field */
+ if ((ack & SGQ_NAK) == SGQ_NAK)
+ ND_PRINT((ndo, "nak %d ", ack & SGQ_MASK));
+ else
+ ND_PRINT((ndo, "ack %d ", ack & SGQ_MASK));
+ ND_TCHECK(amp->ak_acknum[1]);
+ ack = EXTRACT_LE_16BITS(amp->ak_acknum[1]);
+ if (ack & SGQ_OACK) { /* ackdat field */
+ if ((ack & SGQ_ONAK) == SGQ_ONAK)
+ ND_PRINT((ndo, "nakdat %d ", ack & SGQ_MASK));
+ else
+ ND_PRINT((ndo, "ackdat %d ", ack & SGQ_MASK));
+ }
+ }
+ }
+ break;
+ case MFS_CACK:
+ ND_PRINT((ndo, "conn-ack %d", dst));
+ break;
+ default:
+ ND_PRINT((ndo, "reserved-acktype? %x %d > %d", flags, src, dst));
+ break;
+ }
+ break;
+ case MFT_CTL:
+ switch (flags & NSP_SUBMASK) {
+ case MFS_CI:
+ case MFS_RCI:
+ if ((flags & NSP_SUBMASK) == MFS_CI)
+ ND_PRINT((ndo, "conn-initiate "));
+ else
+ ND_PRINT((ndo, "retrans-conn-initiate "));
+ ND_PRINT((ndo, "%d>%d ", src, dst));
+ {
+ struct cimsg *cimp = (struct cimsg *)nspp;
+ int services, info, segsize;
+#ifdef PRINT_NSPDATA
+ u_char *dp;
+#endif
+
+ if (nsplen < sizeof(struct cimsg))
+ goto trunc;
+ ND_TCHECK(*cimp);
+ services = EXTRACT_LE_8BITS(cimp->ci_services);
+ info = EXTRACT_LE_8BITS(cimp->ci_info);
+ segsize = EXTRACT_LE_16BITS(cimp->ci_segsize);
+
+ switch (services & COS_MASK) {
+ case COS_NONE:
+ break;
+ case COS_SEGMENT:
+ ND_PRINT((ndo, "seg "));
+ break;
+ case COS_MESSAGE:
+ ND_PRINT((ndo, "msg "));
+ break;
+ case COS_CRYPTSER:
+ ND_PRINT((ndo, "crypt "));
+ break;
+ }
+ switch (info & COI_MASK) {
+ case COI_32:
+ ND_PRINT((ndo, "ver 3.2 "));
+ break;
+ case COI_31:
+ ND_PRINT((ndo, "ver 3.1 "));
+ break;
+ case COI_40:
+ ND_PRINT((ndo, "ver 4.0 "));
+ break;
+ case COI_41:
+ ND_PRINT((ndo, "ver 4.1 "));
+ break;
+ }
+ ND_PRINT((ndo, "segsize %d ", segsize));
+#ifdef PRINT_NSPDATA
+ if (nsplen > sizeof(struct cimsg)) {
+ dp = &(nspp[sizeof(struct cimsg)]);
+ ND_TCHECK2(*dp, nsplen - sizeof(struct cimsg));
+ pdata(ndo, dp, nsplen - sizeof(struct cimsg));
+ }
+#endif
+ }
+ break;
+ case MFS_CC:
+ ND_PRINT((ndo, "conn-confirm %d>%d ", src, dst));
+ {
+ struct ccmsg *ccmp = (struct ccmsg *)nspp;
+ int services, info;
+ u_int segsize, optlen;
+#ifdef PRINT_NSPDATA
+ u_char *dp;
+#endif
+
+ if (nsplen < sizeof(struct ccmsg))
+ goto trunc;
+ ND_TCHECK(*ccmp);
+ services = EXTRACT_LE_8BITS(ccmp->cc_services);
+ info = EXTRACT_LE_8BITS(ccmp->cc_info);
+ segsize = EXTRACT_LE_16BITS(ccmp->cc_segsize);
+ optlen = EXTRACT_LE_8BITS(ccmp->cc_optlen);
+
+ switch (services & COS_MASK) {
+ case COS_NONE:
+ break;
+ case COS_SEGMENT:
+ ND_PRINT((ndo, "seg "));
+ break;
+ case COS_MESSAGE:
+ ND_PRINT((ndo, "msg "));
+ break;
+ case COS_CRYPTSER:
+ ND_PRINT((ndo, "crypt "));
+ break;
+ }
+ switch (info & COI_MASK) {
+ case COI_32:
+ ND_PRINT((ndo, "ver 3.2 "));
+ break;
+ case COI_31:
+ ND_PRINT((ndo, "ver 3.1 "));
+ break;
+ case COI_40:
+ ND_PRINT((ndo, "ver 4.0 "));
+ break;
+ case COI_41:
+ ND_PRINT((ndo, "ver 4.1 "));
+ break;
+ }
+ ND_PRINT((ndo, "segsize %d ", segsize));
+ if (optlen) {
+ ND_PRINT((ndo, "optlen %d ", optlen));
+#ifdef PRINT_NSPDATA
+ if (optlen > nsplen - sizeof(struct ccmsg))
+ goto trunc;
+ dp = &(nspp[sizeof(struct ccmsg)]);
+ ND_TCHECK2(*dp, optlen);
+ pdata(ndo, dp, optlen);
+#endif
+ }
+ }
+ break;
+ case MFS_DI:
+ ND_PRINT((ndo, "disconn-initiate %d>%d ", src, dst));
+ {
+ struct dimsg *dimp = (struct dimsg *)nspp;
+ int reason;
+ u_int optlen;
+#ifdef PRINT_NSPDATA
+ u_char *dp;
+#endif
+
+ if (nsplen < sizeof(struct dimsg))
+ goto trunc;
+ ND_TCHECK(*dimp);
+ reason = EXTRACT_LE_16BITS(dimp->di_reason);
+ optlen = EXTRACT_LE_8BITS(dimp->di_optlen);
+
+ print_reason(ndo, reason);
+ if (optlen) {
+ ND_PRINT((ndo, "optlen %d ", optlen));
+#ifdef PRINT_NSPDATA
+ if (optlen > nsplen - sizeof(struct dimsg))
+ goto trunc;
+ dp = &(nspp[sizeof(struct dimsg)]);
+ ND_TCHECK2(*dp, optlen);
+ pdata(ndo, dp, optlen);
+#endif
+ }
+ }
+ break;
+ case MFS_DC:
+ ND_PRINT((ndo, "disconn-confirm %d>%d ", src, dst));
+ {
+ struct dcmsg *dcmp = (struct dcmsg *)nspp;
+ int reason;
+
+ ND_TCHECK(*dcmp);
+ reason = EXTRACT_LE_16BITS(dcmp->dc_reason);
+
+ print_reason(ndo, reason);
+ }
+ break;
+ default:
+ ND_PRINT((ndo, "reserved-ctltype? %x %d > %d", flags, src, dst));
+ break;
+ }
+ break;
+ default:
+ ND_PRINT((ndo, "reserved-type? %x %d > %d", flags, src, dst));
+ break;
+ }
+ return (1);
+
+trunc:
+ return (0);
+}
+
+static const struct tok reason2str[] = {
+ { UC_OBJREJECT, "object rejected connect" },
+ { UC_RESOURCES, "insufficient resources" },
+ { UC_NOSUCHNODE, "unrecognized node name" },
+ { DI_SHUT, "node is shutting down" },
+ { UC_NOSUCHOBJ, "unrecognized object" },
+ { UC_INVOBJFORMAT, "invalid object name format" },
+ { UC_OBJTOOBUSY, "object too busy" },
+ { DI_PROTOCOL, "protocol error discovered" },
+ { DI_TPA, "third party abort" },
+ { UC_USERABORT, "user abort" },
+ { UC_INVNODEFORMAT, "invalid node name format" },
+ { UC_LOCALSHUT, "local node shutting down" },
+ { DI_LOCALRESRC, "insufficient local resources" },
+ { DI_REMUSERRESRC, "insufficient remote user resources" },
+ { UC_ACCESSREJECT, "invalid access control information" },
+ { DI_BADACCNT, "bad ACCOUNT information" },
+ { UC_NORESPONSE, "no response from object" },
+ { UC_UNREACHABLE, "node unreachable" },
+ { DC_NOLINK, "no link terminate" },
+ { DC_COMPLETE, "disconnect complete" },
+ { DI_BADIMAGE, "bad image data in connect" },
+ { DI_SERVMISMATCH, "cryptographic service mismatch" },
+ { 0, NULL }
+};
+
+static void
+print_reason(netdissect_options *ndo,
+ register int reason)
+{
+ ND_PRINT((ndo, "%s ", tok2str(reason2str, "reason-%d", reason)));
+}
+
+const char *
+dnnum_string(u_short dnaddr)
+{
+ char *str;
+ size_t siz;
+ int area = (u_short)(dnaddr & AREAMASK) >> AREASHIFT;
+ int node = dnaddr & NODEMASK;
+
+ str = (char *)malloc(siz = sizeof("00.0000"));
+ if (str == NULL)
+ error("dnnum_string: malloc");
+ snprintf(str, siz, "%d.%d", area, node);
+ return(str);
+}
+
+const char *
+dnname_string(u_short dnaddr)
+{
+#ifdef HAVE_DNET_HTOA
+ struct dn_naddr dna;
+ char *dnname;
+
+ dna.a_len = sizeof(short);
+ memcpy((char *)dna.a_addr, (char *)&dnaddr, sizeof(short));
+ dnname = dnet_htoa(&dna);
+ if(dnname != NULL)
+ return (strdup(dnname));
+ else
+ return(dnnum_string(dnaddr));
+#else
+ return(dnnum_string(dnaddr)); /* punt */
+#endif
+}
+
+#ifdef PRINT_NSPDATA
+static void
+pdata(netdissect_options *ndo,
+ u_char *dp, u_int maxlen)
+{
+ char c;
+ u_int x = maxlen;
+
+ while (x-- > 0) {
+ c = *dp++;
+ safeputchar(ndo, c);
+ }
+}
+#endif
--- /dev/null
+/*
+ * Copyright (C) 1998 and 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.
+ */
+/*
+ * RFC3315: DHCPv6
+ * supported DHCPv6 options:
+ * RFC3319: Session Initiation Protocol (SIP) Servers options,
+ * RFC3633: IPv6 Prefix options,
+ * RFC3646: DNS Configuration options,
+ * RFC3898: Network Information Service (NIS) Configuration options,
+ * RFC4075: Simple Network Time Protocol (SNTP) Configuration option,
+ * RFC4242: Information Refresh Time option,
+ * RFC4280: Broadcast and Multicast Control Servers options,
+ * RFC5908: Network Time Protocol (NTP) Server Option for DHCPv6
+ * RFC6334: Dual-Stack Lite option,
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-dhcp6.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+/* lease duration */
+#define DHCP6_DURATION_INFINITE 0xffffffff
+
+/* Error Values */
+#define DH6ERR_FAILURE 16
+#define DH6ERR_AUTHFAIL 17
+#define DH6ERR_POORLYFORMED 18
+#define DH6ERR_UNAVAIL 19
+#define DH6ERR_OPTUNAVAIL 20
+
+/* Message type */
+#define DH6_SOLICIT 1
+#define DH6_ADVERTISE 2
+#define DH6_REQUEST 3
+#define DH6_CONFIRM 4
+#define DH6_RENEW 5
+#define DH6_REBIND 6
+#define DH6_REPLY 7
+#define DH6_RELEASE 8
+#define DH6_DECLINE 9
+#define DH6_RECONFIGURE 10
+#define DH6_INFORM_REQ 11
+#define DH6_RELAY_FORW 12
+#define DH6_RELAY_REPLY 13
+#define DH6_LEASEQUERY 14
+#define DH6_LQ_REPLY 15
+
+static const struct tok dh6_msgtype_str[] = {
+ { DH6_SOLICIT, "solicit" },
+ { DH6_ADVERTISE, "advertise" },
+ { DH6_REQUEST, "request" },
+ { DH6_CONFIRM, "confirm" },
+ { DH6_RENEW, "renew" },
+ { DH6_REBIND, "rebind" },
+ { DH6_REPLY, "reply" },
+ { DH6_RELEASE, "release" },
+ { DH6_DECLINE, "decline" },
+ { DH6_RECONFIGURE, "reconfigure" },
+ { DH6_INFORM_REQ, "inf-req" },
+ { DH6_RELAY_FORW, "relay-fwd" },
+ { DH6_RELAY_REPLY, "relay-reply" },
+ { DH6_LEASEQUERY, "leasequery" },
+ { DH6_LQ_REPLY, "leasequery-reply" },
+ { 0, NULL }
+};
+
+/* DHCP6 base packet format */
+struct dhcp6 {
+ union {
+ uint8_t m;
+ uint32_t x;
+ } dh6_msgtypexid;
+ /* options follow */
+};
+#define dh6_msgtype dh6_msgtypexid.m
+#define dh6_xid dh6_msgtypexid.x
+#define DH6_XIDMASK 0x00ffffff
+
+/* DHCPv6 relay messages */
+struct dhcp6_relay {
+ uint8_t dh6relay_msgtype;
+ uint8_t dh6relay_hcnt;
+ uint8_t dh6relay_linkaddr[16]; /* XXX: badly aligned */
+ uint8_t dh6relay_peeraddr[16];
+ /* options follow */
+};
+
+/* options */
+#define DH6OPT_CLIENTID 1
+#define DH6OPT_SERVERID 2
+#define DH6OPT_IA_NA 3
+#define DH6OPT_IA_TA 4
+#define DH6OPT_IA_ADDR 5
+#define DH6OPT_ORO 6
+#define DH6OPT_PREFERENCE 7
+# define DH6OPT_PREF_MAX 255
+#define DH6OPT_ELAPSED_TIME 8
+#define DH6OPT_RELAY_MSG 9
+/*#define DH6OPT_SERVER_MSG 10 deprecated */
+#define DH6OPT_AUTH 11
+# define DH6OPT_AUTHPROTO_DELAYED 2
+# define DH6OPT_AUTHPROTO_RECONFIG 3
+# define DH6OPT_AUTHALG_HMACMD5 1
+# define DH6OPT_AUTHRDM_MONOCOUNTER 0
+# define DH6OPT_AUTHRECONFIG_KEY 1
+# define DH6OPT_AUTHRECONFIG_HMACMD5 2
+#define DH6OPT_UNICAST 12
+#define DH6OPT_STATUS_CODE 13
+# define DH6OPT_STCODE_SUCCESS 0
+# define DH6OPT_STCODE_UNSPECFAIL 1
+# define DH6OPT_STCODE_NOADDRAVAIL 2
+# define DH6OPT_STCODE_NOBINDING 3
+# define DH6OPT_STCODE_NOTONLINK 4
+# define DH6OPT_STCODE_USEMULTICAST 5
+# define DH6OPT_STCODE_NOPREFIXAVAIL 6
+# define DH6OPT_STCODE_UNKNOWNQUERYTYPE 7
+# define DH6OPT_STCODE_MALFORMEDQUERY 8
+# define DH6OPT_STCODE_NOTCONFIGURED 9
+# define DH6OPT_STCODE_NOTALLOWED 10
+#define DH6OPT_RAPID_COMMIT 14
+#define DH6OPT_USER_CLASS 15
+#define DH6OPT_VENDOR_CLASS 16
+#define DH6OPT_VENDOR_OPTS 17
+#define DH6OPT_INTERFACE_ID 18
+#define DH6OPT_RECONF_MSG 19
+#define DH6OPT_RECONF_ACCEPT 20
+#define DH6OPT_SIP_SERVER_D 21
+#define DH6OPT_SIP_SERVER_A 22
+#define DH6OPT_DNS_SERVERS 23
+#define DH6OPT_DOMAIN_LIST 24
+#define DH6OPT_IA_PD 25
+#define DH6OPT_IA_PD_PREFIX 26
+#define DH6OPT_NIS_SERVERS 27
+#define DH6OPT_NISP_SERVERS 28
+#define DH6OPT_NIS_NAME 29
+#define DH6OPT_NISP_NAME 30
+#define DH6OPT_SNTP_SERVERS 31
+#define DH6OPT_LIFETIME 32
+#define DH6OPT_BCMCS_SERVER_D 33
+#define DH6OPT_BCMCS_SERVER_A 34
+#define DH6OPT_GEOCONF_CIVIC 36
+#define DH6OPT_REMOTE_ID 37
+#define DH6OPT_SUBSCRIBER_ID 38
+#define DH6OPT_CLIENT_FQDN 39
+#define DH6OPT_PANA_AGENT 40
+#define DH6OPT_NEW_POSIX_TIMEZONE 41
+#define DH6OPT_NEW_TZDB_TIMEZONE 42
+#define DH6OPT_ERO 43
+#define DH6OPT_LQ_QUERY 44
+#define DH6OPT_CLIENT_DATA 45
+#define DH6OPT_CLT_TIME 46
+#define DH6OPT_LQ_RELAY_DATA 47
+#define DH6OPT_LQ_CLIENT_LINK 48
+#define DH6OPT_NTP_SERVER 56
+# define DH6OPT_NTP_SUBOPTION_SRV_ADDR 1
+# define DH6OPT_NTP_SUBOPTION_MC_ADDR 2
+# define DH6OPT_NTP_SUBOPTION_SRV_FQDN 3
+#define DH6OPT_AFTR_NAME 64
+
+static const struct tok dh6opt_str[] = {
+ { DH6OPT_CLIENTID, "client-ID" },
+ { DH6OPT_SERVERID, "server-ID" },
+ { DH6OPT_IA_NA, "IA_NA" },
+ { DH6OPT_IA_TA, "IA_TA" },
+ { DH6OPT_IA_ADDR, "IA_ADDR" },
+ { DH6OPT_ORO, "option-request" },
+ { DH6OPT_PREFERENCE, "preference" },
+ { DH6OPT_ELAPSED_TIME, "elapsed-time" },
+ { DH6OPT_RELAY_MSG, "relay-message" },
+ { DH6OPT_AUTH, "authentication" },
+ { DH6OPT_UNICAST, "server-unicast" },
+ { DH6OPT_STATUS_CODE, "status-code" },
+ { DH6OPT_RAPID_COMMIT, "rapid-commit" },
+ { DH6OPT_USER_CLASS, "user-class" },
+ { DH6OPT_VENDOR_CLASS, "vendor-class" },
+ { DH6OPT_VENDOR_OPTS, "vendor-specific-info" },
+ { DH6OPT_INTERFACE_ID, "interface-ID" },
+ { DH6OPT_RECONF_MSG, "reconfigure-message" },
+ { DH6OPT_RECONF_ACCEPT, "reconfigure-accept" },
+ { DH6OPT_SIP_SERVER_D, "SIP-servers-domain" },
+ { DH6OPT_SIP_SERVER_A, "SIP-servers-address" },
+ { DH6OPT_DNS_SERVERS, "DNS-server" },
+ { DH6OPT_DOMAIN_LIST, "DNS-search-list" },
+ { DH6OPT_IA_PD, "IA_PD" },
+ { DH6OPT_IA_PD_PREFIX, "IA_PD-prefix" },
+ { DH6OPT_SNTP_SERVERS, "SNTP-servers" },
+ { DH6OPT_LIFETIME, "lifetime" },
+ { DH6OPT_NIS_SERVERS, "NIS-server" },
+ { DH6OPT_NISP_SERVERS, "NIS+-server" },
+ { DH6OPT_NIS_NAME, "NIS-domain-name" },
+ { DH6OPT_NISP_NAME, "NIS+-domain-name" },
+ { DH6OPT_BCMCS_SERVER_D, "BCMCS-domain-name" },
+ { DH6OPT_BCMCS_SERVER_A, "BCMCS-server" },
+ { DH6OPT_GEOCONF_CIVIC, "Geoconf-Civic" },
+ { DH6OPT_REMOTE_ID, "Remote-ID" },
+ { DH6OPT_SUBSCRIBER_ID, "Subscriber-ID" },
+ { DH6OPT_CLIENT_FQDN, "Client-FQDN" },
+ { DH6OPT_PANA_AGENT, "PANA-agent" },
+ { DH6OPT_NEW_POSIX_TIMEZONE, "POSIX-timezone" },
+ { DH6OPT_NEW_TZDB_TIMEZONE, "POSIX-tz-database" },
+ { DH6OPT_ERO, "Echo-request-option" },
+ { DH6OPT_LQ_QUERY, "Lease-query" },
+ { DH6OPT_CLIENT_DATA, "LQ-client-data" },
+ { DH6OPT_CLT_TIME, "Clt-time" },
+ { DH6OPT_LQ_RELAY_DATA, "LQ-relay-data" },
+ { DH6OPT_LQ_CLIENT_LINK, "LQ-client-link" },
+ { DH6OPT_NTP_SERVER, "NTP-server" },
+ { DH6OPT_AFTR_NAME, "AFTR-Name" },
+ { 0, NULL }
+};
+
+static const struct tok dh6opt_stcode_str[] = {
+ { DH6OPT_STCODE_SUCCESS, "success" },
+ { DH6OPT_STCODE_UNSPECFAIL, "unspec failure" },
+ { DH6OPT_STCODE_NOADDRAVAIL, "no addresses" },
+ { DH6OPT_STCODE_NOBINDING, "no binding" },
+ { DH6OPT_STCODE_NOTONLINK, "not on-link" },
+ { DH6OPT_STCODE_USEMULTICAST, "use multicast" },
+ { DH6OPT_STCODE_NOPREFIXAVAIL, "no prefixes" },
+ { DH6OPT_STCODE_UNKNOWNQUERYTYPE, "unknown query type" },
+ { DH6OPT_STCODE_MALFORMEDQUERY, "malformed query" },
+ { DH6OPT_STCODE_NOTCONFIGURED, "not configured" },
+ { DH6OPT_STCODE_NOTALLOWED, "not allowed" },
+ { 0, NULL }
+};
+
+struct dhcp6opt {
+ uint16_t dh6opt_type;
+ uint16_t dh6opt_len;
+ /* type-dependent data follows */
+};
+
+static const char *
+dhcp6stcode(const uint16_t code)
+{
+ return code > 255 ? "INVALID code" : tok2str(dh6opt_stcode_str, "code%u", code);
+}
+
+static void
+dhcp6opt_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep)
+{
+ const struct dhcp6opt *dh6o;
+ const u_char *tp;
+ size_t i;
+ uint16_t opttype;
+ size_t optlen;
+ uint8_t auth_proto;
+ u_int authinfolen, authrealmlen;
+ int remain_len; /* Length of remaining options */
+ int label_len; /* Label length */
+ uint16_t subopt_code;
+ uint16_t subopt_len;
+
+ if (cp == ep)
+ return;
+ while (cp < ep) {
+ if (ep < cp + sizeof(*dh6o))
+ goto trunc;
+ dh6o = (struct dhcp6opt *)cp;
+ ND_TCHECK(*dh6o);
+ optlen = EXTRACT_16BITS(&dh6o->dh6opt_len);
+ if (ep < cp + sizeof(*dh6o) + optlen)
+ goto trunc;
+ opttype = EXTRACT_16BITS(&dh6o->dh6opt_type);
+ ND_PRINT((ndo, " (%s", tok2str(dh6opt_str, "opt_%u", opttype)));
+ switch (opttype) {
+ case DH6OPT_CLIENTID:
+ case DH6OPT_SERVERID:
+ if (optlen < 2) {
+ /*(*/
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ switch (EXTRACT_16BITS(tp)) {
+ case 1:
+ if (optlen >= 2 + 6) {
+ ND_PRINT((ndo, " hwaddr/time type %u time %u ",
+ EXTRACT_16BITS(&tp[2]),
+ EXTRACT_32BITS(&tp[4])));
+ for (i = 8; i < optlen; i++)
+ ND_PRINT((ndo, "%02x", tp[i]));
+ /*(*/
+ ND_PRINT((ndo, ")"));
+ } else {
+ /*(*/
+ ND_PRINT((ndo, " ?)"));
+ }
+ break;
+ case 2:
+ if (optlen >= 2 + 8) {
+ ND_PRINT((ndo, " vid "));
+ for (i = 2; i < 2 + 8; i++)
+ ND_PRINT((ndo, "%02x", tp[i]));
+ /*(*/
+ ND_PRINT((ndo, ")"));
+ } else {
+ /*(*/
+ ND_PRINT((ndo, " ?)"));
+ }
+ break;
+ case 3:
+ if (optlen >= 2 + 2) {
+ ND_PRINT((ndo, " hwaddr type %u ",
+ EXTRACT_16BITS(&tp[2])));
+ for (i = 4; i < optlen; i++)
+ ND_PRINT((ndo, "%02x", tp[i]));
+ /*(*/
+ ND_PRINT((ndo, ")"));
+ } else {
+ /*(*/
+ ND_PRINT((ndo, " ?)"));
+ }
+ break;
+ default:
+ ND_PRINT((ndo, " type %d)", EXTRACT_16BITS(tp)));
+ break;
+ }
+ break;
+ case DH6OPT_IA_ADDR:
+ if (optlen < 24) {
+ /*(*/
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ ND_PRINT((ndo, " %s", ip6addr_string(ndo, &tp[0])));
+ ND_PRINT((ndo, " pltime:%u vltime:%u",
+ EXTRACT_32BITS(&tp[16]),
+ EXTRACT_32BITS(&tp[20])));
+ if (optlen > 24) {
+ /* there are sub-options */
+ dhcp6opt_print(ndo, tp + 24, tp + optlen);
+ }
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_ORO:
+ case DH6OPT_ERO:
+ if (optlen % 2) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ for (i = 0; i < optlen; i += 2) {
+ ND_PRINT((ndo, " %s",
+ tok2str(dh6opt_str, "opt_%u", EXTRACT_16BITS(&tp[i]))));
+ }
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_PREFERENCE:
+ if (optlen != 1) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ ND_PRINT((ndo, " %d)", *tp));
+ break;
+ case DH6OPT_ELAPSED_TIME:
+ if (optlen != 2) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ ND_PRINT((ndo, " %d)", EXTRACT_16BITS(tp)));
+ break;
+ case DH6OPT_RELAY_MSG:
+ ND_PRINT((ndo, " ("));
+ tp = (u_char *)(dh6o + 1);
+ dhcp6_print(ndo, tp, optlen);
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_AUTH:
+ if (optlen < 11) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ auth_proto = *tp;
+ switch (auth_proto) {
+ case DH6OPT_AUTHPROTO_DELAYED:
+ ND_PRINT((ndo, " proto: delayed"));
+ break;
+ case DH6OPT_AUTHPROTO_RECONFIG:
+ ND_PRINT((ndo, " proto: reconfigure"));
+ break;
+ default:
+ ND_PRINT((ndo, " proto: %d", auth_proto));
+ break;
+ }
+ tp++;
+ switch (*tp) {
+ case DH6OPT_AUTHALG_HMACMD5:
+ /* XXX: may depend on the protocol */
+ ND_PRINT((ndo, ", alg: HMAC-MD5"));
+ break;
+ default:
+ ND_PRINT((ndo, ", alg: %d", *tp));
+ break;
+ }
+ tp++;
+ switch (*tp) {
+ case DH6OPT_AUTHRDM_MONOCOUNTER:
+ ND_PRINT((ndo, ", RDM: mono"));
+ break;
+ default:
+ ND_PRINT((ndo, ", RDM: %d", *tp));
+ break;
+ }
+ tp++;
+ ND_PRINT((ndo, ", RD:"));
+ for (i = 0; i < 4; i++, tp += 2)
+ ND_PRINT((ndo, " %04x", EXTRACT_16BITS(tp)));
+
+ /* protocol dependent part */
+ authinfolen = optlen - 11;
+ switch (auth_proto) {
+ case DH6OPT_AUTHPROTO_DELAYED:
+ if (authinfolen == 0)
+ break;
+ if (authinfolen < 20) {
+ ND_PRINT((ndo, " ??"));
+ break;
+ }
+ authrealmlen = authinfolen - 20;
+ if (authrealmlen > 0) {
+ ND_PRINT((ndo, ", realm: "));
+ }
+ for (i = 0; i < authrealmlen; i++, tp++)
+ ND_PRINT((ndo, "%02x", *tp));
+ ND_PRINT((ndo, ", key ID: %08x", EXTRACT_32BITS(tp)));
+ tp += 4;
+ ND_PRINT((ndo, ", HMAC-MD5:"));
+ for (i = 0; i < 4; i++, tp+= 4)
+ ND_PRINT((ndo, " %08x", EXTRACT_32BITS(tp)));
+ break;
+ case DH6OPT_AUTHPROTO_RECONFIG:
+ if (authinfolen != 17) {
+ ND_PRINT((ndo, " ??"));
+ break;
+ }
+ switch (*tp++) {
+ case DH6OPT_AUTHRECONFIG_KEY:
+ ND_PRINT((ndo, " reconfig-key"));
+ break;
+ case DH6OPT_AUTHRECONFIG_HMACMD5:
+ ND_PRINT((ndo, " type: HMAC-MD5"));
+ break;
+ default:
+ ND_PRINT((ndo, " type: ??"));
+ break;
+ }
+ ND_PRINT((ndo, " value:"));
+ for (i = 0; i < 4; i++, tp+= 4)
+ ND_PRINT((ndo, " %08x", EXTRACT_32BITS(tp)));
+ break;
+ default:
+ ND_PRINT((ndo, " ??"));
+ break;
+ }
+
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_RAPID_COMMIT: /* nothing todo */
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_INTERFACE_ID:
+ case DH6OPT_SUBSCRIBER_ID:
+ /*
+ * Since we cannot predict the encoding, print hex dump
+ * at most 10 characters.
+ */
+ tp = (u_char *)(dh6o + 1);
+ ND_PRINT((ndo, " "));
+ for (i = 0; i < optlen && i < 10; i++)
+ ND_PRINT((ndo, "%02x", tp[i]));
+ ND_PRINT((ndo, "...)"));
+ break;
+ case DH6OPT_RECONF_MSG:
+ tp = (u_char *)(dh6o + 1);
+ switch (*tp) {
+ case DH6_RENEW:
+ ND_PRINT((ndo, " for renew)"));
+ break;
+ case DH6_INFORM_REQ:
+ ND_PRINT((ndo, " for inf-req)"));
+ break;
+ default:
+ ND_PRINT((ndo, " for ?\?\?(%02x))", *tp));
+ break;
+ }
+ break;
+ case DH6OPT_RECONF_ACCEPT: /* nothing todo */
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_SIP_SERVER_A:
+ case DH6OPT_DNS_SERVERS:
+ case DH6OPT_SNTP_SERVERS:
+ case DH6OPT_NIS_SERVERS:
+ case DH6OPT_NISP_SERVERS:
+ case DH6OPT_BCMCS_SERVER_A:
+ case DH6OPT_PANA_AGENT:
+ case DH6OPT_LQ_CLIENT_LINK:
+ if (optlen % 16) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ for (i = 0; i < optlen; i += 16)
+ ND_PRINT((ndo, " %s", ip6addr_string(ndo, &tp[i])));
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_SIP_SERVER_D:
+ case DH6OPT_DOMAIN_LIST:
+ tp = (u_char *)(dh6o + 1);
+ while (tp < cp + sizeof(*dh6o) + optlen) {
+ ND_PRINT((ndo, " "));
+ if ((tp = ns_nprint(ndo, tp, cp + sizeof(*dh6o) + optlen)) == NULL)
+ goto trunc;
+ }
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_STATUS_CODE:
+ if (optlen < 2) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ ND_PRINT((ndo, " %s)", dhcp6stcode(EXTRACT_16BITS(&tp[0]))));
+ break;
+ case DH6OPT_IA_NA:
+ case DH6OPT_IA_PD:
+ if (optlen < 12) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ ND_PRINT((ndo, " IAID:%u T1:%u T2:%u",
+ EXTRACT_32BITS(&tp[0]),
+ EXTRACT_32BITS(&tp[4]),
+ EXTRACT_32BITS(&tp[8])));
+ if (optlen > 12) {
+ /* there are sub-options */
+ dhcp6opt_print(ndo, tp + 12, tp + optlen);
+ }
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_IA_TA:
+ if (optlen < 4) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ ND_PRINT((ndo, " IAID:%u", EXTRACT_32BITS(tp)));
+ if (optlen > 4) {
+ /* there are sub-options */
+ dhcp6opt_print(ndo, tp + 4, tp + optlen);
+ }
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_IA_PD_PREFIX:
+ if (optlen < 25) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ ND_PRINT((ndo, " %s/%d", ip6addr_string(ndo, &tp[9]), tp[8]));
+ ND_PRINT((ndo, " pltime:%u vltime:%u",
+ EXTRACT_32BITS(&tp[0]),
+ EXTRACT_32BITS(&tp[4])));
+ if (optlen > 25) {
+ /* there are sub-options */
+ dhcp6opt_print(ndo, tp + 25, tp + optlen);
+ }
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_LIFETIME:
+ case DH6OPT_CLT_TIME:
+ if (optlen != 4) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ ND_PRINT((ndo, " %d)", EXTRACT_32BITS(tp)));
+ break;
+ case DH6OPT_REMOTE_ID:
+ if (optlen < 4) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ ND_PRINT((ndo, " %d ", EXTRACT_32BITS(tp)));
+ /*
+ * Print hex dump first 10 characters.
+ */
+ for (i = 4; i < optlen && i < 14; i++)
+ ND_PRINT((ndo, "%02x", tp[i]));
+ ND_PRINT((ndo, "...)"));
+ break;
+ case DH6OPT_LQ_QUERY:
+ if (optlen < 17) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ switch (*tp) {
+ case 1:
+ ND_PRINT((ndo, " by-address"));
+ break;
+ case 2:
+ ND_PRINT((ndo, " by-clientID"));
+ break;
+ default:
+ ND_PRINT((ndo, " type_%d", (int)*tp));
+ break;
+ }
+ ND_PRINT((ndo, " %s", ip6addr_string(ndo, &tp[1])));
+ if (optlen > 17) {
+ /* there are query-options */
+ dhcp6opt_print(ndo, tp + 17, tp + optlen);
+ }
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_CLIENT_DATA:
+ tp = (u_char *)(dh6o + 1);
+ if (optlen > 0) {
+ /* there are encapsulated options */
+ dhcp6opt_print(ndo, tp, tp + optlen);
+ }
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_LQ_RELAY_DATA:
+ if (optlen < 16) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ ND_PRINT((ndo, " %s ", ip6addr_string(ndo, &tp[0])));
+ /*
+ * Print hex dump first 10 characters.
+ */
+ for (i = 16; i < optlen && i < 26; i++)
+ ND_PRINT((ndo, "%02x", tp[i]));
+ ND_PRINT((ndo, "...)"));
+ break;
+ case DH6OPT_NTP_SERVER:
+ if (optlen < 4) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ while (tp < cp + sizeof(*dh6o) + optlen - 4) {
+ subopt_code = EXTRACT_16BITS(tp);
+ tp += 2;
+ subopt_len = EXTRACT_16BITS(tp);
+ tp += 2;
+ if (tp + subopt_len > cp + sizeof(*dh6o) + optlen)
+ goto trunc;
+ ND_PRINT((ndo, " subopt:%d", subopt_code));
+ switch (subopt_code) {
+ case DH6OPT_NTP_SUBOPTION_SRV_ADDR:
+ case DH6OPT_NTP_SUBOPTION_MC_ADDR:
+ if (subopt_len != 16) {
+ ND_PRINT((ndo, " ?"));
+ break;
+ }
+ ND_PRINT((ndo, " %s", ip6addr_string(ndo, &tp[0])));
+ break;
+ case DH6OPT_NTP_SUBOPTION_SRV_FQDN:
+ ND_PRINT((ndo, " "));
+ if (ns_nprint(ndo, tp, tp + subopt_len) == NULL)
+ goto trunc;
+ break;
+ default:
+ ND_PRINT((ndo, " ?"));
+ break;
+ }
+ tp += subopt_len;
+ }
+ ND_PRINT((ndo, ")"));
+ break;
+ case DH6OPT_AFTR_NAME:
+ if (optlen < 3) {
+ ND_PRINT((ndo, " ?)"));
+ break;
+ }
+ tp = (u_char *)(dh6o + 1);
+ remain_len = optlen;
+ ND_PRINT((ndo, " "));
+ /* Encoding is described in section 3.1 of RFC 1035 */
+ while (remain_len && *tp) {
+ label_len = *tp++;
+ if (label_len < remain_len - 1) {
+ ND_PRINT((ndo, "%.*s", label_len, tp));
+ tp += label_len;
+ remain_len -= (label_len + 1);
+ if(*tp) ND_PRINT((ndo, "."));
+ } else {
+ ND_PRINT((ndo, " ?"));
+ break;
+ }
+ }
+ ND_PRINT((ndo, ")"));
+ break;
+ default:
+ ND_PRINT((ndo, ")"));
+ break;
+ }
+
+ cp += sizeof(*dh6o) + optlen;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|dhcp6ext]"));
+}
+
+/*
+ * Print dhcp6 packets
+ */
+void
+dhcp6_print(netdissect_options *ndo,
+ const u_char *cp, u_int length)
+{
+ struct dhcp6 *dh6;
+ struct dhcp6_relay *dh6relay;
+ const u_char *ep;
+ u_char *extp;
+ const char *name;
+
+ ND_PRINT((ndo, "dhcp6"));
+
+ ep = (u_char *)ndo->ndo_snapend;
+ if (cp + length < ep)
+ ep = cp + length;
+
+ dh6 = (struct dhcp6 *)cp;
+ dh6relay = (struct dhcp6_relay *)cp;
+ ND_TCHECK(dh6->dh6_xid);
+ name = tok2str(dh6_msgtype_str, "msgtype-%u", dh6->dh6_msgtype);
+
+ if (!ndo->ndo_vflag) {
+ ND_PRINT((ndo, " %s", name));
+ return;
+ }
+
+ /* XXX relay agent messages have to be handled differently */
+
+ ND_PRINT((ndo, " %s (", name)); /*)*/
+ if (dh6->dh6_msgtype != DH6_RELAY_FORW &&
+ dh6->dh6_msgtype != DH6_RELAY_REPLY) {
+ ND_PRINT((ndo, "xid=%x", EXTRACT_32BITS(&dh6->dh6_xid) & DH6_XIDMASK));
+ extp = (u_char *)(dh6 + 1);
+ dhcp6opt_print(ndo, extp, ep);
+ } else { /* relay messages */
+ struct in6_addr addr6;
+
+ ND_TCHECK(dh6relay->dh6relay_peeraddr);
+
+ memcpy(&addr6, dh6relay->dh6relay_linkaddr, sizeof (addr6));
+ ND_PRINT((ndo, "linkaddr=%s", ip6addr_string(ndo, &addr6)));
+
+ memcpy(&addr6, dh6relay->dh6relay_peeraddr, sizeof (addr6));
+ ND_PRINT((ndo, " peeraddr=%s", ip6addr_string(ndo, &addr6)));
+
+ dhcp6opt_print(ndo, (u_char *)(dh6relay + 1), ep);
+ }
+ /*(*/
+ ND_PRINT((ndo, ")"));
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|dhcp6]"));
+}
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-domain.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "nameser.h"
+
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+
+static const char *ns_ops[] = {
+ "", " inv_q", " stat", " op3", " notify", " update", " op6", " op7",
+ " op8", " updateA", " updateD", " updateDA",
+ " updateM", " updateMA", " zoneInit", " zoneRef",
+};
+
+static const char *ns_resp[] = {
+ "", " FormErr", " ServFail", " NXDomain",
+ " NotImp", " Refused", " YXDomain", " YXRRSet",
+ " NXRRSet", " NotAuth", " NotZone", " Resp11",
+ " Resp12", " Resp13", " Resp14", " NoChange",
+};
+
+/* skip over a domain name */
+static const u_char *
+ns_nskip(netdissect_options *ndo,
+ register const u_char *cp)
+{
+ register u_char i;
+
+ if (!ND_TTEST2(*cp, 1))
+ return (NULL);
+ i = *cp++;
+ while (i) {
+ if ((i & INDIR_MASK) == INDIR_MASK)
+ return (cp + 1);
+ if ((i & INDIR_MASK) == EDNS0_MASK) {
+ int bitlen, bytelen;
+
+ if ((i & ~INDIR_MASK) != EDNS0_ELT_BITLABEL)
+ return(NULL); /* unknown ELT */
+ if (!ND_TTEST2(*cp, 1))
+ return (NULL);
+ if ((bitlen = *cp++) == 0)
+ bitlen = 256;
+ bytelen = (bitlen + 7) / 8;
+ cp += bytelen;
+ } else
+ cp += i;
+ if (!ND_TTEST2(*cp, 1))
+ return (NULL);
+ i = *cp++;
+ }
+ return (cp);
+}
+
+/* print a <domain-name> */
+static const u_char *
+blabel_print(netdissect_options *ndo,
+ const u_char *cp)
+{
+ int bitlen, slen, b;
+ const u_char *bitp, *lim;
+ char tc;
+
+ if (!ND_TTEST2(*cp, 1))
+ return(NULL);
+ if ((bitlen = *cp) == 0)
+ bitlen = 256;
+ slen = (bitlen + 3) / 4;
+ lim = cp + 1 + slen;
+
+ /* print the bit string as a hex string */
+ ND_PRINT((ndo, "\\[x"));
+ for (bitp = cp + 1, b = bitlen; bitp < lim && b > 7; b -= 8, bitp++) {
+ ND_TCHECK(*bitp);
+ ND_PRINT((ndo, "%02x", *bitp));
+ }
+ if (b > 4) {
+ ND_TCHECK(*bitp);
+ tc = *bitp++;
+ ND_PRINT((ndo, "%02x", tc & (0xff << (8 - b))));
+ } else if (b > 0) {
+ ND_TCHECK(*bitp);
+ tc = *bitp++;
+ ND_PRINT((ndo, "%1x", ((tc >> 4) & 0x0f) & (0x0f << (4 - b))));
+ }
+ ND_PRINT((ndo, "/%d]", bitlen));
+ return lim;
+trunc:
+ ND_PRINT((ndo, ".../%d]", bitlen));
+ return NULL;
+}
+
+static int
+labellen(netdissect_options *ndo,
+ const u_char *cp)
+{
+ register u_int i;
+
+ if (!ND_TTEST2(*cp, 1))
+ return(-1);
+ i = *cp;
+ if ((i & INDIR_MASK) == EDNS0_MASK) {
+ int bitlen, elt;
+ if ((elt = (i & ~INDIR_MASK)) != EDNS0_ELT_BITLABEL) {
+ ND_PRINT((ndo, "<ELT %d>", elt));
+ return(-1);
+ }
+ if (!ND_TTEST2(*(cp + 1), 1))
+ return(-1);
+ if ((bitlen = *(cp + 1)) == 0)
+ bitlen = 256;
+ return(((bitlen + 7) / 8) + 1);
+ } else
+ return(i);
+}
+
+const u_char *
+ns_nprint(netdissect_options *ndo,
+ register const u_char *cp, register const u_char *bp)
+{
+ register u_int i, l;
+ register const u_char *rp = NULL;
+ register int compress = 0;
+ int chars_processed;
+ int elt;
+ int data_size = ndo->ndo_snapend - bp;
+
+ if ((l = labellen(ndo, cp)) == (u_int)-1)
+ return(NULL);
+ if (!ND_TTEST2(*cp, 1))
+ return(NULL);
+ chars_processed = 1;
+ if (((i = *cp++) & INDIR_MASK) != INDIR_MASK) {
+ compress = 0;
+ rp = cp + l;
+ }
+
+ if (i != 0)
+ while (i && cp < ndo->ndo_snapend) {
+ if ((i & INDIR_MASK) == INDIR_MASK) {
+ if (!compress) {
+ rp = cp + 1;
+ compress = 1;
+ }
+ if (!ND_TTEST2(*cp, 1))
+ return(NULL);
+ cp = bp + (((i << 8) | *cp) & 0x3fff);
+ if ((l = labellen(ndo, cp)) == (u_int)-1)
+ return(NULL);
+ if (!ND_TTEST2(*cp, 1))
+ return(NULL);
+ i = *cp++;
+ chars_processed++;
+
+ /*
+ * If we've looked at every character in
+ * the message, this pointer will make
+ * us look at some character again,
+ * which means we're looping.
+ */
+ if (chars_processed >= data_size) {
+ ND_PRINT((ndo, "<LOOP>"));
+ return (NULL);
+ }
+ continue;
+ }
+ if ((i & INDIR_MASK) == EDNS0_MASK) {
+ elt = (i & ~INDIR_MASK);
+ switch(elt) {
+ case EDNS0_ELT_BITLABEL:
+ if (blabel_print(ndo, cp) == NULL)
+ return (NULL);
+ break;
+ default:
+ /* unknown ELT */
+ ND_PRINT((ndo, "<ELT %d>", elt));
+ return(NULL);
+ }
+ } else {
+ if (fn_printn(ndo, cp, l, ndo->ndo_snapend))
+ return(NULL);
+ }
+
+ cp += l;
+ chars_processed += l;
+ ND_PRINT((ndo, "."));
+ if ((l = labellen(ndo, cp)) == (u_int)-1)
+ return(NULL);
+ if (!ND_TTEST2(*cp, 1))
+ return(NULL);
+ i = *cp++;
+ chars_processed++;
+ if (!compress)
+ rp += l + 1;
+ }
+ else
+ ND_PRINT((ndo, "."));
+ return (rp);
+}
+
+/* print a <character-string> */
+static const u_char *
+ns_cprint(netdissect_options *ndo,
+ register const u_char *cp)
+{
+ register u_int i;
+
+ if (!ND_TTEST2(*cp, 1))
+ return (NULL);
+ i = *cp++;
+ if (fn_printn(ndo, cp, i, ndo->ndo_snapend))
+ return (NULL);
+ return (cp + i);
+}
+
+/* http://www.iana.org/assignments/dns-parameters */
+const struct tok ns_type2str[] = {
+ { T_A, "A" }, /* RFC 1035 */
+ { T_NS, "NS" }, /* RFC 1035 */
+ { T_MD, "MD" }, /* RFC 1035 */
+ { T_MF, "MF" }, /* RFC 1035 */
+ { T_CNAME, "CNAME" }, /* RFC 1035 */
+ { T_SOA, "SOA" }, /* RFC 1035 */
+ { T_MB, "MB" }, /* RFC 1035 */
+ { T_MG, "MG" }, /* RFC 1035 */
+ { T_MR, "MR" }, /* RFC 1035 */
+ { T_NULL, "NULL" }, /* RFC 1035 */
+ { T_WKS, "WKS" }, /* RFC 1035 */
+ { T_PTR, "PTR" }, /* RFC 1035 */
+ { T_HINFO, "HINFO" }, /* RFC 1035 */
+ { T_MINFO, "MINFO" }, /* RFC 1035 */
+ { T_MX, "MX" }, /* RFC 1035 */
+ { T_TXT, "TXT" }, /* RFC 1035 */
+ { T_RP, "RP" }, /* RFC 1183 */
+ { T_AFSDB, "AFSDB" }, /* RFC 1183 */
+ { T_X25, "X25" }, /* RFC 1183 */
+ { T_ISDN, "ISDN" }, /* RFC 1183 */
+ { T_RT, "RT" }, /* RFC 1183 */
+ { T_NSAP, "NSAP" }, /* RFC 1706 */
+ { T_NSAP_PTR, "NSAP_PTR" },
+ { T_SIG, "SIG" }, /* RFC 2535 */
+ { T_KEY, "KEY" }, /* RFC 2535 */
+ { T_PX, "PX" }, /* RFC 2163 */
+ { T_GPOS, "GPOS" }, /* RFC 1712 */
+ { T_AAAA, "AAAA" }, /* RFC 1886 */
+ { T_LOC, "LOC" }, /* RFC 1876 */
+ { T_NXT, "NXT" }, /* RFC 2535 */
+ { T_EID, "EID" }, /* Nimrod */
+ { T_NIMLOC, "NIMLOC" }, /* Nimrod */
+ { T_SRV, "SRV" }, /* RFC 2782 */
+ { T_ATMA, "ATMA" }, /* ATM Forum */
+ { T_NAPTR, "NAPTR" }, /* RFC 2168, RFC 2915 */
+ { T_KX, "KX" }, /* RFC 2230 */
+ { T_CERT, "CERT" }, /* RFC 2538 */
+ { T_A6, "A6" }, /* RFC 2874 */
+ { T_DNAME, "DNAME" }, /* RFC 2672 */
+ { T_SINK, "SINK" },
+ { T_OPT, "OPT" }, /* RFC 2671 */
+ { T_APL, "APL" }, /* RFC 3123 */
+ { T_DS, "DS" }, /* RFC 4034 */
+ { T_SSHFP, "SSHFP" }, /* RFC 4255 */
+ { T_IPSECKEY, "IPSECKEY" }, /* RFC 4025 */
+ { T_RRSIG, "RRSIG" }, /* RFC 4034 */
+ { T_NSEC, "NSEC" }, /* RFC 4034 */
+ { T_DNSKEY, "DNSKEY" }, /* RFC 4034 */
+ { T_SPF, "SPF" }, /* RFC-schlitt-spf-classic-02.txt */
+ { T_UINFO, "UINFO" },
+ { T_UID, "UID" },
+ { T_GID, "GID" },
+ { T_UNSPEC, "UNSPEC" },
+ { T_UNSPECA, "UNSPECA" },
+ { T_TKEY, "TKEY" }, /* RFC 2930 */
+ { T_TSIG, "TSIG" }, /* RFC 2845 */
+ { T_IXFR, "IXFR" }, /* RFC 1995 */
+ { T_AXFR, "AXFR" }, /* RFC 1035 */
+ { T_MAILB, "MAILB" }, /* RFC 1035 */
+ { T_MAILA, "MAILA" }, /* RFC 1035 */
+ { T_ANY, "ANY" },
+ { 0, NULL }
+};
+
+const struct tok ns_class2str[] = {
+ { C_IN, "IN" }, /* Not used */
+ { C_CHAOS, "CHAOS" },
+ { C_HS, "HS" },
+ { C_ANY, "ANY" },
+ { 0, NULL }
+};
+
+/* print a query */
+static const u_char *
+ns_qprint(netdissect_options *ndo,
+ register const u_char *cp, register const u_char *bp, int is_mdns)
+{
+ register const u_char *np = cp;
+ register u_int i, class;
+
+ cp = ns_nskip(ndo, cp);
+
+ if (cp == NULL || !ND_TTEST2(*cp, 4))
+ return(NULL);
+
+ /* print the qtype */
+ i = EXTRACT_16BITS(cp);
+ cp += 2;
+ ND_PRINT((ndo, " %s", tok2str(ns_type2str, "Type%d", i)));
+ /* print the qclass (if it's not IN) */
+ i = EXTRACT_16BITS(cp);
+ cp += 2;
+ if (is_mdns)
+ class = (i & ~C_QU);
+ else
+ class = i;
+ if (class != C_IN)
+ ND_PRINT((ndo, " %s", tok2str(ns_class2str, "(Class %d)", class)));
+ if (is_mdns) {
+ ND_PRINT((ndo, i & C_QU ? " (QU)" : " (QM)"));
+ }
+
+ ND_PRINT((ndo, "? "));
+ cp = ns_nprint(ndo, np, bp);
+ return(cp ? cp + 4 : NULL);
+}
+
+/* print a reply */
+static const u_char *
+ns_rprint(netdissect_options *ndo,
+ register const u_char *cp, register const u_char *bp, int is_mdns)
+{
+ register u_int i, class, opt_flags = 0;
+ register u_short typ, len;
+ register const u_char *rp;
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, " "));
+ if ((cp = ns_nprint(ndo, cp, bp)) == NULL)
+ return NULL;
+ } else
+ cp = ns_nskip(ndo, cp);
+
+ if (cp == NULL || !ND_TTEST2(*cp, 10))
+ return (ndo->ndo_snapend);
+
+ /* print the type/qtype */
+ typ = EXTRACT_16BITS(cp);
+ cp += 2;
+ /* print the class (if it's not IN and the type isn't OPT) */
+ i = EXTRACT_16BITS(cp);
+ cp += 2;
+ if (is_mdns)
+ class = (i & ~C_CACHE_FLUSH);
+ else
+ class = i;
+ if (class != C_IN && typ != T_OPT)
+ ND_PRINT((ndo, " %s", tok2str(ns_class2str, "(Class %d)", class)));
+ if (is_mdns) {
+ if (i & C_CACHE_FLUSH)
+ ND_PRINT((ndo, " (Cache flush)"));
+ }
+
+ if (typ == T_OPT) {
+ /* get opt flags */
+ cp += 2;
+ opt_flags = EXTRACT_16BITS(cp);
+ /* ignore rest of ttl field */
+ cp += 2;
+ } else if (ndo->ndo_vflag > 2) {
+ /* print ttl */
+ ND_PRINT((ndo, " ["));
+ relts_print(ndo, EXTRACT_32BITS(cp));
+ ND_PRINT((ndo, "]"));
+ cp += 4;
+ } else {
+ /* ignore ttl */
+ cp += 4;
+ }
+
+ len = EXTRACT_16BITS(cp);
+ cp += 2;
+
+ rp = cp + len;
+
+ ND_PRINT((ndo, " %s", tok2str(ns_type2str, "Type%d", typ)));
+ if (rp > ndo->ndo_snapend)
+ return(NULL);
+
+ switch (typ) {
+ case T_A:
+ if (!ND_TTEST2(*cp, sizeof(struct in_addr)))
+ return(NULL);
+ ND_PRINT((ndo, " %s", intoa(htonl(EXTRACT_32BITS(cp)))));
+ break;
+
+ case T_NS:
+ case T_CNAME:
+ case T_PTR:
+#ifdef T_DNAME
+ case T_DNAME:
+#endif
+ ND_PRINT((ndo, " "));
+ if (ns_nprint(ndo, cp, bp) == NULL)
+ return(NULL);
+ break;
+
+ case T_SOA:
+ if (!ndo->ndo_vflag)
+ break;
+ ND_PRINT((ndo, " "));
+ if ((cp = ns_nprint(ndo, cp, bp)) == NULL)
+ return(NULL);
+ ND_PRINT((ndo, " "));
+ if ((cp = ns_nprint(ndo, cp, bp)) == NULL)
+ return(NULL);
+ if (!ND_TTEST2(*cp, 5 * 4))
+ return(NULL);
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ break;
+ case T_MX:
+ ND_PRINT((ndo, " "));
+ if (!ND_TTEST2(*cp, 2))
+ return(NULL);
+ if (ns_nprint(ndo, cp + 2, bp) == NULL)
+ return(NULL);
+ ND_PRINT((ndo, " %d", EXTRACT_16BITS(cp)));
+ break;
+
+ case T_TXT:
+ while (cp < rp) {
+ ND_PRINT((ndo, " \""));
+ cp = ns_cprint(ndo, cp);
+ if (cp == NULL)
+ return(NULL);
+ ND_PRINT((ndo, "\""));
+ }
+ break;
+
+ case T_SRV:
+ ND_PRINT((ndo, " "));
+ if (!ND_TTEST2(*cp, 6))
+ return(NULL);
+ if (ns_nprint(ndo, cp + 6, bp) == NULL)
+ return(NULL);
+ ND_PRINT((ndo, ":%d %d %d", EXTRACT_16BITS(cp + 4),
+ EXTRACT_16BITS(cp), EXTRACT_16BITS(cp + 2)));
+ break;
+
+#ifdef INET6
+ case T_AAAA:
+ {
+ struct in6_addr addr;
+ char ntop_buf[INET6_ADDRSTRLEN];
+
+ if (!ND_TTEST2(*cp, sizeof(struct in6_addr)))
+ return(NULL);
+ memcpy(&addr, cp, sizeof(struct in6_addr));
+ ND_PRINT((ndo, " %s",
+ inet_ntop(AF_INET6, &addr, ntop_buf, sizeof(ntop_buf))));
+
+ break;
+ }
+
+ case T_A6:
+ {
+ struct in6_addr a;
+ int pbit, pbyte;
+ char ntop_buf[INET6_ADDRSTRLEN];
+
+ if (!ND_TTEST2(*cp, 1))
+ return(NULL);
+ pbit = *cp;
+ pbyte = (pbit & ~7) / 8;
+ if (pbit > 128) {
+ ND_PRINT((ndo, " %u(bad plen)", pbit));
+ break;
+ } else if (pbit < 128) {
+ if (!ND_TTEST2(*(cp + 1), sizeof(a) - pbyte))
+ return(NULL);
+ memset(&a, 0, sizeof(a));
+ memcpy(&a.s6_addr[pbyte], cp + 1, sizeof(a) - pbyte);
+ ND_PRINT((ndo, " %u %s", pbit,
+ inet_ntop(AF_INET6, &a, ntop_buf, sizeof(ntop_buf))));
+ }
+ if (pbit > 0) {
+ ND_PRINT((ndo, " "));
+ if (ns_nprint(ndo, cp + 1 + sizeof(a) - pbyte, bp) == NULL)
+ return(NULL);
+ }
+ break;
+ }
+#endif /*INET6*/
+
+ case T_OPT:
+ ND_PRINT((ndo, " UDPsize=%u", class));
+ if (opt_flags & 0x8000)
+ ND_PRINT((ndo, " OK"));
+ break;
+
+ case T_UNSPECA: /* One long string */
+ if (!ND_TTEST2(*cp, len))
+ return(NULL);
+ if (fn_printn(ndo, cp, len, ndo->ndo_snapend))
+ return(NULL);
+ break;
+
+ case T_TSIG:
+ {
+ if (cp + len > ndo->ndo_snapend)
+ return(NULL);
+ if (!ndo->ndo_vflag)
+ break;
+ ND_PRINT((ndo, " "));
+ if ((cp = ns_nprint(ndo, cp, bp)) == NULL)
+ return(NULL);
+ cp += 6;
+ if (!ND_TTEST2(*cp, 2))
+ return(NULL);
+ ND_PRINT((ndo, " fudge=%u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ if (!ND_TTEST2(*cp, 2))
+ return(NULL);
+ ND_PRINT((ndo, " maclen=%u", EXTRACT_16BITS(cp)));
+ cp += 2 + EXTRACT_16BITS(cp);
+ if (!ND_TTEST2(*cp, 2))
+ return(NULL);
+ ND_PRINT((ndo, " origid=%u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ if (!ND_TTEST2(*cp, 2))
+ return(NULL);
+ ND_PRINT((ndo, " error=%u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ if (!ND_TTEST2(*cp, 2))
+ return(NULL);
+ ND_PRINT((ndo, " otherlen=%u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ }
+ }
+ return (rp); /* XXX This isn't always right */
+}
+
+void
+ns_print(netdissect_options *ndo,
+ register const u_char *bp, u_int length, int is_mdns)
+{
+ register const HEADER *np;
+ register int qdcount, ancount, nscount, arcount;
+ register const u_char *cp;
+ uint16_t b2;
+
+ np = (const HEADER *)bp;
+ ND_TCHECK(*np);
+ /* get the byte-order right */
+ qdcount = EXTRACT_16BITS(&np->qdcount);
+ ancount = EXTRACT_16BITS(&np->ancount);
+ nscount = EXTRACT_16BITS(&np->nscount);
+ arcount = EXTRACT_16BITS(&np->arcount);
+
+ if (DNS_QR(np)) {
+ /* this is a response */
+ ND_PRINT((ndo, "%d%s%s%s%s%s%s",
+ EXTRACT_16BITS(&np->id),
+ ns_ops[DNS_OPCODE(np)],
+ ns_resp[DNS_RCODE(np)],
+ DNS_AA(np)? "*" : "",
+ DNS_RA(np)? "" : "-",
+ DNS_TC(np)? "|" : "",
+ DNS_AD(np)? "$" : ""));
+
+ if (qdcount != 1)
+ ND_PRINT((ndo, " [%dq]", qdcount));
+ /* Print QUESTION section on -vv */
+ cp = (const u_char *)(np + 1);
+ while (qdcount--) {
+ if (qdcount < EXTRACT_16BITS(&np->qdcount) - 1)
+ ND_PRINT((ndo, ","));
+ if (ndo->ndo_vflag > 1) {
+ ND_PRINT((ndo, " q:"));
+ if ((cp = ns_qprint(ndo, cp, bp, is_mdns)) == NULL)
+ goto trunc;
+ } else {
+ if ((cp = ns_nskip(ndo, cp)) == NULL)
+ goto trunc;
+ cp += 4; /* skip QTYPE and QCLASS */
+ }
+ }
+ ND_PRINT((ndo, " %d/%d/%d", ancount, nscount, arcount));
+ if (ancount--) {
+ if ((cp = ns_rprint(ndo, cp, bp, is_mdns)) == NULL)
+ goto trunc;
+ while (cp < ndo->ndo_snapend && ancount--) {
+ ND_PRINT((ndo, ","));
+ if ((cp = ns_rprint(ndo, cp, bp, is_mdns)) == NULL)
+ goto trunc;
+ }
+ }
+ if (ancount > 0)
+ goto trunc;
+ /* Print NS and AR sections on -vv */
+ if (ndo->ndo_vflag > 1) {
+ if (cp < ndo->ndo_snapend && nscount--) {
+ ND_PRINT((ndo, " ns:"));
+ if ((cp = ns_rprint(ndo, cp, bp, is_mdns)) == NULL)
+ goto trunc;
+ while (cp < ndo->ndo_snapend && nscount--) {
+ ND_PRINT((ndo, ","));
+ if ((cp = ns_rprint(ndo, cp, bp, is_mdns)) == NULL)
+ goto trunc;
+ }
+ }
+ if (nscount > 0)
+ goto trunc;
+ if (cp < ndo->ndo_snapend && arcount--) {
+ ND_PRINT((ndo, " ar:"));
+ if ((cp = ns_rprint(ndo, cp, bp, is_mdns)) == NULL)
+ goto trunc;
+ while (cp < ndo->ndo_snapend && arcount--) {
+ ND_PRINT((ndo, ","));
+ if ((cp = ns_rprint(ndo, cp, bp, is_mdns)) == NULL)
+ goto trunc;
+ }
+ }
+ if (arcount > 0)
+ goto trunc;
+ }
+ }
+ else {
+ /* this is a request */
+ ND_PRINT((ndo, "%d%s%s%s", EXTRACT_16BITS(&np->id), ns_ops[DNS_OPCODE(np)],
+ DNS_RD(np) ? "+" : "",
+ DNS_CD(np) ? "%" : ""));
+
+ /* any weirdness? */
+ b2 = EXTRACT_16BITS(((u_short *)np)+1);
+ if (b2 & 0x6cf)
+ ND_PRINT((ndo, " [b2&3=0x%x]", b2));
+
+ if (DNS_OPCODE(np) == IQUERY) {
+ if (qdcount)
+ ND_PRINT((ndo, " [%dq]", qdcount));
+ if (ancount != 1)
+ ND_PRINT((ndo, " [%da]", ancount));
+ }
+ else {
+ if (ancount)
+ ND_PRINT((ndo, " [%da]", ancount));
+ if (qdcount != 1)
+ ND_PRINT((ndo, " [%dq]", qdcount));
+ }
+ if (nscount)
+ ND_PRINT((ndo, " [%dn]", nscount));
+ if (arcount)
+ ND_PRINT((ndo, " [%dau]", arcount));
+
+ cp = (const u_char *)(np + 1);
+ if (qdcount--) {
+ cp = ns_qprint(ndo, cp, (const u_char *)np, is_mdns);
+ if (!cp)
+ goto trunc;
+ while (cp < ndo->ndo_snapend && qdcount--) {
+ cp = ns_qprint(ndo, (const u_char *)cp,
+ (const u_char *)np,
+ is_mdns);
+ if (!cp)
+ goto trunc;
+ }
+ }
+ if (qdcount > 0)
+ goto trunc;
+
+ /* Print remaining sections on -vv */
+ if (ndo->ndo_vflag > 1) {
+ if (ancount--) {
+ if ((cp = ns_rprint(ndo, cp, bp, is_mdns)) == NULL)
+ goto trunc;
+ while (cp < ndo->ndo_snapend && ancount--) {
+ ND_PRINT((ndo, ","));
+ if ((cp = ns_rprint(ndo, cp, bp, is_mdns)) == NULL)
+ goto trunc;
+ }
+ }
+ if (ancount > 0)
+ goto trunc;
+ if (cp < ndo->ndo_snapend && nscount--) {
+ ND_PRINT((ndo, " ns:"));
+ if ((cp = ns_rprint(ndo, cp, bp, is_mdns)) == NULL)
+ goto trunc;
+ while (nscount-- && cp < ndo->ndo_snapend) {
+ ND_PRINT((ndo, ","));
+ if ((cp = ns_rprint(ndo, cp, bp, is_mdns)) == NULL)
+ goto trunc;
+ }
+ }
+ if (nscount > 0)
+ goto trunc;
+ if (cp < ndo->ndo_snapend && arcount--) {
+ ND_PRINT((ndo, " ar:"));
+ if ((cp = ns_rprint(ndo, cp, bp, is_mdns)) == NULL)
+ goto trunc;
+ while (cp < ndo->ndo_snapend && arcount--) {
+ ND_PRINT((ndo, ","));
+ if ((cp = ns_rprint(ndo, cp, bp, is_mdns)) == NULL)
+ goto trunc;
+ }
+ }
+ if (arcount > 0)
+ goto trunc;
+ }
+ }
+ ND_PRINT((ndo, " (%d)", length));
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "[|domain]"));
+}
--- /dev/null
+/*
+ * Copyright (c) 1998-2007 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.
+ *
+ * Dynamic Trunk Protocol (DTP)
+ *
+ * Original code by Carles Kishimoto <carles.kishimoto@gmail.com>
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#define DTP_HEADER_LEN 1
+#define DTP_DOMAIN_TLV 0x0001
+#define DTP_STATUS_TLV 0x0002
+#define DTP_DTP_TYPE_TLV 0x0003
+#define DTP_NEIGHBOR_TLV 0x0004
+
+static const struct tok dtp_tlv_values[] = {
+ { DTP_DOMAIN_TLV, "Domain TLV"},
+ { DTP_STATUS_TLV, "Status TLV"},
+ { DTP_DTP_TYPE_TLV, "DTP type TLV"},
+ { DTP_NEIGHBOR_TLV, "Neighbor TLV"},
+ { 0, NULL}
+};
+
+void
+dtp_print (netdissect_options *ndo, const u_char *pptr, u_int length)
+{
+ int type, len;
+ const u_char *tptr;
+
+ if (length < DTP_HEADER_LEN)
+ goto trunc;
+
+ tptr = pptr;
+
+ ND_TCHECK2(*tptr, DTP_HEADER_LEN);
+
+ ND_PRINT((ndo, "DTPv%u, length %u",
+ (*tptr),
+ length));
+
+ /*
+ * In non-verbose mode, just print version.
+ */
+ if (ndo->ndo_vflag < 1) {
+ return;
+ }
+
+ tptr += DTP_HEADER_LEN;
+
+ while (tptr < (pptr+length)) {
+
+ ND_TCHECK2(*tptr, 4);
+
+ type = EXTRACT_16BITS(tptr);
+ len = EXTRACT_16BITS(tptr+2);
+
+ /* infinite loop check */
+ if (type == 0 || len == 0) {
+ return;
+ }
+
+ ND_PRINT((ndo, "\n\t%s (0x%04x) TLV, length %u",
+ tok2str(dtp_tlv_values, "Unknown", type),
+ type, len));
+
+ switch (type) {
+ case DTP_DOMAIN_TLV:
+ ND_PRINT((ndo, ", %s", tptr+4));
+ break;
+
+ case DTP_STATUS_TLV:
+ case DTP_DTP_TYPE_TLV:
+ ND_PRINT((ndo, ", 0x%x", *(tptr+4)));
+ break;
+
+ case DTP_NEIGHBOR_TLV:
+ ND_PRINT((ndo, ", %s", etheraddr_string(ndo, tptr+4)));
+ break;
+
+ default:
+ break;
+ }
+ tptr += len;
+ }
+
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "[|dtp]"));
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1995, 1996
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-dvmrp.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+/*
+ * DVMRP message types and flag values shamelessly stolen from
+ * mrouted/dvmrp.h.
+ */
+#define DVMRP_PROBE 1 /* for finding neighbors */
+#define DVMRP_REPORT 2 /* for reporting some or all routes */
+#define DVMRP_ASK_NEIGHBORS 3 /* sent by mapper, asking for a list */
+ /* of this router's neighbors */
+#define DVMRP_NEIGHBORS 4 /* response to such a request */
+#define DVMRP_ASK_NEIGHBORS2 5 /* as above, want new format reply */
+#define DVMRP_NEIGHBORS2 6
+#define DVMRP_PRUNE 7 /* prune message */
+#define DVMRP_GRAFT 8 /* graft message */
+#define DVMRP_GRAFT_ACK 9 /* graft acknowledgement */
+
+/*
+ * 'flags' byte values in DVMRP_NEIGHBORS2 reply.
+ */
+#define DVMRP_NF_TUNNEL 0x01 /* neighbors reached via tunnel */
+#define DVMRP_NF_SRCRT 0x02 /* tunnel uses IP source routing */
+#define DVMRP_NF_DOWN 0x10 /* kernel state of interface */
+#define DVMRP_NF_DISABLED 0x20 /* administratively disabled */
+#define DVMRP_NF_QUERIER 0x40 /* I am the subnet's querier */
+
+static int print_probe(netdissect_options *, const u_char *, const u_char *, u_int);
+static int print_report(netdissect_options *, const u_char *, const u_char *, u_int);
+static int print_neighbors(netdissect_options *, const u_char *, const u_char *, u_int);
+static int print_neighbors2(netdissect_options *, const u_char *, const u_char *, u_int);
+static int print_prune(netdissect_options *, const u_char *);
+static int print_graft(netdissect_options *, const u_char *);
+static int print_graft_ack(netdissect_options *, const u_char *);
+
+static uint32_t target_level;
+
+void
+dvmrp_print(netdissect_options *ndo,
+ register const u_char *bp, register u_int len)
+{
+ register const u_char *ep;
+ register u_char type;
+
+ ep = (const u_char *)ndo->ndo_snapend;
+ if (bp >= ep)
+ return;
+
+ ND_TCHECK(bp[1]);
+ type = bp[1];
+
+ /* Skip IGMP header */
+ bp += 8;
+ len -= 8;
+
+ switch (type) {
+
+ case DVMRP_PROBE:
+ ND_PRINT((ndo, " Probe"));
+ if (ndo->ndo_vflag) {
+ if (print_probe(ndo, bp, ep, len) < 0)
+ goto trunc;
+ }
+ break;
+
+ case DVMRP_REPORT:
+ ND_PRINT((ndo, " Report"));
+ if (ndo->ndo_vflag > 1) {
+ if (print_report(ndo, bp, ep, len) < 0)
+ goto trunc;
+ }
+ break;
+
+ case DVMRP_ASK_NEIGHBORS:
+ ND_PRINT((ndo, " Ask-neighbors(old)"));
+ break;
+
+ case DVMRP_NEIGHBORS:
+ ND_PRINT((ndo, " Neighbors(old)"));
+ if (print_neighbors(ndo, bp, ep, len) < 0)
+ goto trunc;
+ break;
+
+ case DVMRP_ASK_NEIGHBORS2:
+ ND_PRINT((ndo, " Ask-neighbors2"));
+ break;
+
+ case DVMRP_NEIGHBORS2:
+ ND_PRINT((ndo, " Neighbors2"));
+ /*
+ * extract version and capabilities from IGMP group
+ * address field
+ */
+ bp -= 4;
+ ND_TCHECK2(bp[0], 4);
+ target_level = (bp[0] << 24) | (bp[1] << 16) |
+ (bp[2] << 8) | bp[3];
+ bp += 4;
+ if (print_neighbors2(ndo, bp, ep, len) < 0)
+ goto trunc;
+ break;
+
+ case DVMRP_PRUNE:
+ ND_PRINT((ndo, " Prune"));
+ if (print_prune(ndo, bp) < 0)
+ goto trunc;
+ break;
+
+ case DVMRP_GRAFT:
+ ND_PRINT((ndo, " Graft"));
+ if (print_graft(ndo, bp) < 0)
+ goto trunc;
+ break;
+
+ case DVMRP_GRAFT_ACK:
+ ND_PRINT((ndo, " Graft-ACK"));
+ if (print_graft_ack(ndo, bp) < 0)
+ goto trunc;
+ break;
+
+ default:
+ ND_PRINT((ndo, " [type %d]", type));
+ break;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|dvmrp]"));
+ return;
+}
+
+static int
+print_report(netdissect_options *ndo,
+ register const u_char *bp, register const u_char *ep,
+ register u_int len)
+{
+ register uint32_t mask, origin;
+ register int metric, done;
+ register u_int i, width;
+
+ while (len > 0) {
+ if (len < 3) {
+ ND_PRINT((ndo, " [|]"));
+ return (0);
+ }
+ ND_TCHECK2(bp[0], 3);
+ mask = (uint32_t)0xff << 24 | bp[0] << 16 | bp[1] << 8 | bp[2];
+ width = 1;
+ if (bp[0])
+ width = 2;
+ if (bp[1])
+ width = 3;
+ if (bp[2])
+ width = 4;
+
+ ND_PRINT((ndo, "\n\tMask %s", intoa(htonl(mask))));
+ bp += 3;
+ len -= 3;
+ do {
+ if (bp + width + 1 > ep) {
+ ND_PRINT((ndo, " [|]"));
+ return (0);
+ }
+ if (len < width + 1) {
+ ND_PRINT((ndo, "\n\t [Truncated Report]"));
+ return (0);
+ }
+ origin = 0;
+ for (i = 0; i < width; ++i) {
+ ND_TCHECK(*bp);
+ origin = origin << 8 | *bp++;
+ }
+ for ( ; i < 4; ++i)
+ origin <<= 8;
+
+ ND_TCHECK(*bp);
+ metric = *bp++;
+ done = metric & 0x80;
+ metric &= 0x7f;
+ ND_PRINT((ndo, "\n\t %s metric %d", intoa(htonl(origin)),
+ metric));
+ len -= width + 1;
+ } while (!done);
+ }
+ return (0);
+trunc:
+ return (-1);
+}
+
+static int
+print_probe(netdissect_options *ndo,
+ register const u_char *bp, register const u_char *ep,
+ register u_int len)
+{
+ register uint32_t genid;
+
+ ND_TCHECK2(bp[0], 4);
+ if ((len < 4) || ((bp + 4) > ep)) {
+ /* { (ctags) */
+ ND_PRINT((ndo, " [|}"));
+ return (0);
+ }
+ genid = (bp[0] << 24) | (bp[1] << 16) | (bp[2] << 8) | bp[3];
+ bp += 4;
+ len -= 4;
+ ND_PRINT((ndo, ndo->ndo_vflag > 1 ? "\n\t" : " "));
+ ND_PRINT((ndo, "genid %u", genid));
+ if (ndo->ndo_vflag < 2)
+ return (0);
+
+ while ((len > 0) && (bp < ep)) {
+ ND_TCHECK2(bp[0], 4);
+ ND_PRINT((ndo, "\n\tneighbor %s", ipaddr_string(ndo, bp)));
+ bp += 4; len -= 4;
+ }
+ return (0);
+trunc:
+ return (-1);
+}
+
+static int
+print_neighbors(netdissect_options *ndo,
+ register const u_char *bp, register const u_char *ep,
+ register u_int len)
+{
+ const u_char *laddr;
+ register u_char metric;
+ register u_char thresh;
+ register int ncount;
+
+ while (len > 0 && bp < ep) {
+ ND_TCHECK2(bp[0], 7);
+ laddr = bp;
+ bp += 4;
+ metric = *bp++;
+ thresh = *bp++;
+ ncount = *bp++;
+ len -= 7;
+ while (--ncount >= 0) {
+ ND_TCHECK2(bp[0], 4);
+ ND_PRINT((ndo, " [%s ->", ipaddr_string(ndo, laddr)));
+ ND_PRINT((ndo, " %s, (%d/%d)]",
+ ipaddr_string(ndo, bp), metric, thresh));
+ bp += 4;
+ len -= 4;
+ }
+ }
+ return (0);
+trunc:
+ return (-1);
+}
+
+static int
+print_neighbors2(netdissect_options *ndo,
+ register const u_char *bp, register const u_char *ep,
+ register u_int len)
+{
+ const u_char *laddr;
+ register u_char metric, thresh, flags;
+ register int ncount;
+
+ ND_PRINT((ndo, " (v %d.%d):",
+ (int)target_level & 0xff,
+ (int)(target_level >> 8) & 0xff));
+
+ while (len > 0 && bp < ep) {
+ ND_TCHECK2(bp[0], 8);
+ laddr = bp;
+ bp += 4;
+ metric = *bp++;
+ thresh = *bp++;
+ flags = *bp++;
+ ncount = *bp++;
+ len -= 8;
+ while (--ncount >= 0 && (len >= 4) && (bp + 4) <= ep) {
+ ND_PRINT((ndo, " [%s -> ", ipaddr_string(ndo, laddr)));
+ ND_PRINT((ndo, "%s (%d/%d", ipaddr_string(ndo, bp),
+ metric, thresh));
+ if (flags & DVMRP_NF_TUNNEL)
+ ND_PRINT((ndo, "/tunnel"));
+ if (flags & DVMRP_NF_SRCRT)
+ ND_PRINT((ndo, "/srcrt"));
+ if (flags & DVMRP_NF_QUERIER)
+ ND_PRINT((ndo, "/querier"));
+ if (flags & DVMRP_NF_DISABLED)
+ ND_PRINT((ndo, "/disabled"));
+ if (flags & DVMRP_NF_DOWN)
+ ND_PRINT((ndo, "/down"));
+ ND_PRINT((ndo, ")]"));
+ bp += 4;
+ len -= 4;
+ }
+ if (ncount != -1) {
+ ND_PRINT((ndo, " [|]"));
+ return (0);
+ }
+ }
+ return (0);
+trunc:
+ return (-1);
+}
+
+static int
+print_prune(netdissect_options *ndo,
+ register const u_char *bp)
+{
+ ND_TCHECK2(bp[0], 12);
+ ND_PRINT((ndo, " src %s grp %s", ipaddr_string(ndo, bp), ipaddr_string(ndo, bp + 4)));
+ bp += 8;
+ ND_PRINT((ndo, " timer "));
+ relts_print(ndo, EXTRACT_32BITS(bp));
+ return (0);
+trunc:
+ return (-1);
+}
+
+static int
+print_graft(netdissect_options *ndo,
+ register const u_char *bp)
+{
+ ND_TCHECK2(bp[0], 8);
+ ND_PRINT((ndo, " src %s grp %s", ipaddr_string(ndo, bp), ipaddr_string(ndo, bp + 4)));
+ return (0);
+trunc:
+ return (-1);
+}
+
+static int
+print_graft_ack(netdissect_options *ndo,
+ register const u_char *bp)
+{
+ ND_TCHECK2(bp[0], 8);
+ ND_PRINT((ndo, " src %s grp %s", ipaddr_string(ndo, bp), ipaddr_string(ndo, bp + 4)));
+ return (0);
+trunc:
+ return (-1);
+}
--- /dev/null
+/*
+ * Copyright (c) 2004 - Michael Richardson <mcr@xelerance.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.
+ *
+ * Format and print EAP packets.
+ *
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-eap.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+#define EAP_FRAME_TYPE_PACKET 0
+#define EAP_FRAME_TYPE_START 1
+#define EAP_FRAME_TYPE_LOGOFF 2
+#define EAP_FRAME_TYPE_KEY 3
+#define EAP_FRAME_TYPE_ENCAP_ASF_ALERT 4
+
+struct eap_frame_t {
+ unsigned char version;
+ unsigned char type;
+ unsigned char length[2];
+};
+
+static const struct tok eap_frame_type_values[] = {
+ { EAP_FRAME_TYPE_PACKET, "EAP packet" },
+ { EAP_FRAME_TYPE_START, "EAPOL start" },
+ { EAP_FRAME_TYPE_LOGOFF, "EAPOL logoff" },
+ { EAP_FRAME_TYPE_KEY, "EAPOL key" },
+ { EAP_FRAME_TYPE_ENCAP_ASF_ALERT, "Encapsulated ASF alert" },
+ { 0, NULL}
+};
+
+/* RFC 3748 */
+struct eap_packet_t {
+ unsigned char code;
+ unsigned char id;
+ unsigned char length[2];
+};
+
+#define EAP_REQUEST 1
+#define EAP_RESPONSE 2
+#define EAP_SUCCESS 3
+#define EAP_FAILURE 4
+
+static const struct tok eap_code_values[] = {
+ { EAP_REQUEST, "Request" },
+ { EAP_RESPONSE, "Response" },
+ { EAP_SUCCESS, "Success" },
+ { EAP_FAILURE, "Failure" },
+ { 0, NULL}
+};
+
+#define EAP_TYPE_NO_PROPOSED 0
+#define EAP_TYPE_IDENTITY 1
+#define EAP_TYPE_NOTIFICATION 2
+#define EAP_TYPE_NAK 3
+#define EAP_TYPE_MD5_CHALLENGE 4
+#define EAP_TYPE_OTP 5
+#define EAP_TYPE_GTC 6
+#define EAP_TYPE_TLS 13 /* RFC 2716 */
+#define EAP_TYPE_SIM 18 /* RFC 4186 */
+#define EAP_TYPE_TTLS 21 /* draft-funk-eap-ttls-v0-01.txt */
+#define EAP_TYPE_AKA 23 /* RFC 4187 */
+#define EAP_TYPE_FAST 43 /* RFC 4851 */
+#define EAP_TYPE_EXPANDED_TYPES 254
+#define EAP_TYPE_EXPERIMENTAL 255
+
+static const struct tok eap_type_values[] = {
+ { EAP_TYPE_NO_PROPOSED, "No proposed" },
+ { EAP_TYPE_IDENTITY, "Identity" },
+ { EAP_TYPE_NOTIFICATION, "Notification" },
+ { EAP_TYPE_NAK, "Nak" },
+ { EAP_TYPE_MD5_CHALLENGE, "MD5-challenge" },
+ { EAP_TYPE_OTP, "OTP" },
+ { EAP_TYPE_GTC, "GTC" },
+ { EAP_TYPE_TLS, "TLS" },
+ { EAP_TYPE_SIM, "SIM" },
+ { EAP_TYPE_TTLS, "TTLS" },
+ { EAP_TYPE_AKA, "AKA" },
+ { EAP_TYPE_FAST, "FAST" },
+ { EAP_TYPE_EXPANDED_TYPES, "Expanded types" },
+ { EAP_TYPE_EXPERIMENTAL, "Experimental" },
+ { 0, NULL}
+};
+
+#define EAP_TLS_EXTRACT_BIT_L(x) (((x)&0x80)>>7)
+
+/* RFC 2716 - EAP TLS bits */
+#define EAP_TLS_FLAGS_LEN_INCLUDED (1 << 7)
+#define EAP_TLS_FLAGS_MORE_FRAGMENTS (1 << 6)
+#define EAP_TLS_FLAGS_START (1 << 5)
+
+static const struct tok eap_tls_flags_values[] = {
+ { EAP_TLS_FLAGS_LEN_INCLUDED, "L bit" },
+ { EAP_TLS_FLAGS_MORE_FRAGMENTS, "More fragments bit"},
+ { EAP_TLS_FLAGS_START, "Start bit"},
+ { 0, NULL}
+};
+
+#define EAP_TTLS_VERSION(x) ((x)&0x07)
+
+/* EAP-AKA and EAP-SIM - RFC 4187 */
+#define EAP_AKA_CHALLENGE 1
+#define EAP_AKA_AUTH_REJECT 2
+#define EAP_AKA_SYNC_FAILURE 4
+#define EAP_AKA_IDENTITY 5
+#define EAP_SIM_START 10
+#define EAP_SIM_CHALLENGE 11
+#define EAP_AKA_NOTIFICATION 12
+#define EAP_AKA_REAUTH 13
+#define EAP_AKA_CLIENT_ERROR 14
+
+static const struct tok eap_aka_subtype_values[] = {
+ { EAP_AKA_CHALLENGE, "Challenge" },
+ { EAP_AKA_AUTH_REJECT, "Auth reject" },
+ { EAP_AKA_SYNC_FAILURE, "Sync failure" },
+ { EAP_AKA_IDENTITY, "Identity" },
+ { EAP_SIM_START, "Start" },
+ { EAP_SIM_CHALLENGE, "Challenge" },
+ { EAP_AKA_NOTIFICATION, "Notification" },
+ { EAP_AKA_REAUTH, "Reauth" },
+ { EAP_AKA_CLIENT_ERROR, "Client error" },
+ { 0, NULL}
+};
+
+/*
+ * Print EAP requests / responses
+ */
+void
+eap_print(netdissect_options *ndo,
+ register const u_char *cp,
+ u_int length _U_)
+{
+ const struct eap_frame_t *eap;
+ const u_char *tptr;
+ u_int tlen, type, subtype;
+ int count=0, len;
+
+ tptr = cp;
+ tlen = length;
+ eap = (const struct eap_frame_t *)cp;
+ ND_TCHECK(*eap);
+
+ /* in non-verbose mode just lets print the basic info */
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "%s (%u) v%u, len %u",
+ tok2str(eap_frame_type_values, "unknown", eap->type),
+ eap->type,
+ eap->version,
+ EXTRACT_16BITS(eap->length)));
+ return;
+ }
+
+ ND_PRINT((ndo, "%s (%u) v%u, len %u",
+ tok2str(eap_frame_type_values, "unknown", eap->type),
+ eap->type,
+ eap->version,
+ EXTRACT_16BITS(eap->length)));
+
+ tptr += sizeof(const struct eap_frame_t);
+ tlen -= sizeof(const struct eap_frame_t);
+
+ switch (eap->type) {
+ case EAP_FRAME_TYPE_PACKET:
+ type = *(tptr);
+ len = EXTRACT_16BITS(tptr+2);
+ ND_PRINT((ndo, ", %s (%u), id %u, len %u",
+ tok2str(eap_code_values, "unknown", type),
+ type,
+ *(tptr+1),
+ len));
+
+ ND_TCHECK2(*tptr, len);
+
+ if (type <= 2) { /* For EAP_REQUEST and EAP_RESPONSE only */
+ subtype = *(tptr+4);
+ ND_PRINT((ndo, "\n\t\t Type %s (%u)",
+ tok2str(eap_type_values, "unknown", *(tptr+4)),
+ *(tptr + 4)));
+
+ switch (subtype) {
+ case EAP_TYPE_IDENTITY:
+ if (len - 5 > 0) {
+ ND_PRINT((ndo, ", Identity: "));
+ safeputs(ndo, tptr + 5, len - 5);
+ }
+ break;
+
+ case EAP_TYPE_NOTIFICATION:
+ if (len - 5 > 0) {
+ ND_PRINT((ndo, ", Notification: "));
+ safeputs(ndo, tptr + 5, len - 5);
+ }
+ break;
+
+ case EAP_TYPE_NAK:
+ count = 5;
+
+ /*
+ * one or more octets indicating
+ * the desired authentication
+ * type one octet per type
+ */
+ while (count < len) {
+ ND_PRINT((ndo, " %s (%u),",
+ tok2str(eap_type_values, "unknown", *(tptr+count)),
+ *(tptr + count)));
+ count++;
+ }
+ break;
+
+ case EAP_TYPE_TTLS:
+ ND_PRINT((ndo, " TTLSv%u",
+ EAP_TTLS_VERSION(*(tptr + 5)))); /* fall through */
+ case EAP_TYPE_TLS:
+ ND_PRINT((ndo, " flags [%s] 0x%02x,",
+ bittok2str(eap_tls_flags_values, "none", *(tptr+5)),
+ *(tptr + 5)));
+
+ if (EAP_TLS_EXTRACT_BIT_L(*(tptr+5))) {
+ ND_PRINT((ndo, " len %u", EXTRACT_32BITS(tptr + 6)));
+ }
+ break;
+
+ case EAP_TYPE_FAST:
+ ND_PRINT((ndo, " FASTv%u",
+ EAP_TTLS_VERSION(*(tptr + 5))));
+ ND_PRINT((ndo, " flags [%s] 0x%02x,",
+ bittok2str(eap_tls_flags_values, "none", *(tptr+5)),
+ *(tptr + 5)));
+
+ if (EAP_TLS_EXTRACT_BIT_L(*(tptr+5))) {
+ ND_PRINT((ndo, " len %u", EXTRACT_32BITS(tptr + 6)));
+ }
+
+ /* FIXME - TLV attributes follow */
+ break;
+
+ case EAP_TYPE_AKA:
+ case EAP_TYPE_SIM:
+ ND_PRINT((ndo, " subtype [%s] 0x%02x,",
+ tok2str(eap_aka_subtype_values, "unknown", *(tptr+5)),
+ *(tptr + 5)));
+
+ /* FIXME - TLV attributes follow */
+ break;
+
+ case EAP_TYPE_MD5_CHALLENGE:
+ case EAP_TYPE_OTP:
+ case EAP_TYPE_GTC:
+ case EAP_TYPE_EXPANDED_TYPES:
+ case EAP_TYPE_EXPERIMENTAL:
+ default:
+ break;
+ }
+ }
+ break;
+
+ case EAP_FRAME_TYPE_LOGOFF:
+ case EAP_FRAME_TYPE_ENCAP_ASF_ALERT:
+ default:
+ break;
+ }
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "\n\t[|EAP]"));
+}
+
+/*
+ * Local Variables:
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Lawrence Berkeley Laboratory,
+ * Berkeley, CA. The name of the University 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.
+ *
+ * Initial contribution from Jeff Honig (jch@MITCHELL.CIT.CORNELL.EDU).
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-egp.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+struct egp_packet {
+ uint8_t egp_version;
+#define EGP_VERSION 2
+ uint8_t egp_type;
+#define EGPT_ACQUIRE 3
+#define EGPT_REACH 5
+#define EGPT_POLL 2
+#define EGPT_UPDATE 1
+#define EGPT_ERROR 8
+ uint8_t egp_code;
+#define EGPC_REQUEST 0
+#define EGPC_CONFIRM 1
+#define EGPC_REFUSE 2
+#define EGPC_CEASE 3
+#define EGPC_CEASEACK 4
+#define EGPC_HELLO 0
+#define EGPC_HEARDU 1
+ uint8_t egp_status;
+#define EGPS_UNSPEC 0
+#define EGPS_ACTIVE 1
+#define EGPS_PASSIVE 2
+#define EGPS_NORES 3
+#define EGPS_ADMIN 4
+#define EGPS_GODOWN 5
+#define EGPS_PARAM 6
+#define EGPS_PROTO 7
+#define EGPS_INDET 0
+#define EGPS_UP 1
+#define EGPS_DOWN 2
+#define EGPS_UNSOL 0x80
+ uint16_t egp_checksum;
+ uint16_t egp_as;
+ uint16_t egp_sequence;
+ union {
+ uint16_t egpu_hello;
+ uint8_t egpu_gws[2];
+ uint16_t egpu_reason;
+#define EGPR_UNSPEC 0
+#define EGPR_BADHEAD 1
+#define EGPR_BADDATA 2
+#define EGPR_NOREACH 3
+#define EGPR_XSPOLL 4
+#define EGPR_NORESP 5
+#define EGPR_UVERSION 6
+ } egp_handg;
+#define egp_hello egp_handg.egpu_hello
+#define egp_intgw egp_handg.egpu_gws[0]
+#define egp_extgw egp_handg.egpu_gws[1]
+#define egp_reason egp_handg.egpu_reason
+ union {
+ uint16_t egpu_poll;
+ uint32_t egpu_sourcenet;
+ } egp_pands;
+#define egp_poll egp_pands.egpu_poll
+#define egp_sourcenet egp_pands.egpu_sourcenet
+};
+
+static const char *egp_acquire_codes[] = {
+ "request",
+ "confirm",
+ "refuse",
+ "cease",
+ "cease_ack"
+};
+
+static const char *egp_acquire_status[] = {
+ "unspecified",
+ "active_mode",
+ "passive_mode",
+ "insufficient_resources",
+ "administratively_prohibited",
+ "going_down",
+ "parameter_violation",
+ "protocol_violation"
+};
+
+static const char *egp_reach_codes[] = {
+ "hello",
+ "i-h-u"
+};
+
+static const char *egp_status_updown[] = {
+ "indeterminate",
+ "up",
+ "down"
+};
+
+static const char *egp_reasons[] = {
+ "unspecified",
+ "bad_EGP_header_format",
+ "bad_EGP_data_field_format",
+ "reachability_info_unavailable",
+ "excessive_polling_rate",
+ "no_response",
+ "unsupported_version"
+};
+
+static void
+egpnrprint(netdissect_options *ndo,
+ register const struct egp_packet *egp)
+{
+ register const uint8_t *cp;
+ uint32_t addr;
+ register uint32_t net;
+ register u_int netlen;
+ int gateways, distances, networks;
+ int t_gateways;
+ const char *comma;
+
+ addr = egp->egp_sourcenet;
+ if (IN_CLASSA(addr)) {
+ net = addr & IN_CLASSA_NET;
+ netlen = 1;
+ } else if (IN_CLASSB(addr)) {
+ net = addr & IN_CLASSB_NET;
+ netlen = 2;
+ } else if (IN_CLASSC(addr)) {
+ net = addr & IN_CLASSC_NET;
+ netlen = 3;
+ } else {
+ net = 0;
+ netlen = 0;
+ }
+ cp = (uint8_t *)(egp + 1);
+
+ t_gateways = egp->egp_intgw + egp->egp_extgw;
+ for (gateways = 0; gateways < t_gateways; ++gateways) {
+ /* Pickup host part of gateway address */
+ addr = 0;
+ ND_TCHECK2(cp[0], 4 - netlen);
+ switch (netlen) {
+
+ case 1:
+ addr = *cp++;
+ /* fall through */
+ case 2:
+ addr = (addr << 8) | *cp++;
+ /* fall through */
+ case 3:
+ addr = (addr << 8) | *cp++;
+ }
+ addr |= net;
+ ND_TCHECK2(cp[0], 1);
+ distances = *cp++;
+ ND_PRINT((ndo, " %s %s ",
+ gateways < (int)egp->egp_intgw ? "int" : "ext",
+ ipaddr_string(ndo, &addr)));
+
+ comma = "";
+ ND_PRINT((ndo, "("));
+ while (--distances >= 0) {
+ ND_TCHECK2(cp[0], 2);
+ ND_PRINT((ndo, "%sd%d:", comma, (int)*cp++));
+ comma = ", ";
+ networks = *cp++;
+ while (--networks >= 0) {
+ /* Pickup network number */
+ ND_TCHECK2(cp[0], 1);
+ addr = (uint32_t)*cp++ << 24;
+ if (IN_CLASSB(addr)) {
+ ND_TCHECK2(cp[0], 1);
+ addr |= (uint32_t)*cp++ << 16;
+ } else if (!IN_CLASSA(addr)) {
+ ND_TCHECK2(cp[0], 2);
+ addr |= (uint32_t)*cp++ << 16;
+ addr |= (uint32_t)*cp++ << 8;
+ }
+ ND_PRINT((ndo, " %s", ipaddr_string(ndo, &addr)));
+ }
+ }
+ ND_PRINT((ndo, ")"));
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "[|]"));
+}
+
+void
+egp_print(netdissect_options *ndo,
+ register const uint8_t *bp, register u_int length)
+{
+ register const struct egp_packet *egp;
+ register int status;
+ register int code;
+ register int type;
+
+ egp = (struct egp_packet *)bp;
+ if (!ND_TTEST2(*egp, length)) {
+ ND_PRINT((ndo, "[|egp]"));
+ return;
+ }
+
+ if (!ndo->ndo_vflag) {
+ ND_PRINT((ndo, "EGPv%u, AS %u, seq %u, length %u",
+ egp->egp_version,
+ EXTRACT_16BITS(&egp->egp_as),
+ EXTRACT_16BITS(&egp->egp_sequence),
+ length));
+ return;
+ } else
+ ND_PRINT((ndo, "EGPv%u, length %u",
+ egp->egp_version,
+ length));
+
+ if (egp->egp_version != EGP_VERSION) {
+ ND_PRINT((ndo, "[version %d]", egp->egp_version));
+ return;
+ }
+
+ type = egp->egp_type;
+ code = egp->egp_code;
+ status = egp->egp_status;
+
+ switch (type) {
+ case EGPT_ACQUIRE:
+ ND_PRINT((ndo, " acquire"));
+ switch (code) {
+ case EGPC_REQUEST:
+ case EGPC_CONFIRM:
+ ND_PRINT((ndo, " %s", egp_acquire_codes[code]));
+ switch (status) {
+ case EGPS_UNSPEC:
+ case EGPS_ACTIVE:
+ case EGPS_PASSIVE:
+ ND_PRINT((ndo, " %s", egp_acquire_status[status]));
+ break;
+
+ default:
+ ND_PRINT((ndo, " [status %d]", status));
+ break;
+ }
+ ND_PRINT((ndo, " hello:%d poll:%d",
+ EXTRACT_16BITS(&egp->egp_hello),
+ EXTRACT_16BITS(&egp->egp_poll)));
+ break;
+
+ case EGPC_REFUSE:
+ case EGPC_CEASE:
+ case EGPC_CEASEACK:
+ ND_PRINT((ndo, " %s", egp_acquire_codes[code]));
+ switch (status ) {
+ case EGPS_UNSPEC:
+ case EGPS_NORES:
+ case EGPS_ADMIN:
+ case EGPS_GODOWN:
+ case EGPS_PARAM:
+ case EGPS_PROTO:
+ ND_PRINT((ndo, " %s", egp_acquire_status[status]));
+ break;
+
+ default:
+ ND_PRINT((ndo, "[status %d]", status));
+ break;
+ }
+ break;
+
+ default:
+ ND_PRINT((ndo, "[code %d]", code));
+ break;
+ }
+ break;
+
+ case EGPT_REACH:
+ switch (code) {
+
+ case EGPC_HELLO:
+ case EGPC_HEARDU:
+ ND_PRINT((ndo, " %s", egp_reach_codes[code]));
+ if (status <= EGPS_DOWN)
+ ND_PRINT((ndo, " state:%s", egp_status_updown[status]));
+ else
+ ND_PRINT((ndo, " [status %d]", status));
+ break;
+
+ default:
+ ND_PRINT((ndo, "[reach code %d]", code));
+ break;
+ }
+ break;
+
+ case EGPT_POLL:
+ ND_PRINT((ndo, " poll"));
+ if (egp->egp_status <= EGPS_DOWN)
+ ND_PRINT((ndo, " state:%s", egp_status_updown[status]));
+ else
+ ND_PRINT((ndo, " [status %d]", status));
+ ND_PRINT((ndo, " net:%s", ipaddr_string(ndo, &egp->egp_sourcenet)));
+ break;
+
+ case EGPT_UPDATE:
+ ND_PRINT((ndo, " update"));
+ if (status & EGPS_UNSOL) {
+ status &= ~EGPS_UNSOL;
+ ND_PRINT((ndo, " unsolicited"));
+ }
+ if (status <= EGPS_DOWN)
+ ND_PRINT((ndo, " state:%s", egp_status_updown[status]));
+ else
+ ND_PRINT((ndo, " [status %d]", status));
+ ND_PRINT((ndo, " %s int %d ext %d",
+ ipaddr_string(ndo, &egp->egp_sourcenet),
+ egp->egp_intgw,
+ egp->egp_extgw));
+ if (ndo->ndo_vflag)
+ egpnrprint(ndo, egp);
+ break;
+
+ case EGPT_ERROR:
+ ND_PRINT((ndo, " error"));
+ if (status <= EGPS_DOWN)
+ ND_PRINT((ndo, " state:%s", egp_status_updown[status]));
+ else
+ ND_PRINT((ndo, " [status %d]", status));
+
+ if (EXTRACT_16BITS(&egp->egp_reason) <= EGPR_UVERSION)
+ ND_PRINT((ndo, " %s", egp_reasons[EXTRACT_16BITS(&egp->egp_reason)]));
+ else
+ ND_PRINT((ndo, " [reason %d]", EXTRACT_16BITS(&egp->egp_reason)));
+ break;
+
+ default:
+ ND_PRINT((ndo, "[type %d]", type));
+ break;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 1998-2004 Hannes Gredler <hannes@tcpdump.org>
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-eigrp.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+/*
+ * packet format documented at
+ * http://www.rhyshaden.com/eigrp.htm
+ */
+
+struct eigrp_common_header {
+ uint8_t version;
+ uint8_t opcode;
+ uint8_t checksum[2];
+ uint8_t flags[4];
+ uint8_t seq[4];
+ uint8_t ack[4];
+ uint8_t asn[4];
+};
+
+#define EIGRP_VERSION 2
+
+#define EIGRP_OPCODE_UPDATE 1
+#define EIGRP_OPCODE_QUERY 3
+#define EIGRP_OPCODE_REPLY 4
+#define EIGRP_OPCODE_HELLO 5
+#define EIGRP_OPCODE_IPXSAP 6
+#define EIGRP_OPCODE_PROBE 7
+
+static const struct tok eigrp_opcode_values[] = {
+ { EIGRP_OPCODE_UPDATE, "Update" },
+ { EIGRP_OPCODE_QUERY, "Query" },
+ { EIGRP_OPCODE_REPLY, "Reply" },
+ { EIGRP_OPCODE_HELLO, "Hello" },
+ { EIGRP_OPCODE_IPXSAP, "IPX SAP" },
+ { EIGRP_OPCODE_PROBE, "Probe" },
+ { 0, NULL}
+};
+
+static const struct tok eigrp_common_header_flag_values[] = {
+ { 0x01, "Init" },
+ { 0x02, "Conditionally Received" },
+ { 0, NULL}
+};
+
+struct eigrp_tlv_header {
+ uint8_t type[2];
+ uint8_t length[2];
+};
+
+#define EIGRP_TLV_GENERAL_PARM 0x0001
+#define EIGRP_TLV_AUTH 0x0002
+#define EIGRP_TLV_SEQ 0x0003
+#define EIGRP_TLV_SW_VERSION 0x0004
+#define EIGRP_TLV_MCAST_SEQ 0x0005
+#define EIGRP_TLV_IP_INT 0x0102
+#define EIGRP_TLV_IP_EXT 0x0103
+#define EIGRP_TLV_AT_INT 0x0202
+#define EIGRP_TLV_AT_EXT 0x0203
+#define EIGRP_TLV_AT_CABLE_SETUP 0x0204
+#define EIGRP_TLV_IPX_INT 0x0302
+#define EIGRP_TLV_IPX_EXT 0x0303
+
+static const struct tok eigrp_tlv_values[] = {
+ { EIGRP_TLV_GENERAL_PARM, "General Parameters"},
+ { EIGRP_TLV_AUTH, "Authentication"},
+ { EIGRP_TLV_SEQ, "Sequence"},
+ { EIGRP_TLV_SW_VERSION, "Software Version"},
+ { EIGRP_TLV_MCAST_SEQ, "Next Multicast Sequence"},
+ { EIGRP_TLV_IP_INT, "IP Internal routes"},
+ { EIGRP_TLV_IP_EXT, "IP External routes"},
+ { EIGRP_TLV_AT_INT, "AppleTalk Internal routes"},
+ { EIGRP_TLV_AT_EXT, "AppleTalk External routes"},
+ { EIGRP_TLV_AT_CABLE_SETUP, "AppleTalk Cable setup"},
+ { EIGRP_TLV_IPX_INT, "IPX Internal routes"},
+ { EIGRP_TLV_IPX_EXT, "IPX External routes"},
+ { 0, NULL}
+};
+
+struct eigrp_tlv_general_parm_t {
+ uint8_t k1;
+ uint8_t k2;
+ uint8_t k3;
+ uint8_t k4;
+ uint8_t k5;
+ uint8_t res;
+ uint8_t holdtime[2];
+};
+
+struct eigrp_tlv_sw_version_t {
+ uint8_t ios_major;
+ uint8_t ios_minor;
+ uint8_t eigrp_major;
+ uint8_t eigrp_minor;
+};
+
+struct eigrp_tlv_ip_int_t {
+ uint8_t nexthop[4];
+ uint8_t delay[4];
+ uint8_t bandwidth[4];
+ uint8_t mtu[3];
+ uint8_t hopcount;
+ uint8_t reliability;
+ uint8_t load;
+ uint8_t reserved[2];
+ uint8_t plen;
+ uint8_t destination; /* variable length [1-4] bytes encoding */
+};
+
+struct eigrp_tlv_ip_ext_t {
+ uint8_t nexthop[4];
+ uint8_t origin_router[4];
+ uint8_t origin_as[4];
+ uint8_t tag[4];
+ uint8_t metric[4];
+ uint8_t reserved[2];
+ uint8_t proto_id;
+ uint8_t flags;
+ uint8_t delay[4];
+ uint8_t bandwidth[4];
+ uint8_t mtu[3];
+ uint8_t hopcount;
+ uint8_t reliability;
+ uint8_t load;
+ uint8_t reserved2[2];
+ uint8_t plen;
+ uint8_t destination; /* variable length [1-4] bytes encoding */
+};
+
+struct eigrp_tlv_at_cable_setup_t {
+ uint8_t cable_start[2];
+ uint8_t cable_end[2];
+ uint8_t router_id[4];
+};
+
+struct eigrp_tlv_at_int_t {
+ uint8_t nexthop[4];
+ uint8_t delay[4];
+ uint8_t bandwidth[4];
+ uint8_t mtu[3];
+ uint8_t hopcount;
+ uint8_t reliability;
+ uint8_t load;
+ uint8_t reserved[2];
+ uint8_t cable_start[2];
+ uint8_t cable_end[2];
+};
+
+struct eigrp_tlv_at_ext_t {
+ uint8_t nexthop[4];
+ uint8_t origin_router[4];
+ uint8_t origin_as[4];
+ uint8_t tag[4];
+ uint8_t proto_id;
+ uint8_t flags;
+ uint8_t metric[2];
+ uint8_t delay[4];
+ uint8_t bandwidth[4];
+ uint8_t mtu[3];
+ uint8_t hopcount;
+ uint8_t reliability;
+ uint8_t load;
+ uint8_t reserved2[2];
+ uint8_t cable_start[2];
+ uint8_t cable_end[2];
+};
+
+static const struct tok eigrp_ext_proto_id_values[] = {
+ { 0x01, "IGRP" },
+ { 0x02, "EIGRP" },
+ { 0x03, "Static" },
+ { 0x04, "RIP" },
+ { 0x05, "Hello" },
+ { 0x06, "OSPF" },
+ { 0x07, "IS-IS" },
+ { 0x08, "EGP" },
+ { 0x09, "BGP" },
+ { 0x0a, "IDRP" },
+ { 0x0b, "Connected" },
+ { 0, NULL}
+};
+
+void
+eigrp_print(netdissect_options *ndo, register const u_char *pptr, register u_int len)
+{
+ const struct eigrp_common_header *eigrp_com_header;
+ const struct eigrp_tlv_header *eigrp_tlv_header;
+ const u_char *tptr,*tlv_tptr;
+ u_int tlen,eigrp_tlv_len,eigrp_tlv_type,tlv_tlen, byte_length, bit_length;
+ uint8_t prefix[4];
+
+ union {
+ const struct eigrp_tlv_general_parm_t *eigrp_tlv_general_parm;
+ const struct eigrp_tlv_sw_version_t *eigrp_tlv_sw_version;
+ const struct eigrp_tlv_ip_int_t *eigrp_tlv_ip_int;
+ const struct eigrp_tlv_ip_ext_t *eigrp_tlv_ip_ext;
+ const struct eigrp_tlv_at_cable_setup_t *eigrp_tlv_at_cable_setup;
+ const struct eigrp_tlv_at_int_t *eigrp_tlv_at_int;
+ const struct eigrp_tlv_at_ext_t *eigrp_tlv_at_ext;
+ } tlv_ptr;
+
+ tptr=pptr;
+ eigrp_com_header = (const struct eigrp_common_header *)pptr;
+ ND_TCHECK(*eigrp_com_header);
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (eigrp_com_header->version != EIGRP_VERSION) {
+ ND_PRINT((ndo, "EIGRP version %u packet not supported",eigrp_com_header->version));
+ return;
+ }
+
+ /* in non-verbose mode just lets print the basic Message Type*/
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "EIGRP %s, length: %u",
+ tok2str(eigrp_opcode_values, "unknown (%u)",eigrp_com_header->opcode),
+ len));
+ return;
+ }
+
+ /* ok they seem to want to know everything - lets fully decode it */
+
+ tlen=len-sizeof(struct eigrp_common_header);
+
+ /* FIXME print other header info */
+ ND_PRINT((ndo, "\n\tEIGRP v%u, opcode: %s (%u), chksum: 0x%04x, Flags: [%s]\n\tseq: 0x%08x, ack: 0x%08x, AS: %u, length: %u",
+ eigrp_com_header->version,
+ tok2str(eigrp_opcode_values, "unknown, type: %u",eigrp_com_header->opcode),
+ eigrp_com_header->opcode,
+ EXTRACT_16BITS(&eigrp_com_header->checksum),
+ tok2str(eigrp_common_header_flag_values,
+ "none",
+ EXTRACT_32BITS(&eigrp_com_header->flags)),
+ EXTRACT_32BITS(&eigrp_com_header->seq),
+ EXTRACT_32BITS(&eigrp_com_header->ack),
+ EXTRACT_32BITS(&eigrp_com_header->asn),
+ tlen));
+
+ tptr+=sizeof(const struct eigrp_common_header);
+
+ while(tlen>0) {
+ /* did we capture enough for fully decoding the object header ? */
+ ND_TCHECK2(*tptr, sizeof(struct eigrp_tlv_header));
+
+ eigrp_tlv_header = (const struct eigrp_tlv_header *)tptr;
+ eigrp_tlv_len=EXTRACT_16BITS(&eigrp_tlv_header->length);
+ eigrp_tlv_type=EXTRACT_16BITS(&eigrp_tlv_header->type);
+
+
+ if (eigrp_tlv_len < sizeof(struct eigrp_tlv_header) ||
+ eigrp_tlv_len > tlen) {
+ print_unknown_data(ndo,tptr+sizeof(struct eigrp_tlv_header),"\n\t ",tlen);
+ return;
+ }
+
+ ND_PRINT((ndo, "\n\t %s TLV (0x%04x), length: %u",
+ tok2str(eigrp_tlv_values,
+ "Unknown",
+ eigrp_tlv_type),
+ eigrp_tlv_type,
+ eigrp_tlv_len));
+
+ tlv_tptr=tptr+sizeof(struct eigrp_tlv_header);
+ tlv_tlen=eigrp_tlv_len-sizeof(struct eigrp_tlv_header);
+
+ /* did we capture enough for fully decoding the object ? */
+ ND_TCHECK2(*tptr, eigrp_tlv_len);
+
+ switch(eigrp_tlv_type) {
+
+ case EIGRP_TLV_GENERAL_PARM:
+ tlv_ptr.eigrp_tlv_general_parm = (const struct eigrp_tlv_general_parm_t *)tlv_tptr;
+
+ ND_PRINT((ndo, "\n\t holdtime: %us, k1 %u, k2 %u, k3 %u, k4 %u, k5 %u",
+ EXTRACT_16BITS(tlv_ptr.eigrp_tlv_general_parm->holdtime),
+ tlv_ptr.eigrp_tlv_general_parm->k1,
+ tlv_ptr.eigrp_tlv_general_parm->k2,
+ tlv_ptr.eigrp_tlv_general_parm->k3,
+ tlv_ptr.eigrp_tlv_general_parm->k4,
+ tlv_ptr.eigrp_tlv_general_parm->k5));
+ break;
+
+ case EIGRP_TLV_SW_VERSION:
+ tlv_ptr.eigrp_tlv_sw_version = (const struct eigrp_tlv_sw_version_t *)tlv_tptr;
+
+ ND_PRINT((ndo, "\n\t IOS version: %u.%u, EIGRP version %u.%u",
+ tlv_ptr.eigrp_tlv_sw_version->ios_major,
+ tlv_ptr.eigrp_tlv_sw_version->ios_minor,
+ tlv_ptr.eigrp_tlv_sw_version->eigrp_major,
+ tlv_ptr.eigrp_tlv_sw_version->eigrp_minor));
+ break;
+
+ case EIGRP_TLV_IP_INT:
+ tlv_ptr.eigrp_tlv_ip_int = (const struct eigrp_tlv_ip_int_t *)tlv_tptr;
+
+ bit_length = tlv_ptr.eigrp_tlv_ip_int->plen;
+ if (bit_length > 32) {
+ ND_PRINT((ndo, "\n\t illegal prefix length %u",bit_length));
+ break;
+ }
+ byte_length = (bit_length + 7) / 8; /* variable length encoding */
+ memset(prefix, 0, 4);
+ memcpy(prefix,&tlv_ptr.eigrp_tlv_ip_int->destination,byte_length);
+
+ ND_PRINT((ndo, "\n\t IPv4 prefix: %15s/%u, nexthop: ",
+ ipaddr_string(ndo, prefix),
+ bit_length));
+ if (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_ip_int->nexthop) == 0)
+ ND_PRINT((ndo, "self"));
+ else
+ ND_PRINT((ndo, "%s",ipaddr_string(ndo, &tlv_ptr.eigrp_tlv_ip_int->nexthop)));
+
+ ND_PRINT((ndo, "\n\t delay %u ms, bandwidth %u Kbps, mtu %u, hop %u, reliability %u, load %u",
+ (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_ip_int->delay)/100),
+ EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_ip_int->bandwidth),
+ EXTRACT_24BITS(&tlv_ptr.eigrp_tlv_ip_int->mtu),
+ tlv_ptr.eigrp_tlv_ip_int->hopcount,
+ tlv_ptr.eigrp_tlv_ip_int->reliability,
+ tlv_ptr.eigrp_tlv_ip_int->load));
+ break;
+
+ case EIGRP_TLV_IP_EXT:
+ tlv_ptr.eigrp_tlv_ip_ext = (const struct eigrp_tlv_ip_ext_t *)tlv_tptr;
+
+ bit_length = tlv_ptr.eigrp_tlv_ip_ext->plen;
+ if (bit_length > 32) {
+ ND_PRINT((ndo, "\n\t illegal prefix length %u",bit_length));
+ break;
+ }
+ byte_length = (bit_length + 7) / 8; /* variable length encoding */
+ memset(prefix, 0, 4);
+ memcpy(prefix,&tlv_ptr.eigrp_tlv_ip_ext->destination,byte_length);
+
+ ND_PRINT((ndo, "\n\t IPv4 prefix: %15s/%u, nexthop: ",
+ ipaddr_string(ndo, prefix),
+ bit_length));
+ if (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_ip_ext->nexthop) == 0)
+ ND_PRINT((ndo, "self"));
+ else
+ ND_PRINT((ndo, "%s",ipaddr_string(ndo, &tlv_ptr.eigrp_tlv_ip_ext->nexthop)));
+
+ ND_PRINT((ndo, "\n\t origin-router %s, origin-as %u, origin-proto %s, flags [0x%02x], tag 0x%08x, metric %u",
+ ipaddr_string(ndo, tlv_ptr.eigrp_tlv_ip_ext->origin_router),
+ EXTRACT_32BITS(tlv_ptr.eigrp_tlv_ip_ext->origin_as),
+ tok2str(eigrp_ext_proto_id_values,"unknown",tlv_ptr.eigrp_tlv_ip_ext->proto_id),
+ tlv_ptr.eigrp_tlv_ip_ext->flags,
+ EXTRACT_32BITS(tlv_ptr.eigrp_tlv_ip_ext->tag),
+ EXTRACT_32BITS(tlv_ptr.eigrp_tlv_ip_ext->metric)));
+
+ ND_PRINT((ndo, "\n\t delay %u ms, bandwidth %u Kbps, mtu %u, hop %u, reliability %u, load %u",
+ (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_ip_ext->delay)/100),
+ EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_ip_ext->bandwidth),
+ EXTRACT_24BITS(&tlv_ptr.eigrp_tlv_ip_ext->mtu),
+ tlv_ptr.eigrp_tlv_ip_ext->hopcount,
+ tlv_ptr.eigrp_tlv_ip_ext->reliability,
+ tlv_ptr.eigrp_tlv_ip_ext->load));
+ break;
+
+ case EIGRP_TLV_AT_CABLE_SETUP:
+ tlv_ptr.eigrp_tlv_at_cable_setup = (const struct eigrp_tlv_at_cable_setup_t *)tlv_tptr;
+
+ ND_PRINT((ndo, "\n\t Cable-range: %u-%u, Router-ID %u",
+ EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_cable_setup->cable_start),
+ EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_cable_setup->cable_end),
+ EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_cable_setup->router_id)));
+ break;
+
+ case EIGRP_TLV_AT_INT:
+ tlv_ptr.eigrp_tlv_at_int = (const struct eigrp_tlv_at_int_t *)tlv_tptr;
+
+ ND_PRINT((ndo, "\n\t Cable-Range: %u-%u, nexthop: ",
+ EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_int->cable_start),
+ EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_int->cable_end)));
+
+ if (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_int->nexthop) == 0)
+ ND_PRINT((ndo, "self"));
+ else
+ ND_PRINT((ndo, "%u.%u",
+ EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_int->nexthop),
+ EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_int->nexthop[2])));
+
+ ND_PRINT((ndo, "\n\t delay %u ms, bandwidth %u Kbps, mtu %u, hop %u, reliability %u, load %u",
+ (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_int->delay)/100),
+ EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_int->bandwidth),
+ EXTRACT_24BITS(&tlv_ptr.eigrp_tlv_at_int->mtu),
+ tlv_ptr.eigrp_tlv_at_int->hopcount,
+ tlv_ptr.eigrp_tlv_at_int->reliability,
+ tlv_ptr.eigrp_tlv_at_int->load));
+ break;
+
+ case EIGRP_TLV_AT_EXT:
+ tlv_ptr.eigrp_tlv_at_ext = (const struct eigrp_tlv_at_ext_t *)tlv_tptr;
+
+ ND_PRINT((ndo, "\n\t Cable-Range: %u-%u, nexthop: ",
+ EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_ext->cable_start),
+ EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_ext->cable_end)));
+
+ if (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_ext->nexthop) == 0)
+ ND_PRINT((ndo, "self"));
+ else
+ ND_PRINT((ndo, "%u.%u",
+ EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_ext->nexthop),
+ EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_ext->nexthop[2])));
+
+ ND_PRINT((ndo, "\n\t origin-router %u, origin-as %u, origin-proto %s, flags [0x%02x], tag 0x%08x, metric %u",
+ EXTRACT_32BITS(tlv_ptr.eigrp_tlv_at_ext->origin_router),
+ EXTRACT_32BITS(tlv_ptr.eigrp_tlv_at_ext->origin_as),
+ tok2str(eigrp_ext_proto_id_values,"unknown",tlv_ptr.eigrp_tlv_at_ext->proto_id),
+ tlv_ptr.eigrp_tlv_at_ext->flags,
+ EXTRACT_32BITS(tlv_ptr.eigrp_tlv_at_ext->tag),
+ EXTRACT_16BITS(tlv_ptr.eigrp_tlv_at_ext->metric)));
+
+ ND_PRINT((ndo, "\n\t delay %u ms, bandwidth %u Kbps, mtu %u, hop %u, reliability %u, load %u",
+ (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_ext->delay)/100),
+ EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_ext->bandwidth),
+ EXTRACT_24BITS(&tlv_ptr.eigrp_tlv_at_ext->mtu),
+ tlv_ptr.eigrp_tlv_at_ext->hopcount,
+ tlv_ptr.eigrp_tlv_at_ext->reliability,
+ tlv_ptr.eigrp_tlv_at_ext->load));
+ break;
+
+ /*
+ * FIXME those are the defined TLVs that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+
+ case EIGRP_TLV_AUTH:
+ case EIGRP_TLV_SEQ:
+ case EIGRP_TLV_MCAST_SEQ:
+ case EIGRP_TLV_IPX_INT:
+ case EIGRP_TLV_IPX_EXT:
+
+ default:
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo,tlv_tptr,"\n\t ",tlv_tlen);
+ break;
+ }
+ /* do we want to see an additionally hexdump ? */
+ if (ndo->ndo_vflag > 1)
+ print_unknown_data(ndo,tptr+sizeof(struct eigrp_tlv_header),"\n\t ",
+ eigrp_tlv_len-sizeof(struct eigrp_tlv_header));
+
+ tptr+=eigrp_tlv_len;
+ tlen-=eigrp_tlv_len;
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+}
--- /dev/null
+/* $OpenBSD: print-enc.c,v 1.7 2002/02/19 19:39:40 millert Exp $ */
+
+/*
+ * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-enc.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+/* From $OpenBSD: if_enc.h,v 1.8 2001/06/25 05:14:00 angelos Exp $ */
+/*
+ * The authors of this code are John Ioannidis (ji@tla.org),
+ * Angelos D. Keromytis (kermit@csd.uch.gr) and
+ * Niels Provos (provos@physnet.uni-hamburg.de).
+ *
+ * This code was written by John Ioannidis for BSD/OS in Athens, Greece,
+ * in November 1995.
+ *
+ * Ported to OpenBSD and NetBSD, with additional transforms, in December 1996,
+ * by Angelos D. Keromytis.
+ *
+ * Additional transforms and features in 1997 and 1998 by Angelos D. Keromytis
+ * and Niels Provos.
+ *
+ * Copyright (C) 1995, 1996, 1997, 1998 by John Ioannidis, Angelos D. Keromytis
+ * and Niels Provos.
+ * Copyright (c) 2001, Angelos D. Keromytis.
+ *
+ * Permission to use, copy, and modify this software with or without fee
+ * is hereby granted, provided that this entire notice is included in
+ * all copies of any software which is or includes a copy or
+ * modification of this software.
+ * You may use this code under the GNU public license if you so wish. Please
+ * contribute changes back to the authors under this freer than GPL license
+ * so that we may further the use of strong encryption without limitations to
+ * all.
+ *
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY
+ * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE
+ * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
+ * PURPOSE.
+ */
+
+#define ENC_HDRLEN 12
+
+/* From $OpenBSD: mbuf.h,v 1.56 2002/01/25 15:50:23 art Exp $ */
+#define M_CONF 0x0400 /* packet was encrypted (ESP-transport) */
+#define M_AUTH 0x0800 /* packet was authenticated (AH) */
+
+struct enchdr {
+ uint32_t af;
+ uint32_t spi;
+ uint32_t flags;
+};
+
+#define ENC_PRINT_TYPE(wh, xf, nam) \
+ if ((wh) & (xf)) { \
+ ND_PRINT((ndo, "%s%s", nam, (wh) == (xf) ? "): " : ",")); \
+ (wh) &= ~(xf); \
+ }
+
+u_int
+enc_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ register u_int length = h->len;
+ register u_int caplen = h->caplen;
+ int flags;
+ const struct enchdr *hdr;
+
+ if (caplen < ENC_HDRLEN) {
+ ND_PRINT((ndo, "[|enc]"));
+ goto out;
+ }
+
+ hdr = (struct enchdr *)p;
+ flags = hdr->flags;
+ if (flags == 0)
+ ND_PRINT((ndo, "(unprotected): "));
+ else
+ ND_PRINT((ndo, "("));
+ ENC_PRINT_TYPE(flags, M_AUTH, "authentic");
+ ENC_PRINT_TYPE(flags, M_CONF, "confidential");
+ /* ENC_PRINT_TYPE(flags, M_TUNNEL, "tunnel"); */
+ ND_PRINT((ndo, "SPI 0x%08x: ", EXTRACT_32BITS(&hdr->spi)));
+
+ length -= ENC_HDRLEN;
+ caplen -= ENC_HDRLEN;
+ p += ENC_HDRLEN;
+
+ switch (hdr->af) {
+ case AF_INET:
+ ip_print(ndo, p, length);
+ break;
+#ifdef AF_INET6
+ case AF_INET6:
+ ip6_print(ndo, p, length);
+ break;
+#endif
+ }
+
+out:
+ return (ENC_HDRLEN);
+}
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/* NetBSD: print-ah.c,v 1.4 1996/05/20 00:41:16 fvdl Exp */
+
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-esp.c,v 1.6 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+/* Any code in this file that depends on HAVE_LIBCRYPTO depends on
+ * HAVE_OPENSSL_EVP_H too. Undefining the former when the latter isn't defined
+ * is the simplest way of handling the dependency.
+ */
+#ifdef HAVE_LIBCRYPTO
+#ifdef HAVE_OPENSSL_EVP_H
+#include <openssl/evp.h>
+#else
+#undef HAVE_LIBCRYPTO
+#endif
+#endif
+
+#include "ip.h"
+#ifdef INET6
+#include "ip6.h"
+#endif
+
+#include "interface.h"
+#include "extract.h"
+
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 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.
+ */
+
+/*
+ * RFC1827/2406 Encapsulated Security Payload.
+ */
+
+struct newesp {
+ uint32_t esp_spi; /* ESP */
+ uint32_t esp_seq; /* Sequence number */
+ /*variable size*/ /* (IV and) Payload data */
+ /*variable size*/ /* padding */
+ /*8bit*/ /* pad size */
+ /*8bit*/ /* next header */
+ /*8bit*/ /* next header */
+ /*variable size, 32bit bound*/ /* Authentication data */
+};
+
+#ifdef HAVE_LIBCRYPTO
+union inaddr_u {
+ struct in_addr in4;
+#ifdef INET6
+ struct in6_addr in6;
+#endif
+};
+struct sa_list {
+ struct sa_list *next;
+ u_int daddr_version;
+ union inaddr_u daddr;
+ uint32_t spi; /* if == 0, then IKEv2 */
+ int initiator;
+ u_char spii[8]; /* for IKEv2 */
+ u_char spir[8];
+ const EVP_CIPHER *evp;
+ int ivlen;
+ int authlen;
+ u_char authsecret[256];
+ int authsecret_len;
+ u_char secret[256]; /* is that big enough for all secrets? */
+ int secretlen;
+};
+
+/*
+ * this will adjust ndo_packetp and ndo_snapend to new buffer!
+ */
+USES_APPLE_DEPRECATED_API
+int esp_print_decrypt_buffer_by_ikev2(netdissect_options *ndo,
+ int initiator,
+ u_char spii[8], u_char spir[8],
+ u_char *buf, u_char *end)
+{
+ struct sa_list *sa;
+ u_char *iv;
+ int len;
+ EVP_CIPHER_CTX ctx;
+
+ /* initiator arg is any non-zero value */
+ if(initiator) initiator=1;
+
+ /* see if we can find the SA, and if so, decode it */
+ for (sa = ndo->ndo_sa_list_head; sa != NULL; sa = sa->next) {
+ if (sa->spi == 0
+ && initiator == sa->initiator
+ && memcmp(spii, sa->spii, 8) == 0
+ && memcmp(spir, sa->spir, 8) == 0)
+ break;
+ }
+
+ if(sa == NULL) return 0;
+ if(sa->evp == NULL) return 0;
+
+ /*
+ * remove authenticator, and see if we still have something to
+ * work with
+ */
+ end = end - sa->authlen;
+ iv = buf;
+ buf = buf + sa->ivlen;
+ len = end-buf;
+
+ if(end <= buf) return 0;
+
+ memset(&ctx, 0, sizeof(ctx));
+ if (EVP_CipherInit(&ctx, sa->evp, sa->secret, NULL, 0) < 0)
+ (*ndo->ndo_warning)(ndo, "espkey init failed");
+ EVP_CipherInit(&ctx, NULL, NULL, iv, 0);
+ EVP_Cipher(&ctx, buf, buf, len);
+ EVP_CIPHER_CTX_cleanup(&ctx);
+
+ ndo->ndo_packetp = buf;
+ ndo->ndo_snapend = end;
+
+ return 1;
+
+}
+USES_APPLE_RST
+
+static void esp_print_addsa(netdissect_options *ndo,
+ struct sa_list *sa, int sa_def)
+{
+ /* copy the "sa" */
+
+ struct sa_list *nsa;
+
+ nsa = (struct sa_list *)malloc(sizeof(struct sa_list));
+ if (nsa == NULL)
+ (*ndo->ndo_error)(ndo, "ran out of memory to allocate sa structure");
+
+ *nsa = *sa;
+
+ if (sa_def)
+ ndo->ndo_sa_default = nsa;
+
+ nsa->next = ndo->ndo_sa_list_head;
+ ndo->ndo_sa_list_head = nsa;
+}
+
+
+static u_int hexdigit(netdissect_options *ndo, char hex)
+{
+ if (hex >= '0' && hex <= '9')
+ return (hex - '0');
+ else if (hex >= 'A' && hex <= 'F')
+ return (hex - 'A' + 10);
+ else if (hex >= 'a' && hex <= 'f')
+ return (hex - 'a' + 10);
+ else {
+ (*ndo->ndo_error)(ndo, "invalid hex digit %c in espsecret\n", hex);
+ return 0;
+ }
+}
+
+static u_int hex2byte(netdissect_options *ndo, char *hexstring)
+{
+ u_int byte;
+
+ byte = (hexdigit(ndo, hexstring[0]) << 4) + hexdigit(ndo, hexstring[1]);
+ return byte;
+}
+
+/*
+ * returns size of binary, 0 on failure.
+ */
+static
+int espprint_decode_hex(netdissect_options *ndo,
+ u_char *binbuf, unsigned int binbuf_len,
+ char *hex)
+{
+ unsigned int len;
+ int i;
+
+ len = strlen(hex) / 2;
+
+ if (len > binbuf_len) {
+ (*ndo->ndo_warning)(ndo, "secret is too big: %d\n", len);
+ return 0;
+ }
+
+ i = 0;
+ while (hex[0] != '\0' && hex[1]!='\0') {
+ binbuf[i] = hex2byte(ndo, hex);
+ hex += 2;
+ i++;
+ }
+
+ return i;
+}
+
+/*
+ * decode the form: SPINUM@IP <tab> ALGONAME:0xsecret
+ */
+
+USES_APPLE_DEPRECATED_API
+static int
+espprint_decode_encalgo(netdissect_options *ndo,
+ char *decode, struct sa_list *sa)
+{
+ size_t i;
+ const EVP_CIPHER *evp;
+ int authlen = 0;
+ char *colon, *p;
+
+ colon = strchr(decode, ':');
+ if (colon == NULL) {
+ (*ndo->ndo_warning)(ndo, "failed to decode espsecret: %s\n", decode);
+ return 0;
+ }
+ *colon = '\0';
+
+ if (strlen(decode) > strlen("-hmac96") &&
+ !strcmp(decode + strlen(decode) - strlen("-hmac96"),
+ "-hmac96")) {
+ p = strstr(decode, "-hmac96");
+ *p = '\0';
+ authlen = 12;
+ }
+ if (strlen(decode) > strlen("-cbc") &&
+ !strcmp(decode + strlen(decode) - strlen("-cbc"), "-cbc")) {
+ p = strstr(decode, "-cbc");
+ *p = '\0';
+ }
+ evp = EVP_get_cipherbyname(decode);
+
+ if (!evp) {
+ (*ndo->ndo_warning)(ndo, "failed to find cipher algo %s\n", decode);
+ sa->evp = NULL;
+ sa->authlen = 0;
+ sa->ivlen = 0;
+ return 0;
+ }
+
+ sa->evp = evp;
+ sa->authlen = authlen;
+ sa->ivlen = EVP_CIPHER_iv_length(evp);
+
+ colon++;
+ if (colon[0] == '0' && colon[1] == 'x') {
+ /* decode some hex! */
+
+ colon += 2;
+ sa->secretlen = espprint_decode_hex(ndo, sa->secret, sizeof(sa->secret), colon);
+ if(sa->secretlen == 0) return 0;
+ } else {
+ i = strlen(colon);
+
+ if (i < sizeof(sa->secret)) {
+ memcpy(sa->secret, colon, i);
+ sa->secretlen = i;
+ } else {
+ memcpy(sa->secret, colon, sizeof(sa->secret));
+ sa->secretlen = sizeof(sa->secret);
+ }
+ }
+
+ return 1;
+}
+USES_APPLE_RST
+
+/*
+ * for the moment, ignore the auth algorith, just hard code the authenticator
+ * length. Need to research how openssl looks up HMAC stuff.
+ */
+static int
+espprint_decode_authalgo(netdissect_options *ndo,
+ char *decode, struct sa_list *sa)
+{
+ char *colon;
+
+ colon = strchr(decode, ':');
+ if (colon == NULL) {
+ (*ndo->ndo_warning)(ndo, "failed to decode espsecret: %s\n", decode);
+ return 0;
+ }
+ *colon = '\0';
+
+ if(strcasecmp(colon,"sha1") == 0 ||
+ strcasecmp(colon,"md5") == 0) {
+ sa->authlen = 12;
+ }
+ return 1;
+}
+
+static void esp_print_decode_ikeline(netdissect_options *ndo, char *line,
+ const char *file, int lineno)
+{
+ /* it's an IKEv2 secret, store it instead */
+ struct sa_list sa1;
+
+ char *init;
+ char *icookie, *rcookie;
+ int ilen, rlen;
+ char *authkey;
+ char *enckey;
+
+ init = strsep(&line, " \t");
+ icookie = strsep(&line, " \t");
+ rcookie = strsep(&line, " \t");
+ authkey = strsep(&line, " \t");
+ enckey = strsep(&line, " \t");
+
+ /* if any fields are missing */
+ if(!init || !icookie || !rcookie || !authkey || !enckey) {
+ (*ndo->ndo_warning)(ndo, "print_esp: failed to find all fields for ikev2 at %s:%u",
+ file, lineno);
+
+ return;
+ }
+
+ ilen = strlen(icookie);
+ rlen = strlen(rcookie);
+
+ if((init[0]!='I' && init[0]!='R')
+ || icookie[0]!='0' || icookie[1]!='x'
+ || rcookie[0]!='0' || rcookie[1]!='x'
+ || ilen!=18
+ || rlen!=18) {
+ (*ndo->ndo_warning)(ndo, "print_esp: line %s:%u improperly formatted.",
+ file, lineno);
+
+ (*ndo->ndo_warning)(ndo, "init=%s icookie=%s(%u) rcookie=%s(%u)",
+ init, icookie, ilen, rcookie, rlen);
+
+ return;
+ }
+
+ sa1.spi = 0;
+ sa1.initiator = (init[0] == 'I');
+ if(espprint_decode_hex(ndo, sa1.spii, sizeof(sa1.spii), icookie+2)!=8)
+ return;
+
+ if(espprint_decode_hex(ndo, sa1.spir, sizeof(sa1.spir), rcookie+2)!=8)
+ return;
+
+ if(!espprint_decode_encalgo(ndo, enckey, &sa1)) return;
+
+ if(!espprint_decode_authalgo(ndo, authkey, &sa1)) return;
+
+ esp_print_addsa(ndo, &sa1, FALSE);
+}
+
+/*
+ *
+ * special form: file /name
+ * causes us to go read from this file instead.
+ *
+ */
+static void esp_print_decode_onesecret(netdissect_options *ndo, char *line,
+ const char *file, int lineno)
+{
+ struct sa_list sa1;
+ int sa_def;
+
+ char *spikey;
+ char *decode;
+
+ spikey = strsep(&line, " \t");
+ sa_def = 0;
+ memset(&sa1, 0, sizeof(struct sa_list));
+
+ /* if there is only one token, then it is an algo:key token */
+ if (line == NULL) {
+ decode = spikey;
+ spikey = NULL;
+ /* sa1.daddr.version = 0; */
+ /* memset(&sa1.daddr, 0, sizeof(sa1.daddr)); */
+ /* sa1.spi = 0; */
+ sa_def = 1;
+ } else
+ decode = line;
+
+ if (spikey && strcasecmp(spikey, "file") == 0) {
+ /* open file and read it */
+ FILE *secretfile;
+ char fileline[1024];
+ int lineno=0;
+ char *nl;
+ char *filename = line;
+
+ secretfile = fopen(filename, FOPEN_READ_TXT);
+ if (secretfile == NULL) {
+ perror(filename);
+ exit(3);
+ }
+
+ while (fgets(fileline, sizeof(fileline)-1, secretfile) != NULL) {
+ lineno++;
+ /* remove newline from the line */
+ nl = strchr(fileline, '\n');
+ if (nl)
+ *nl = '\0';
+ if (fileline[0] == '#') continue;
+ if (fileline[0] == '\0') continue;
+
+ esp_print_decode_onesecret(ndo, fileline, filename, lineno);
+ }
+ fclose(secretfile);
+
+ return;
+ }
+
+ if (spikey && strcasecmp(spikey, "ikev2") == 0) {
+ esp_print_decode_ikeline(ndo, line, file, lineno);
+ return;
+ }
+
+ if (spikey) {
+
+ char *spistr, *foo;
+ uint32_t spino;
+
+ spistr = strsep(&spikey, "@");
+
+ spino = strtoul(spistr, &foo, 0);
+ if (spistr == foo || !spikey) {
+ (*ndo->ndo_warning)(ndo, "print_esp: failed to decode spi# %s\n", foo);
+ return;
+ }
+
+ sa1.spi = spino;
+
+#ifdef INET6
+ if (inet_pton(AF_INET6, spikey, &sa1.daddr.in6) == 1) {
+ sa1.daddr_version = 6;
+ } else
+#endif
+ if (inet_pton(AF_INET, spikey, &sa1.daddr.in4) == 1) {
+ sa1.daddr_version = 4;
+ } else {
+ (*ndo->ndo_warning)(ndo, "print_esp: can not decode IP# %s\n", spikey);
+ return;
+ }
+ }
+
+ if (decode) {
+ /* skip any blank spaces */
+ while (isspace((unsigned char)*decode))
+ decode++;
+
+ if(!espprint_decode_encalgo(ndo, decode, &sa1)) {
+ return;
+ }
+ }
+
+ esp_print_addsa(ndo, &sa1, sa_def);
+}
+
+USES_APPLE_DEPRECATED_API
+static void esp_init(netdissect_options *ndo _U_)
+{
+
+ OpenSSL_add_all_algorithms();
+ EVP_add_cipher_alias(SN_des_ede3_cbc, "3des");
+}
+USES_APPLE_RST
+
+void esp_print_decodesecret(netdissect_options *ndo)
+{
+ char *line;
+ char *p;
+ static int initialized = 0;
+
+ if (!initialized) {
+ esp_init(ndo);
+ initialized = 1;
+ }
+
+ p = ndo->ndo_espsecret;
+
+ while (p && p[0] != '\0') {
+ /* pick out the first line or first thing until a comma */
+ if ((line = strsep(&p, "\n,")) == NULL) {
+ line = p;
+ p = NULL;
+ }
+
+ esp_print_decode_onesecret(ndo, line, "cmdline", 0);
+ }
+
+ ndo->ndo_espsecret = NULL;
+}
+
+#endif
+
+#ifdef HAVE_LIBCRYPTO
+USES_APPLE_DEPRECATED_API
+#endif
+int
+esp_print(netdissect_options *ndo,
+ const u_char *bp, const int length, const u_char *bp2
+#ifndef HAVE_LIBCRYPTO
+ _U_
+#endif
+ ,
+ int *nhdr
+#ifndef HAVE_LIBCRYPTO
+ _U_
+#endif
+ ,
+ int *padlen
+#ifndef HAVE_LIBCRYPTO
+ _U_
+#endif
+ )
+{
+ register const struct newesp *esp;
+ register const u_char *ep;
+#ifdef HAVE_LIBCRYPTO
+ struct ip *ip;
+ struct sa_list *sa = NULL;
+#ifdef INET6
+ struct ip6_hdr *ip6 = NULL;
+#endif
+ int advance;
+ int len;
+ u_char *secret;
+ int ivlen = 0;
+ u_char *ivoff;
+ u_char *p;
+ EVP_CIPHER_CTX ctx;
+#endif
+
+ esp = (struct newesp *)bp;
+
+#ifdef HAVE_LIBCRYPTO
+ secret = NULL;
+ advance = 0;
+#endif
+
+#if 0
+ /* keep secret out of a register */
+ p = (u_char *)&secret;
+#endif
+
+ /* 'ep' points to the end of available data. */
+ ep = ndo->ndo_snapend;
+
+ if ((u_char *)(esp + 1) >= ep) {
+ ND_PRINT((ndo, "[|ESP]"));
+ goto fail;
+ }
+ ND_PRINT((ndo, "ESP(spi=0x%08x", EXTRACT_32BITS(&esp->esp_spi)));
+ ND_PRINT((ndo, ",seq=0x%x)", EXTRACT_32BITS(&esp->esp_seq)));
+ ND_PRINT((ndo, ", length %u", length));
+
+#ifndef HAVE_LIBCRYPTO
+ goto fail;
+#else
+ /* initiailize SAs */
+ if (ndo->ndo_sa_list_head == NULL) {
+ if (!ndo->ndo_espsecret)
+ goto fail;
+
+ esp_print_decodesecret(ndo);
+ }
+
+ if (ndo->ndo_sa_list_head == NULL)
+ goto fail;
+
+ ip = (struct ip *)bp2;
+ switch (IP_V(ip)) {
+#ifdef INET6
+ case 6:
+ ip6 = (struct ip6_hdr *)bp2;
+ /* we do not attempt to decrypt jumbograms */
+ if (!EXTRACT_16BITS(&ip6->ip6_plen))
+ goto fail;
+ /* if we can't get nexthdr, we do not need to decrypt it */
+ len = sizeof(struct ip6_hdr) + EXTRACT_16BITS(&ip6->ip6_plen);
+
+ /* see if we can find the SA, and if so, decode it */
+ for (sa = ndo->ndo_sa_list_head; sa != NULL; sa = sa->next) {
+ if (sa->spi == EXTRACT_32BITS(&esp->esp_spi) &&
+ sa->daddr_version == 6 &&
+ UNALIGNED_MEMCMP(&sa->daddr.in6, &ip6->ip6_dst,
+ sizeof(struct in6_addr)) == 0) {
+ break;
+ }
+ }
+ break;
+#endif /*INET6*/
+ case 4:
+ /* nexthdr & padding are in the last fragment */
+ if (EXTRACT_16BITS(&ip->ip_off) & IP_MF)
+ goto fail;
+ len = EXTRACT_16BITS(&ip->ip_len);
+
+ /* see if we can find the SA, and if so, decode it */
+ for (sa = ndo->ndo_sa_list_head; sa != NULL; sa = sa->next) {
+ if (sa->spi == EXTRACT_32BITS(&esp->esp_spi) &&
+ sa->daddr_version == 4 &&
+ UNALIGNED_MEMCMP(&sa->daddr.in4, &ip->ip_dst,
+ sizeof(struct in_addr)) == 0) {
+ break;
+ }
+ }
+ break;
+ default:
+ goto fail;
+ }
+
+ /* if we didn't find the specific one, then look for
+ * an unspecified one.
+ */
+ if (sa == NULL)
+ sa = ndo->ndo_sa_default;
+
+ /* if not found fail */
+ if (sa == NULL)
+ goto fail;
+
+ /* if we can't get nexthdr, we do not need to decrypt it */
+ if (ep - bp2 < len)
+ goto fail;
+ if (ep - bp2 > len) {
+ /* FCS included at end of frame (NetBSD 1.6 or later) */
+ ep = bp2 + len;
+ }
+
+ ivoff = (u_char *)(esp + 1) + 0;
+ ivlen = sa->ivlen;
+ secret = sa->secret;
+ ep = ep - sa->authlen;
+
+ if (sa->evp) {
+ memset(&ctx, 0, sizeof(ctx));
+ if (EVP_CipherInit(&ctx, sa->evp, secret, NULL, 0) < 0)
+ (*ndo->ndo_warning)(ndo, "espkey init failed");
+
+ p = ivoff;
+ EVP_CipherInit(&ctx, NULL, NULL, p, 0);
+ EVP_Cipher(&ctx, p + ivlen, p + ivlen, ep - (p + ivlen));
+ EVP_CIPHER_CTX_cleanup(&ctx);
+ advance = ivoff - (u_char *)esp + ivlen;
+ } else
+ advance = sizeof(struct newesp);
+
+ /* sanity check for pad length */
+ if (ep - bp < *(ep - 2))
+ goto fail;
+
+ if (padlen)
+ *padlen = *(ep - 2) + 2;
+
+ if (nhdr)
+ *nhdr = *(ep - 1);
+
+ ND_PRINT((ndo, ": "));
+ return advance;
+#endif
+
+fail:
+ return -1;
+}
+#ifdef HAVE_LIBCRYPTO
+USES_APPLE_RST
+#endif
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ether.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+#include "ethertype.h"
+#include "ether.h"
+
+const struct tok ethertype_values[] = {
+ { ETHERTYPE_IP, "IPv4" },
+ { ETHERTYPE_MPLS, "MPLS unicast" },
+ { 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"},
+ { ETHERTYPE_REVARP, "Reverse ARP"},
+ { ETHERTYPE_NS, "NS" },
+ { ETHERTYPE_SPRITE, "Sprite" },
+ { ETHERTYPE_TRAIL, "Trail" },
+ { ETHERTYPE_MOPDL, "MOP DL" },
+ { ETHERTYPE_MOPRC, "MOP RC" },
+ { ETHERTYPE_DN, "DN" },
+ { ETHERTYPE_LAT, "LAT" },
+ { ETHERTYPE_SCA, "SCA" },
+ { ETHERTYPE_TEB, "TEB" },
+ { ETHERTYPE_LANBRIDGE, "Lanbridge" },
+ { ETHERTYPE_DECDNS, "DEC DNS" },
+ { ETHERTYPE_DECDTS, "DEC DTS" },
+ { ETHERTYPE_VEXP, "VEXP" },
+ { ETHERTYPE_VPROD, "VPROD" },
+ { ETHERTYPE_ATALK, "Appletalk" },
+ { ETHERTYPE_AARP, "Appletalk ARP" },
+ { ETHERTYPE_IPX, "IPX" },
+ { ETHERTYPE_PPP, "PPP" },
+ { ETHERTYPE_MPCP, "MPCP" },
+ { ETHERTYPE_SLOW, "Slow Protocols" },
+ { ETHERTYPE_PPPOED, "PPPoE D" },
+ { ETHERTYPE_PPPOES, "PPPoE S" },
+ { ETHERTYPE_EAPOL, "EAPOL" },
+ { ETHERTYPE_RRCP, "RRCP" },
+ { ETHERTYPE_MS_NLB_HB, "MS NLB heartbeat" },
+ { ETHERTYPE_JUMBO, "Jumbo" },
+ { ETHERTYPE_LOOPBACK, "Loopback" },
+ { ETHERTYPE_ISO, "OSI" },
+ { ETHERTYPE_GRE_ISO, "GRE-OSI" },
+ { ETHERTYPE_CFM_OLD, "CFM (old)" },
+ { ETHERTYPE_CFM, "CFM" },
+ { ETHERTYPE_IEEE1905_1, "IEEE1905.1" },
+ { ETHERTYPE_LLDP, "LLDP" },
+ { ETHERTYPE_TIPC, "TIPC"},
+ { ETHERTYPE_GEONET_OLD, "GeoNet (old)"},
+ { ETHERTYPE_GEONET, "GeoNet"},
+ { ETHERTYPE_CALM_FAST, "CALM FAST"},
+ { ETHERTYPE_AOE, "AoE" },
+ { 0, NULL}
+};
+
+static inline void
+ether_hdr_print(netdissect_options *ndo,
+ const u_char *bp, u_int length)
+{
+ register const struct ether_header *ep;
+ uint16_t ether_type;
+
+ ep = (const struct ether_header *)bp;
+
+ ND_PRINT((ndo, "%s > %s",
+ etheraddr_string(ndo, ESRC(ep)),
+ etheraddr_string(ndo, EDST(ep))));
+
+ ether_type = EXTRACT_16BITS(&ep->ether_type);
+ if (!ndo->ndo_qflag) {
+ if (ether_type <= ETHERMTU)
+ ND_PRINT((ndo, ", 802.3"));
+ else
+ ND_PRINT((ndo, ", ethertype %s (0x%04x)",
+ tok2str(ethertype_values,"Unknown", ether_type),
+ ether_type));
+ } else {
+ if (ether_type <= ETHERMTU)
+ ND_PRINT((ndo, ", 802.3"));
+ else
+ ND_PRINT((ndo, ", %s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", ether_type)));
+ }
+
+ ND_PRINT((ndo, ", length %u: ", length));
+}
+
+/*
+ * Print an Ethernet frame.
+ * This might be encapsulated within another frame; we might be passed
+ * a pointer to a function that can print header information for that
+ * frame's protocol, and an argument to pass to that function.
+ */
+void
+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;
+ u_short ether_type;
+ u_short extracted_ether_type;
+
+ if (caplen < ETHER_HDRLEN || length < ETHER_HDRLEN) {
+ ND_PRINT((ndo, "[|ether]"));
+ return;
+ }
+
+ if (ndo->ndo_eflag) {
+ if (print_encap_header != NULL)
+ (*print_encap_header)(ndo, encap_header_arg);
+ ether_hdr_print(ndo, p, length);
+ }
+ orig_length = length;
+
+ length -= ETHER_HDRLEN;
+ caplen -= ETHER_HDRLEN;
+ ep = (struct ether_header *)p;
+ p += ETHER_HDRLEN;
+
+ ether_type = EXTRACT_16BITS(&ep->ether_type);
+
+recurse:
+ /*
+ * Is it (gag) an 802.3 encapsulation?
+ */
+ if (ether_type <= ETHERMTU) {
+ /* Try to print the LLC-layer header & higher layers */
+ if (llc_print(ndo, p, length, caplen, ESRC(ep), EDST(ep),
+ &extracted_ether_type) == 0) {
+ /* ether_type not known, print raw packet */
+ if (!ndo->ndo_eflag) {
+ if (print_encap_header != NULL)
+ (*print_encap_header)(ndo, encap_header_arg);
+ ether_hdr_print(ndo, (u_char *)ep, orig_length);
+ }
+
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+ } 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) {
+ ND_PRINT((ndo, "[|vlan]"));
+ return;
+ }
+ if (ndo->ndo_eflag) {
+ uint16_t tag = EXTRACT_16BITS(p);
+
+ ND_PRINT((ndo, "%s, ", ieee8021q_tci_string(tag)));
+ }
+
+ ether_type = EXTRACT_16BITS(p + 2);
+ 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;
+ goto recurse;
+ } else if (ether_type == ETHERTYPE_JUMBO) {
+ /*
+ * Alteon jumbo frames.
+ * See
+ *
+ * http://tools.ietf.org/html/draft-ietf-isis-ext-eth-01
+ *
+ * which indicates that, following the type field,
+ * there's an LLC header and payload.
+ */
+ /* Try to print the LLC-layer header & higher layers */
+ if (llc_print(ndo, p, length, caplen, ESRC(ep), EDST(ep),
+ &extracted_ether_type) == 0) {
+ /* ether_type not known, print raw packet */
+ if (!ndo->ndo_eflag) {
+ if (print_encap_header != NULL)
+ (*print_encap_header)(ndo, encap_header_arg);
+ ether_hdr_print(ndo, (u_char *)ep, orig_length);
+ }
+
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+ } else {
+ if (ethertype_print(ndo, ether_type, p, length, caplen) == 0) {
+ /* ether_type not known, print raw packet */
+ if (!ndo->ndo_eflag) {
+ if (print_encap_header != NULL)
+ (*print_encap_header)(ndo, encap_header_arg);
+ ether_hdr_print(ndo, (u_char *)ep, orig_length);
+ }
+
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(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
+ether_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
+ const u_char *p)
+{
+ 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) {
+ ND_PRINT((ndo, "[|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) {
+ ND_PRINT((ndo, "[|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.
+ *
+ * Returns non-zero if it can do so, zero if the ethertype is unknown.
+ */
+
+int
+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(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_IPV6:
+ ip6_print(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_ARP:
+ case ETHERTYPE_REVARP:
+ arp_print(ndo, p, length, caplen);
+ return (1);
+
+ case ETHERTYPE_DN:
+ decnet_print(ndo, p, length, caplen);
+ return (1);
+
+ case ETHERTYPE_ATALK:
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "et1 "));
+ atalk_print(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_AARP:
+ aarp_print(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_IPX:
+ ND_PRINT((ndo, "(NOV-ETHII) "));
+ ipx_print(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_ISO:
+ 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(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_EAPOL:
+ eap_print(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_RRCP:
+ rrcp_print(ndo, p - 14 , length + 14);
+ return (1);
+
+ case ETHERTYPE_PPP:
+ if (length) {
+ ND_PRINT((ndo, ": "));
+ ppp_print(ndo, p, length);
+ }
+ return (1);
+
+ case ETHERTYPE_MPCP:
+ mpcp_print(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_SLOW:
+ slow_print(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_CFM:
+ case ETHERTYPE_CFM_OLD:
+ cfm_print(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_LLDP:
+ lldp_print(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_LOOPBACK:
+ loopback_print(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_MPLS:
+ case ETHERTYPE_MPLS_MULTI:
+ mpls_print(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_TIPC:
+ tipc_print(ndo, p, length, caplen);
+ return (1);
+
+ case ETHERTYPE_MS_NLB_HB:
+ msnlb_print(ndo, p);
+ return (1);
+
+ case ETHERTYPE_GEONET_OLD:
+ case ETHERTYPE_GEONET:
+ geonet_print(ndo, p-14, p, length);
+ return (1);
+
+ case ETHERTYPE_CALM_FAST:
+ calm_fast_print(ndo, p-14, p, length);
+ return (1);
+
+ case ETHERTYPE_AOE:
+ aoe_print(ndo, p, length);
+ return (1);
+
+ case ETHERTYPE_LAT:
+ case ETHERTYPE_SCA:
+ case ETHERTYPE_MOPRC:
+ case ETHERTYPE_MOPDL:
+ case ETHERTYPE_IEEE1905_1:
+ /* default_print for now */
+ default:
+ return (0);
+ }
+}
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
+
--- /dev/null
+/*
+ * Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-fddi.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "ether.h"
+
+/*
+ * Based on Ultrix if_fddi.h
+ */
+
+struct fddi_header {
+ u_char fddi_fc; /* frame control */
+ u_char fddi_dhost[6];
+ u_char fddi_shost[6];
+};
+
+/*
+ * Length of an FDDI header; note that some compilers may pad
+ * "struct fddi_header" to a multiple of 4 bytes, for example, so
+ * "sizeof (struct fddi_header)" may not give the right
+ * answer.
+ */
+#define FDDI_HDRLEN 13
+
+/* Useful values for fddi_fc (frame control) field */
+
+/*
+ * FDDI Frame Control bits
+ */
+#define FDDIFC_C 0x80 /* Class bit */
+#define FDDIFC_L 0x40 /* Address length bit */
+#define FDDIFC_F 0x30 /* Frame format bits */
+#define FDDIFC_Z 0x0f /* Control bits */
+
+/*
+ * FDDI Frame Control values. (48-bit addressing only).
+ */
+#define FDDIFC_VOID 0x40 /* Void frame */
+#define FDDIFC_NRT 0x80 /* Nonrestricted token */
+#define FDDIFC_RT 0xc0 /* Restricted token */
+#define FDDIFC_SMT_INFO 0x41 /* SMT Info */
+#define FDDIFC_SMT_NSA 0x4F /* SMT Next station adrs */
+#define FDDIFC_MAC_BEACON 0xc2 /* MAC Beacon frame */
+#define FDDIFC_MAC_CLAIM 0xc3 /* MAC Claim frame */
+#define FDDIFC_LLC_ASYNC 0x50 /* Async. LLC frame */
+#define FDDIFC_LLC_SYNC 0xd0 /* Sync. LLC frame */
+#define FDDIFC_IMP_ASYNC 0x60 /* Implementor Async. */
+#define FDDIFC_IMP_SYNC 0xe0 /* Implementor Synch. */
+#define FDDIFC_SMT 0x40 /* SMT frame */
+#define FDDIFC_MAC 0xc0 /* MAC frame */
+
+#define FDDIFC_CLFF 0xF0 /* Class/Length/Format bits */
+#define FDDIFC_ZZZZ 0x0F /* Control bits */
+
+/*
+ * Some FDDI interfaces use bit-swapped addresses.
+ */
+#if defined(ultrix) || defined(__alpha) || defined(__bsdi) || defined(__NetBSD__) || defined(__linux__)
+int fddi_bitswap = 0;
+#else
+int fddi_bitswap = 1;
+#endif
+
+/*
+ * FDDI support for tcpdump, by Jeffrey Mogul [DECWRL], June 1992
+ *
+ * Based in part on code by Van Jacobson, which bears this note:
+ *
+ * NOTE: This is a very preliminary hack for FDDI support.
+ * There are all sorts of wired in constants & nothing (yet)
+ * to print SMT packets as anything other than hex dumps.
+ * Most of the necessary changes are waiting on my redoing
+ * the "header" that a kernel fddi driver supplies to bpf: I
+ * want it to look like one byte of 'direction' (0 or 1
+ * depending on whether the packet was inbound or outbound),
+ * two bytes of system/driver dependent data (anything an
+ * implementor thinks would be useful to filter on and/or
+ * save per-packet, then the real 21-byte FDDI header.
+ * Steve McCanne & I have also talked about adding the
+ * 'direction' byte to all bpf headers (e.g., in the two
+ * bytes of padding on an ethernet header). It's not clear
+ * we could do this in a backwards compatible way & we hate
+ * the idea of an incompatible bpf change. Discussions are
+ * proceeding.
+ *
+ * Also, to really support FDDI (and better support 802.2
+ * over ethernet) we really need to re-think the rather simple
+ * minded assumptions about fixed length & fixed format link
+ * level headers made in gencode.c. One day...
+ *
+ * - vj
+ */
+
+static const u_char fddi_bit_swap[] = {
+ 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+ 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+ 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+ 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+ 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+ 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+ 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+ 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+ 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+ 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+ 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+ 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+ 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+ 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+ 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+ 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+ 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+ 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+ 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+ 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+ 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+ 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+ 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+ 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+ 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+ 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+ 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+ 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+ 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+ 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+ 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+ 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
+};
+
+/*
+ * Print FDDI frame-control bits
+ */
+static inline void
+print_fddi_fc(netdissect_options *ndo, u_char fc)
+{
+ switch (fc) {
+
+ case FDDIFC_VOID: /* Void frame */
+ ND_PRINT((ndo, "void "));
+ break;
+
+ case FDDIFC_NRT: /* Nonrestricted token */
+ ND_PRINT((ndo, "nrt "));
+ break;
+
+ case FDDIFC_RT: /* Restricted token */
+ ND_PRINT((ndo, "rt "));
+ break;
+
+ case FDDIFC_SMT_INFO: /* SMT Info */
+ ND_PRINT((ndo, "info "));
+ break;
+
+ case FDDIFC_SMT_NSA: /* SMT Next station adrs */
+ ND_PRINT((ndo, "nsa "));
+ break;
+
+ case FDDIFC_MAC_BEACON: /* MAC Beacon frame */
+ ND_PRINT((ndo, "beacon "));
+ break;
+
+ case FDDIFC_MAC_CLAIM: /* MAC Claim frame */
+ ND_PRINT((ndo, "claim "));
+ break;
+
+ default:
+ switch (fc & FDDIFC_CLFF) {
+
+ case FDDIFC_MAC:
+ ND_PRINT((ndo, "mac%1x ", fc & FDDIFC_ZZZZ));
+ break;
+
+ case FDDIFC_SMT:
+ ND_PRINT((ndo, "smt%1x ", fc & FDDIFC_ZZZZ));
+ break;
+
+ case FDDIFC_LLC_ASYNC:
+ ND_PRINT((ndo, "async%1x ", fc & FDDIFC_ZZZZ));
+ break;
+
+ case FDDIFC_LLC_SYNC:
+ ND_PRINT((ndo, "sync%1x ", fc & FDDIFC_ZZZZ));
+ break;
+
+ case FDDIFC_IMP_ASYNC:
+ ND_PRINT((ndo, "imp_async%1x ", fc & FDDIFC_ZZZZ));
+ break;
+
+ case FDDIFC_IMP_SYNC:
+ ND_PRINT((ndo, "imp_sync%1x ", fc & FDDIFC_ZZZZ));
+ break;
+
+ default:
+ ND_PRINT((ndo, "%02x ", fc));
+ break;
+ }
+ }
+}
+
+/* Extract src, dst addresses */
+static inline void
+extract_fddi_addrs(const struct fddi_header *fddip, char *fsrc, char *fdst)
+{
+ register int i;
+
+ if (fddi_bitswap) {
+ /*
+ * bit-swap the fddi addresses (isn't the IEEE standards
+ * process wonderful!) then convert them to names.
+ */
+ for (i = 0; i < 6; ++i)
+ fdst[i] = fddi_bit_swap[fddip->fddi_dhost[i]];
+ for (i = 0; i < 6; ++i)
+ fsrc[i] = fddi_bit_swap[fddip->fddi_shost[i]];
+ }
+ else {
+ memcpy(fdst, (const char *)fddip->fddi_dhost, 6);
+ memcpy(fsrc, (const char *)fddip->fddi_shost, 6);
+ }
+}
+
+/*
+ * Print the FDDI MAC header
+ */
+static inline void
+fddi_hdr_print(netdissect_options *ndo,
+ register const struct fddi_header *fddip, register u_int length,
+ register const u_char *fsrc, register const u_char *fdst)
+{
+ const char *srcname, *dstname;
+
+ srcname = etheraddr_string(ndo, fsrc);
+ dstname = etheraddr_string(ndo, fdst);
+
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "%02x %s %s %d: ",
+ fddip->fddi_fc,
+ srcname, dstname,
+ length));
+ else if (ndo->ndo_qflag)
+ ND_PRINT((ndo, "%s %s %d: ", srcname, dstname, length));
+ else {
+ print_fddi_fc(ndo, fddip->fddi_fc);
+ ND_PRINT((ndo, "%s %s %d: ", srcname, dstname, length));
+ }
+}
+
+static inline void
+fddi_smt_print(netdissect_options *ndo, const u_char *p _U_, u_int length _U_)
+{
+ ND_PRINT((ndo, "<SMT printer not yet implemented>"));
+}
+
+void
+fddi_print(netdissect_options *ndo, const u_char *p, u_int length, u_int caplen)
+{
+ const struct fddi_header *fddip = (const struct fddi_header *)p;
+ struct ether_header ehdr;
+ u_short extracted_ethertype;
+
+ if (caplen < FDDI_HDRLEN) {
+ ND_PRINT((ndo, "[|fddi]"));
+ return;
+ }
+
+ /*
+ * Get the FDDI addresses into a canonical form
+ */
+ extract_fddi_addrs(fddip, (char *)ESRC(&ehdr), (char *)EDST(&ehdr));
+
+ if (ndo->ndo_eflag)
+ fddi_hdr_print(ndo, fddip, length, ESRC(&ehdr), EDST(&ehdr));
+
+ /* Skip over FDDI MAC header */
+ length -= FDDI_HDRLEN;
+ p += FDDI_HDRLEN;
+ caplen -= FDDI_HDRLEN;
+
+ /* Frame Control field determines interpretation of packet */
+ if ((fddip->fddi_fc & FDDIFC_CLFF) == FDDIFC_LLC_ASYNC) {
+ /* Try to print the LLC-layer header & higher layers */
+ if (llc_print(ndo, p, length, caplen, ESRC(&ehdr), EDST(&ehdr),
+ &extracted_ethertype) == 0) {
+ /*
+ * Some kinds of LLC packet we cannot
+ * handle intelligently
+ */
+ if (!ndo->ndo_eflag)
+ fddi_hdr_print(ndo, fddip, length + FDDI_HDRLEN,
+ ESRC(&ehdr), EDST(&ehdr));
+ if (extracted_ethertype) {
+ ND_PRINT((ndo, "(LLC %s) ",
+ etherproto_string(htons(extracted_ethertype))));
+ }
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+ } else if ((fddip->fddi_fc & FDDIFC_CLFF) == FDDIFC_SMT)
+ fddi_smt_print(ndo, p, caplen);
+ else {
+ /* Some kinds of FDDI packet we cannot handle intelligently */
+ if (!ndo->ndo_eflag)
+ fddi_hdr_print(ndo, fddip, length + FDDI_HDRLEN, ESRC(&ehdr),
+ EDST(&ehdr));
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+}
+
+/*
+ * This is the top level routine of the printer. 'p' points
+ * to the FDDI 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
+fddi_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, register const u_char *p)
+{
+ fddi_print(ndo, p, h->len, h->caplen);
+
+ return (FDDI_HDRLEN);
+}
--- /dev/null
+/*
+ * 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.
+ *
+ * Copyright (c) 2009 Mojatatu Networks, Inc
+ *
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+static const char tstr[] = "[|forces]";
+
+/*
+ * RFC5810: Forwarding and Control Element Separation (ForCES) Protocol
+ */
+#define ForCES_VERS 1
+#define ForCES_HDRL 24
+#define ForCES_ALNL 4U
+#define TLV_HDRL 4
+#define ILV_HDRL 8
+
+#define TOM_RSVD 0x0
+#define TOM_ASSNSETUP 0x1
+#define TOM_ASSNTEARD 0x2
+#define TOM_CONFIG 0x3
+#define TOM_QUERY 0x4
+#define TOM_EVENTNOT 0x5
+#define TOM_PKTREDIR 0x6
+#define TOM_HEARTBT 0x0F
+#define TOM_ASSNSETREP 0x11
+#define TOM_CONFIGREP 0x13
+#define TOM_QUERYREP 0x14
+
+/*
+ * tom_h Flags: resv1(8b):maxtlvs(4b):resv2(2b):mintlv(2b)
+*/
+#define ZERO_TTLV 0x01
+#define ZERO_MORE_TTLV 0x02
+#define ONE_MORE_TTLV 0x04
+#define ZERO_TLV 0x00
+#define ONE_TLV 0x10
+#define TWO_TLV 0x20
+#define MAX_TLV 0xF0
+
+#define TTLV_T1 (ONE_MORE_TTLV|ONE_TLV)
+#define TTLV_T2 (ONE_MORE_TTLV|MAX_TLV)
+
+struct tom_h {
+ uint32_t v;
+ uint16_t flags;
+ uint16_t op_msk;
+ const char *s;
+ int (*print) (netdissect_options *ndo, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+};
+
+enum {
+ TOM_RSV_I,
+ TOM_ASS_I,
+ TOM_AST_I,
+ TOM_CFG_I,
+ TOM_QRY_I,
+ TOM_EVN_I,
+ TOM_RED_I,
+ TOM_HBT_I,
+ TOM_ASR_I,
+ TOM_CNR_I,
+ TOM_QRR_I,
+ _TOM_RSV_MAX
+};
+#define TOM_MAX_IND (_TOM_RSV_MAX - 1)
+
+static inline int tom_valid(uint8_t tom)
+{
+ if (tom > 0) {
+ if (tom >= 0x7 && tom <= 0xe)
+ return 0;
+ if (tom == 0x10)
+ return 0;
+ if (tom > 0x14)
+ return 0;
+ return 1;
+ } else
+ return 0;
+}
+
+static inline const char *ForCES_node(uint32_t node)
+{
+ if (node <= 0x3FFFFFFF)
+ return "FE";
+ if (node >= 0x40000000 && node <= 0x7FFFFFFF)
+ return "CE";
+ if (node >= 0xC0000000 && node <= 0xFFFFFFEF)
+ return "AllMulticast";
+ if (node == 0xFFFFFFFD)
+ return "AllCEsBroadcast";
+ if (node == 0xFFFFFFFE)
+ return "AllFEsBroadcast";
+ if (node == 0xFFFFFFFF)
+ return "AllBroadcast";
+
+ return "ForCESreserved";
+
+}
+
+static const struct tok ForCES_ACKs[] = {
+ {0x0, "NoACK"},
+ {0x1, "SuccessACK"},
+ {0x2, "FailureACK"},
+ {0x3, "AlwaysACK"},
+ {0, NULL}
+};
+
+static const struct tok ForCES_EMs[] = {
+ {0x0, "EMReserved"},
+ {0x1, "execute-all-or-none"},
+ {0x2, "execute-until-failure"},
+ {0x3, "continue-execute-on-failure"},
+ {0, NULL}
+};
+
+static const struct tok ForCES_ATs[] = {
+ {0x0, "Standalone"},
+ {0x1, "2PCtransaction"},
+ {0, NULL}
+};
+
+static const struct tok ForCES_TPs[] = {
+ {0x0, "StartofTransaction"},
+ {0x1, "MiddleofTransaction"},
+ {0x2, "EndofTransaction"},
+ {0x3, "abort"},
+ {0, NULL}
+};
+
+/*
+ * Structure of forces header, naked of TLVs.
+ */
+struct forcesh {
+ uint8_t fm_vrsvd; /* version and reserved */
+#define ForCES_V(forcesh) ((forcesh)->fm_vrsvd >> 4)
+ uint8_t fm_tom; /* type of message */
+ uint16_t fm_len; /* total length * 4 bytes */
+#define ForCES_BLN(forcesh) ((uint32_t)(EXTRACT_16BITS(&(forcesh)->fm_len) << 2))
+ uint32_t fm_sid; /* Source ID */
+#define ForCES_SID(forcesh) EXTRACT_32BITS(&(forcesh)->fm_sid)
+ uint32_t fm_did; /* Destination ID */
+#define ForCES_DID(forcesh) EXTRACT_32BITS(&(forcesh)->fm_did)
+ uint8_t fm_cor[8]; /* correlator */
+ uint32_t fm_flags; /* flags */
+#define ForCES_ACK(forcesh) ((EXTRACT_32BITS(&(forcesh)->fm_flags)&0xC0000000) >> 30)
+#define ForCES_PRI(forcesh) ((EXTRACT_32BITS(&(forcesh)->fm_flags)&0x38000000) >> 27)
+#define ForCES_RS1(forcesh) ((EXTRACT_32BITS(&(forcesh)->fm_flags)&0x07000000) >> 24)
+#define ForCES_EM(forcesh) ((EXTRACT_32BITS(&(forcesh)->fm_flags)&0x00C00000) >> 22)
+#define ForCES_AT(forcesh) ((EXTRACT_32BITS(&(forcesh)->fm_flags)&0x00200000) >> 21)
+#define ForCES_TP(forcesh) ((EXTRACT_32BITS(&(forcesh)->fm_flags)&0x00180000) >> 19)
+#define ForCES_RS2(forcesh) ((EXTRACT_32BITS(&(forcesh)->fm_flags)&0x0007FFFF) >> 0)
+};
+
+#define ForCES_HLN_VALID(fhl,tlen) ((tlen) >= ForCES_HDRL && \
+ (fhl) >= ForCES_HDRL && \
+ (fhl) == (tlen))
+
+#define F_LFB_RSVD 0x0
+#define F_LFB_FEO 0x1
+#define F_LFB_FEPO 0x2
+static const struct tok ForCES_LFBs[] = {
+ {F_LFB_RSVD, "Invalid TLV"},
+ {F_LFB_FEO, "FEObj LFB"},
+ {F_LFB_FEPO, "FEProtoObj LFB"},
+ {0, NULL}
+};
+
+/* this is defined in RFC5810 section A.2 */
+/* http://www.iana.org/assignments/forces/forces.xhtml#oper-tlv-types */
+enum {
+ F_OP_RSV = 0,
+ F_OP_SET = 1,
+ F_OP_SETPROP = 2,
+ F_OP_SETRESP = 3,
+ F_OP_SETPRESP = 4,
+ F_OP_DEL = 5,
+ F_OP_DELRESP = 6,
+ F_OP_GET = 7,
+ F_OP_GETPROP = 8,
+ F_OP_GETRESP = 9,
+ F_OP_GETPRESP = 10,
+ F_OP_REPORT = 11,
+ F_OP_COMMIT = 12,
+ F_OP_RCOMMIT = 13,
+ F_OP_RTRCOMP = 14,
+ _F_OP_MAX
+};
+#define F_OP_MAX (_F_OP_MAX - 1)
+
+enum {
+ B_OP_SET = 1 << (F_OP_SET - 1),
+ B_OP_SETPROP = 1 << (F_OP_SETPROP - 1),
+ B_OP_SETRESP = 1 << (F_OP_SETRESP - 1),
+ B_OP_SETPRESP = 1 << (F_OP_SETPRESP - 1),
+ B_OP_DEL = 1 << (F_OP_DEL - 1),
+ B_OP_DELRESP = 1 << (F_OP_DELRESP - 1),
+ B_OP_GET = 1 << (F_OP_GET - 1),
+ B_OP_GETPROP = 1 << (F_OP_GETPROP - 1),
+ B_OP_GETRESP = 1 << (F_OP_GETRESP - 1),
+ B_OP_GETPRESP = 1 << (F_OP_GETPRESP - 1),
+ B_OP_REPORT = 1 << (F_OP_REPORT - 1),
+ B_OP_COMMIT = 1 << (F_OP_COMMIT - 1),
+ B_OP_RCOMMIT = 1 << (F_OP_RCOMMIT - 1),
+ B_OP_RTRCOMP = 1 << (F_OP_RTRCOMP - 1),
+};
+
+struct optlv_h {
+ uint16_t flags;
+ uint16_t op_msk;
+ const char *s;
+ int (*print) (netdissect_options *ndo, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+};
+
+static int genoptlv_print(netdissect_options *, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+static int recpdoptlv_print(netdissect_options *, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+static int invoptlv_print(netdissect_options *, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+
+#define OP_MIN_SIZ 8
+struct pathdata_h {
+ uint16_t pflags;
+ uint16_t pIDcnt;
+};
+
+#define B_FULLD 0x1
+#define B_SPARD 0x2
+#define B_RESTV 0x4
+#define B_KEYIN 0x8
+#define B_APPND 0x10
+#define B_TRNG 0x20
+
+static const struct optlv_h OPTLV_msg[F_OP_MAX + 1] = {
+ /* F_OP_RSV */ {ZERO_TTLV, 0, "Invalid OPTLV", invoptlv_print},
+ /* F_OP_SET */ {TTLV_T2, B_FULLD | B_SPARD, " Set", recpdoptlv_print},
+ /* F_OP_SETPROP */
+ {TTLV_T2, B_FULLD | B_SPARD, " SetProp", recpdoptlv_print},
+ /* F_OP_SETRESP */ {TTLV_T2, B_RESTV, " SetResp", recpdoptlv_print},
+ /* F_OP_SETPRESP */ {TTLV_T2, B_RESTV, " SetPropResp", recpdoptlv_print},
+ /* F_OP_DEL */ {ZERO_TTLV, 0, " Del", recpdoptlv_print},
+ /* F_OP_DELRESP */ {TTLV_T2, B_RESTV, " DelResp", recpdoptlv_print},
+ /* F_OP_GET */ {ZERO_TTLV, 0, " Get", recpdoptlv_print},
+ /* F_OP_GETPROP */ {ZERO_TTLV, 0, " GetProp", recpdoptlv_print},
+ /* F_OP_GETRESP */
+ {TTLV_T2, B_FULLD | B_SPARD | B_RESTV, " GetResp", recpdoptlv_print},
+ /* F_OP_GETPRESP */
+ {TTLV_T2, B_FULLD | B_RESTV, " GetPropResp", recpdoptlv_print},
+ /* F_OP_REPORT */
+ {TTLV_T2, B_FULLD | B_SPARD, " Report", recpdoptlv_print},
+ /* F_OP_COMMIT */ {ZERO_TTLV, 0, " Commit", NULL},
+ /* F_OP_RCOMMIT */ {TTLV_T1, B_RESTV, " RCommit", genoptlv_print},
+ /* F_OP_RTRCOMP */ {ZERO_TTLV, 0, " RTRCOMP", NULL},
+};
+
+static inline const struct optlv_h *get_forces_optlv_h(uint16_t opt)
+{
+ if (opt > F_OP_MAX || opt <= F_OP_RSV)
+ return &OPTLV_msg[F_OP_RSV];
+
+ return &OPTLV_msg[opt];
+}
+
+#define IND_SIZE 256
+#define IND_CHR ' '
+#define IND_PREF '\n'
+#define IND_SUF 0x0
+char ind_buf[IND_SIZE];
+
+static inline char *indent_pr(int indent, int nlpref)
+{
+ int i = 0;
+ char *r = ind_buf;
+
+ if (indent > (IND_SIZE - 1))
+ indent = IND_SIZE - 1;
+
+ if (nlpref) {
+ r[i] = IND_PREF;
+ i++;
+ indent--;
+ }
+
+ while (--indent >= 0)
+ r[i++] = IND_CHR;
+
+ r[i] = IND_SUF;
+ return r;
+}
+
+static inline int op_valid(uint16_t op, uint16_t mask)
+{
+ int opb = 1 << (op - 1);
+
+ if (op == 0)
+ return 0;
+ if (opb & mask)
+ return 1;
+ /* I guess we should allow vendor operations? */
+ if (op >= 0x8000)
+ return 1;
+ return 0;
+}
+
+#define F_TLV_RSVD 0x0000
+#define F_TLV_REDR 0x0001
+#define F_TLV_ASRS 0x0010
+#define F_TLV_ASRT 0x0011
+#define F_TLV_LFBS 0x1000
+#define F_TLV_PDAT 0x0110
+#define F_TLV_KEYI 0x0111
+#define F_TLV_FULD 0x0112
+#define F_TLV_SPAD 0x0113
+#define F_TLV_REST 0x0114
+#define F_TLV_METD 0x0115
+#define F_TLV_REDD 0x0116
+#define F_TLV_TRNG 0x0117
+
+
+#define F_TLV_VNST 0x8000
+
+static const struct tok ForCES_TLV[] = {
+ {F_TLV_RSVD, "Invalid TLV"},
+ {F_TLV_REDR, "REDIRECT TLV"},
+ {F_TLV_ASRS, "ASResult TLV"},
+ {F_TLV_ASRT, "ASTreason TLV"},
+ {F_TLV_LFBS, "LFBselect TLV"},
+ {F_TLV_PDAT, "PATH-DATA TLV"},
+ {F_TLV_KEYI, "KEYINFO TLV"},
+ {F_TLV_FULD, "FULLDATA TLV"},
+ {F_TLV_SPAD, "SPARSEDATA TLV"},
+ {F_TLV_REST, "RESULT TLV"},
+ {F_TLV_METD, "METADATA TLV"},
+ {F_TLV_REDD, "REDIRECTDATA TLV"},
+ {0, NULL}
+};
+
+#define TLV_HLN 4
+static inline int ttlv_valid(uint16_t ttlv)
+{
+ if (ttlv > 0) {
+ if (ttlv == 1 || ttlv == 0x1000)
+ return 1;
+ if (ttlv >= 0x10 && ttlv <= 0x11)
+ return 1;
+ if (ttlv >= 0x110 && ttlv <= 0x116)
+ return 1;
+ if (ttlv >= 0x8000)
+ return 0; /* XXX: */
+ }
+
+ return 0;
+}
+
+struct forces_ilv {
+ uint32_t type;
+ uint32_t length;
+};
+
+struct forces_tlv {
+ uint16_t type;
+ uint16_t length;
+};
+
+#define F_ALN_LEN(len) ( ((len)+ForCES_ALNL-1) & ~(ForCES_ALNL-1) )
+#define GET_TOP_TLV(fhdr) ((struct forces_tlv *)((fhdr) + sizeof (struct forcesh)))
+#define TLV_SET_LEN(len) (F_ALN_LEN(TLV_HDRL) + (len))
+#define TLV_ALN_LEN(len) F_ALN_LEN(TLV_SET_LEN(len))
+#define TLV_RDAT_LEN(tlv) ((int)(EXTRACT_16BITS(&(tlv)->length) - TLV_SET_LEN(0))
+#define TLV_DATA(tlvp) ((void*)(((char*)(tlvp)) + TLV_SET_LEN(0)))
+#define GO_NXT_TLV(tlv,rlen) ((rlen) -= F_ALN_LEN(EXTRACT_16BITS(&(tlv)->length)), \
+ (struct forces_tlv*)(((char*)(tlv)) \
+ + F_ALN_LEN(EXTRACT_16BITS(&(tlv)->length))))
+#define ILV_SET_LEN(len) (F_ALN_LEN(ILV_HDRL) + (len))
+#define ILV_ALN_LEN(len) F_ALN_LEN(ILV_SET_LEN(len))
+#define ILV_RDAT_LEN(ilv) ((int)(EXTRACT_32BITS(&(ilv)->length)) - ILV_SET_LEN(0))
+#define ILV_DATA(ilvp) ((void*)(((char*)(ilvp)) + ILV_SET_LEN(0)))
+#define GO_NXT_ILV(ilv,rlen) ((rlen) -= F_ALN_LEN(EXTRACT_32BITS(&(ilv)->length)), \
+ (struct forces_ilv *)(((char*)(ilv)) \
+ + F_ALN_LEN(EXTRACT_32BITS(&(ilv)->length))))
+#define INVALID_RLEN 1
+#define INVALID_STLN 2
+#define INVALID_LTLN 3
+#define INVALID_ALEN 4
+
+static const struct tok ForCES_TLV_err[] = {
+ {INVALID_RLEN, "Invalid total length"},
+ {INVALID_STLN, "xLV too short"},
+ {INVALID_LTLN, "xLV too long"},
+ {INVALID_ALEN, "data padding missing"},
+ {0, NULL}
+};
+
+static inline u_int tlv_valid(const struct forces_tlv *tlv, u_int rlen)
+{
+ if (rlen < TLV_HDRL)
+ return INVALID_RLEN;
+ if (EXTRACT_16BITS(&tlv->length) < TLV_HDRL)
+ return INVALID_STLN;
+ if (EXTRACT_16BITS(&tlv->length) > rlen)
+ return INVALID_LTLN;
+ if (rlen < F_ALN_LEN(EXTRACT_16BITS(&tlv->length)))
+ return INVALID_ALEN;
+
+ return 0;
+}
+
+static inline int ilv_valid(const struct forces_ilv *ilv, u_int rlen)
+{
+ if (rlen < ILV_HDRL)
+ return INVALID_RLEN;
+ if (EXTRACT_32BITS(&ilv->length) < ILV_HDRL)
+ return INVALID_STLN;
+ if (EXTRACT_32BITS(&ilv->length) > rlen)
+ return INVALID_LTLN;
+ if (rlen < F_ALN_LEN(EXTRACT_32BITS(&ilv->length)))
+ return INVALID_ALEN;
+
+ return 0;
+}
+
+static int lfbselect_print(netdissect_options *, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+static int redirect_print(netdissect_options *, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+static int asrtlv_print(netdissect_options *, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+static int asttlv_print(netdissect_options *, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+
+struct forces_lfbsh {
+ uint32_t class;
+ uint32_t instance;
+};
+
+#define ASSNS_OPS (B_OP_REPORT)
+#define CFG_OPS (B_OP_SET|B_OP_SETPROP|B_OP_DEL|B_OP_COMMIT|B_OP_RTRCOMP)
+#define CFG_ROPS (B_OP_SETRESP|B_OP_SETPRESP|B_OP_DELRESP|B_OP_RCOMMIT)
+#define CFG_QY (B_OP_GET|B_OP_GETPROP)
+#define CFG_QYR (B_OP_GETRESP|B_OP_GETPRESP)
+#define CFG_EVN (B_OP_REPORT)
+
+static const struct tom_h ForCES_msg[TOM_MAX_IND + 1] = {
+ /* TOM_RSV_I */ {TOM_RSVD, ZERO_TTLV, 0, "Invalid message", NULL},
+ /* TOM_ASS_I */ {TOM_ASSNSETUP, ZERO_MORE_TTLV | TWO_TLV, ASSNS_OPS,
+ "Association Setup", lfbselect_print},
+ /* TOM_AST_I */
+ {TOM_ASSNTEARD, TTLV_T1, 0, "Association TearDown", asttlv_print},
+ /* TOM_CFG_I */ {TOM_CONFIG, TTLV_T2, CFG_OPS, "Config", lfbselect_print},
+ /* TOM_QRY_I */ {TOM_QUERY, TTLV_T2, CFG_QY, "Query", lfbselect_print},
+ /* TOM_EVN_I */ {TOM_EVENTNOT, TTLV_T1, CFG_EVN, "Event Notification",
+ lfbselect_print},
+ /* TOM_RED_I */
+ {TOM_PKTREDIR, TTLV_T2, 0, "Packet Redirect", redirect_print},
+ /* TOM_HBT_I */ {TOM_HEARTBT, ZERO_TTLV, 0, "HeartBeat", NULL},
+ /* TOM_ASR_I */
+ {TOM_ASSNSETREP, TTLV_T1, 0, "Association Response", asrtlv_print},
+ /* TOM_CNR_I */ {TOM_CONFIGREP, TTLV_T2, CFG_ROPS, "Config Response",
+ lfbselect_print},
+ /* TOM_QRR_I */
+ {TOM_QUERYREP, TTLV_T2, CFG_QYR, "Query Response", lfbselect_print},
+};
+
+static inline const struct tom_h *get_forces_tom(uint8_t tom)
+{
+ int i;
+ for (i = TOM_RSV_I; i <= TOM_MAX_IND; i++) {
+ const struct tom_h *th = &ForCES_msg[i];
+ if (th->v == tom)
+ return th;
+ }
+ return &ForCES_msg[TOM_RSV_I];
+}
+
+struct pdata_ops {
+ uint32_t v;
+ uint16_t flags;
+ uint16_t op_msk;
+ const char *s;
+ int (*print) (netdissect_options *, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+};
+
+enum {
+ PD_RSV_I,
+ PD_SEL_I,
+ PD_FDT_I,
+ PD_SDT_I,
+ PD_RES_I,
+ PD_PDT_I,
+ _PD_RSV_MAX
+};
+#define PD_MAX_IND (_TOM_RSV_MAX - 1)
+
+static inline int pd_valid(uint16_t pd)
+{
+ if (pd >= F_TLV_PDAT && pd <= F_TLV_REST)
+ return 1;
+ return 0;
+}
+
+static inline void
+chk_op_type(netdissect_options *ndo,
+ uint16_t type, uint16_t msk, uint16_t omsk)
+{
+ if (type != F_TLV_PDAT) {
+ if (msk & B_KEYIN) {
+ if (type != F_TLV_KEYI) {
+ ND_PRINT((ndo, "Based on flags expected KEYINFO TLV!\n"));
+ }
+ } else {
+ if (!(msk & omsk)) {
+ ND_PRINT((ndo, "Illegal DATA encoding for type 0x%x programmed %x got %x \n",
+ type, omsk, msk));
+ }
+ }
+ }
+
+}
+
+#define F_SELKEY 1
+#define F_SELTABRANGE 2
+#define F_TABAPPEND 4
+
+struct res_val {
+ uint8_t result;
+ uint8_t resv1;
+ uint16_t resv2;
+};
+
+static int prestlv_print(netdissect_options *, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+static int pkeyitlv_print(netdissect_options *, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+static int fdatatlv_print(netdissect_options *, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+static int sdatatlv_print(netdissect_options *, register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent);
+
+static const struct pdata_ops ForCES_pdata[PD_MAX_IND + 1] = {
+ /* PD_RSV_I */ {0, 0, 0, "Invalid message", NULL},
+ /* PD_SEL_I */ {F_TLV_KEYI, 0, 0, "KEYINFO TLV", pkeyitlv_print},
+ /* PD_FDT_I */ {F_TLV_FULD, 0, B_FULLD, "FULLDATA TLV", fdatatlv_print},
+ /* PD_SDT_I */ {F_TLV_SPAD, 0, B_SPARD, "SPARSEDATA TLV", sdatatlv_print},
+ /* PD_RES_I */ {F_TLV_REST, 0, B_RESTV, "RESULT TLV", prestlv_print},
+ /* PD_PDT_I */
+ {F_TLV_PDAT, 0, 0, "Inner PATH-DATA TLV", recpdoptlv_print},
+};
+
+static inline const struct pdata_ops *get_forces_pd(uint16_t pd)
+{
+ int i;
+ for (i = PD_RSV_I + 1; i <= PD_MAX_IND; i++) {
+ const struct pdata_ops *pdo = &ForCES_pdata[i];
+ if (pdo->v == pd)
+ return pdo;
+ }
+ return &ForCES_pdata[TOM_RSV_I];
+}
+
+enum {
+ E_SUCCESS,
+ E_INVALID_HEADER,
+ E_LENGTH_MISMATCH,
+ E_VERSION_MISMATCH,
+ E_INVALID_DESTINATION_PID,
+ E_LFB_UNKNOWN,
+ E_LFB_NOT_FOUND,
+ E_LFB_INSTANCE_ID_NOT_FOUND,
+ E_INVALID_PATH,
+ E_COMPONENT_DOES_NOT_EXIST,
+ E_EXISTS,
+ E_NOT_FOUND,
+ E_READ_ONLY,
+ E_INVALID_ARRAY_CREATION,
+ E_VALUE_OUT_OF_RANGE,
+ E_CONTENTS_TOO_LONG,
+ E_INVALID_PARAMETERS,
+ E_INVALID_MESSAGE_TYPE,
+ E_INVALID_FLAGS,
+ E_INVALID_TLV,
+ E_EVENT_ERROR,
+ E_NOT_SUPPORTED,
+ E_MEMORY_ERROR,
+ E_INTERNAL_ERROR,
+ /* 0x18-0xFE are reserved .. */
+ E_UNSPECIFIED_ERROR = 0XFF
+};
+
+static const struct tok ForCES_errs[] = {
+ {E_SUCCESS, "SUCCESS"},
+ {E_INVALID_HEADER, "INVALID HEADER"},
+ {E_LENGTH_MISMATCH, "LENGTH MISMATCH"},
+ {E_VERSION_MISMATCH, "VERSION MISMATCH"},
+ {E_INVALID_DESTINATION_PID, "INVALID DESTINATION PID"},
+ {E_LFB_UNKNOWN, "LFB UNKNOWN"},
+ {E_LFB_NOT_FOUND, "LFB NOT FOUND"},
+ {E_LFB_INSTANCE_ID_NOT_FOUND, "LFB INSTANCE ID NOT FOUND"},
+ {E_INVALID_PATH, "INVALID PATH"},
+ {E_COMPONENT_DOES_NOT_EXIST, "COMPONENT DOES NOT EXIST"},
+ {E_EXISTS, "EXISTS ALREADY"},
+ {E_NOT_FOUND, "NOT FOUND"},
+ {E_READ_ONLY, "READ ONLY"},
+ {E_INVALID_ARRAY_CREATION, "INVALID ARRAY CREATION"},
+ {E_VALUE_OUT_OF_RANGE, "VALUE OUT OF RANGE"},
+ {E_CONTENTS_TOO_LONG, "CONTENTS TOO LONG"},
+ {E_INVALID_PARAMETERS, "INVALID PARAMETERS"},
+ {E_INVALID_MESSAGE_TYPE, "INVALID MESSAGE TYPE"},
+ {E_INVALID_FLAGS, "INVALID FLAGS"},
+ {E_INVALID_TLV, "INVALID TLV"},
+ {E_EVENT_ERROR, "EVENT ERROR"},
+ {E_NOT_SUPPORTED, "NOT SUPPORTED"},
+ {E_MEMORY_ERROR, "MEMORY ERROR"},
+ {E_INTERNAL_ERROR, "INTERNAL ERROR"},
+ {E_UNSPECIFIED_ERROR, "UNSPECIFIED ERROR"},
+ {0, NULL}
+};
+
+#define RESLEN 4
+
+static int
+prestlv_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk _U_, int indent)
+{
+ const struct forces_tlv *tlv = (struct forces_tlv *)pptr;
+ register const u_char *tdp = (u_char *) TLV_DATA(tlv);
+ struct res_val *r = (struct res_val *)tdp;
+ u_int dlen;
+
+ /*
+ * pdatacnt_print() has ensured that len (the TLV length)
+ * >= TLV_HDRL.
+ */
+ dlen = len - TLV_HDRL;
+ if (dlen != RESLEN) {
+ ND_PRINT((ndo, "illegal RESULT-TLV: %d bytes!\n", dlen));
+ return -1;
+ }
+
+ ND_TCHECK(*r);
+ if (r->result >= 0x18 && r->result <= 0xFE) {
+ ND_PRINT((ndo, "illegal reserved result code: 0x%x!\n", r->result));
+ return -1;
+ }
+
+ if (ndo->ndo_vflag >= 3) {
+ char *ib = indent_pr(indent, 0);
+ ND_PRINT((ndo, "%s Result: %s (code 0x%x)\n", ib,
+ tok2str(ForCES_errs, NULL, r->result), r->result));
+ }
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+fdatatlv_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk _U_, int indent)
+{
+ const struct forces_tlv *tlv = (struct forces_tlv *)pptr;
+ u_int rlen;
+ register const u_char *tdp = (u_char *) TLV_DATA(tlv);
+ uint16_t type;
+
+ /*
+ * pdatacnt_print() or pkeyitlv_print() has ensured that len
+ * (the TLV length) >= TLV_HDRL.
+ */
+ rlen = len - TLV_HDRL;
+ ND_TCHECK(*tlv);
+ type = EXTRACT_16BITS(&tlv->type);
+ if (type != F_TLV_FULD) {
+ ND_PRINT((ndo, "Error: expecting FULLDATA!\n"));
+ return -1;
+ }
+
+ if (ndo->ndo_vflag >= 3) {
+ char *ib = indent_pr(indent + 2, 1);
+ ND_PRINT((ndo, "%s[", &ib[1]));
+ hex_print_with_offset(ndo, ib, tdp, rlen, 0);
+ ND_PRINT((ndo, "\n%s]\n", &ib[1]));
+ }
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+sdatailv_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk _U_, int indent)
+{
+ u_int rlen;
+ const struct forces_ilv *ilv = (struct forces_ilv *)pptr;
+ int invilv;
+
+ if (len < ILV_HDRL) {
+ ND_PRINT((ndo, "Error: BAD SPARSEDATA-TLV!\n"));
+ return -1;
+ }
+ rlen = len;
+ indent += 1;
+ while (rlen != 0) {
+#if 0
+ ND_PRINT((ndo, "Jamal - outstanding length <%d>\n", rlen));
+#endif
+ char *ib = indent_pr(indent, 1);
+ register const u_char *tdp = (u_char *) ILV_DATA(ilv);
+ ND_TCHECK(*ilv);
+ invilv = ilv_valid(ilv, rlen);
+ if (invilv) {
+ ND_PRINT((ndo, "%s[", &ib[1]));
+ hex_print_with_offset(ndo, ib, tdp, rlen, 0);
+ ND_PRINT((ndo, "\n%s]\n", &ib[1]));
+ return -1;
+ }
+ if (ndo->ndo_vflag >= 3) {
+ int ilvl = EXTRACT_32BITS(&ilv->length);
+ ND_PRINT((ndo, "\n%s ILV: type %x length %d\n", &ib[1],
+ EXTRACT_32BITS(&ilv->type), ilvl));
+ hex_print_with_offset(ndo, "\t\t[", tdp, ilvl-ILV_HDRL, 0);
+ }
+
+ ilv = GO_NXT_ILV(ilv, rlen);
+ }
+
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+sdatatlv_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent)
+{
+ const struct forces_tlv *tlv = (struct forces_tlv *)pptr;
+ u_int rlen;
+ register const u_char *tdp = (u_char *) TLV_DATA(tlv);
+ uint16_t type;
+
+ /*
+ * pdatacnt_print() has ensured that len (the TLV length)
+ * >= TLV_HDRL.
+ */
+ rlen = len - TLV_HDRL;
+ ND_TCHECK(*tlv);
+ type = EXTRACT_16BITS(&tlv->type);
+ if (type != F_TLV_SPAD) {
+ ND_PRINT((ndo, "Error: expecting SPARSEDATA!\n"));
+ return -1;
+ }
+
+ return sdatailv_print(ndo, tdp, rlen, op_msk, indent);
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+pkeyitlv_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent)
+{
+ const struct forces_tlv *tlv = (struct forces_tlv *)pptr;
+ register const u_char *tdp = (u_char *) TLV_DATA(tlv);
+ register const u_char *dp = tdp + 4;
+ const struct forces_tlv *kdtlv = (struct forces_tlv *)dp;
+ uint32_t id;
+ char *ib = indent_pr(indent, 0);
+ uint16_t type, tll;
+ u_int invtlv;
+
+ ND_TCHECK(*tdp);
+ id = EXTRACT_32BITS(tdp);
+ ND_PRINT((ndo, "%sKeyinfo: Key 0x%x\n", ib, id));
+ ND_TCHECK(*kdtlv);
+ type = EXTRACT_16BITS(&kdtlv->type);
+ invtlv = tlv_valid(kdtlv, len);
+
+ if (invtlv) {
+ ND_PRINT((ndo, "%s TLV type 0x%x len %d\n",
+ tok2str(ForCES_TLV_err, NULL, invtlv), type,
+ EXTRACT_16BITS(&kdtlv->length)));
+ return -1;
+ }
+ /*
+ * At this point, tlv_valid() has ensured that the TLV
+ * length is large enough but not too large (it doesn't
+ * go past the end of the containing TLV).
+ */
+ tll = EXTRACT_16BITS(&kdtlv->length);
+ dp = (u_char *) TLV_DATA(kdtlv);
+ return fdatatlv_print(ndo, dp, tll, op_msk, indent);
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+#define PTH_DESC_SIZE 12
+
+static int
+pdatacnt_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t IDcnt, uint16_t op_msk, int indent)
+{
+ u_int i;
+ uint32_t id;
+ char *ib = indent_pr(indent, 0);
+
+ if ((op_msk & B_APPND) && ndo->ndo_vflag >= 3) {
+ ND_PRINT((ndo, "%sTABLE APPEND\n", ib));
+ }
+ for (i = 0; i < IDcnt; i++) {
+ ND_TCHECK2(*pptr, 4);
+ if (len < 4)
+ goto trunc;
+ id = EXTRACT_32BITS(pptr);
+ if (ndo->ndo_vflag >= 3)
+ ND_PRINT((ndo, "%sID#%02u: %d\n", ib, i + 1, id));
+ len -= 4;
+ pptr += 4;
+ }
+
+ if ((op_msk & B_TRNG) || (op_msk & B_KEYIN)) {
+ if (op_msk & B_TRNG) {
+ uint32_t starti, endi;
+
+ if (len < PTH_DESC_SIZE) {
+ ND_PRINT((ndo, "pathlength %d with key/range too short %d\n",
+ len, PTH_DESC_SIZE));
+ return -1;
+ }
+
+ pptr += sizeof(struct forces_tlv);
+ len -= sizeof(struct forces_tlv);
+
+ starti = EXTRACT_32BITS(pptr);
+ pptr += 4;
+ len -= 4;
+
+ endi = EXTRACT_32BITS(pptr);
+ pptr += 4;
+ len -= 4;
+
+ if (ndo->ndo_vflag >= 3)
+ ND_PRINT((ndo, "%sTable range: [%d,%d]\n", ib, starti, endi));
+ }
+
+ if (op_msk & B_KEYIN) {
+ struct forces_tlv *keytlv;
+ uint16_t tll;
+
+ if (len < PTH_DESC_SIZE) {
+ ND_PRINT((ndo, "pathlength %d with key/range too short %d\n",
+ len, PTH_DESC_SIZE));
+ return -1;
+ }
+
+ /* skip keyid */
+ pptr += 4;
+ len -= 4;
+ keytlv = (struct forces_tlv *)pptr;
+ /* skip header */
+ pptr += sizeof(struct forces_tlv);
+ len -= sizeof(struct forces_tlv);
+ /* skip key content */
+ tll = EXTRACT_16BITS(&keytlv->length);
+ if (tll < TLV_HDRL) {
+ ND_PRINT((ndo, "key content length %u < %u\n",
+ tll, TLV_HDRL));
+ return -1;
+ }
+ tll -= TLV_HDRL;
+ if (len < tll) {
+ ND_PRINT((ndo, "key content too short\n"));
+ return -1;
+ }
+ pptr += tll;
+ len -= tll;
+ }
+
+ }
+
+ if (len) {
+ const struct forces_tlv *pdtlv = (struct forces_tlv *)pptr;
+ uint16_t type;
+ uint16_t tll;
+ int pad = 0;
+ u_int aln;
+ u_int invtlv;
+
+ ND_TCHECK(*pdtlv);
+ type = EXTRACT_16BITS(&pdtlv->type);
+ invtlv = tlv_valid(pdtlv, len);
+ if (invtlv) {
+ ND_PRINT((ndo, "%s Outstanding bytes %d for TLV type 0x%x TLV len %d\n",
+ tok2str(ForCES_TLV_err, NULL, invtlv), len, type,
+ EXTRACT_16BITS(&pdtlv->length)));
+ goto pd_err;
+ }
+ /*
+ * At this point, tlv_valid() has ensured that the TLV
+ * length is large enough but not too large (it doesn't
+ * go past the end of the containing TLV).
+ */
+ tll = EXTRACT_16BITS(&pdtlv->length) - TLV_HDRL;
+ aln = F_ALN_LEN(EXTRACT_16BITS(&pdtlv->length));
+ if (aln > EXTRACT_16BITS(&pdtlv->length)) {
+ if (aln > len) {
+ ND_PRINT((ndo,
+ "Invalid padded pathdata TLV type 0x%x len %d missing %d pad bytes\n",
+ type, EXTRACT_16BITS(&pdtlv->length), aln - len));
+ } else {
+ pad = aln - EXTRACT_16BITS(&pdtlv->length);
+ }
+ }
+ if (pd_valid(type)) {
+ const struct pdata_ops *ops = get_forces_pd(type);
+
+ if (ndo->ndo_vflag >= 3 && ops->v != F_TLV_PDAT) {
+ if (pad)
+ ND_PRINT((ndo, "%s %s (Length %d DataLen %d pad %d Bytes)\n",
+ ib, ops->s, EXTRACT_16BITS(&pdtlv->length), tll, pad));
+ else
+ ND_PRINT((ndo, "%s %s (Length %d DataLen %d Bytes)\n",
+ ib, ops->s, EXTRACT_16BITS(&pdtlv->length), tll));
+ }
+
+ chk_op_type(ndo, type, op_msk, ops->op_msk);
+
+ if (ops->print(ndo, (const u_char *)pdtlv,
+ tll + pad + TLV_HDRL, op_msk,
+ indent + 2) == -1)
+ return -1;
+ len -= (TLV_HDRL + pad + tll);
+ } else {
+ ND_PRINT((ndo, "Invalid path data content type 0x%x len %d\n",
+ type, EXTRACT_16BITS(&pdtlv->length)));
+pd_err:
+ if (EXTRACT_16BITS(&pdtlv->length)) {
+ hex_print_with_offset(ndo, "Bad Data val\n\t [",
+ pptr, len, 0);
+ ND_PRINT((ndo, "]\n"));
+
+ return -1;
+ }
+ }
+ }
+ return len;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+pdata_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent)
+{
+ const struct pathdata_h *pdh = (struct pathdata_h *)pptr;
+ char *ib = indent_pr(indent, 0);
+ u_int minsize = 0;
+ int more_pd = 0;
+ uint16_t idcnt = 0;
+
+ ND_TCHECK(*pdh);
+ if (len < sizeof(struct pathdata_h))
+ goto trunc;
+ if (ndo->ndo_vflag >= 3) {
+ ND_PRINT((ndo, "\n%sPathdata: Flags 0x%x ID count %d\n",
+ ib, EXTRACT_16BITS(&pdh->pflags), EXTRACT_16BITS(&pdh->pIDcnt)));
+ }
+
+ if (EXTRACT_16BITS(&pdh->pflags) & F_SELKEY) {
+ op_msk |= B_KEYIN;
+ }
+
+ /* Table GET Range operation */
+ if (EXTRACT_16BITS(&pdh->pflags) & F_SELTABRANGE) {
+ op_msk |= B_TRNG;
+ }
+ /* Table SET append operation */
+ if (EXTRACT_16BITS(&pdh->pflags) & F_TABAPPEND) {
+ op_msk |= B_APPND;
+ }
+
+ pptr += sizeof(struct pathdata_h);
+ len -= sizeof(struct pathdata_h);
+ idcnt = EXTRACT_16BITS(&pdh->pIDcnt);
+ minsize = idcnt * 4;
+ if (len < minsize) {
+ ND_PRINT((ndo, "\t\t\ttruncated IDs expected %uB got %uB\n", minsize,
+ len));
+ hex_print_with_offset(ndo, "\t\t\tID Data[", pptr, len, 0);
+ ND_PRINT((ndo, "]\n"));
+ return -1;
+ }
+
+ if ((op_msk & B_TRNG) && (op_msk & B_KEYIN)) {
+ ND_PRINT((ndo, "\t\t\tIllegal to have both Table ranges and keys\n"));
+ return -1;
+ }
+
+ more_pd = pdatacnt_print(ndo, 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(ndo, pptr, len, op_msk, indent+1);
+ } else
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+genoptlv_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent)
+{
+ const struct forces_tlv *pdtlv = (struct forces_tlv *)pptr;
+ uint16_t type;
+ int tll;
+ u_int invtlv;
+ char *ib = indent_pr(indent, 0);
+
+ ND_TCHECK(*pdtlv);
+ type = EXTRACT_16BITS(&pdtlv->type);
+ tll = EXTRACT_16BITS(&pdtlv->length) - TLV_HDRL;
+ invtlv = tlv_valid(pdtlv, len);
+ ND_PRINT((ndo, "genoptlvprint - %s TLV type 0x%x len %d\n",
+ tok2str(ForCES_TLV, NULL, type), type, EXTRACT_16BITS(&pdtlv->length)));
+ if (!invtlv) {
+ /*
+ * At this point, tlv_valid() has ensured that the TLV
+ * length is large enough but not too large (it doesn't
+ * go past the end of the containing TLV).
+ */
+ register const u_char *dp = (u_char *) TLV_DATA(pdtlv);
+ if (!ttlv_valid(type)) {
+ ND_PRINT((ndo, "%s TLV type 0x%x len %d\n",
+ tok2str(ForCES_TLV_err, NULL, invtlv), type,
+ EXTRACT_16BITS(&pdtlv->length)));
+ return -1;
+ }
+ if (ndo->ndo_vflag >= 3)
+ ND_PRINT((ndo, "%s%s, length %d (data length %d Bytes)",
+ ib, tok2str(ForCES_TLV, NULL, type),
+ EXTRACT_16BITS(&pdtlv->length), tll));
+
+ return pdata_print(ndo, dp, tll, op_msk, indent + 1);
+ } else {
+ ND_PRINT((ndo, "\t\t\tInvalid ForCES TLV type=%x", type));
+ return -1;
+ }
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+recpdoptlv_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent)
+{
+ const struct forces_tlv *pdtlv = (struct forces_tlv *)pptr;
+ int tll;
+ u_int invtlv;
+ uint16_t type;
+ register const u_char *dp;
+ char *ib;
+
+ while (len != 0) {
+ ND_TCHECK(*pdtlv);
+ invtlv = tlv_valid(pdtlv, len);
+ if (invtlv) {
+ break;
+ }
+
+ /*
+ * At this point, tlv_valid() has ensured that the TLV
+ * length is large enough but not too large (it doesn't
+ * go past the end of the containing TLV).
+ */
+ ib = indent_pr(indent, 0);
+ type = EXTRACT_16BITS(&pdtlv->type);
+ dp = (u_char *) TLV_DATA(pdtlv);
+ tll = EXTRACT_16BITS(&pdtlv->length) - TLV_HDRL;
+
+ if (ndo->ndo_vflag >= 3)
+ ND_PRINT((ndo, "%s%s, length %d (data encapsulated %d Bytes)",
+ ib, tok2str(ForCES_TLV, NULL, type),
+ EXTRACT_16BITS(&pdtlv->length),
+ EXTRACT_16BITS(&pdtlv->length) - TLV_HDRL));
+
+ if (pdata_print(ndo, dp, tll, op_msk, indent + 1) == -1)
+ return -1;
+ pdtlv = GO_NXT_TLV(pdtlv, len);
+ }
+
+ if (len) {
+ ND_PRINT((ndo,
+ "\n\t\tMessy PATHDATA TLV header, type (0x%x)\n\t\texcess of %d Bytes ",
+ EXTRACT_16BITS(&pdtlv->type), len - EXTRACT_16BITS(&pdtlv->length)));
+ return -1;
+ }
+
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+invoptlv_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk _U_, int indent)
+{
+ char *ib = indent_pr(indent, 1);
+
+ if (ndo->ndo_vflag >= 3) {
+ ND_PRINT((ndo, "%sData[", &ib[1]));
+ hex_print_with_offset(ndo, ib, pptr, len, 0);
+ ND_PRINT((ndo, "%s]\n", ib));
+ }
+ return -1;
+}
+
+static int
+otlv_print(netdissect_options *ndo,
+ const struct forces_tlv *otlv, uint16_t op_msk _U_, int indent)
+{
+ int rc = 0;
+ register const u_char *dp = (u_char *) TLV_DATA(otlv);
+ uint16_t type;
+ int tll;
+ char *ib = indent_pr(indent, 0);
+ const struct optlv_h *ops;
+
+ /*
+ * lfbselect_print() has ensured that EXTRACT_16BITS(&otlv->length)
+ * >= TLV_HDRL.
+ */
+ ND_TCHECK(*otlv);
+ type = EXTRACT_16BITS(&otlv->type);
+ tll = EXTRACT_16BITS(&otlv->length) - TLV_HDRL;
+ ops = get_forces_optlv_h(type);
+ if (ndo->ndo_vflag >= 3) {
+ ND_PRINT((ndo, "%sOper TLV %s(0x%x) length %d\n", ib, ops->s, type,
+ EXTRACT_16BITS(&otlv->length)));
+ }
+ /* rest of ops must at least have 12B {pathinfo} */
+ if (tll < OP_MIN_SIZ) {
+ ND_PRINT((ndo, "\t\tOper TLV %s(0x%x) length %d\n", ops->s, type,
+ EXTRACT_16BITS(&otlv->length)));
+ ND_PRINT((ndo, "\t\tTruncated data size %d minimum required %d\n", tll,
+ OP_MIN_SIZ));
+ return invoptlv_print(ndo, dp, tll, ops->op_msk, indent);
+
+ }
+
+ /* XXX - do anything with ops->flags? */
+ if(ops->print) {
+ rc = ops->print(ndo, dp, tll, ops->op_msk, indent + 1);
+ }
+ return rc;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+#define ASTDLN 4
+#define ASTMCD 255
+static int
+asttlv_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk _U_, int indent)
+{
+ uint32_t rescode;
+ u_int dlen;
+ char *ib = indent_pr(indent, 0);
+
+ /*
+ * forces_type_print() has ensured that len (the TLV length)
+ * >= TLV_HDRL.
+ */
+ dlen = len - TLV_HDRL;
+ if (dlen != ASTDLN) {
+ ND_PRINT((ndo, "illegal ASTresult-TLV: %d bytes!\n", dlen));
+ return -1;
+ }
+ ND_TCHECK2(*pptr, 4);
+ rescode = EXTRACT_32BITS(pptr);
+ if (rescode > ASTMCD) {
+ ND_PRINT((ndo, "illegal ASTresult result code: %d!\n", rescode));
+ return -1;
+ }
+
+ if (ndo->ndo_vflag >= 3) {
+ ND_PRINT((ndo, "Teardown reason:\n%s", ib));
+ switch (rescode) {
+ case 0:
+ ND_PRINT((ndo, "Normal Teardown"));
+ break;
+ case 1:
+ ND_PRINT((ndo, "Loss of Heartbeats"));
+ break;
+ case 2:
+ ND_PRINT((ndo, "Out of bandwidth"));
+ break;
+ case 3:
+ ND_PRINT((ndo, "Out of Memory"));
+ break;
+ case 4:
+ ND_PRINT((ndo, "Application Crash"));
+ break;
+ default:
+ ND_PRINT((ndo, "Unknown Teardown reason"));
+ break;
+ }
+ ND_PRINT((ndo, "(%x)\n%s", rescode, ib));
+ }
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+#define ASRDLN 4
+#define ASRMCD 3
+static int
+asrtlv_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk _U_, int indent)
+{
+ uint32_t rescode;
+ u_int dlen;
+ char *ib = indent_pr(indent, 0);
+
+ /*
+ * forces_type_print() has ensured that len (the TLV length)
+ * >= TLV_HDRL.
+ */
+ dlen = len - TLV_HDRL;
+ if (dlen != ASRDLN) { /* id, instance, oper tlv */
+ ND_PRINT((ndo, "illegal ASRresult-TLV: %d bytes!\n", dlen));
+ return -1;
+ }
+ ND_TCHECK2(*pptr, 4);
+ rescode = EXTRACT_32BITS(pptr);
+
+ if (rescode > ASRMCD) {
+ ND_PRINT((ndo, "illegal ASRresult result code: %d!\n", rescode));
+ return -1;
+ }
+
+ if (ndo->ndo_vflag >= 3) {
+ ND_PRINT((ndo, "\n%s", ib));
+ switch (rescode) {
+ case 0:
+ ND_PRINT((ndo, "Success "));
+ break;
+ case 1:
+ ND_PRINT((ndo, "FE ID invalid "));
+ break;
+ case 2:
+ ND_PRINT((ndo, "permission denied "));
+ break;
+ default:
+ ND_PRINT((ndo, "Unknown "));
+ break;
+ }
+ ND_PRINT((ndo, "(%x)\n%s", rescode, ib));
+ }
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+#if 0
+/*
+ * XXX - not used.
+ */
+static int
+gentltlv_print(netdissect_options *ndo,
+ register const u_char * pptr _U_, register u_int len,
+ uint16_t op_msk _U_, int indent _U_)
+{
+ u_int dlen = len - TLV_HDRL;
+
+ if (dlen < 4) { /* at least 32 bits must exist */
+ ND_PRINT((ndo, "truncated TLV: %d bytes missing! ", 4 - dlen));
+ return -1;
+ }
+ return 0;
+}
+#endif
+
+#define RD_MIN 8
+
+static int
+print_metailv(netdissect_options *ndo,
+ register const u_char * pptr, uint16_t op_msk _U_, int indent)
+{
+ u_int rlen;
+ char *ib = indent_pr(indent, 0);
+ /* XXX: check header length */
+ const struct forces_ilv *ilv = (struct forces_ilv *)pptr;
+
+ /*
+ * print_metatlv() has ensured that len (what remains in the
+ * ILV) >= ILV_HDRL.
+ */
+ rlen = EXTRACT_32BITS(&ilv->length) - ILV_HDRL;
+ ND_TCHECK(*ilv);
+ ND_PRINT((ndo, "%sMetaID 0x%x length %d\n", ib, EXTRACT_32BITS(&ilv->type),
+ EXTRACT_32BITS(&ilv->length)));
+ if (ndo->ndo_vflag >= 3) {
+ hex_print_with_offset(ndo, "\t\t[", ILV_DATA(ilv), rlen, 0);
+ ND_PRINT((ndo, " ]\n"));
+ }
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+print_metatlv(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk _U_, int indent)
+{
+ u_int dlen;
+ char *ib = indent_pr(indent, 0);
+ u_int rlen;
+ const struct forces_ilv *ilv = (struct forces_ilv *)pptr;
+ int invilv;
+
+ /*
+ * redirect_print() has ensured that len (what remains in the
+ * TLV) >= TLV_HDRL.
+ */
+ dlen = len - TLV_HDRL;
+ rlen = dlen;
+ ND_PRINT((ndo, "\n%s METADATA length %d \n", ib, rlen));
+ while (rlen != 0) {
+ ND_TCHECK(*ilv);
+ invilv = ilv_valid(ilv, rlen);
+ if (invilv) {
+ break;
+ }
+
+ /*
+ * At this point, ilv_valid() has ensured that the ILV
+ * length is large enough but not too large (it doesn't
+ * go past the end of the containing TLV).
+ */
+ print_metailv(ndo, (u_char *) ilv, 0, indent + 1);
+ ilv = GO_NXT_ILV(ilv, rlen);
+ }
+
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+
+static int
+print_reddata(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk _U_, int indent _U_)
+{
+ u_int dlen;
+ char *ib = indent_pr(indent, 0);
+ u_int rlen;
+
+ dlen = len - TLV_HDRL;
+ rlen = dlen;
+ ND_PRINT((ndo, "\n%s Redirect Data length %d \n", ib, rlen));
+
+ if (ndo->ndo_vflag >= 3) {
+ ND_PRINT((ndo, "\t\t["));
+ hex_print_with_offset(ndo, "\n\t\t", pptr, rlen, 0);
+ ND_PRINT((ndo, "\n\t\t]"));
+ }
+
+ return 0;
+}
+
+static int
+redirect_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk _U_, int indent)
+{
+ const struct forces_tlv *tlv = (struct forces_tlv *)pptr;
+ u_int dlen;
+ u_int rlen;
+ u_int invtlv;
+
+ /*
+ * forces_type_print() has ensured that len (the TLV length)
+ * >= TLV_HDRL.
+ */
+ dlen = len - TLV_HDRL;
+ if (dlen <= RD_MIN) {
+ ND_PRINT((ndo, "\n\t\ttruncated Redirect TLV: %d bytes missing! ",
+ RD_MIN - dlen));
+ return -1;
+ }
+
+ rlen = dlen;
+ indent += 1;
+ while (rlen != 0) {
+ ND_TCHECK(*tlv);
+ invtlv = tlv_valid(tlv, rlen);
+ if (invtlv) {
+ ND_PRINT((ndo, "Bad Redirect data\n"));
+ break;
+ }
+
+ /*
+ * At this point, tlv_valid() has ensured that the TLV
+ * length is large enough but not too large (it doesn't
+ * go past the end of the containing TLV).
+ */
+ if (EXTRACT_16BITS(&tlv->type) == F_TLV_METD) {
+ print_metatlv(ndo, (u_char *) TLV_DATA(tlv),
+ EXTRACT_16BITS(&tlv->length), 0, indent);
+ } else if ((EXTRACT_16BITS(&tlv->type) == F_TLV_REDD)) {
+ print_reddata(ndo, (u_char *) TLV_DATA(tlv),
+ EXTRACT_16BITS(&tlv->length), 0, indent);
+ } else {
+ ND_PRINT((ndo, "Unknown REDIRECT TLV 0x%x len %d\n",
+ EXTRACT_16BITS(&tlv->type),
+ EXTRACT_16BITS(&tlv->length)));
+ }
+
+ tlv = GO_NXT_TLV(tlv, rlen);
+ }
+
+ if (rlen) {
+ ND_PRINT((ndo,
+ "\n\t\tMessy Redirect TLV header, type (0x%x)\n\t\texcess of %d Bytes ",
+ EXTRACT_16BITS(&tlv->type),
+ rlen - EXTRACT_16BITS(&tlv->length)));
+ return -1;
+ }
+
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+#define OP_OFF 8
+#define OP_MIN 12
+
+static int
+lfbselect_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len,
+ uint16_t op_msk, int indent)
+{
+ const struct forces_lfbsh *lfbs;
+ const struct forces_tlv *otlv;
+ char *ib = indent_pr(indent, 0);
+ u_int dlen;
+ u_int rlen;
+ u_int invtlv;
+
+ /*
+ * forces_type_print() has ensured that len (the TLV length)
+ * >= TLV_HDRL.
+ */
+ dlen = len - TLV_HDRL;
+ if (dlen <= OP_MIN) { /* id, instance, oper tlv header .. */
+ ND_PRINT((ndo, "\n\t\ttruncated lfb selector: %d bytes missing! ",
+ OP_MIN - dlen));
+ return -1;
+ }
+
+ /*
+ * At this point, we know that dlen > OP_MIN; OP_OFF < OP_MIN, so
+ * we also know that it's > OP_OFF.
+ */
+ rlen = dlen - OP_OFF;
+
+ lfbs = (const struct forces_lfbsh *)pptr;
+ ND_TCHECK(*lfbs);
+ if (ndo->ndo_vflag >= 3) {
+ ND_PRINT((ndo, "\n%s%s(Classid %x) instance %x\n",
+ ib, tok2str(ForCES_LFBs, NULL, EXTRACT_32BITS(&lfbs->class)),
+ EXTRACT_32BITS(&lfbs->class),
+ EXTRACT_32BITS(&lfbs->instance)));
+ }
+
+ otlv = (struct forces_tlv *)(lfbs + 1);
+
+ indent += 1;
+ while (rlen != 0) {
+ ND_TCHECK(*otlv);
+ invtlv = tlv_valid(otlv, rlen);
+ if (invtlv)
+ break;
+
+ /*
+ * At this point, tlv_valid() has ensured that the TLV
+ * length is large enough but not too large (it doesn't
+ * go past the end of the containing TLV).
+ */
+ if (op_valid(EXTRACT_16BITS(&otlv->type), op_msk)) {
+ otlv_print(ndo, otlv, 0, indent);
+ } else {
+ if (ndo->ndo_vflag < 3)
+ ND_PRINT((ndo, "\n"));
+ ND_PRINT((ndo,
+ "\t\tINValid oper-TLV type 0x%x length %d for this ForCES message\n",
+ EXTRACT_16BITS(&otlv->type), EXTRACT_16BITS(&otlv->length)));
+ invoptlv_print(ndo, (u_char *)otlv, rlen, 0, indent);
+ }
+ otlv = GO_NXT_TLV(otlv, rlen);
+ }
+
+ if (rlen) {
+ ND_PRINT((ndo,
+ "\n\t\tMessy oper TLV header, type (0x%x)\n\t\texcess of %d Bytes ",
+ EXTRACT_16BITS(&otlv->type), rlen - EXTRACT_16BITS(&otlv->length)));
+ return -1;
+ }
+
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int
+forces_type_print(netdissect_options *ndo,
+ register const u_char * pptr, const struct forcesh *fhdr _U_,
+ register u_int mlen, const struct tom_h *tops)
+{
+ const struct forces_tlv *tltlv;
+ u_int rlen;
+ u_int invtlv;
+ int rc = 0;
+ int ttlv = 0;
+
+ /*
+ * forces_print() has already checked that mlen >= ForCES_HDRL
+ * by calling ForCES_HLN_VALID().
+ */
+ rlen = mlen - ForCES_HDRL;
+
+ if (rlen > TLV_HLN) {
+ if (tops->flags & ZERO_TTLV) {
+ ND_PRINT((ndo, "<0x%x>Illegal Top level TLV!\n", tops->flags));
+ return -1;
+ }
+ } else {
+ if (tops->flags & ZERO_MORE_TTLV)
+ return 0;
+ if (tops->flags & ONE_MORE_TTLV) {
+ ND_PRINT((ndo, "\tTop level TLV Data missing!\n"));
+ return -1;
+ }
+ }
+
+ if (tops->flags & ZERO_TTLV) {
+ return 0;
+ }
+
+ ttlv = tops->flags >> 4;
+ tltlv = GET_TOP_TLV(pptr);
+
+ /*XXX: 15 top level tlvs will probably be fine
+ You are nuts if you send more ;-> */
+ while (rlen != 0) {
+ ND_TCHECK(*tltlv);
+ invtlv = tlv_valid(tltlv, rlen);
+ if (invtlv)
+ break;
+
+ /*
+ * At this point, tlv_valid() has ensured that the TLV
+ * length is large enough but not too large (it doesn't
+ * go past the end of the packet).
+ */
+ if (!ttlv_valid(EXTRACT_16BITS(&tltlv->type))) {
+ ND_PRINT((ndo, "\n\tInvalid ForCES Top TLV type=0x%x",
+ EXTRACT_16BITS(&tltlv->type)));
+ return -1;
+ }
+
+ if (ndo->ndo_vflag >= 3)
+ ND_PRINT((ndo, "\t%s, length %d (data length %d Bytes)",
+ tok2str(ForCES_TLV, NULL, EXTRACT_16BITS(&tltlv->type)),
+ EXTRACT_16BITS(&tltlv->length),
+ EXTRACT_16BITS(&tltlv->length) - TLV_HDRL));
+
+ rc = tops->print(ndo, (u_char *) TLV_DATA(tltlv),
+ EXTRACT_16BITS(&tltlv->length), tops->op_msk, 9);
+ if (rc < 0) {
+ return -1;
+ }
+ tltlv = GO_NXT_TLV(tltlv, rlen);
+ ttlv--;
+ if (ttlv <= 0)
+ break;
+ }
+ /*
+ * XXX - if ttlv != 0, does that mean that the packet was too
+ * short, and didn't have *enough* TLVs in it?
+ */
+ if (rlen) {
+ ND_PRINT((ndo, "\tMess TopTLV header: min %u, total %d advertised %d ",
+ TLV_HDRL, rlen, EXTRACT_16BITS(&tltlv->length)));
+ return -1;
+ }
+
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+void
+forces_print(netdissect_options *ndo,
+ register const u_char * pptr, register u_int len)
+{
+ const struct forcesh *fhdr;
+ u_int mlen;
+ uint32_t flg_raw;
+ const struct tom_h *tops;
+ int rc = 0;
+
+ fhdr = (const struct forcesh *)pptr;
+ ND_TCHECK(*fhdr);
+ if (!tom_valid(fhdr->fm_tom)) {
+ ND_PRINT((ndo, "Invalid ForCES message type %d\n", fhdr->fm_tom));
+ goto error;
+ }
+
+ mlen = ForCES_BLN(fhdr);
+
+ tops = get_forces_tom(fhdr->fm_tom);
+ if (tops->v == TOM_RSVD) {
+ ND_PRINT((ndo, "\n\tUnknown ForCES message type=0x%x", fhdr->fm_tom));
+ goto error;
+ }
+
+ ND_PRINT((ndo, "\n\tForCES %s ", tops->s));
+ if (!ForCES_HLN_VALID(mlen, len)) {
+ ND_PRINT((ndo,
+ "Illegal ForCES pkt len - min %u, total recvd %d, advertised %d ",
+ ForCES_HDRL, len, ForCES_BLN(fhdr)));
+ goto error;
+ }
+
+ ND_TCHECK2(*(pptr + 20), 4);
+ flg_raw = EXTRACT_32BITS(pptr + 20);
+ if (ndo->ndo_vflag >= 1) {
+ ND_PRINT((ndo, "\n\tForCES Version %d len %uB flags 0x%08x ",
+ ForCES_V(fhdr), mlen, flg_raw));
+ ND_PRINT((ndo,
+ "\n\tSrcID 0x%x(%s) DstID 0x%x(%s) Correlator 0x%" PRIx64,
+ ForCES_SID(fhdr), ForCES_node(ForCES_SID(fhdr)),
+ ForCES_DID(fhdr), ForCES_node(ForCES_DID(fhdr)),
+ EXTRACT_64BITS(fhdr->fm_cor)));
+
+ }
+ if (ndo->ndo_vflag >= 2) {
+ ND_PRINT((ndo,
+ "\n\tForCES flags:\n\t %s(0x%x), prio=%d, %s(0x%x),\n\t %s(0x%x), %s(0x%x)\n",
+ tok2str(ForCES_ACKs, "ACKUnknown", ForCES_ACK(fhdr)),
+ ForCES_ACK(fhdr),
+ ForCES_PRI(fhdr),
+ tok2str(ForCES_EMs, "EMUnknown", ForCES_EM(fhdr)),
+ ForCES_EM(fhdr),
+ tok2str(ForCES_ATs, "ATUnknown", ForCES_AT(fhdr)),
+ ForCES_AT(fhdr),
+ tok2str(ForCES_TPs, "TPUnknown", ForCES_TP(fhdr)),
+ ForCES_TP(fhdr)));
+ ND_PRINT((ndo,
+ "\t Extra flags: rsv(b5-7) 0x%x rsv(b13-31) 0x%x\n",
+ ForCES_RS1(fhdr), ForCES_RS2(fhdr)));
+ }
+ rc = forces_type_print(ndo, pptr, fhdr, mlen, tops);
+ if (rc < 0) {
+error:
+ hex_print_with_offset(ndo, "\n\t[", pptr, len, 0);
+ ND_PRINT((ndo, "\n\t]"));
+ return;
+ }
+
+ if (ndo->ndo_vflag >= 4) {
+ ND_PRINT((ndo, "\n\t Raw ForCES message\n\t ["));
+ hex_print_with_offset(ndo, "\n\t ", pptr, len, 0);
+ ND_PRINT((ndo, "\n\t ]"));
+ }
+ ND_PRINT((ndo, "\n"));
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-fr.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "ethertype.h"
+#include "llc.h"
+#include "nlpid.h"
+#include "extract.h"
+#include "oui.h"
+
+static void frf15_print(netdissect_options *ndo, const u_char *, u_int);
+
+/*
+ * the frame relay header has a variable length
+ *
+ * the EA bit determines if there is another byte
+ * in the header
+ *
+ * minimum header length is 2 bytes
+ * maximum header length is 4 bytes
+ *
+ * 7 6 5 4 3 2 1 0
+ * +----+----+----+----+----+----+----+----+
+ * | DLCI (6 bits) | CR | EA |
+ * +----+----+----+----+----+----+----+----+
+ * | DLCI (4 bits) |FECN|BECN| DE | EA |
+ * +----+----+----+----+----+----+----+----+
+ * | DLCI (7 bits) | EA |
+ * +----+----+----+----+----+----+----+----+
+ * | DLCI (6 bits) |SDLC| EA |
+ * +----+----+----+----+----+----+----+----+
+ */
+
+#define FR_EA_BIT 0x01
+
+#define FR_CR_BIT 0x02000000
+#define FR_DE_BIT 0x00020000
+#define FR_BECN_BIT 0x00040000
+#define FR_FECN_BIT 0x00080000
+#define FR_SDLC_BIT 0x00000002
+
+
+static const struct tok fr_header_flag_values[] = {
+ { FR_CR_BIT, "C!" },
+ { FR_DE_BIT, "DE" },
+ { FR_BECN_BIT, "BECN" },
+ { FR_FECN_BIT, "FECN" },
+ { FR_SDLC_BIT, "sdlcore" },
+ { 0, NULL }
+};
+
+/* FRF.15 / FRF.16 */
+#define MFR_B_BIT 0x80
+#define MFR_E_BIT 0x40
+#define MFR_C_BIT 0x20
+#define MFR_BEC_MASK (MFR_B_BIT | MFR_E_BIT | MFR_C_BIT)
+#define MFR_CTRL_FRAME (MFR_B_BIT | MFR_E_BIT | MFR_C_BIT)
+#define MFR_FRAG_FRAME (MFR_B_BIT | MFR_E_BIT )
+
+static const struct tok frf_flag_values[] = {
+ { MFR_B_BIT, "Begin" },
+ { MFR_E_BIT, "End" },
+ { MFR_C_BIT, "Control" },
+ { 0, NULL }
+};
+
+/* Finds out Q.922 address length, DLCI and flags. Returns 1 on success,
+ * 0 on invalid address, -1 on truncated packet
+ * save the flags dep. on address length
+ */
+static int parse_q922_addr(netdissect_options *ndo,
+ const u_char *p, u_int *dlci,
+ u_int *addr_len, uint8_t *flags, u_int length)
+{
+ if (!ND_TTEST(p[0]) || length < 1)
+ return -1;
+ if ((p[0] & FR_EA_BIT))
+ return 0;
+
+ if (!ND_TTEST(p[1]) || length < 2)
+ return -1;
+ *addr_len = 2;
+ *dlci = ((p[0] & 0xFC) << 2) | ((p[1] & 0xF0) >> 4);
+
+ flags[0] = p[0] & 0x02; /* populate the first flag fields */
+ flags[1] = p[1] & 0x0c;
+ flags[2] = 0; /* clear the rest of the flags */
+ flags[3] = 0;
+
+ if (p[1] & FR_EA_BIT)
+ return 1; /* 2-byte Q.922 address */
+
+ p += 2;
+ length -= 2;
+ if (!ND_TTEST(p[0]) || length < 1)
+ return -1;
+ (*addr_len)++; /* 3- or 4-byte Q.922 address */
+ if ((p[0] & FR_EA_BIT) == 0) {
+ *dlci = (*dlci << 7) | (p[0] >> 1);
+ (*addr_len)++; /* 4-byte Q.922 address */
+ p++;
+ length--;
+ }
+
+ if (!ND_TTEST(p[0]) || length < 1)
+ return -1;
+ if ((p[0] & FR_EA_BIT) == 0)
+ return 0; /* more than 4 bytes of Q.922 address? */
+
+ flags[3] = p[0] & 0x02;
+
+ *dlci = (*dlci << 6) | (p[0] >> 2);
+
+ return 1;
+}
+
+char *
+q922_string(netdissect_options *ndo, const u_char *p, u_int length)
+{
+
+ static u_int dlci, addr_len;
+ static uint8_t flags[4];
+ static char buffer[sizeof("DLCI xxxxxxxxxx")];
+ memset(buffer, 0, sizeof(buffer));
+
+ if (parse_q922_addr(ndo, p, &dlci, &addr_len, flags, length) == 1){
+ snprintf(buffer, sizeof(buffer), "DLCI %u", dlci);
+ }
+
+ return buffer;
+}
+
+
+/* Frame Relay packet structure, with flags and CRC removed
+
+ +---------------------------+
+ | Q.922 Address* |
+ +-- --+
+ | |
+ +---------------------------+
+ | Control (UI = 0x03) |
+ +---------------------------+
+ | Optional Pad (0x00) |
+ +---------------------------+
+ | NLPID |
+ +---------------------------+
+ | . |
+ | . |
+ | . |
+ | Data |
+ | . |
+ | . |
+ +---------------------------+
+
+ * Q.922 addresses, as presently defined, are two octets and
+ contain a 10-bit DLCI. In some networks Q.922 addresses
+ may optionally be increased to three or four octets.
+*/
+
+static void
+fr_hdr_print(netdissect_options *ndo,
+ int length, u_int addr_len, u_int dlci, uint8_t *flags, uint16_t nlpid)
+{
+ if (ndo->ndo_qflag) {
+ ND_PRINT((ndo, "Q.922, DLCI %u, length %u: ",
+ dlci,
+ length));
+ } else {
+ if (nlpid <= 0xff) /* if its smaller than 256 then its a NLPID */
+ ND_PRINT((ndo, "Q.922, hdr-len %u, DLCI %u, Flags [%s], NLPID %s (0x%02x), length %u: ",
+ addr_len,
+ dlci,
+ bittok2str(fr_header_flag_values, "none", EXTRACT_32BITS(flags)),
+ tok2str(nlpid_values,"unknown", nlpid),
+ nlpid,
+ length));
+ else /* must be an ethertype */
+ ND_PRINT((ndo, "Q.922, hdr-len %u, DLCI %u, Flags [%s], cisco-ethertype %s (0x%04x), length %u: ",
+ addr_len,
+ dlci,
+ bittok2str(fr_header_flag_values, "none", EXTRACT_32BITS(flags)),
+ tok2str(ethertype_values, "unknown", nlpid),
+ nlpid,
+ length));
+ }
+}
+
+u_int
+fr_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ register u_int length = h->len;
+ register u_int caplen = h->caplen;
+
+ ND_TCHECK2(*p, 4); /* minimum frame header length */
+
+ if ((length = fr_print(ndo, p, length)) == 0)
+ return (0);
+ else
+ return length;
+ trunc:
+ ND_PRINT((ndo, "[|fr]"));
+ return caplen;
+}
+
+u_int
+fr_print(netdissect_options *ndo,
+ register const u_char *p, u_int length)
+{
+ int ret;
+ uint16_t extracted_ethertype;
+ u_int dlci;
+ u_int addr_len;
+ uint16_t nlpid;
+ u_int hdr_len;
+ uint8_t flags[4];
+
+ ret = parse_q922_addr(ndo, p, &dlci, &addr_len, flags, length);
+ if (ret == -1)
+ goto trunc;
+ if (ret == 0) {
+ ND_PRINT((ndo, "Q.922, invalid address"));
+ return 0;
+ }
+
+ ND_TCHECK(p[addr_len]);
+ if (length < addr_len + 1)
+ goto trunc;
+
+ if (p[addr_len] != LLC_UI && dlci != 0) {
+ /*
+ * Let's figure out if we have Cisco-style encapsulation,
+ * with an Ethernet type (Cisco HDLC type?) following the
+ * address.
+ */
+ if (!ND_TTEST2(p[addr_len], 2) || length < addr_len + 2) {
+ /* no Ethertype */
+ ND_PRINT((ndo, "UI %02x! ", p[addr_len]));
+ } else {
+ extracted_ethertype = EXTRACT_16BITS(p+addr_len);
+
+ if (ndo->ndo_eflag)
+ fr_hdr_print(ndo, length, addr_len, dlci,
+ flags, extracted_ethertype);
+
+ if (ethertype_print(ndo, extracted_ethertype,
+ p+addr_len+ETHERTYPE_LEN,
+ length-addr_len-ETHERTYPE_LEN,
+ length-addr_len-ETHERTYPE_LEN) == 0)
+ /* ether_type not known, probably it wasn't one */
+ ND_PRINT((ndo, "UI %02x! ", p[addr_len]));
+ else
+ return addr_len + 2;
+ }
+ }
+
+ ND_TCHECK(p[addr_len+1]);
+ if (length < addr_len + 2)
+ goto trunc;
+
+ if (p[addr_len + 1] == 0) {
+ /*
+ * Assume a pad byte after the control (UI) byte.
+ * A pad byte should only be used with 3-byte Q.922.
+ */
+ if (addr_len != 3)
+ ND_PRINT((ndo, "Pad! "));
+ hdr_len = addr_len + 1 /* UI */ + 1 /* pad */ + 1 /* NLPID */;
+ } else {
+ /*
+ * Not a pad byte.
+ * A pad byte should be used with 3-byte Q.922.
+ */
+ if (addr_len == 3)
+ ND_PRINT((ndo, "No pad! "));
+ hdr_len = addr_len + 1 /* UI */ + 1 /* NLPID */;
+ }
+
+ ND_TCHECK(p[hdr_len - 1]);
+ if (length < hdr_len)
+ goto trunc;
+ nlpid = p[hdr_len - 1];
+
+ if (ndo->ndo_eflag)
+ fr_hdr_print(ndo, length, addr_len, dlci, flags, nlpid);
+ p += hdr_len;
+ length -= hdr_len;
+
+ switch (nlpid) {
+ case NLPID_IP:
+ ip_print(ndo, p, length);
+ break;
+
+ case NLPID_IP6:
+ ip6_print(ndo, p, length);
+ break;
+
+ case NLPID_CLNP:
+ case NLPID_ESIS:
+ case NLPID_ISIS:
+ isoclns_print(ndo, p - 1, length + 1, length + 1); /* OSI printers need the NLPID field */
+ break;
+
+ case NLPID_SNAP:
+ if (snap_print(ndo, p, length, length, 0) == 0) {
+ /* ether_type not known, print raw packet */
+ if (!ndo->ndo_eflag)
+ fr_hdr_print(ndo, length + hdr_len, hdr_len,
+ dlci, flags, nlpid);
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p - hdr_len, length + hdr_len);
+ }
+ break;
+
+ case NLPID_Q933:
+ q933_print(ndo, p, length);
+ break;
+
+ case NLPID_MFR:
+ frf15_print(ndo, p, length);
+ break;
+
+ case NLPID_PPP:
+ ppp_print(ndo, p, length);
+ break;
+
+ default:
+ if (!ndo->ndo_eflag)
+ fr_hdr_print(ndo, length + hdr_len, addr_len,
+ dlci, flags, nlpid);
+ if (!ndo->ndo_xflag)
+ ND_DEFAULTPRINT(p, length);
+ }
+
+ return hdr_len;
+
+ trunc:
+ ND_PRINT((ndo, "[|fr]"));
+ return 0;
+
+}
+
+u_int
+mfr_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ register u_int length = h->len;
+ register u_int caplen = h->caplen;
+
+ ND_TCHECK2(*p, 2); /* minimum frame header length */
+
+ if ((length = mfr_print(ndo, p, length)) == 0)
+ return (0);
+ else
+ return length;
+ trunc:
+ ND_PRINT((ndo, "[|mfr]"));
+ return caplen;
+}
+
+
+#define MFR_CTRL_MSG_ADD_LINK 1
+#define MFR_CTRL_MSG_ADD_LINK_ACK 2
+#define MFR_CTRL_MSG_ADD_LINK_REJ 3
+#define MFR_CTRL_MSG_HELLO 4
+#define MFR_CTRL_MSG_HELLO_ACK 5
+#define MFR_CTRL_MSG_REMOVE_LINK 6
+#define MFR_CTRL_MSG_REMOVE_LINK_ACK 7
+
+static const struct tok mfr_ctrl_msg_values[] = {
+ { MFR_CTRL_MSG_ADD_LINK, "Add Link" },
+ { MFR_CTRL_MSG_ADD_LINK_ACK, "Add Link ACK" },
+ { MFR_CTRL_MSG_ADD_LINK_REJ, "Add Link Reject" },
+ { MFR_CTRL_MSG_HELLO, "Hello" },
+ { MFR_CTRL_MSG_HELLO_ACK, "Hello ACK" },
+ { MFR_CTRL_MSG_REMOVE_LINK, "Remove Link" },
+ { MFR_CTRL_MSG_REMOVE_LINK_ACK, "Remove Link ACK" },
+ { 0, NULL }
+};
+
+#define MFR_CTRL_IE_BUNDLE_ID 1
+#define MFR_CTRL_IE_LINK_ID 2
+#define MFR_CTRL_IE_MAGIC_NUM 3
+#define MFR_CTRL_IE_TIMESTAMP 5
+#define MFR_CTRL_IE_VENDOR_EXT 6
+#define MFR_CTRL_IE_CAUSE 7
+
+static const struct tok mfr_ctrl_ie_values[] = {
+ { MFR_CTRL_IE_BUNDLE_ID, "Bundle ID"},
+ { MFR_CTRL_IE_LINK_ID, "Link ID"},
+ { MFR_CTRL_IE_MAGIC_NUM, "Magic Number"},
+ { MFR_CTRL_IE_TIMESTAMP, "Timestamp"},
+ { MFR_CTRL_IE_VENDOR_EXT, "Vendor Extension"},
+ { MFR_CTRL_IE_CAUSE, "Cause"},
+ { 0, NULL }
+};
+
+#define MFR_ID_STRING_MAXLEN 50
+
+struct ie_tlv_header_t {
+ uint8_t ie_type;
+ uint8_t ie_len;
+};
+
+u_int
+mfr_print(netdissect_options *ndo,
+ register const u_char *p, u_int length)
+{
+ u_int tlen,idx,hdr_len = 0;
+ uint16_t sequence_num;
+ uint8_t ie_type,ie_len;
+ const uint8_t *tptr;
+
+
+/*
+ * FRF.16 Link Integrity Control Frame
+ *
+ * 7 6 5 4 3 2 1 0
+ * +----+----+----+----+----+----+----+----+
+ * | B | E | C=1| 0 0 0 0 | EA |
+ * +----+----+----+----+----+----+----+----+
+ * | 0 0 0 0 0 0 0 0 |
+ * +----+----+----+----+----+----+----+----+
+ * | message type |
+ * +----+----+----+----+----+----+----+----+
+ */
+
+ ND_TCHECK2(*p, 4); /* minimum frame header length */
+
+ if ((p[0] & MFR_BEC_MASK) == MFR_CTRL_FRAME && p[1] == 0) {
+ ND_PRINT((ndo, "FRF.16 Control, Flags [%s], %s, length %u",
+ bittok2str(frf_flag_values,"none",(p[0] & MFR_BEC_MASK)),
+ tok2str(mfr_ctrl_msg_values,"Unknown Message (0x%02x)",p[2]),
+ length));
+ tptr = p + 3;
+ tlen = length -3;
+ hdr_len = 3;
+
+ if (!ndo->ndo_vflag)
+ return hdr_len;
+
+ while (tlen>sizeof(struct ie_tlv_header_t)) {
+ ND_TCHECK2(*tptr, sizeof(struct ie_tlv_header_t));
+ ie_type=tptr[0];
+ ie_len=tptr[1];
+
+ ND_PRINT((ndo, "\n\tIE %s (%u), length %u: ",
+ tok2str(mfr_ctrl_ie_values,"Unknown",ie_type),
+ ie_type,
+ ie_len));
+
+ /* infinite loop check */
+ if (ie_type == 0 || ie_len <= sizeof(struct ie_tlv_header_t))
+ return hdr_len;
+
+ ND_TCHECK2(*tptr, ie_len);
+ tptr+=sizeof(struct ie_tlv_header_t);
+ /* tlv len includes header */
+ ie_len-=sizeof(struct ie_tlv_header_t);
+ tlen-=sizeof(struct ie_tlv_header_t);
+
+ switch (ie_type) {
+
+ case MFR_CTRL_IE_MAGIC_NUM:
+ ND_PRINT((ndo, "0x%08x", EXTRACT_32BITS(tptr)));
+ break;
+
+ case MFR_CTRL_IE_BUNDLE_ID: /* same message format */
+ case MFR_CTRL_IE_LINK_ID:
+ for (idx = 0; idx < ie_len && idx < MFR_ID_STRING_MAXLEN; idx++) {
+ if (*(tptr+idx) != 0) /* don't print null termination */
+ safeputchar(ndo, *(tptr + idx));
+ else
+ break;
+ }
+ break;
+
+ case MFR_CTRL_IE_TIMESTAMP:
+ if (ie_len == sizeof(struct timeval)) {
+ ts_print(ndo, (const struct timeval *)tptr);
+ break;
+ }
+ /* fall through and hexdump if no unix timestamp */
+
+ /*
+ * FIXME those are the defined IEs that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+
+ case MFR_CTRL_IE_VENDOR_EXT:
+ case MFR_CTRL_IE_CAUSE:
+
+ default:
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, tptr, "\n\t ", ie_len);
+ break;
+ }
+
+ /* do we want to see a hexdump of the IE ? */
+ if (ndo->ndo_vflag > 1 )
+ print_unknown_data(ndo, tptr, "\n\t ", ie_len);
+
+ tlen-=ie_len;
+ tptr+=ie_len;
+ }
+ return hdr_len;
+ }
+/*
+ * FRF.16 Fragmentation Frame
+ *
+ * 7 6 5 4 3 2 1 0
+ * +----+----+----+----+----+----+----+----+
+ * | B | E | C=0|seq. (high 4 bits) | EA |
+ * +----+----+----+----+----+----+----+----+
+ * | sequence (low 8 bits) |
+ * +----+----+----+----+----+----+----+----+
+ * | DLCI (6 bits) | CR | EA |
+ * +----+----+----+----+----+----+----+----+
+ * | DLCI (4 bits) |FECN|BECN| DE | EA |
+ * +----+----+----+----+----+----+----+----+
+ */
+
+ sequence_num = (p[0]&0x1e)<<7 | p[1];
+ /* whole packet or first fragment ? */
+ if ((p[0] & MFR_BEC_MASK) == MFR_FRAG_FRAME ||
+ (p[0] & MFR_BEC_MASK) == MFR_B_BIT) {
+ ND_PRINT((ndo, "FRF.16 Frag, seq %u, Flags [%s], ",
+ sequence_num,
+ bittok2str(frf_flag_values,"none",(p[0] & MFR_BEC_MASK))));
+ hdr_len = 2;
+ fr_print(ndo, p+hdr_len,length-hdr_len);
+ return hdr_len;
+ }
+
+ /* must be a middle or the last fragment */
+ ND_PRINT((ndo, "FRF.16 Frag, seq %u, Flags [%s]",
+ sequence_num,
+ bittok2str(frf_flag_values,"none",(p[0] & MFR_BEC_MASK))));
+ print_unknown_data(ndo, p, "\n\t", length);
+
+ return hdr_len;
+
+ trunc:
+ ND_PRINT((ndo, "[|mfr]"));
+ return length;
+}
+
+/* an NLPID of 0xb1 indicates a 2-byte
+ * FRF.15 header
+ *
+ * 7 6 5 4 3 2 1 0
+ * +----+----+----+----+----+----+----+----+
+ * ~ Q.922 header ~
+ * +----+----+----+----+----+----+----+----+
+ * | NLPID (8 bits) | NLPID=0xb1
+ * +----+----+----+----+----+----+----+----+
+ * | B | E | C |seq. (high 4 bits) | R |
+ * +----+----+----+----+----+----+----+----+
+ * | sequence (low 8 bits) |
+ * +----+----+----+----+----+----+----+----+
+ */
+
+#define FR_FRF15_FRAGTYPE 0x01
+
+static void
+frf15_print(netdissect_options *ndo,
+ const u_char *p, u_int length)
+{
+ uint16_t sequence_num, flags;
+
+ flags = p[0]&MFR_BEC_MASK;
+ sequence_num = (p[0]&0x1e)<<7 | p[1];
+
+ ND_PRINT((ndo, "FRF.15, seq 0x%03x, Flags [%s],%s Fragmentation, length %u",
+ sequence_num,
+ bittok2str(frf_flag_values,"none",flags),
+ p[0]&FR_FRF15_FRAGTYPE ? "Interface" : "End-to-End",
+ length));
+
+/* TODO:
+ * depending on all permutations of the B, E and C bit
+ * dig as deep as we can - e.g. on the first (B) fragment
+ * there is enough payload to print the IP header
+ * on non (B) fragments it depends if the fragmentation
+ * model is end-to-end or interface based wether we want to print
+ * another Q.922 header
+ */
+
+}
+
+/*
+ * Q.933 decoding portion for framerelay specific.
+ */
+
+/* Q.933 packet format
+ Format of Other Protocols
+ using Q.933 NLPID
+ +-------------------------------+
+ | Q.922 Address |
+ +---------------+---------------+
+ |Control 0x03 | NLPID 0x08 |
+ +---------------+---------------+
+ | L2 Protocol ID |
+ | octet 1 | octet 2 |
+ +-------------------------------+
+ | L3 Protocol ID |
+ | octet 2 | octet 2 |
+ +-------------------------------+
+ | Protocol Data |
+ +-------------------------------+
+ | FCS |
+ +-------------------------------+
+ */
+
+/* L2 (Octet 1)- Call Reference Usually is 0x0 */
+
+/*
+ * L2 (Octet 2)- Message Types definition 1 byte long.
+ */
+/* Call Establish */
+#define MSG_TYPE_ESC_TO_NATIONAL 0x00
+#define MSG_TYPE_ALERT 0x01
+#define MSG_TYPE_CALL_PROCEEDING 0x02
+#define MSG_TYPE_CONNECT 0x07
+#define MSG_TYPE_CONNECT_ACK 0x0F
+#define MSG_TYPE_PROGRESS 0x03
+#define MSG_TYPE_SETUP 0x05
+/* Call Clear */
+#define MSG_TYPE_DISCONNECT 0x45
+#define MSG_TYPE_RELEASE 0x4D
+#define MSG_TYPE_RELEASE_COMPLETE 0x5A
+#define MSG_TYPE_RESTART 0x46
+#define MSG_TYPE_RESTART_ACK 0x4E
+/* Status */
+#define MSG_TYPE_STATUS 0x7D
+#define MSG_TYPE_STATUS_ENQ 0x75
+
+static const struct tok fr_q933_msg_values[] = {
+ { MSG_TYPE_ESC_TO_NATIONAL, "ESC to National" },
+ { MSG_TYPE_ALERT, "Alert" },
+ { MSG_TYPE_CALL_PROCEEDING, "Call proceeding" },
+ { MSG_TYPE_CONNECT, "Connect" },
+ { MSG_TYPE_CONNECT_ACK, "Connect ACK" },
+ { MSG_TYPE_PROGRESS, "Progress" },
+ { MSG_TYPE_SETUP, "Setup" },
+ { MSG_TYPE_DISCONNECT, "Disconnect" },
+ { MSG_TYPE_RELEASE, "Release" },
+ { MSG_TYPE_RELEASE_COMPLETE, "Release Complete" },
+ { MSG_TYPE_RESTART, "Restart" },
+ { MSG_TYPE_RESTART_ACK, "Restart ACK" },
+ { MSG_TYPE_STATUS, "Status Reply" },
+ { MSG_TYPE_STATUS_ENQ, "Status Enquiry" },
+ { 0, NULL }
+};
+
+#define MSG_ANSI_LOCKING_SHIFT 0x95
+
+#define FR_LMI_ANSI_REPORT_TYPE_IE 0x01
+#define FR_LMI_ANSI_LINK_VERIFY_IE_91 0x19 /* details? */
+#define FR_LMI_ANSI_LINK_VERIFY_IE 0x03
+#define FR_LMI_ANSI_PVC_STATUS_IE 0x07
+
+#define FR_LMI_CCITT_REPORT_TYPE_IE 0x51
+#define FR_LMI_CCITT_LINK_VERIFY_IE 0x53
+#define FR_LMI_CCITT_PVC_STATUS_IE 0x57
+
+static const struct tok fr_q933_ie_values_codeset5[] = {
+ { FR_LMI_ANSI_REPORT_TYPE_IE, "ANSI Report Type" },
+ { FR_LMI_ANSI_LINK_VERIFY_IE_91, "ANSI Link Verify" },
+ { FR_LMI_ANSI_LINK_VERIFY_IE, "ANSI Link Verify" },
+ { FR_LMI_ANSI_PVC_STATUS_IE, "ANSI PVC Status" },
+ { FR_LMI_CCITT_REPORT_TYPE_IE, "CCITT Report Type" },
+ { FR_LMI_CCITT_LINK_VERIFY_IE, "CCITT Link Verify" },
+ { FR_LMI_CCITT_PVC_STATUS_IE, "CCITT PVC Status" },
+ { 0, NULL }
+};
+
+#define FR_LMI_REPORT_TYPE_IE_FULL_STATUS 0
+#define FR_LMI_REPORT_TYPE_IE_LINK_VERIFY 1
+#define FR_LMI_REPORT_TYPE_IE_ASYNC_PVC 2
+
+static const struct tok fr_lmi_report_type_ie_values[] = {
+ { FR_LMI_REPORT_TYPE_IE_FULL_STATUS, "Full Status" },
+ { FR_LMI_REPORT_TYPE_IE_LINK_VERIFY, "Link verify" },
+ { FR_LMI_REPORT_TYPE_IE_ASYNC_PVC, "Async PVC Status" },
+ { 0, NULL }
+};
+
+/* array of 16 codepages - currently we only support codepage 1,5 */
+static const struct tok *fr_q933_ie_codesets[] = {
+ NULL,
+ fr_q933_ie_values_codeset5,
+ NULL,
+ NULL,
+ NULL,
+ fr_q933_ie_values_codeset5,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+static int fr_q933_print_ie_codeset5(netdissect_options *ndo,
+ const struct ie_tlv_header_t *ie_p, const u_char *p);
+
+typedef int (*codeset_pr_func_t)(netdissect_options *,
+ const struct ie_tlv_header_t *ie_p, const u_char *p);
+
+/* array of 16 codepages - currently we only support codepage 1,5 */
+static const codeset_pr_func_t fr_q933_print_ie_codeset[] = {
+ NULL,
+ fr_q933_print_ie_codeset5,
+ NULL,
+ NULL,
+ NULL,
+ fr_q933_print_ie_codeset5,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+void
+q933_print(netdissect_options *ndo,
+ const u_char *p, u_int length)
+{
+ const u_char *ptemp = p;
+ struct ie_tlv_header_t *ie_p;
+ int olen;
+ int is_ansi = 0;
+ u_int codeset;
+ u_int ie_is_known = 0;
+
+ if (length < 9) { /* shortest: Q.933a LINK VERIFY */
+ ND_PRINT((ndo, "[|q.933]"));
+ return;
+ }
+
+ codeset = p[2]&0x0f; /* extract the codeset */
+
+ if (p[2] == MSG_ANSI_LOCKING_SHIFT) {
+ is_ansi = 1;
+ }
+
+ ND_PRINT((ndo, "%s", ndo->ndo_eflag ? "" : "Q.933, "));
+
+ /* printing out header part */
+ ND_PRINT((ndo, "%s, codeset %u", is_ansi ? "ANSI" : "CCITT", codeset));
+
+ if (p[0]) {
+ ND_PRINT((ndo, ", Call Ref: 0x%02x", p[0]));
+ }
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, ", %s (0x%02x), length %u",
+ tok2str(fr_q933_msg_values,
+ "unknown message", p[1]),
+ p[1],
+ length));
+ } else {
+ ND_PRINT((ndo, ", %s",
+ tok2str(fr_q933_msg_values,
+ "unknown message 0x%02x", p[1])));
+ }
+
+ olen = length; /* preserve the original length for non verbose mode */
+
+ if (length < (u_int)(2 - is_ansi)) {
+ ND_PRINT((ndo, "[|q.933]"));
+ return;
+ }
+ length -= 2 + is_ansi;
+ ptemp += 2 + is_ansi;
+
+ /* Loop through the rest of IE */
+ while (length > sizeof(struct ie_tlv_header_t)) {
+ ie_p = (struct ie_tlv_header_t *)ptemp;
+ if (length < sizeof(struct ie_tlv_header_t) ||
+ length < sizeof(struct ie_tlv_header_t) + ie_p->ie_len) {
+ if (ndo->ndo_vflag) { /* not bark if there is just a trailer */
+ ND_PRINT((ndo, "\n[|q.933]"));
+ } else {
+ ND_PRINT((ndo, ", length %u", olen));
+ }
+ return;
+ }
+
+ /* lets do the full IE parsing only in verbose mode
+ * however some IEs (DLCI Status, Link Verify)
+ * are also interestting in non-verbose mode */
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "\n\t%s IE (0x%02x), length %u: ",
+ tok2str(fr_q933_ie_codesets[codeset],
+ "unknown", ie_p->ie_type),
+ ie_p->ie_type,
+ ie_p->ie_len));
+ }
+
+ /* sanity check */
+ if (ie_p->ie_type == 0 || ie_p->ie_len == 0) {
+ return;
+ }
+
+ if (fr_q933_print_ie_codeset[codeset] != NULL) {
+ ie_is_known = fr_q933_print_ie_codeset[codeset](ndo, ie_p, ptemp);
+ }
+
+ if (ndo->ndo_vflag >= 1 && !ie_is_known) {
+ print_unknown_data(ndo, ptemp+2, "\n\t", ie_p->ie_len);
+ }
+
+ /* do we want to see a hexdump of the IE ? */
+ if (ndo->ndo_vflag> 1 && ie_is_known) {
+ print_unknown_data(ndo, ptemp+2, "\n\t ", ie_p->ie_len);
+ }
+
+ length = length - ie_p->ie_len - 2;
+ ptemp = ptemp + ie_p->ie_len + 2;
+ }
+ if (!ndo->ndo_vflag) {
+ ND_PRINT((ndo, ", length %u", olen));
+ }
+}
+
+static int
+fr_q933_print_ie_codeset5(netdissect_options *ndo,
+ const struct ie_tlv_header_t *ie_p, const u_char *p)
+{
+ u_int dlci;
+
+ switch (ie_p->ie_type) {
+
+ case FR_LMI_ANSI_REPORT_TYPE_IE: /* fall through */
+ case FR_LMI_CCITT_REPORT_TYPE_IE:
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "%s (%u)",
+ tok2str(fr_lmi_report_type_ie_values,"unknown",p[2]),
+ p[2]));
+ }
+ return 1;
+
+ case FR_LMI_ANSI_LINK_VERIFY_IE: /* fall through */
+ case FR_LMI_CCITT_LINK_VERIFY_IE:
+ case FR_LMI_ANSI_LINK_VERIFY_IE_91:
+ if (!ndo->ndo_vflag) {
+ ND_PRINT((ndo, ", "));
+ }
+ ND_PRINT((ndo, "TX Seq: %3d, RX Seq: %3d", p[2], p[3]));
+ return 1;
+
+ case FR_LMI_ANSI_PVC_STATUS_IE: /* fall through */
+ case FR_LMI_CCITT_PVC_STATUS_IE:
+ if (!ndo->ndo_vflag) {
+ ND_PRINT((ndo, ", "));
+ }
+ /* now parse the DLCI information element. */
+ if ((ie_p->ie_len < 3) ||
+ (p[2] & 0x80) ||
+ ((ie_p->ie_len == 3) && !(p[3] & 0x80)) ||
+ ((ie_p->ie_len == 4) && ((p[3] & 0x80) || !(p[4] & 0x80))) ||
+ ((ie_p->ie_len == 5) && ((p[3] & 0x80) || (p[4] & 0x80) ||
+ !(p[5] & 0x80))) ||
+ (ie_p->ie_len > 5) ||
+ !(p[ie_p->ie_len + 1] & 0x80)) {
+ ND_PRINT((ndo, "Invalid DLCI IE"));
+ }
+
+ dlci = ((p[2] & 0x3F) << 4) | ((p[3] & 0x78) >> 3);
+ if (ie_p->ie_len == 4) {
+ dlci = (dlci << 6) | ((p[4] & 0x7E) >> 1);
+ }
+ else if (ie_p->ie_len == 5) {
+ dlci = (dlci << 13) | (p[4] & 0x7F) | ((p[5] & 0x7E) >> 1);
+ }
+
+ ND_PRINT((ndo, "DLCI %u: status %s%s", dlci,
+ p[ie_p->ie_len + 1] & 0x8 ? "New, " : "",
+ p[ie_p->ie_len + 1] & 0x2 ? "Active" : "Inactive"));
+ return 1;
+ }
+
+ return 0;
+}
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-frag6.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef INET6
+
+#include <tcpdump-stdinc.h>
+
+#include "ip6.h"
+#include "interface.h"
+#include "extract.h"
+
+int
+frag6_print(netdissect_options *ndo, register const u_char *bp, register const u_char *bp2)
+{
+ register const struct ip6_frag *dp;
+ register const struct ip6_hdr *ip6;
+
+ dp = (const struct ip6_frag *)bp;
+ ip6 = (const struct ip6_hdr *)bp2;
+
+ ND_TCHECK(dp->ip6f_offlg);
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "frag (0x%08x:%d|%ld)",
+ EXTRACT_32BITS(&dp->ip6f_ident),
+ EXTRACT_16BITS(&dp->ip6f_offlg) & IP6F_OFF_MASK,
+ sizeof(struct ip6_hdr) + EXTRACT_16BITS(&ip6->ip6_plen) -
+ (long)(bp - bp2) - sizeof(struct ip6_frag)));
+ } else {
+ ND_PRINT((ndo, "frag (%d|%ld)",
+ EXTRACT_16BITS(&dp->ip6f_offlg) & IP6F_OFF_MASK,
+ sizeof(struct ip6_hdr) + EXTRACT_16BITS(&ip6->ip6_plen) -
+ (long)(bp - bp2) - sizeof(struct ip6_frag)));
+ }
+
+ /* it is meaningless to decode non-first fragment */
+ if ((EXTRACT_16BITS(&dp->ip6f_offlg) & IP6F_OFF_MASK) != 0)
+ return -1;
+ else
+ {
+ ND_PRINT((ndo, " "));
+ return sizeof(struct ip6_frag);
+ }
+trunc:
+ ND_PRINT((ndo, "[|frag]"));
+ return -1;
+}
+#endif /* INET6 */
--- /dev/null
+/*
+ * 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.
+ */
+
+#ifndef lint
+static const char rcsid[] _U_ =
+ "@(#) Header";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "netdissect.h"
+#include "extract.h"
+
+void
+ftp_print(netdissect_options *ndo, const u_char *pptr, u_int len)
+{
+ txtproto_print(ndo, pptr, len, "ftp", NULL, 0);
+}
--- /dev/null
+/*
+ * Copyright (c) 2014 VMware, Inc. All Rights Reserved.
+ *
+ * Jesse Gross <jesse@nicira.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, 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.
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "ethertype.h"
+
+/*
+ * Geneve header, draft-gross-geneve-02
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |Ver| Opt Len |O|C| Rsvd. | Protocol Type |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Virtual Network Identifier (VNI) | Reserved |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Variable Length Options |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * Options:
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Option Class | Type |R|R|R| Length |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Variable Option Data |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define VER_SHIFT 6
+#define HDR_OPTS_LEN_MASK 0x3F
+
+#define FLAG_OAM (1 << 7)
+#define FLAG_CRITICAL (1 << 6)
+#define FLAG_R1 (1 << 5)
+#define FLAG_R2 (1 << 4)
+#define FLAG_R3 (1 << 3)
+#define FLAG_R4 (1 << 2)
+#define FLAG_R5 (1 << 1)
+#define FLAG_R6 (1 << 0)
+
+#define OPT_TYPE_CRITICAL (1 << 7)
+#define OPT_LEN_MASK 0x1F
+
+static const struct tok geneve_flag_values[] = {
+ { FLAG_OAM, "O" },
+ { FLAG_CRITICAL, "C" },
+ { FLAG_R1, "R1" },
+ { FLAG_R2, "R2" },
+ { FLAG_R3, "R3" },
+ { FLAG_R4, "R4" },
+ { FLAG_R5, "R5" },
+ { FLAG_R6, "R6" },
+ { 0, NULL }
+};
+
+static const char *
+format_opt_class(uint16_t opt_class)
+{
+ if (opt_class <= 0xff)
+ return "Standard";
+ else if (opt_class == 0xffff)
+ return "Experimental";
+ else
+ return "Unknown";
+}
+
+static void
+geneve_opts_print(netdissect_options *ndo, const u_char *bp, u_int len)
+{
+ const char *sep = "";
+
+ while (len > 0) {
+ uint16_t opt_class;
+ uint8_t opt_type;
+ uint8_t opt_len;
+
+ ND_PRINT((ndo, "%s", sep));
+ sep = ", ";
+
+ opt_class = EXTRACT_16BITS(bp);
+ opt_type = *(bp + 2);
+ opt_len = 4 + ((*(bp + 3) & OPT_LEN_MASK) * 4);
+
+ ND_PRINT((ndo, "class %s (0x%x) type 0x%x%s len %u",
+ format_opt_class(opt_class), opt_class, opt_type,
+ opt_type & OPT_TYPE_CRITICAL ? "(C)" : "", opt_len));
+
+ if (opt_len > len) {
+ ND_PRINT((ndo, " [bad length]"));
+ return;
+ }
+
+ if (ndo->ndo_vflag > 1 && opt_len > 4) {
+ uint32_t *print_data = (uint32_t *)(bp + 4);
+ int i;
+
+ ND_PRINT((ndo, " data"));
+
+ for (i = 4; i < opt_len; i += 4) {
+ ND_PRINT((ndo, " %08x", EXTRACT_32BITS(print_data)));
+ print_data++;
+ }
+ }
+
+ bp += opt_len;
+ len -= opt_len;
+ }
+}
+
+void
+geneve_print(netdissect_options *ndo, const u_char *bp, u_int len)
+{
+ uint8_t ver_opt;
+ uint version;
+ uint8_t flags;
+ uint16_t prot;
+ uint32_t vni;
+ uint8_t reserved;
+ u_int opts_len;
+
+ ND_PRINT((ndo, "Geneve"));
+
+ ND_TCHECK2(*bp, 8);
+
+ ver_opt = *bp;
+ bp += 1;
+ len -= 1;
+
+ version = ver_opt >> VER_SHIFT;
+ if (version != 0) {
+ ND_PRINT((ndo, " ERROR: unknown-version %u", version));
+ return;
+ }
+
+ flags = *bp;
+ bp += 1;
+ len -= 1;
+
+ prot = EXTRACT_16BITS(bp);
+ bp += 2;
+ len -= 2;
+
+ vni = EXTRACT_24BITS(bp);
+ bp += 3;
+ len -= 3;
+
+ reserved = *bp;
+ bp += 1;
+ len -= 1;
+
+ ND_PRINT((ndo, ", Flags [%s]",
+ bittok2str_nosep(geneve_flag_values, "none", flags)));
+ ND_PRINT((ndo, ", vni 0x%x", vni));
+
+ if (reserved)
+ ND_PRINT((ndo, ", rsvd 0x%x", reserved));
+
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, ", proto %s (0x%04x)",
+ tok2str(ethertype_values, "unknown", prot), prot));
+
+ opts_len = (ver_opt & HDR_OPTS_LEN_MASK) * 4;
+
+ if (len < opts_len) {
+ ND_PRINT((ndo, " truncated-geneve - %u bytes missing",
+ len - opts_len));
+ return;
+ }
+
+ ND_TCHECK2(*bp, opts_len);
+
+ if (opts_len > 0) {
+ ND_PRINT((ndo, ", options ["));
+
+ if (ndo->ndo_vflag)
+ geneve_opts_print(ndo, bp, opts_len);
+ else
+ ND_PRINT((ndo, "%u bytes", opts_len));
+
+ ND_PRINT((ndo, "]"));
+ }
+
+ bp += opts_len;
+ len -= opts_len;
+
+ if (ndo->ndo_vflag < 1)
+ ND_PRINT((ndo, ": "));
+ else
+ ND_PRINT((ndo, "\n\t"));
+
+ if (ethertype_print(ndo, prot, bp, len, len) == 0) {
+ if (prot == ETHERTYPE_TEB)
+ ether_print(ndo, bp, len, len, NULL, NULL);
+ else
+ ND_PRINT((ndo, "geneve-proto-0x%x", prot));
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|geneve]"));
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 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.
+ *
+ * Original code by Ola Martin Lykkja (ola.lykkja@q-free.com)
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+
+/*
+ ETSI TS 102 636-5-1 V1.1.1 (2011-02)
+ Intelligent Transport Systems (ITS); Vehicular Communications; GeoNetworking;
+ Part 5: Transport Protocols; Sub-part 1: Basic Transport Protocol
+
+ ETSI TS 102 636-4-1 V1.1.1 (2011-06)
+ Intelligent Transport Systems (ITS); Vehicular communications; GeoNetworking;
+ Part 4: Geographical addressing and forwarding for point-to-point and point-to-multipoint communications;
+ Sub-part 1: Media-Independent Functionality
+*/
+
+#define GEONET_ADDR_LEN 8
+
+static const struct tok msg_type_values[] = {
+ { 0, "CAM" },
+ { 1, "DENM" },
+ { 101, "TPEGM" },
+ { 102, "TSPDM" },
+ { 103, "VPM" },
+ { 104, "SRM" },
+ { 105, "SLAM" },
+ { 106, "ecoCAM" },
+ { 107, "ITM" },
+ { 150, "SA" },
+ { 0, NULL }
+};
+
+static void
+print_btp_body(netdissect_options *ndo,
+ const u_char *bp)
+{
+ int version;
+ int msg_type;
+ const char *msg_type_str;
+
+ /* Assuming ItsDpuHeader */
+ version = bp[0];
+ msg_type = bp[1];
+ msg_type_str = tok2str(msg_type_values, "unknown (%u)", msg_type);
+
+ ND_PRINT((ndo, "; ItsPduHeader v:%d t:%d-%s", version, msg_type, msg_type_str));
+}
+
+static void
+print_btp(netdissect_options *ndo,
+ const u_char *bp)
+{
+ uint16_t dest = EXTRACT_16BITS(bp+0);
+ uint16_t src = EXTRACT_16BITS(bp+2);
+ ND_PRINT((ndo, "; BTP Dst:%u Src:%u", dest, src));
+}
+
+static int
+print_long_pos_vector(netdissect_options *ndo,
+ const u_char *bp)
+{
+ uint32_t lat, lon;
+
+ ND_PRINT((ndo, "GN_ADDR:%s ", linkaddr_string (ndo, bp, 0, GEONET_ADDR_LEN)));
+
+ if (!ND_TTEST2(*(bp+12), 8))
+ return (-1);
+ lat = EXTRACT_32BITS(bp+12);
+ ND_PRINT((ndo, "lat:%d ", lat));
+ lon = EXTRACT_32BITS(bp+16);
+ ND_PRINT((ndo, "lon:%d", lon));
+ return (0);
+}
+
+
+/*
+ * This is the top level routine of the printer. 'p' points
+ * to the geonet header of the packet.
+ */
+void
+geonet_print(netdissect_options *ndo, const u_char *eth, const u_char *bp, u_int length)
+{
+ int version;
+ int next_hdr;
+ int hdr_type;
+ int hdr_subtype;
+ uint16_t payload_length;
+ int hop_limit;
+ const char *next_hdr_txt = "Unknown";
+ const char *hdr_type_txt = "Unknown";
+ int hdr_size = -1;
+
+ ND_PRINT((ndo, "GeoNet src:%s; ", etheraddr_string(ndo, eth+6)));
+
+ /* Process Common Header */
+ if (length < 36)
+ goto malformed;
+
+ ND_TCHECK2(*bp, 7);
+ version = bp[0] >> 4;
+ next_hdr = bp[0] & 0x0f;
+ hdr_type = bp[1] >> 4;
+ hdr_subtype = bp[1] & 0x0f;
+ payload_length = EXTRACT_16BITS(bp+4);
+ hop_limit = bp[7];
+
+ switch (next_hdr) {
+ case 0: next_hdr_txt = "Any"; break;
+ case 1: next_hdr_txt = "BTP-A"; break;
+ case 2: next_hdr_txt = "BTP-B"; break;
+ case 3: next_hdr_txt = "IPv6"; break;
+ }
+
+ switch (hdr_type) {
+ case 0: hdr_type_txt = "Any"; break;
+ case 1: hdr_type_txt = "Beacon"; break;
+ case 2: hdr_type_txt = "GeoUnicast"; break;
+ case 3: switch (hdr_subtype) {
+ case 0: hdr_type_txt = "GeoAnycastCircle"; break;
+ case 1: hdr_type_txt = "GeoAnycastRect"; break;
+ case 2: hdr_type_txt = "GeoAnycastElipse"; break;
+ }
+ break;
+ case 4: switch (hdr_subtype) {
+ case 0: hdr_type_txt = "GeoBroadcastCircle"; break;
+ case 1: hdr_type_txt = "GeoBroadcastRect"; break;
+ case 2: hdr_type_txt = "GeoBroadcastElipse"; break;
+ }
+ break;
+ case 5: switch (hdr_subtype) {
+ case 0: hdr_type_txt = "TopoScopeBcast-SH"; break;
+ case 1: hdr_type_txt = "TopoScopeBcast-MH"; break;
+ }
+ break;
+ case 6: switch (hdr_subtype) {
+ case 0: hdr_type_txt = "LocService-Request"; break;
+ case 1: hdr_type_txt = "LocService-Reply"; break;
+ }
+ break;
+ }
+
+ ND_PRINT((ndo, "v:%d ", version));
+ ND_PRINT((ndo, "NH:%d-%s ", next_hdr, next_hdr_txt));
+ ND_PRINT((ndo, "HT:%d-%d-%s ", hdr_type, hdr_subtype, hdr_type_txt));
+ ND_PRINT((ndo, "HopLim:%d ", hop_limit));
+ ND_PRINT((ndo, "Payload:%d ", payload_length));
+ if (print_long_pos_vector(ndo, bp + 8) == -1)
+ goto trunc;
+
+ /* Skip Common Header */
+ length -= 36;
+ bp += 36;
+
+ /* Process Extended Headers */
+ switch (hdr_type) {
+ case 0: /* Any */
+ hdr_size = 0;
+ break;
+ case 1: /* Beacon */
+ hdr_size = 0;
+ break;
+ case 2: /* GeoUnicast */
+ break;
+ case 3: switch (hdr_subtype) {
+ case 0: /* GeoAnycastCircle */
+ break;
+ case 1: /* GeoAnycastRect */
+ break;
+ case 2: /* GeoAnycastElipse */
+ break;
+ }
+ break;
+ case 4: switch (hdr_subtype) {
+ case 0: /* GeoBroadcastCircle */
+ break;
+ case 1: /* GeoBroadcastRect */
+ break;
+ case 2: /* GeoBroadcastElipse */
+ break;
+ }
+ break;
+ case 5: switch (hdr_subtype) {
+ case 0: /* TopoScopeBcast-SH */
+ hdr_size = 0;
+ break;
+ case 1: /* TopoScopeBcast-MH */
+ hdr_size = 68 - 36;
+ break;
+ }
+ break;
+ case 6: switch (hdr_subtype) {
+ case 0: /* LocService-Request */
+ break;
+ case 1: /* LocService-Reply */
+ break;
+ }
+ break;
+ }
+
+ /* Skip Extended headers */
+ if (hdr_size >= 0) {
+ if (length < (u_int)hdr_size)
+ goto malformed;
+ ND_TCHECK2(*bp, hdr_size);
+ length -= hdr_size;
+ bp += hdr_size;
+ switch (next_hdr) {
+ case 0: /* Any */
+ break;
+ case 1:
+ case 2: /* BTP A/B */
+ if (length < 4)
+ goto malformed;
+ ND_TCHECK2(*bp, 4);
+ print_btp(ndo, bp);
+ length -= 4;
+ bp += 4;
+ if (length >= 2) {
+ /*
+ * XXX - did print_btp_body()
+ * return if length < 2
+ * because this is optional,
+ * or was that just not
+ * reporting genuine errors?
+ */
+ ND_TCHECK2(*bp, 2);
+ print_btp_body(ndo, bp);
+ }
+ break;
+ case 3: /* IPv6 */
+ break;
+ }
+ }
+
+ /* Print user data part */
+ if (ndo->ndo_vflag)
+ ND_DEFAULTPRINT(bp, length);
+ return;
+
+malformed:
+ ND_PRINT((ndo, " Malformed (small) "));
+ /* XXX - print the remaining data as hex? */
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|geonet]"));
+}
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/* $OpenBSD: print-gre.c,v 1.6 2002/10/30 03:04:04 fgsch Exp $ */
+
+/*
+ * Copyright (c) 2002 Jason L. Wright (jason@thought.net)
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Jason L. Wright
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+/*
+ * tcpdump filter for GRE - Generic Routing Encapsulation
+ * RFC1701 (GRE), RFC1702 (GRE IPv4), and RFC2637 (Enhanced GRE)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-gre.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "ethertype.h"
+
+static const char tstr[] = "[|gre]";
+
+#define GRE_CP 0x8000 /* checksum present */
+#define GRE_RP 0x4000 /* routing present */
+#define GRE_KP 0x2000 /* key present */
+#define GRE_SP 0x1000 /* sequence# present */
+#define GRE_sP 0x0800 /* source routing */
+#define GRE_RECRS 0x0700 /* recursion count */
+#define GRE_AP 0x0080 /* acknowledgment# present */
+
+static const struct tok gre_flag_values[] = {
+ { GRE_CP, "checksum present"},
+ { GRE_RP, "routing present"},
+ { GRE_KP, "key present"},
+ { GRE_SP, "sequence# present"},
+ { GRE_sP, "source routing present"},
+ { GRE_RECRS, "recursion count"},
+ { GRE_AP, "ack present"},
+ { 0, NULL }
+};
+
+#define GRE_VERS_MASK 0x0007 /* protocol version */
+
+/* source route entry types */
+#define GRESRE_IP 0x0800 /* IP */
+#define GRESRE_ASN 0xfffe /* ASN */
+
+static void gre_print_0(netdissect_options *, const u_char *, u_int);
+static void gre_print_1(netdissect_options *, const u_char *, u_int);
+static void gre_sre_print(netdissect_options *, uint16_t, uint8_t, uint8_t, const u_char *, u_int);
+static void gre_sre_ip_print(netdissect_options *, uint8_t, uint8_t, const u_char *, u_int);
+static void gre_sre_asn_print(netdissect_options *, uint8_t, uint8_t, const u_char *, u_int);
+
+void
+gre_print(netdissect_options *ndo, const u_char *bp, u_int length)
+{
+ u_int len = length, vers;
+
+ if (len < 2) {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+ vers = EXTRACT_16BITS(bp) & GRE_VERS_MASK;
+ ND_PRINT((ndo, "GREv%u",vers));
+
+ switch(vers) {
+ case 0:
+ gre_print_0(ndo, bp, len);
+ break;
+ case 1:
+ gre_print_1(ndo, bp, len);
+ break;
+ default:
+ ND_PRINT((ndo, " ERROR: unknown-version"));
+ break;
+ }
+}
+
+static void
+gre_print_0(netdissect_options *ndo, const u_char *bp, u_int length)
+{
+ u_int len = length;
+ uint16_t flags, prot;
+
+ flags = EXTRACT_16BITS(bp);
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, ", Flags [%s]",
+ bittok2str(gre_flag_values,"none",flags)));
+
+ len -= 2;
+ bp += 2;
+
+ if (len < 2)
+ goto trunc;
+ prot = EXTRACT_16BITS(bp);
+ len -= 2;
+ bp += 2;
+
+ if ((flags & GRE_CP) | (flags & GRE_RP)) {
+ if (len < 2)
+ goto trunc;
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, ", sum 0x%x", EXTRACT_16BITS(bp)));
+ bp += 2;
+ len -= 2;
+
+ if (len < 2)
+ goto trunc;
+ ND_PRINT((ndo, ", off 0x%x", EXTRACT_16BITS(bp)));
+ bp += 2;
+ len -= 2;
+ }
+
+ if (flags & GRE_KP) {
+ if (len < 4)
+ goto trunc;
+ ND_PRINT((ndo, ", key=0x%x", EXTRACT_32BITS(bp)));
+ bp += 4;
+ len -= 4;
+ }
+
+ if (flags & GRE_SP) {
+ if (len < 4)
+ goto trunc;
+ ND_PRINT((ndo, ", seq %u", EXTRACT_32BITS(bp)));
+ bp += 4;
+ len -= 4;
+ }
+
+ if (flags & GRE_RP) {
+ for (;;) {
+ uint16_t af;
+ uint8_t sreoff;
+ uint8_t srelen;
+
+ if (len < 4)
+ goto trunc;
+ af = EXTRACT_16BITS(bp);
+ sreoff = *(bp + 2);
+ srelen = *(bp + 3);
+ bp += 4;
+ len -= 4;
+
+ if (af == 0 && srelen == 0)
+ break;
+
+ gre_sre_print(ndo, af, sreoff, srelen, bp, len);
+
+ if (len < srelen)
+ goto trunc;
+ bp += srelen;
+ len -= srelen;
+ }
+ }
+
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, ", proto %s (0x%04x)",
+ tok2str(ethertype_values,"unknown",prot),
+ prot));
+
+ ND_PRINT((ndo, ", length %u",length));
+
+ if (ndo->ndo_vflag < 1)
+ ND_PRINT((ndo, ": ")); /* put in a colon as protocol demarc */
+ else
+ ND_PRINT((ndo, "\n\t")); /* if verbose go multiline */
+
+ switch (prot) {
+ case ETHERTYPE_IP:
+ ip_print(ndo, bp, len);
+ break;
+ case ETHERTYPE_IPV6:
+ ip6_print(ndo, bp, len);
+ break;
+ case ETHERTYPE_MPLS:
+ mpls_print(ndo, bp, len);
+ break;
+ case ETHERTYPE_IPX:
+ ipx_print(ndo, bp, len);
+ break;
+ case ETHERTYPE_ATALK:
+ atalk_print(ndo, bp, len);
+ break;
+ case ETHERTYPE_GRE_ISO:
+ isoclns_print(ndo, bp, len, len);
+ break;
+ case ETHERTYPE_TEB:
+ ether_print(ndo, bp, len, len, NULL, NULL);
+ break;
+ default:
+ ND_PRINT((ndo, "gre-proto-0x%x", prot));
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+gre_print_1(netdissect_options *ndo, const u_char *bp, u_int length)
+{
+ u_int len = length;
+ uint16_t flags, prot;
+
+ flags = EXTRACT_16BITS(bp);
+ len -= 2;
+ bp += 2;
+
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, ", Flags [%s]",
+ bittok2str(gre_flag_values,"none",flags)));
+
+ if (len < 2)
+ goto trunc;
+ prot = EXTRACT_16BITS(bp);
+ len -= 2;
+ bp += 2;
+
+
+ if (flags & GRE_KP) {
+ uint32_t k;
+
+ if (len < 4)
+ goto trunc;
+ k = EXTRACT_32BITS(bp);
+ ND_PRINT((ndo, ", call %d", k & 0xffff));
+ len -= 4;
+ bp += 4;
+ }
+
+ if (flags & GRE_SP) {
+ if (len < 4)
+ goto trunc;
+ ND_PRINT((ndo, ", seq %u", EXTRACT_32BITS(bp)));
+ bp += 4;
+ len -= 4;
+ }
+
+ if (flags & GRE_AP) {
+ if (len < 4)
+ goto trunc;
+ ND_PRINT((ndo, ", ack %u", EXTRACT_32BITS(bp)));
+ bp += 4;
+ len -= 4;
+ }
+
+ if ((flags & GRE_SP) == 0)
+ ND_PRINT((ndo, ", no-payload"));
+
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, ", proto %s (0x%04x)",
+ tok2str(ethertype_values,"unknown",prot),
+ prot));
+
+ ND_PRINT((ndo, ", length %u",length));
+
+ if ((flags & GRE_SP) == 0)
+ return;
+
+ if (ndo->ndo_vflag < 1)
+ ND_PRINT((ndo, ": ")); /* put in a colon as protocol demarc */
+ else
+ ND_PRINT((ndo, "\n\t")); /* if verbose go multiline */
+
+ switch (prot) {
+ case ETHERTYPE_PPP:
+ ppp_print(ndo, bp, len);
+ break;
+ default:
+ ND_PRINT((ndo, "gre-proto-0x%x", prot));
+ break;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+gre_sre_print(netdissect_options *ndo, uint16_t af, uint8_t sreoff,
+ uint8_t srelen, const u_char *bp, u_int len)
+{
+ switch (af) {
+ case GRESRE_IP:
+ ND_PRINT((ndo, ", (rtaf=ip"));
+ gre_sre_ip_print(ndo, sreoff, srelen, bp, len);
+ ND_PRINT((ndo, ") "));
+ break;
+ case GRESRE_ASN:
+ ND_PRINT((ndo, ", (rtaf=asn"));
+ gre_sre_asn_print(ndo, sreoff, srelen, bp, len);
+ ND_PRINT((ndo, ") "));
+ break;
+ default:
+ ND_PRINT((ndo, ", (rtaf=0x%x) ", af));
+ }
+}
+
+static void
+gre_sre_ip_print(netdissect_options *ndo, uint8_t sreoff, uint8_t srelen,
+ const u_char *bp, u_int len)
+{
+ struct in_addr a;
+ const u_char *up = bp;
+
+ if (sreoff & 3) {
+ ND_PRINT((ndo, ", badoffset=%u", sreoff));
+ return;
+ }
+ if (srelen & 3) {
+ ND_PRINT((ndo, ", badlength=%u", srelen));
+ return;
+ }
+ if (sreoff >= srelen) {
+ ND_PRINT((ndo, ", badoff/len=%u/%u", sreoff, srelen));
+ return;
+ }
+
+ for (;;) {
+ if (len < 4 || srelen == 0)
+ return;
+
+ memcpy(&a, bp, sizeof(a));
+ ND_PRINT((ndo, " %s%s",
+ ((bp - up) == sreoff) ? "*" : "",
+ inet_ntoa(a)));
+
+ bp += 4;
+ len -= 4;
+ srelen -= 4;
+ }
+}
+
+static void
+gre_sre_asn_print(netdissect_options *ndo, uint8_t sreoff, uint8_t srelen,
+ const u_char *bp, u_int len)
+{
+ const u_char *up = bp;
+
+ if (sreoff & 1) {
+ ND_PRINT((ndo, ", badoffset=%u", sreoff));
+ return;
+ }
+ if (srelen & 1) {
+ ND_PRINT((ndo, ", badlength=%u", srelen));
+ return;
+ }
+ if (sreoff >= srelen) {
+ ND_PRINT((ndo, ", badoff/len=%u/%u", sreoff, srelen));
+ return;
+ }
+
+ for (;;) {
+ if (len < 2 || srelen == 0)
+ return;
+
+ ND_PRINT((ndo, " %s%x",
+ ((bp - up) == sreoff) ? "*" : "",
+ EXTRACT_16BITS(bp)));
+
+ bp += 2;
+ len -= 2;
+ srelen -= 2;
+ }
+}
--- /dev/null
+/*
+ * Copyright (C) 2001 Julian Cowley
+ * 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.
+ */
+
+/* Cisco Hot Standby Router Protocol (HSRP). */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-hsrp.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+
+/* HSRP op code types. */
+static const char *op_code_str[] = {
+ "hello",
+ "coup",
+ "resign"
+};
+
+/* HSRP states and associated names. */
+static const struct tok states[] = {
+ { 0, "initial" },
+ { 1, "learn" },
+ { 2, "listen" },
+ { 4, "speak" },
+ { 8, "standby" },
+ { 16, "active" },
+ { 0, NULL }
+};
+
+/*
+ * RFC 2281:
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Version | Op Code | State | Hellotime |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Holdtime | Priority | Group | Reserved |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Authentication Data |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Authentication Data |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Virtual IP Address |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define HSRP_AUTH_SIZE 8
+
+/* HSRP protocol header. */
+struct hsrp {
+ uint8_t hsrp_version;
+ uint8_t hsrp_op_code;
+ uint8_t hsrp_state;
+ uint8_t hsrp_hellotime;
+ uint8_t hsrp_holdtime;
+ uint8_t hsrp_priority;
+ uint8_t hsrp_group;
+ uint8_t hsrp_reserved;
+ uint8_t hsrp_authdata[HSRP_AUTH_SIZE];
+ struct in_addr hsrp_virtaddr;
+};
+
+void
+hsrp_print(netdissect_options *ndo, register const uint8_t *bp, register u_int len)
+{
+ struct hsrp *hp = (struct hsrp *) bp;
+
+ ND_TCHECK(hp->hsrp_version);
+ ND_PRINT((ndo, "HSRPv%d", hp->hsrp_version));
+ if (hp->hsrp_version != 0)
+ return;
+ ND_TCHECK(hp->hsrp_op_code);
+ ND_PRINT((ndo, "-"));
+ ND_PRINT((ndo, "%s ", tok2strary(op_code_str, "unknown (%d)", hp->hsrp_op_code)));
+ ND_PRINT((ndo, "%d: ", len));
+ ND_TCHECK(hp->hsrp_state);
+ ND_PRINT((ndo, "state=%s ", tok2str(states, "Unknown (%d)", hp->hsrp_state)));
+ ND_TCHECK(hp->hsrp_group);
+ ND_PRINT((ndo, "group=%d ", hp->hsrp_group));
+ ND_TCHECK(hp->hsrp_reserved);
+ if (hp->hsrp_reserved != 0) {
+ ND_PRINT((ndo, "[reserved=%d!] ", hp->hsrp_reserved));
+ }
+ ND_TCHECK(hp->hsrp_virtaddr);
+ ND_PRINT((ndo, "addr=%s", ipaddr_string(ndo, &hp->hsrp_virtaddr)));
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, " hellotime="));
+ relts_print(ndo, hp->hsrp_hellotime);
+ ND_PRINT((ndo, " holdtime="));
+ relts_print(ndo, hp->hsrp_holdtime);
+ ND_PRINT((ndo, " priority=%d", hp->hsrp_priority));
+ ND_PRINT((ndo, " auth=\""));
+ if (fn_printn(ndo, hp->hsrp_authdata, sizeof(hp->hsrp_authdata),
+ ndo->ndo_snapend)) {
+ ND_PRINT((ndo, "\""));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "\""));
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "[|hsrp]"));
+}
--- /dev/null
+/*
+ * 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.
+ */
+
+#ifndef lint
+static const char rcsid[] _U_ =
+ "@(#) Header";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "interface.h"
+#include "extract.h"
+
+/*
+ * Includes WebDAV requests.
+ */
+static const char *httpcmds[] = {
+ "GET",
+ "PUT",
+ "COPY",
+ "HEAD",
+ "LOCK",
+ "MOVE",
+ "POLL",
+ "POST",
+ "BCOPY",
+ "BMOVE",
+ "MKCOL",
+ "TRACE",
+ "LABEL",
+ "MERGE",
+ "DELETE",
+ "SEARCH",
+ "UNLOCK",
+ "REPORT",
+ "UPDATE",
+ "NOTIFY",
+ "BDELETE",
+ "CONNECT",
+ "OPTIONS",
+ "CHECKIN",
+ "PROPFIND",
+ "CHECKOUT",
+ "CCM_POST",
+ "SUBSCRIBE",
+ "PROPPATCH",
+ "BPROPFIND",
+ "BPROPPATCH",
+ "UNCHECKOUT",
+ "MKACTIVITY",
+ "MKWORKSPACE",
+ "UNSUBSCRIBE",
+ "RPC_CONNECT",
+ "VERSION-CONTROL",
+ "BASELINE-CONTROL",
+ NULL
+};
+
+void
+http_print(netdissect_options *ndo, const u_char *pptr, u_int len)
+{
+ txtproto_print(ndo, pptr, len, "http", httpcmds, RESP_CODE_SECOND_TOKEN);
+}
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994, 1995, 1996
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-icmp.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+
+#include "ip.h"
+#include "udp.h"
+#include "ipproto.h"
+#include "mpls.h"
+
+/*
+ * Interface Control Message Protocol Definitions.
+ * Per RFC 792, September 1981.
+ */
+
+/*
+ * Structure of an icmp header.
+ */
+struct icmp {
+ uint8_t icmp_type; /* type of message, see below */
+ uint8_t icmp_code; /* type sub code */
+ uint16_t icmp_cksum; /* ones complement cksum of struct */
+ union {
+ uint8_t ih_pptr; /* ICMP_PARAMPROB */
+ struct in_addr ih_gwaddr; /* ICMP_REDIRECT */
+ struct ih_idseq {
+ uint16_t icd_id;
+ uint16_t icd_seq;
+ } ih_idseq;
+ uint32_t ih_void;
+ } icmp_hun;
+#define icmp_pptr icmp_hun.ih_pptr
+#define icmp_gwaddr icmp_hun.ih_gwaddr
+#define icmp_id icmp_hun.ih_idseq.icd_id
+#define icmp_seq icmp_hun.ih_idseq.icd_seq
+#define icmp_void icmp_hun.ih_void
+ union {
+ struct id_ts {
+ uint32_t its_otime;
+ uint32_t its_rtime;
+ uint32_t its_ttime;
+ } id_ts;
+ struct id_ip {
+ struct ip idi_ip;
+ /* options and then 64 bits of data */
+ } id_ip;
+ uint32_t id_mask;
+ uint8_t id_data[1];
+ } icmp_dun;
+#define icmp_otime icmp_dun.id_ts.its_otime
+#define icmp_rtime icmp_dun.id_ts.its_rtime
+#define icmp_ttime icmp_dun.id_ts.its_ttime
+#define icmp_ip icmp_dun.id_ip.idi_ip
+#define icmp_mask icmp_dun.id_mask
+#define icmp_data icmp_dun.id_data
+};
+
+#define ICMP_MPLS_EXT_EXTRACT_VERSION(x) (((x)&0xf0)>>4)
+#define ICMP_MPLS_EXT_VERSION 2
+
+/*
+ * Lower bounds on packet lengths for various types.
+ * For the error advice packets must first insure that the
+ * packet is large enought to contain the returned ip header.
+ * Only then can we do the check to see if 64 bits of packet
+ * data have been returned, since we need to check the returned
+ * ip header length.
+ */
+#define ICMP_MINLEN 8 /* abs minimum */
+#define ICMP_EXTD_MINLEN (156 - sizeof (struct ip)) /* draft-bonica-internet-icmp-08 */
+#define ICMP_TSLEN (8 + 3 * sizeof (uint32_t)) /* timestamp */
+#define ICMP_MASKLEN 12 /* address mask */
+#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */
+#define ICMP_ADVLEN(p) (8 + (IP_HL(&(p)->icmp_ip) << 2) + 8)
+ /* N.B.: must separately check that ip_hl >= 5 */
+
+/*
+ * Definition of type and code field values.
+ */
+#define ICMP_ECHOREPLY 0 /* echo reply */
+#define ICMP_UNREACH 3 /* dest unreachable, codes: */
+#define ICMP_UNREACH_NET 0 /* bad net */
+#define ICMP_UNREACH_HOST 1 /* bad host */
+#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */
+#define ICMP_UNREACH_PORT 3 /* bad port */
+#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */
+#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */
+#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */
+#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */
+#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */
+#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */
+#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */
+#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */
+#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */
+#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */
+#define ICMP_REDIRECT 5 /* shorter route, codes: */
+#define ICMP_REDIRECT_NET 0 /* for network */
+#define ICMP_REDIRECT_HOST 1 /* for host */
+#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */
+#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */
+#define ICMP_ECHO 8 /* echo service */
+#define ICMP_ROUTERADVERT 9 /* router advertisement */
+#define ICMP_ROUTERSOLICIT 10 /* router solicitation */
+#define ICMP_TIMXCEED 11 /* time exceeded, code: */
+#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */
+#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */
+#define ICMP_PARAMPROB 12 /* ip header bad */
+#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */
+#define ICMP_TSTAMP 13 /* timestamp request */
+#define ICMP_TSTAMPREPLY 14 /* timestamp reply */
+#define ICMP_IREQ 15 /* information request */
+#define ICMP_IREQREPLY 16 /* information reply */
+#define ICMP_MASKREQ 17 /* address mask request */
+#define ICMP_MASKREPLY 18 /* address mask reply */
+
+#define ICMP_MAXTYPE 18
+
+#define ICMP_ERRTYPE(type) \
+ ((type) == ICMP_UNREACH || (type) == ICMP_SOURCEQUENCH || \
+ (type) == ICMP_REDIRECT || (type) == ICMP_TIMXCEED || \
+ (type) == ICMP_PARAMPROB)
+#define ICMP_MPLS_EXT_TYPE(type) \
+ ((type) == ICMP_UNREACH || \
+ (type) == ICMP_TIMXCEED || \
+ (type) == ICMP_PARAMPROB)
+/* rfc1700 */
+#ifndef ICMP_UNREACH_NET_UNKNOWN
+#define ICMP_UNREACH_NET_UNKNOWN 6 /* destination net unknown */
+#endif
+#ifndef ICMP_UNREACH_HOST_UNKNOWN
+#define ICMP_UNREACH_HOST_UNKNOWN 7 /* destination host unknown */
+#endif
+#ifndef ICMP_UNREACH_ISOLATED
+#define ICMP_UNREACH_ISOLATED 8 /* source host isolated */
+#endif
+#ifndef ICMP_UNREACH_NET_PROHIB
+#define ICMP_UNREACH_NET_PROHIB 9 /* admin prohibited net */
+#endif
+#ifndef ICMP_UNREACH_HOST_PROHIB
+#define ICMP_UNREACH_HOST_PROHIB 10 /* admin prohibited host */
+#endif
+#ifndef ICMP_UNREACH_TOSNET
+#define ICMP_UNREACH_TOSNET 11 /* tos prohibited net */
+#endif
+#ifndef ICMP_UNREACH_TOSHOST
+#define ICMP_UNREACH_TOSHOST 12 /* tos prohibited host */
+#endif
+
+/* rfc1716 */
+#ifndef ICMP_UNREACH_FILTER_PROHIB
+#define ICMP_UNREACH_FILTER_PROHIB 13 /* admin prohibited filter */
+#endif
+#ifndef ICMP_UNREACH_HOST_PRECEDENCE
+#define ICMP_UNREACH_HOST_PRECEDENCE 14 /* host precedence violation */
+#endif
+#ifndef ICMP_UNREACH_PRECEDENCE_CUTOFF
+#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* precedence cutoff */
+#endif
+
+/* Most of the icmp types */
+static const struct tok icmp2str[] = {
+ { ICMP_ECHOREPLY, "echo reply" },
+ { ICMP_SOURCEQUENCH, "source quench" },
+ { ICMP_ECHO, "echo request" },
+ { ICMP_ROUTERSOLICIT, "router solicitation" },
+ { ICMP_TSTAMP, "time stamp request" },
+ { ICMP_TSTAMPREPLY, "time stamp reply" },
+ { ICMP_IREQ, "information request" },
+ { ICMP_IREQREPLY, "information reply" },
+ { ICMP_MASKREQ, "address mask request" },
+ { 0, NULL }
+};
+
+/* Formats for most of the ICMP_UNREACH codes */
+static const struct tok unreach2str[] = {
+ { ICMP_UNREACH_NET, "net %s unreachable" },
+ { ICMP_UNREACH_HOST, "host %s unreachable" },
+ { ICMP_UNREACH_SRCFAIL,
+ "%s unreachable - source route failed" },
+ { ICMP_UNREACH_NET_UNKNOWN, "net %s unreachable - unknown" },
+ { ICMP_UNREACH_HOST_UNKNOWN, "host %s unreachable - unknown" },
+ { ICMP_UNREACH_ISOLATED,
+ "%s unreachable - source host isolated" },
+ { ICMP_UNREACH_NET_PROHIB,
+ "net %s unreachable - admin prohibited" },
+ { ICMP_UNREACH_HOST_PROHIB,
+ "host %s unreachable - admin prohibited" },
+ { ICMP_UNREACH_TOSNET,
+ "net %s unreachable - tos prohibited" },
+ { ICMP_UNREACH_TOSHOST,
+ "host %s unreachable - tos prohibited" },
+ { ICMP_UNREACH_FILTER_PROHIB,
+ "host %s unreachable - admin prohibited filter" },
+ { ICMP_UNREACH_HOST_PRECEDENCE,
+ "host %s unreachable - host precedence violation" },
+ { ICMP_UNREACH_PRECEDENCE_CUTOFF,
+ "host %s unreachable - precedence cutoff" },
+ { 0, NULL }
+};
+
+/* Formats for the ICMP_REDIRECT codes */
+static const struct tok type2str[] = {
+ { ICMP_REDIRECT_NET, "redirect %s to net %s" },
+ { ICMP_REDIRECT_HOST, "redirect %s to host %s" },
+ { ICMP_REDIRECT_TOSNET, "redirect-tos %s to net %s" },
+ { ICMP_REDIRECT_TOSHOST, "redirect-tos %s to host %s" },
+ { 0, NULL }
+};
+
+/* rfc1191 */
+struct mtu_discovery {
+ uint16_t unused;
+ uint16_t nexthopmtu;
+};
+
+/* rfc1256 */
+struct ih_rdiscovery {
+ uint8_t ird_addrnum;
+ uint8_t ird_addrsiz;
+ uint16_t ird_lifetime;
+};
+
+struct id_rdiscovery {
+ uint32_t ird_addr;
+ uint32_t ird_pref;
+};
+
+/*
+ * draft-bonica-internet-icmp-08
+ *
+ * The Destination Unreachable, Time Exceeded
+ * and Parameter Problem messages are slighly changed as per
+ * the above draft. A new Length field gets added to give
+ * the caller an idea about the length of the piggypacked
+ * IP packet before the MPLS extension header starts.
+ *
+ * The Length field represents length of the padded "original datagram"
+ * field measured in 32-bit words.
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Type | Code | Checksum |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | unused | Length | unused |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Internet Header + leading octets of original datagram |
+ * | |
+ * | // |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+struct icmp_ext_t {
+ uint8_t icmp_type;
+ uint8_t icmp_code;
+ uint8_t icmp_checksum[2];
+ uint8_t icmp_reserved;
+ uint8_t icmp_length;
+ uint8_t icmp_reserved2[2];
+ uint8_t icmp_ext_legacy_header[128]; /* extension header starts 128 bytes after ICMP header */
+ uint8_t icmp_ext_version_res[2];
+ uint8_t icmp_ext_checksum[2];
+ uint8_t icmp_ext_data[1];
+};
+
+struct icmp_mpls_ext_object_header_t {
+ uint8_t length[2];
+ uint8_t class_num;
+ uint8_t ctype;
+};
+
+static const struct tok icmp_mpls_ext_obj_values[] = {
+ { 1, "MPLS Stack Entry" },
+ { 2, "Extended Payload" },
+ { 0, NULL}
+};
+
+/* prototypes */
+const char *icmp_tstamp_print(u_int);
+
+/* print the milliseconds since midnight UTC */
+const char *
+icmp_tstamp_print(u_int tstamp)
+{
+ u_int msec,sec,min,hrs;
+
+ static char buf[64];
+
+ msec = tstamp % 1000;
+ sec = tstamp / 1000;
+ min = sec / 60; sec -= min * 60;
+ hrs = min / 60; min -= hrs * 60;
+ snprintf(buf, sizeof(buf), "%02u:%02u:%02u.%03u",hrs,min,sec,msec);
+ return buf;
+}
+
+void
+icmp_print(netdissect_options *ndo, const u_char *bp, u_int plen, const u_char *bp2,
+ int fragmented)
+{
+ char *cp;
+ const struct icmp *dp;
+ const struct icmp_ext_t *ext_dp;
+ const struct ip *ip;
+ const char *str, *fmt;
+ const struct ip *oip;
+ const struct udphdr *ouh;
+ const uint8_t *obj_tptr;
+ uint32_t raw_label;
+ const u_char *snapend_save;
+ 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;
+ ip = (struct ip *)bp2;
+ str = buf;
+
+ ND_TCHECK(dp->icmp_code);
+ switch (dp->icmp_type) {
+
+ case ICMP_ECHO:
+ case ICMP_ECHOREPLY:
+ ND_TCHECK(dp->icmp_seq);
+ (void)snprintf(buf, sizeof(buf), "echo %s, id %u, seq %u",
+ dp->icmp_type == ICMP_ECHO ?
+ "request" : "reply",
+ EXTRACT_16BITS(&dp->icmp_id),
+ EXTRACT_16BITS(&dp->icmp_seq));
+ break;
+
+ case ICMP_UNREACH:
+ ND_TCHECK(dp->icmp_ip.ip_dst);
+ switch (dp->icmp_code) {
+
+ case ICMP_UNREACH_PROTOCOL:
+ ND_TCHECK(dp->icmp_ip.ip_p);
+ (void)snprintf(buf, sizeof(buf),
+ "%s protocol %d unreachable",
+ ipaddr_string(ndo, &dp->icmp_ip.ip_dst),
+ dp->icmp_ip.ip_p);
+ break;
+
+ case ICMP_UNREACH_PORT:
+ ND_TCHECK(dp->icmp_ip.ip_p);
+ oip = &dp->icmp_ip;
+ hlen = IP_HL(oip) * 4;
+ ouh = (struct udphdr *)(((u_char *)oip) + hlen);
+ ND_TCHECK(ouh->uh_dport);
+ dport = EXTRACT_16BITS(&ouh->uh_dport);
+ switch (oip->ip_p) {
+
+ case IPPROTO_TCP:
+ (void)snprintf(buf, sizeof(buf),
+ "%s tcp port %s unreachable",
+ ipaddr_string(ndo, &oip->ip_dst),
+ tcpport_string(dport));
+ break;
+
+ case IPPROTO_UDP:
+ (void)snprintf(buf, sizeof(buf),
+ "%s udp port %s unreachable",
+ ipaddr_string(ndo, &oip->ip_dst),
+ udpport_string(dport));
+ break;
+
+ default:
+ (void)snprintf(buf, sizeof(buf),
+ "%s protocol %d port %d unreachable",
+ ipaddr_string(ndo, &oip->ip_dst),
+ oip->ip_p, dport);
+ break;
+ }
+ break;
+
+ case ICMP_UNREACH_NEEDFRAG:
+ {
+ register const struct mtu_discovery *mp;
+ mp = (struct mtu_discovery *)(u_char *)&dp->icmp_void;
+ mtu = EXTRACT_16BITS(&mp->nexthopmtu);
+ if (mtu) {
+ (void)snprintf(buf, sizeof(buf),
+ "%s unreachable - need to frag (mtu %d)",
+ ipaddr_string(ndo, &dp->icmp_ip.ip_dst), mtu);
+ } else {
+ (void)snprintf(buf, sizeof(buf),
+ "%s unreachable - need to frag",
+ ipaddr_string(ndo, &dp->icmp_ip.ip_dst));
+ }
+ }
+ break;
+
+ default:
+ fmt = tok2str(unreach2str, "#%d %%s unreachable",
+ dp->icmp_code);
+ (void)snprintf(buf, sizeof(buf), fmt,
+ ipaddr_string(ndo, &dp->icmp_ip.ip_dst));
+ break;
+ }
+ break;
+
+ case ICMP_REDIRECT:
+ ND_TCHECK(dp->icmp_ip.ip_dst);
+ fmt = tok2str(type2str, "redirect-#%d %%s to net %%s",
+ dp->icmp_code);
+ (void)snprintf(buf, sizeof(buf), fmt,
+ ipaddr_string(ndo, &dp->icmp_ip.ip_dst),
+ ipaddr_string(ndo, &dp->icmp_gwaddr));
+ break;
+
+ case ICMP_ROUTERADVERT:
+ {
+ register const struct ih_rdiscovery *ihp;
+ register const struct id_rdiscovery *idp;
+ u_int lifetime, num, size;
+
+ (void)snprintf(buf, sizeof(buf), "router advertisement");
+ cp = buf + strlen(buf);
+
+ ihp = (struct ih_rdiscovery *)&dp->icmp_void;
+ ND_TCHECK(*ihp);
+ (void)strncpy(cp, " lifetime ", sizeof(buf) - (cp - buf));
+ cp = buf + strlen(buf);
+ lifetime = EXTRACT_16BITS(&ihp->ird_lifetime);
+ if (lifetime < 60) {
+ (void)snprintf(cp, sizeof(buf) - (cp - buf), "%u",
+ lifetime);
+ } else if (lifetime < 60 * 60) {
+ (void)snprintf(cp, sizeof(buf) - (cp - buf), "%u:%02u",
+ lifetime / 60, lifetime % 60);
+ } else {
+ (void)snprintf(cp, sizeof(buf) - (cp - buf),
+ "%u:%02u:%02u",
+ lifetime / 3600,
+ (lifetime % 3600) / 60,
+ lifetime % 60);
+ }
+ cp = buf + strlen(buf);
+
+ num = ihp->ird_addrnum;
+ (void)snprintf(cp, sizeof(buf) - (cp - buf), " %d:", num);
+ cp = buf + strlen(buf);
+
+ size = ihp->ird_addrsiz;
+ if (size != 2) {
+ (void)snprintf(cp, sizeof(buf) - (cp - buf),
+ " [size %d]", size);
+ break;
+ }
+ idp = (struct id_rdiscovery *)&dp->icmp_data;
+ while (num-- > 0) {
+ ND_TCHECK(*idp);
+ (void)snprintf(cp, sizeof(buf) - (cp - buf), " {%s %u}",
+ ipaddr_string(ndo, &idp->ird_addr),
+ EXTRACT_32BITS(&idp->ird_pref));
+ cp = buf + strlen(buf);
+ ++idp;
+ }
+ }
+ break;
+
+ case ICMP_TIMXCEED:
+ ND_TCHECK(dp->icmp_ip.ip_dst);
+ switch (dp->icmp_code) {
+
+ case ICMP_TIMXCEED_INTRANS:
+ str = "time exceeded in-transit";
+ break;
+
+ case ICMP_TIMXCEED_REASS:
+ str = "ip reassembly time exceeded";
+ break;
+
+ default:
+ (void)snprintf(buf, sizeof(buf), "time exceeded-#%d",
+ dp->icmp_code);
+ break;
+ }
+ break;
+
+ case ICMP_PARAMPROB:
+ if (dp->icmp_code)
+ (void)snprintf(buf, sizeof(buf),
+ "parameter problem - code %d", dp->icmp_code);
+ else {
+ ND_TCHECK(dp->icmp_pptr);
+ (void)snprintf(buf, sizeof(buf),
+ "parameter problem - octet %d", dp->icmp_pptr);
+ }
+ break;
+
+ case ICMP_MASKREPLY:
+ ND_TCHECK(dp->icmp_mask);
+ (void)snprintf(buf, sizeof(buf), "address mask is 0x%08x",
+ EXTRACT_32BITS(&dp->icmp_mask));
+ break;
+
+ case ICMP_TSTAMP:
+ ND_TCHECK(dp->icmp_seq);
+ (void)snprintf(buf, sizeof(buf),
+ "time stamp query id %u seq %u",
+ EXTRACT_16BITS(&dp->icmp_id),
+ EXTRACT_16BITS(&dp->icmp_seq));
+ break;
+
+ case ICMP_TSTAMPREPLY:
+ ND_TCHECK(dp->icmp_ttime);
+ (void)snprintf(buf, sizeof(buf),
+ "time stamp reply id %u seq %u: org %s",
+ EXTRACT_16BITS(&dp->icmp_id),
+ EXTRACT_16BITS(&dp->icmp_seq),
+ icmp_tstamp_print(EXTRACT_32BITS(&dp->icmp_otime)));
+
+ (void)snprintf(buf+strlen(buf),sizeof(buf)-strlen(buf),", recv %s",
+ icmp_tstamp_print(EXTRACT_32BITS(&dp->icmp_rtime)));
+ (void)snprintf(buf+strlen(buf),sizeof(buf)-strlen(buf),", xmit %s",
+ icmp_tstamp_print(EXTRACT_32BITS(&dp->icmp_ttime)));
+ break;
+
+ default:
+ str = tok2str(icmp2str, "type-#%d", dp->icmp_type);
+ break;
+ }
+ ND_PRINT((ndo, "ICMP %s, length %u", str, plen));
+ if (ndo->ndo_vflag && !fragmented) { /* don't attempt checksumming if this is a frag */
+ uint16_t sum, icmp_sum;
+ struct cksum_vec vec[1];
+ if (ND_TTEST2(*bp, plen)) {
+ vec[0].ptr = (const uint8_t *)(void *)dp;
+ vec[0].len = plen;
+ sum = in_cksum(vec, 1);
+ if (sum != 0) {
+ icmp_sum = EXTRACT_16BITS(&dp->icmp_cksum);
+ ND_PRINT((ndo, " (wrong icmp cksum %x (->%x)!)",
+ icmp_sum,
+ in_cksum_shouldbe(icmp_sum, sum)));
+ }
+ }
+ }
+
+ /*
+ * print the remnants of the IP packet.
+ * save the snaplength as this may get overidden in the IP printer.
+ */
+ if (ndo->ndo_vflag >= 1 && ICMP_ERRTYPE(dp->icmp_type)) {
+ bp += 8;
+ ND_PRINT((ndo, "\n\t"));
+ ip = (struct ip *)bp;
+ ndo->ndo_snaplen = ndo->ndo_snapend - bp;
+ snapend_save = ndo->ndo_snapend;
+ ip_print(ndo, bp, EXTRACT_16BITS(&ip->ip_len));
+ ndo->ndo_snapend = snapend_save;
+ }
+
+ /*
+ * Attempt to decode the MPLS extensions only for some ICMP types.
+ */
+ if (ndo->ndo_vflag >= 1 && plen > ICMP_EXTD_MINLEN && ICMP_MPLS_EXT_TYPE(dp->icmp_type)) {
+
+ ND_TCHECK(*ext_dp);
+
+ /*
+ * Check first if the mpls extension header shows a non-zero length.
+ * If the length field is not set then silently verify the checksum
+ * 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) {
+ vec[0].ptr = (const uint8_t *)(void *)&ext_dp->icmp_ext_version_res;
+ vec[0].len = plen - ICMP_EXTD_MINLEN;
+ if (in_cksum(vec, 1)) {
+ return;
+ }
+ }
+
+ ND_PRINT((ndo, "\n\tMPLS extension v%u",
+ ICMP_MPLS_EXT_EXTRACT_VERSION(*(ext_dp->icmp_ext_version_res))));
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (ICMP_MPLS_EXT_EXTRACT_VERSION(*(ext_dp->icmp_ext_version_res)) !=
+ ICMP_MPLS_EXT_VERSION) {
+ ND_PRINT((ndo, " packet not supported"));
+ return;
+ }
+
+ hlen = plen - ICMP_EXTD_MINLEN;
+ vec[0].ptr = (const uint8_t *)(void *)&ext_dp->icmp_ext_version_res;
+ vec[0].len = hlen;
+ ND_PRINT((ndo, ", checksum 0x%04x (%scorrect), length %u",
+ EXTRACT_16BITS(ext_dp->icmp_ext_checksum),
+ in_cksum(vec, 1) ? "in" : "",
+ hlen));
+
+ hlen -= 4; /* subtract common header size */
+ obj_tptr = (uint8_t *)ext_dp->icmp_ext_data;
+
+ while (hlen > sizeof(struct icmp_mpls_ext_object_header_t)) {
+
+ icmp_mpls_ext_object_header = (struct icmp_mpls_ext_object_header_t *)obj_tptr;
+ ND_TCHECK(*icmp_mpls_ext_object_header);
+ obj_tlen = EXTRACT_16BITS(icmp_mpls_ext_object_header->length);
+ obj_class_num = icmp_mpls_ext_object_header->class_num;
+ obj_ctype = icmp_mpls_ext_object_header->ctype;
+ obj_tptr += sizeof(struct icmp_mpls_ext_object_header_t);
+
+ ND_PRINT((ndo, "\n\t %s Object (%u), Class-Type: %u, length %u",
+ tok2str(icmp_mpls_ext_obj_values,"unknown",obj_class_num),
+ obj_class_num,
+ obj_ctype,
+ obj_tlen));
+
+ hlen-=sizeof(struct icmp_mpls_ext_object_header_t); /* length field includes tlv header */
+
+ /* infinite loop protection */
+ if ((obj_class_num == 0) ||
+ (obj_tlen < sizeof(struct icmp_mpls_ext_object_header_t))) {
+ return;
+ }
+ obj_tlen-=sizeof(struct icmp_mpls_ext_object_header_t);
+
+ switch (obj_class_num) {
+ case 1:
+ switch(obj_ctype) {
+ case 1:
+ ND_TCHECK2(*obj_tptr, 4);
+ raw_label = EXTRACT_32BITS(obj_tptr);
+ ND_PRINT((ndo, "\n\t label %u, exp %u", MPLS_LABEL(raw_label), MPLS_EXP(raw_label)));
+ if (MPLS_STACK(raw_label))
+ ND_PRINT((ndo, ", [S]"));
+ ND_PRINT((ndo, ", ttl %u", MPLS_TTL(raw_label)));
+ break;
+ default:
+ print_unknown_data(ndo, obj_tptr, "\n\t ", obj_tlen);
+ }
+ break;
+
+ /*
+ * FIXME those are the defined objects that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+ case 2:
+ default:
+ print_unknown_data(ndo, obj_tptr, "\n\t ", obj_tlen);
+ break;
+ }
+ if (hlen < obj_tlen)
+ break;
+ hlen -= obj_tlen;
+ obj_tptr += obj_tlen;
+ }
+ }
+
+ return;
+trunc:
+ ND_PRINT((ndo, "[|icmp]"));
+}
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-icmp6.c,v 1.8 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef INET6
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#include "ip6.h"
+#include "ipproto.h"
+
+#include "udp.h"
+#include "ah.h"
+
+/* NetBSD: icmp6.h,v 1.13 2000/08/03 16:30:37 itojun Exp */
+/* $KAME: icmp6.h,v 1.22 2000/08/03 15:25:16 jinmei Exp $ */
+
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 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.
+ */
+
+struct icmp6_hdr {
+ uint8_t icmp6_type; /* type field */
+ uint8_t icmp6_code; /* code field */
+ uint16_t icmp6_cksum; /* checksum field */
+ union {
+ uint32_t icmp6_un_data32[1]; /* type-specific field */
+ uint16_t icmp6_un_data16[2]; /* type-specific field */
+ uint8_t icmp6_un_data8[4]; /* type-specific field */
+ } icmp6_dataun;
+};
+
+#define icmp6_data32 icmp6_dataun.icmp6_un_data32
+#define icmp6_data16 icmp6_dataun.icmp6_un_data16
+#define icmp6_data8 icmp6_dataun.icmp6_un_data8
+#define icmp6_pptr icmp6_data32[0] /* parameter prob */
+#define icmp6_mtu icmp6_data32[0] /* packet too big */
+#define icmp6_id icmp6_data16[0] /* echo request/reply */
+#define icmp6_seq icmp6_data16[1] /* echo request/reply */
+#define icmp6_maxdelay icmp6_data16[0] /* mcast group membership */
+
+#define ICMP6_DST_UNREACH 1 /* dest unreachable, codes: */
+#define ICMP6_PACKET_TOO_BIG 2 /* packet too big */
+#define ICMP6_TIME_EXCEEDED 3 /* time exceeded, code: */
+#define ICMP6_PARAM_PROB 4 /* ip6 header bad */
+
+#define ICMP6_ECHO_REQUEST 128 /* echo service */
+#define ICMP6_ECHO_REPLY 129 /* echo reply */
+#define ICMP6_MEMBERSHIP_QUERY 130 /* group membership query */
+#define MLD6_LISTENER_QUERY 130 /* multicast listener query */
+#define ICMP6_MEMBERSHIP_REPORT 131 /* group membership report */
+#define MLD6_LISTENER_REPORT 131 /* multicast listener report */
+#define ICMP6_MEMBERSHIP_REDUCTION 132 /* group membership termination */
+#define MLD6_LISTENER_DONE 132 /* multicast listener done */
+
+#define ND_ROUTER_SOLICIT 133 /* router solicitation */
+#define ND_ROUTER_ADVERT 134 /* router advertisement */
+#define ND_NEIGHBOR_SOLICIT 135 /* neighbor solicitation */
+#define ND_NEIGHBOR_ADVERT 136 /* neighbor advertisement */
+#define ND_REDIRECT 137 /* redirect */
+
+#define ICMP6_ROUTER_RENUMBERING 138 /* router renumbering */
+
+#define ICMP6_WRUREQUEST 139 /* who are you request */
+#define ICMP6_WRUREPLY 140 /* who are you reply */
+#define ICMP6_FQDN_QUERY 139 /* FQDN query */
+#define ICMP6_FQDN_REPLY 140 /* FQDN reply */
+#define ICMP6_NI_QUERY 139 /* node information request */
+#define ICMP6_NI_REPLY 140 /* node information reply */
+#define IND_SOLICIT 141 /* inverse neighbor solicitation */
+#define IND_ADVERT 142 /* inverse neighbor advertisement */
+
+#define ICMP6_V2_MEMBERSHIP_REPORT 143 /* v2 membership report */
+#define MLDV2_LISTENER_REPORT 143 /* v2 multicast listener report */
+#define ICMP6_HADISCOV_REQUEST 144
+#define ICMP6_HADISCOV_REPLY 145
+#define ICMP6_MOBILEPREFIX_SOLICIT 146
+#define ICMP6_MOBILEPREFIX_ADVERT 147
+
+#define MLD6_MTRACE_RESP 200 /* mtrace response(to sender) */
+#define MLD6_MTRACE 201 /* mtrace messages */
+
+#define ICMP6_MAXTYPE 201
+
+#define ICMP6_DST_UNREACH_NOROUTE 0 /* no route to destination */
+#define ICMP6_DST_UNREACH_ADMIN 1 /* administratively prohibited */
+#define ICMP6_DST_UNREACH_NOTNEIGHBOR 2 /* not a neighbor(obsolete) */
+#define ICMP6_DST_UNREACH_BEYONDSCOPE 2 /* beyond scope of source address */
+#define ICMP6_DST_UNREACH_ADDR 3 /* address unreachable */
+#define ICMP6_DST_UNREACH_NOPORT 4 /* port unreachable */
+
+#define ICMP6_TIME_EXCEED_TRANSIT 0 /* ttl==0 in transit */
+#define ICMP6_TIME_EXCEED_REASSEMBLY 1 /* ttl==0 in reass */
+
+#define ICMP6_PARAMPROB_HEADER 0 /* erroneous header field */
+#define ICMP6_PARAMPROB_NEXTHEADER 1 /* unrecognized next header */
+#define ICMP6_PARAMPROB_OPTION 2 /* unrecognized option */
+
+#define ICMP6_INFOMSG_MASK 0x80 /* all informational messages */
+
+#define ICMP6_NI_SUBJ_IPV6 0 /* Query Subject is an IPv6 address */
+#define ICMP6_NI_SUBJ_FQDN 1 /* Query Subject is a Domain name */
+#define ICMP6_NI_SUBJ_IPV4 2 /* Query Subject is an IPv4 address */
+
+#define ICMP6_NI_SUCCESS 0 /* node information successful reply */
+#define ICMP6_NI_REFUSED 1 /* node information request is refused */
+#define ICMP6_NI_UNKNOWN 2 /* unknown Qtype */
+
+#define ICMP6_ROUTER_RENUMBERING_COMMAND 0 /* rr command */
+#define ICMP6_ROUTER_RENUMBERING_RESULT 1 /* rr result */
+#define ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET 255 /* rr seq num reset */
+
+/* Used in kernel only */
+#define ND_REDIRECT_ONLINK 0 /* redirect to an on-link node */
+#define ND_REDIRECT_ROUTER 1 /* redirect to a better router */
+
+/*
+ * Multicast Listener Discovery
+ */
+struct mld6_hdr {
+ struct icmp6_hdr mld6_hdr;
+ struct in6_addr mld6_addr; /* multicast address */
+};
+
+#define mld6_type mld6_hdr.icmp6_type
+#define mld6_code mld6_hdr.icmp6_code
+#define mld6_cksum mld6_hdr.icmp6_cksum
+#define mld6_maxdelay mld6_hdr.icmp6_data16[0]
+#define mld6_reserved mld6_hdr.icmp6_data16[1]
+
+#define MLD_MINLEN 24
+#define MLDV2_MINLEN 28
+
+/*
+ * Neighbor Discovery
+ */
+
+struct nd_router_solicit { /* router solicitation */
+ struct icmp6_hdr nd_rs_hdr;
+ /* could be followed by options */
+};
+
+#define nd_rs_type nd_rs_hdr.icmp6_type
+#define nd_rs_code nd_rs_hdr.icmp6_code
+#define nd_rs_cksum nd_rs_hdr.icmp6_cksum
+#define nd_rs_reserved nd_rs_hdr.icmp6_data32[0]
+
+struct nd_router_advert { /* router advertisement */
+ struct icmp6_hdr nd_ra_hdr;
+ uint32_t nd_ra_reachable; /* reachable time */
+ uint32_t nd_ra_retransmit; /* retransmit timer */
+ /* could be followed by options */
+};
+
+#define nd_ra_type nd_ra_hdr.icmp6_type
+#define nd_ra_code nd_ra_hdr.icmp6_code
+#define nd_ra_cksum nd_ra_hdr.icmp6_cksum
+#define nd_ra_curhoplimit nd_ra_hdr.icmp6_data8[0]
+#define nd_ra_flags_reserved nd_ra_hdr.icmp6_data8[1]
+#define ND_RA_FLAG_MANAGED 0x80
+#define ND_RA_FLAG_OTHER 0x40
+#define ND_RA_FLAG_HOME_AGENT 0x20
+
+/*
+ * Router preference values based on draft-draves-ipngwg-router-selection-01.
+ * These are non-standard definitions.
+ */
+#define ND_RA_FLAG_RTPREF_MASK 0x18 /* 00011000 */
+
+#define ND_RA_FLAG_RTPREF_HIGH 0x08 /* 00001000 */
+#define ND_RA_FLAG_RTPREF_MEDIUM 0x00 /* 00000000 */
+#define ND_RA_FLAG_RTPREF_LOW 0x18 /* 00011000 */
+#define ND_RA_FLAG_RTPREF_RSV 0x10 /* 00010000 */
+
+#define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1]
+
+struct nd_neighbor_solicit { /* neighbor solicitation */
+ struct icmp6_hdr nd_ns_hdr;
+ struct in6_addr nd_ns_target; /*target address */
+ /* could be followed by options */
+};
+
+#define nd_ns_type nd_ns_hdr.icmp6_type
+#define nd_ns_code nd_ns_hdr.icmp6_code
+#define nd_ns_cksum nd_ns_hdr.icmp6_cksum
+#define nd_ns_reserved nd_ns_hdr.icmp6_data32[0]
+
+struct nd_neighbor_advert { /* neighbor advertisement */
+ struct icmp6_hdr nd_na_hdr;
+ struct in6_addr nd_na_target; /* target address */
+ /* could be followed by options */
+};
+
+#define nd_na_type nd_na_hdr.icmp6_type
+#define nd_na_code nd_na_hdr.icmp6_code
+#define nd_na_cksum nd_na_hdr.icmp6_cksum
+#define nd_na_flags_reserved nd_na_hdr.icmp6_data32[0]
+
+#define ND_NA_FLAG_ROUTER 0x80000000
+#define ND_NA_FLAG_SOLICITED 0x40000000
+#define ND_NA_FLAG_OVERRIDE 0x20000000
+
+struct nd_redirect { /* redirect */
+ struct icmp6_hdr nd_rd_hdr;
+ struct in6_addr nd_rd_target; /* target address */
+ struct in6_addr nd_rd_dst; /* destination address */
+ /* could be followed by options */
+};
+
+#define nd_rd_type nd_rd_hdr.icmp6_type
+#define nd_rd_code nd_rd_hdr.icmp6_code
+#define nd_rd_cksum nd_rd_hdr.icmp6_cksum
+#define nd_rd_reserved nd_rd_hdr.icmp6_data32[0]
+
+struct nd_opt_hdr { /* Neighbor discovery option header */
+ uint8_t nd_opt_type;
+ uint8_t nd_opt_len;
+ /* followed by option specific data*/
+};
+
+#define ND_OPT_SOURCE_LINKADDR 1
+#define ND_OPT_TARGET_LINKADDR 2
+#define ND_OPT_PREFIX_INFORMATION 3
+#define ND_OPT_REDIRECTED_HEADER 4
+#define ND_OPT_MTU 5
+#define ND_OPT_ADVINTERVAL 7
+#define ND_OPT_HOMEAGENT_INFO 8
+#define ND_OPT_ROUTE_INFO 24 /* RFC4191 */
+#define ND_OPT_RDNSS 25
+#define ND_OPT_DNSSL 31
+
+struct nd_opt_prefix_info { /* prefix information */
+ uint8_t nd_opt_pi_type;
+ uint8_t nd_opt_pi_len;
+ uint8_t nd_opt_pi_prefix_len;
+ uint8_t nd_opt_pi_flags_reserved;
+ uint8_t nd_opt_pi_valid_time[4];
+ uint8_t nd_opt_pi_preferred_time[4];
+ uint8_t nd_opt_pi_reserved2[4];
+ struct in6_addr nd_opt_pi_prefix;
+};
+
+#define ND_OPT_PI_FLAG_ONLINK 0x80
+#define ND_OPT_PI_FLAG_AUTO 0x40
+#define ND_OPT_PI_FLAG_ROUTER 0x20 /*2292bis*/
+
+struct nd_opt_rd_hdr { /* redirected header */
+ uint8_t nd_opt_rh_type;
+ uint8_t nd_opt_rh_len;
+ uint16_t nd_opt_rh_reserved1;
+ uint32_t nd_opt_rh_reserved2;
+ /* followed by IP header and data */
+};
+
+struct nd_opt_mtu { /* MTU option */
+ uint8_t nd_opt_mtu_type;
+ uint8_t nd_opt_mtu_len;
+ uint16_t nd_opt_mtu_reserved;
+ uint32_t nd_opt_mtu_mtu;
+};
+
+struct nd_opt_rdnss { /* RDNSS RFC 6106 5.1 */
+ uint8_t nd_opt_rdnss_type;
+ uint8_t nd_opt_rdnss_len;
+ uint16_t nd_opt_rdnss_reserved;
+ uint32_t nd_opt_rdnss_lifetime;
+ struct in6_addr nd_opt_rdnss_addr[1]; /* variable-length */
+};
+
+struct nd_opt_dnssl { /* DNSSL RFC 6106 5.2 */
+ uint8_t nd_opt_dnssl_type;
+ uint8_t nd_opt_dnssl_len;
+ uint16_t nd_opt_dnssl_reserved;
+ uint32_t nd_opt_dnssl_lifetime;
+ /* followed by list of DNS search domains, variable-length */
+};
+
+struct nd_opt_advinterval { /* Advertisement interval option */
+ uint8_t nd_opt_adv_type;
+ uint8_t nd_opt_adv_len;
+ uint16_t nd_opt_adv_reserved;
+ uint32_t nd_opt_adv_interval;
+};
+
+struct nd_opt_homeagent_info { /* Home Agent info */
+ uint8_t nd_opt_hai_type;
+ uint8_t nd_opt_hai_len;
+ uint16_t nd_opt_hai_reserved;
+ int16_t nd_opt_hai_preference;
+ uint16_t nd_opt_hai_lifetime;
+};
+
+struct nd_opt_route_info { /* route info */
+ uint8_t nd_opt_rti_type;
+ uint8_t nd_opt_rti_len;
+ uint8_t nd_opt_rti_prefixlen;
+ uint8_t nd_opt_rti_flags;
+ uint32_t nd_opt_rti_lifetime;
+ /* prefix follows */
+};
+
+/*
+ * icmp6 namelookup
+ */
+
+struct icmp6_namelookup {
+ struct icmp6_hdr icmp6_nl_hdr;
+ uint8_t icmp6_nl_nonce[8];
+ int32_t icmp6_nl_ttl;
+#if 0
+ uint8_t icmp6_nl_len;
+ uint8_t icmp6_nl_name[3];
+#endif
+ /* could be followed by options */
+};
+
+/*
+ * icmp6 node information
+ */
+struct icmp6_nodeinfo {
+ struct icmp6_hdr icmp6_ni_hdr;
+ uint8_t icmp6_ni_nonce[8];
+ /* could be followed by reply data */
+};
+
+#define ni_type icmp6_ni_hdr.icmp6_type
+#define ni_code icmp6_ni_hdr.icmp6_code
+#define ni_cksum icmp6_ni_hdr.icmp6_cksum
+#define ni_qtype icmp6_ni_hdr.icmp6_data16[0]
+#define ni_flags icmp6_ni_hdr.icmp6_data16[1]
+
+#define NI_QTYPE_NOOP 0 /* NOOP */
+#define NI_QTYPE_SUPTYPES 1 /* Supported Qtypes */
+#define NI_QTYPE_FQDN 2 /* FQDN (draft 04) */
+#define NI_QTYPE_DNSNAME 2 /* DNS Name */
+#define NI_QTYPE_NODEADDR 3 /* Node Addresses */
+#define NI_QTYPE_IPV4ADDR 4 /* IPv4 Addresses */
+
+/* network endian */
+#define NI_SUPTYPE_FLAG_COMPRESS ((uint16_t)htons(0x1))
+#define NI_FQDN_FLAG_VALIDTTL ((uint16_t)htons(0x1))
+
+/* network endian */
+#define NI_NODEADDR_FLAG_TRUNCATE ((uint16_t)htons(0x1))
+#define NI_NODEADDR_FLAG_ALL ((uint16_t)htons(0x2))
+#define NI_NODEADDR_FLAG_COMPAT ((uint16_t)htons(0x4))
+#define NI_NODEADDR_FLAG_LINKLOCAL ((uint16_t)htons(0x8))
+#define NI_NODEADDR_FLAG_SITELOCAL ((uint16_t)htons(0x10))
+#define NI_NODEADDR_FLAG_GLOBAL ((uint16_t)htons(0x20))
+#define NI_NODEADDR_FLAG_ANYCAST ((uint16_t)htons(0x40)) /* just experimental. not in spec */
+
+struct ni_reply_fqdn {
+ uint32_t ni_fqdn_ttl; /* TTL */
+ uint8_t ni_fqdn_namelen; /* length in octets of the FQDN */
+ uint8_t ni_fqdn_name[3]; /* XXX: alignment */
+};
+
+/*
+ * Router Renumbering. as router-renum-08.txt
+ */
+struct icmp6_router_renum { /* router renumbering header */
+ struct icmp6_hdr rr_hdr;
+ uint8_t rr_segnum;
+ uint8_t rr_flags;
+ uint16_t rr_maxdelay;
+ uint32_t rr_reserved;
+};
+#define ICMP6_RR_FLAGS_TEST 0x80
+#define ICMP6_RR_FLAGS_REQRESULT 0x40
+#define ICMP6_RR_FLAGS_FORCEAPPLY 0x20
+#define ICMP6_RR_FLAGS_SPECSITE 0x10
+#define ICMP6_RR_FLAGS_PREVDONE 0x08
+
+#define rr_type rr_hdr.icmp6_type
+#define rr_code rr_hdr.icmp6_code
+#define rr_cksum rr_hdr.icmp6_cksum
+#define rr_seqnum rr_hdr.icmp6_data32[0]
+
+struct rr_pco_match { /* match prefix part */
+ uint8_t rpm_code;
+ uint8_t rpm_len;
+ uint8_t rpm_ordinal;
+ uint8_t rpm_matchlen;
+ uint8_t rpm_minlen;
+ uint8_t rpm_maxlen;
+ uint16_t rpm_reserved;
+ struct in6_addr rpm_prefix;
+};
+
+#define RPM_PCO_ADD 1
+#define RPM_PCO_CHANGE 2
+#define RPM_PCO_SETGLOBAL 3
+#define RPM_PCO_MAX 4
+
+struct rr_pco_use { /* use prefix part */
+ uint8_t rpu_uselen;
+ uint8_t rpu_keeplen;
+ uint8_t rpu_ramask;
+ uint8_t rpu_raflags;
+ uint32_t rpu_vltime;
+ uint32_t rpu_pltime;
+ uint32_t rpu_flags;
+ struct in6_addr rpu_prefix;
+};
+#define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK 0x80
+#define ICMP6_RR_PCOUSE_RAFLAGS_AUTO 0x40
+
+/* network endian */
+#define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME ((uint32_t)htonl(0x80000000))
+#define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME ((uint32_t)htonl(0x40000000))
+
+struct rr_result { /* router renumbering result message */
+ uint16_t rrr_flags;
+ uint8_t rrr_ordinal;
+ uint8_t rrr_matchedlen;
+ uint32_t rrr_ifid;
+ struct in6_addr rrr_prefix;
+};
+/* network endian */
+#define ICMP6_RR_RESULT_FLAGS_OOB ((uint16_t)htons(0x0002))
+#define ICMP6_RR_RESULT_FLAGS_FORBIDDEN ((uint16_t)htons(0x0001))
+
+static const char *get_rtpref(u_int);
+static const char *get_lifetime(uint32_t);
+static void print_lladdr(netdissect_options *ndo, const u_char *, size_t);
+static void icmp6_opt_print(netdissect_options *ndo, const u_char *, int);
+static void mld6_print(netdissect_options *ndo, const u_char *);
+static void mldv2_report_print(netdissect_options *ndo, const u_char *, u_int);
+static void mldv2_query_print(netdissect_options *ndo, const u_char *, u_int);
+static const struct udphdr *get_upperlayer(netdissect_options *ndo, const u_char *, u_int *);
+static void dnsname_print(netdissect_options *ndo, const u_char *, const u_char *);
+static void icmp6_nodeinfo_print(netdissect_options *ndo, u_int, const u_char *, const u_char *);
+static void icmp6_rrenum_print(netdissect_options *ndo, const u_char *, const u_char *);
+
+#ifndef abs
+#define abs(a) ((0 < (a)) ? (a) : -(a))
+#endif
+
+#include "rpl.h"
+
+static const struct tok icmp6_type_values[] = {
+ { ICMP6_DST_UNREACH, "destination unreachable"},
+ { ICMP6_PACKET_TOO_BIG, "packet too big"},
+ { ICMP6_TIME_EXCEEDED, "time exceeded in-transit"},
+ { ICMP6_PARAM_PROB, "parameter problem"},
+ { ICMP6_ECHO_REQUEST, "echo request"},
+ { ICMP6_ECHO_REPLY, "echo reply"},
+ { MLD6_LISTENER_QUERY, "multicast listener query"},
+ { MLD6_LISTENER_REPORT, "multicast listener report"},
+ { MLD6_LISTENER_DONE, "multicast listener done"},
+ { ND_ROUTER_SOLICIT, "router solicitation"},
+ { ND_ROUTER_ADVERT, "router advertisement"},
+ { ND_NEIGHBOR_SOLICIT, "neighbor solicitation"},
+ { ND_NEIGHBOR_ADVERT, "neighbor advertisement"},
+ { ND_REDIRECT, "redirect"},
+ { ICMP6_ROUTER_RENUMBERING, "router renumbering"},
+ { IND_SOLICIT, "inverse neighbor solicitation"},
+ { IND_ADVERT, "inverse neighbor advertisement"},
+ { MLDV2_LISTENER_REPORT, "multicast listener report v2"},
+ { ICMP6_HADISCOV_REQUEST, "ha discovery request"},
+ { ICMP6_HADISCOV_REPLY, "ha discovery reply"},
+ { ICMP6_MOBILEPREFIX_SOLICIT, "mobile router solicitation"},
+ { ICMP6_MOBILEPREFIX_ADVERT, "mobile router advertisement"},
+ { ICMP6_WRUREQUEST, "who-are-you request"},
+ { ICMP6_WRUREPLY, "who-are-you reply"},
+ { ICMP6_NI_QUERY, "node information query"},
+ { ICMP6_NI_REPLY, "node information reply"},
+ { MLD6_MTRACE, "mtrace message"},
+ { MLD6_MTRACE_RESP, "mtrace response"},
+ { ND_RPL_MESSAGE, "RPL"},
+ { 0, NULL }
+};
+
+static const struct tok icmp6_dst_unreach_code_values[] = {
+ { ICMP6_DST_UNREACH_NOROUTE, "unreachable route" },
+ { ICMP6_DST_UNREACH_ADMIN, " unreachable prohibited"},
+ { ICMP6_DST_UNREACH_BEYONDSCOPE, "beyond scope"},
+ { ICMP6_DST_UNREACH_ADDR, "unreachable address"},
+ { ICMP6_DST_UNREACH_NOPORT, "unreachable port"},
+ { 0, NULL }
+};
+
+static const struct tok icmp6_opt_pi_flag_values[] = {
+ { ND_OPT_PI_FLAG_ONLINK, "onlink" },
+ { ND_OPT_PI_FLAG_AUTO, "auto" },
+ { ND_OPT_PI_FLAG_ROUTER, "router" },
+ { 0, NULL }
+};
+
+static const struct tok icmp6_opt_ra_flag_values[] = {
+ { ND_RA_FLAG_MANAGED, "managed" },
+ { ND_RA_FLAG_OTHER, "other stateful"},
+ { ND_RA_FLAG_HOME_AGENT, "home agent"},
+ { 0, NULL }
+};
+
+static const struct tok icmp6_nd_na_flag_values[] = {
+ { ND_NA_FLAG_ROUTER, "router" },
+ { ND_NA_FLAG_SOLICITED, "solicited" },
+ { ND_NA_FLAG_OVERRIDE, "override" },
+ { 0, NULL }
+};
+
+
+static const struct tok icmp6_opt_values[] = {
+ { ND_OPT_SOURCE_LINKADDR, "source link-address"},
+ { ND_OPT_TARGET_LINKADDR, "destination link-address"},
+ { ND_OPT_PREFIX_INFORMATION, "prefix info"},
+ { ND_OPT_REDIRECTED_HEADER, "redirected header"},
+ { ND_OPT_MTU, "mtu"},
+ { ND_OPT_RDNSS, "rdnss"},
+ { ND_OPT_DNSSL, "dnssl"},
+ { ND_OPT_ADVINTERVAL, "advertisement interval"},
+ { ND_OPT_HOMEAGENT_INFO, "homeagent information"},
+ { ND_OPT_ROUTE_INFO, "route info"},
+ { 0, NULL }
+};
+
+/* mldv2 report types */
+static const struct tok mldv2report2str[] = {
+ { 1, "is_in" },
+ { 2, "is_ex" },
+ { 3, "to_in" },
+ { 4, "to_ex" },
+ { 5, "allow" },
+ { 6, "block" },
+ { 0, NULL }
+};
+
+static const char *
+get_rtpref(u_int v)
+{
+ static const char *rtpref_str[] = {
+ "medium", /* 00 */
+ "high", /* 01 */
+ "rsv", /* 10 */
+ "low" /* 11 */
+ };
+
+ return rtpref_str[((v & ND_RA_FLAG_RTPREF_MASK) >> 3) & 0xff];
+}
+
+static const char *
+get_lifetime(uint32_t v)
+{
+ static char buf[20];
+
+ if (v == (uint32_t)~0UL)
+ return "infinity";
+ else {
+ snprintf(buf, sizeof(buf), "%us", v);
+ return buf;
+ }
+}
+
+static void
+print_lladdr(netdissect_options *ndo, const uint8_t *p, size_t l)
+{
+ const uint8_t *ep, *q;
+
+ q = p;
+ ep = p + l;
+ while (l > 0 && q < ep) {
+ if (q > p)
+ ND_PRINT((ndo,":"));
+ ND_PRINT((ndo,"%02x", *q++));
+ l--;
+ }
+}
+
+static int icmp6_cksum(const struct ip6_hdr *ip6, const struct icmp6_hdr *icp,
+ u_int len)
+{
+ return nextproto6_cksum(ip6, (const uint8_t *)(void *)icp, len, len,
+ IPPROTO_ICMPV6);
+}
+
+const struct tok rpl_mop_values[] = {
+ { RPL_DIO_NONSTORING, "nonstoring"},
+ { RPL_DIO_STORING, "storing"},
+ { RPL_DIO_NONSTORING_MULTICAST, "nonstoring-multicast"},
+ { RPL_DIO_STORING_MULTICAST, "storing-multicast"},
+ { 0, NULL},
+};
+
+const struct tok rpl_subopt_values[] = {
+ { RPL_OPT_PAD0, "pad0"},
+ { RPL_OPT_PADN, "padN"},
+ { RPL_DIO_METRICS, "metrics"},
+ { RPL_DIO_ROUTINGINFO, "routinginfo"},
+ { RPL_DIO_CONFIG, "config"},
+ { RPL_DAO_RPLTARGET, "rpltarget"},
+ { RPL_DAO_TRANSITINFO, "transitinfo"},
+ { RPL_DIO_DESTPREFIX, "destprefix"},
+ { RPL_DAO_RPLTARGET_DESC, "rpltargetdesc"},
+ { 0, NULL},
+};
+
+static void
+rpl_format_dagid(char dagid_str[65], const u_char *dagid)
+{
+ char *d = dagid_str;
+ int i;
+
+ for(i=0;i<16;i++) {
+ if(isprint(dagid[i])) {
+ *d++ = dagid[i];
+ } else {
+ snprintf(d,5,"0x%02x", dagid[i]); /* 4 + null char */
+ d += 4;
+ }
+ }
+ *d++ = '\0';
+}
+
+static void
+rpl_dio_printopt(netdissect_options *ndo,
+ const struct rpl_dio_genoption *opt,
+ u_int length)
+{
+ if(length < RPL_DIO_GENOPTION_LEN) return;
+ length -= RPL_DIO_GENOPTION_LEN;
+
+ ND_TCHECK(opt->rpl_dio_len);
+
+ while((opt->rpl_dio_type == RPL_OPT_PAD0 &&
+ (u_char *)opt < ndo->ndo_snapend) ||
+ ND_TTEST2(*opt,(opt->rpl_dio_len+2))) {
+
+ unsigned int optlen = opt->rpl_dio_len+2;
+ if(opt->rpl_dio_type == RPL_OPT_PAD0) {
+ optlen = 1;
+ ND_PRINT((ndo, " opt:pad0"));
+ } else {
+ ND_PRINT((ndo, " opt:%s len:%u ",
+ tok2str(rpl_subopt_values, "%subopt:%u", opt->rpl_dio_type),
+ optlen));
+ if(ndo->ndo_vflag > 2) {
+ unsigned int paylen = opt->rpl_dio_len;
+ if(paylen > length) paylen = length;
+ hex_print(ndo,
+ " ",
+ ((uint8_t *)opt) + RPL_DIO_GENOPTION_LEN, /* content of DIO option */
+ paylen);
+ }
+ }
+ opt = (struct rpl_dio_genoption *)(((char *)opt) + optlen);
+ length -= optlen;
+ }
+ return;
+trunc:
+ ND_PRINT((ndo," [|truncated]"));
+ return;
+}
+
+static void
+rpl_dio_print(netdissect_options *ndo,
+ const u_char *bp, u_int length)
+{
+ const struct nd_rpl_dio *dio = (struct nd_rpl_dio *)bp;
+ char dagid_str[65];
+
+ ND_TCHECK(*dio);
+ rpl_format_dagid(dagid_str, dio->rpl_dagid);
+
+ ND_PRINT((ndo, " [dagid:%s,seq:%u,instance:%u,rank:%u,%smop:%s,prf:%u]",
+ dagid_str,
+ dio->rpl_dtsn,
+ dio->rpl_instanceid,
+ EXTRACT_16BITS(&dio->rpl_dagrank),
+ RPL_DIO_GROUNDED(dio->rpl_mopprf) ? "grounded,":"",
+ tok2str(rpl_mop_values, "mop%u", RPL_DIO_MOP(dio->rpl_mopprf)),
+ RPL_DIO_PRF(dio->rpl_mopprf)));
+
+ if(ndo->ndo_vflag > 1) {
+ struct rpl_dio_genoption *opt = (struct rpl_dio_genoption *)&dio[1];
+ rpl_dio_printopt(ndo, opt, length);
+ }
+ return;
+trunc:
+ ND_PRINT((ndo," [|truncated]"));
+ return;
+}
+
+static void
+rpl_dao_print(netdissect_options *ndo,
+ const u_char *bp, u_int length)
+{
+ const struct nd_rpl_dao *dao = (struct nd_rpl_dao *)bp;
+ char dagid_str[65];
+
+ ND_TCHECK(*dao);
+ if (length < ND_RPL_DAO_MIN_LEN)
+ goto tooshort;
+
+ strcpy(dagid_str,"<elided>");
+ bp += ND_RPL_DAO_MIN_LEN;
+ length -= ND_RPL_DAO_MIN_LEN;
+ if(RPL_DAO_D(dao->rpl_flags)) {
+ ND_TCHECK2(dao->rpl_dagid, DAGID_LEN);
+ if (length < DAGID_LEN)
+ goto tooshort;
+ rpl_format_dagid(dagid_str, dao->rpl_dagid);
+ bp += DAGID_LEN;
+ length -= DAGID_LEN;
+ }
+
+ ND_PRINT((ndo, " [dagid:%s,seq:%u,instance:%u%s%s,%02x]",
+ dagid_str,
+ dao->rpl_daoseq,
+ dao->rpl_instanceid,
+ RPL_DAO_K(dao->rpl_flags) ? ",acK":"",
+ RPL_DAO_D(dao->rpl_flags) ? ",Dagid":"",
+ dao->rpl_flags));
+
+ if(ndo->ndo_vflag > 1) {
+ const struct rpl_dio_genoption *opt = (struct rpl_dio_genoption *)bp;
+ rpl_dio_printopt(ndo, opt, length);
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo," [|truncated]"));
+ return;
+
+tooshort:
+ ND_PRINT((ndo," [|length too short]"));
+ return;
+}
+
+static void
+rpl_daoack_print(netdissect_options *ndo,
+ const u_char *bp, u_int length)
+{
+ const struct nd_rpl_daoack *daoack = (struct nd_rpl_daoack *)bp;
+ char dagid_str[65];
+
+ ND_TCHECK2(*daoack, ND_RPL_DAOACK_MIN_LEN);
+ if (length < ND_RPL_DAOACK_MIN_LEN)
+ goto tooshort;
+
+ strcpy(dagid_str,"<elided>");
+ bp += ND_RPL_DAOACK_MIN_LEN;
+ length -= ND_RPL_DAOACK_MIN_LEN;
+ if(RPL_DAOACK_D(daoack->rpl_flags)) {
+ ND_TCHECK2(daoack->rpl_dagid, 16);
+ if (length < DAGID_LEN)
+ goto tooshort;
+ rpl_format_dagid(dagid_str, daoack->rpl_dagid);
+ bp += DAGID_LEN;
+ length -= DAGID_LEN;
+ }
+
+ ND_PRINT((ndo, " [dagid:%s,seq:%u,instance:%u,status:%u]",
+ dagid_str,
+ daoack->rpl_daoseq,
+ daoack->rpl_instanceid,
+ daoack->rpl_status));
+
+ /* no officially defined options for DAOACK, but print any we find */
+ if(ndo->ndo_vflag > 1) {
+ const struct rpl_dio_genoption *opt = (struct rpl_dio_genoption *)bp;
+ rpl_dio_printopt(ndo, opt, length);
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo," [|dao-truncated]"));
+ return;
+
+tooshort:
+ ND_PRINT((ndo," [|dao-length too short]"));
+ return;
+}
+
+static void
+rpl_print(netdissect_options *ndo,
+ const struct icmp6_hdr *hdr,
+ const u_char *bp, u_int length)
+{
+ int secured = hdr->icmp6_code & 0x80;
+ int basecode= hdr->icmp6_code & 0x7f;
+
+ if(secured) {
+ ND_PRINT((ndo, ", (SEC) [worktodo]"));
+ /* XXX
+ * the next header pointer needs to move forward to
+ * skip the secure part.
+ */
+ return;
+ } else {
+ ND_PRINT((ndo, ", (CLR)"));
+ }
+
+ switch(basecode) {
+ case ND_RPL_DAG_IS:
+ ND_PRINT((ndo, "DODAG Information Solicitation"));
+ if(ndo->ndo_vflag) {
+ }
+ break;
+ case ND_RPL_DAG_IO:
+ ND_PRINT((ndo, "DODAG Information Object"));
+ if(ndo->ndo_vflag) {
+ rpl_dio_print(ndo, bp, length);
+ }
+ break;
+ case ND_RPL_DAO:
+ ND_PRINT((ndo, "Destination Advertisement Object"));
+ if(ndo->ndo_vflag) {
+ rpl_dao_print(ndo, bp, length);
+ }
+ break;
+ case ND_RPL_DAO_ACK:
+ ND_PRINT((ndo, "Destination Advertisement Object Ack"));
+ if(ndo->ndo_vflag) {
+ rpl_daoack_print(ndo, bp, length);
+ }
+ break;
+ default:
+ ND_PRINT((ndo, "RPL message, unknown code %u",hdr->icmp6_code));
+ break;
+ }
+ return;
+
+#if 0
+trunc:
+ ND_PRINT((ndo," [|truncated]"));
+ return;
+#endif
+
+}
+
+
+void
+icmp6_print(netdissect_options *ndo,
+ const u_char *bp, u_int length, const u_char *bp2, int fragmented)
+{
+ const struct icmp6_hdr *dp;
+ const struct ip6_hdr *ip;
+ const struct ip6_hdr *oip;
+ const struct udphdr *ouh;
+ int dport;
+ const u_char *ep;
+ u_int prot;
+
+ dp = (struct icmp6_hdr *)bp;
+ ip = (struct ip6_hdr *)bp2;
+ oip = (struct ip6_hdr *)(dp + 1);
+ /* 'ep' points to the end of available data. */
+ ep = ndo->ndo_snapend;
+
+ ND_TCHECK(dp->icmp6_cksum);
+
+ if (ndo->ndo_vflag && !fragmented) {
+ uint16_t sum, udp_sum;
+
+ if (ND_TTEST2(bp[0], length)) {
+ udp_sum = EXTRACT_16BITS(&dp->icmp6_cksum);
+ sum = icmp6_cksum(ip, dp, length);
+ if (sum != 0)
+ ND_PRINT((ndo,"[bad icmp6 cksum 0x%04x -> 0x%04x!] ",
+ udp_sum,
+ in_cksum_shouldbe(udp_sum, sum)));
+ else
+ ND_PRINT((ndo,"[icmp6 sum ok] "));
+ }
+ }
+
+ ND_PRINT((ndo,"ICMP6, %s", tok2str(icmp6_type_values,"unknown icmp6 type (%u)",dp->icmp6_type)));
+
+ /* display cosmetics: print the packet length for printer that use the vflag now */
+ if (ndo->ndo_vflag)
+ switch (dp->icmp6_type) {
+ case ND_ROUTER_SOLICIT:
+ case ND_ROUTER_ADVERT:
+ case ND_NEIGHBOR_ADVERT:
+ case ND_NEIGHBOR_SOLICIT:
+ case ND_REDIRECT:
+ case ICMP6_HADISCOV_REPLY:
+ case ICMP6_MOBILEPREFIX_ADVERT:
+ ND_PRINT((ndo, ", length %u", length));
+ break;
+ default:
+ break;
+ }
+
+ switch (dp->icmp6_type) {
+ case ICMP6_DST_UNREACH:
+ ND_TCHECK(oip->ip6_dst);
+ ND_PRINT((ndo,", %s", tok2str(icmp6_dst_unreach_code_values,"unknown unreach code (%u)",dp->icmp6_code)));
+ switch (dp->icmp6_code) {
+
+ case ICMP6_DST_UNREACH_NOROUTE: /* fall through */
+ case ICMP6_DST_UNREACH_ADMIN:
+ case ICMP6_DST_UNREACH_ADDR:
+ ND_PRINT((ndo," %s",ip6addr_string(ndo, &oip->ip6_dst)));
+ break;
+ case ICMP6_DST_UNREACH_BEYONDSCOPE:
+ ND_PRINT((ndo," %s, source address %s",
+ ip6addr_string(ndo, &oip->ip6_dst),
+ ip6addr_string(ndo, &oip->ip6_src)));
+ break;
+ case ICMP6_DST_UNREACH_NOPORT:
+ if ((ouh = get_upperlayer(ndo, (u_char *)oip, &prot))
+ == NULL)
+ goto trunc;
+
+ dport = EXTRACT_16BITS(&ouh->uh_dport);
+ switch (prot) {
+ case IPPROTO_TCP:
+ ND_PRINT((ndo,", %s tcp port %s",
+ ip6addr_string(ndo, &oip->ip6_dst),
+ tcpport_string(dport)));
+ break;
+ case IPPROTO_UDP:
+ ND_PRINT((ndo,", %s udp port %s",
+ ip6addr_string(ndo, &oip->ip6_dst),
+ udpport_string(dport)));
+ break;
+ default:
+ ND_PRINT((ndo,", %s protocol %d port %d unreachable",
+ ip6addr_string(ndo, &oip->ip6_dst),
+ oip->ip6_nxt, dport));
+ break;
+ }
+ break;
+ default:
+ if (ndo->ndo_vflag <= 1) {
+ print_unknown_data(ndo, bp,"\n\t",length);
+ return;
+ }
+ break;
+ }
+ break;
+ case ICMP6_PACKET_TOO_BIG:
+ ND_TCHECK(dp->icmp6_mtu);
+ ND_PRINT((ndo,", mtu %u", EXTRACT_32BITS(&dp->icmp6_mtu)));
+ break;
+ case ICMP6_TIME_EXCEEDED:
+ ND_TCHECK(oip->ip6_dst);
+ switch (dp->icmp6_code) {
+ case ICMP6_TIME_EXCEED_TRANSIT:
+ ND_PRINT((ndo," for %s",
+ ip6addr_string(ndo, &oip->ip6_dst)));
+ break;
+ case ICMP6_TIME_EXCEED_REASSEMBLY:
+ ND_PRINT((ndo," (reassembly)"));
+ break;
+ default:
+ ND_PRINT((ndo,", unknown code (%u)", dp->icmp6_code));
+ break;
+ }
+ break;
+ case ICMP6_PARAM_PROB:
+ ND_TCHECK(oip->ip6_dst);
+ switch (dp->icmp6_code) {
+ case ICMP6_PARAMPROB_HEADER:
+ ND_PRINT((ndo,", erroneous - octet %u", EXTRACT_32BITS(&dp->icmp6_pptr)));
+ break;
+ case ICMP6_PARAMPROB_NEXTHEADER:
+ ND_PRINT((ndo,", next header - octet %u", EXTRACT_32BITS(&dp->icmp6_pptr)));
+ break;
+ case ICMP6_PARAMPROB_OPTION:
+ ND_PRINT((ndo,", option - octet %u", EXTRACT_32BITS(&dp->icmp6_pptr)));
+ break;
+ default:
+ ND_PRINT((ndo,", code-#%d",
+ dp->icmp6_code));
+ break;
+ }
+ break;
+ case ICMP6_ECHO_REQUEST:
+ case ICMP6_ECHO_REPLY:
+ ND_TCHECK(dp->icmp6_seq);
+ ND_PRINT((ndo,", seq %u", EXTRACT_16BITS(&dp->icmp6_seq)));
+ break;
+ case ICMP6_MEMBERSHIP_QUERY:
+ if (length == MLD_MINLEN) {
+ mld6_print(ndo, (const u_char *)dp);
+ } else if (length >= MLDV2_MINLEN) {
+ ND_PRINT((ndo," v2"));
+ mldv2_query_print(ndo, (const u_char *)dp, length);
+ } else {
+ ND_PRINT((ndo," unknown-version (len %u) ", length));
+ }
+ break;
+ case ICMP6_MEMBERSHIP_REPORT:
+ mld6_print(ndo, (const u_char *)dp);
+ break;
+ case ICMP6_MEMBERSHIP_REDUCTION:
+ mld6_print(ndo, (const u_char *)dp);
+ break;
+ case ND_ROUTER_SOLICIT:
+#define RTSOLLEN 8
+ if (ndo->ndo_vflag) {
+ icmp6_opt_print(ndo, (const u_char *)dp + RTSOLLEN,
+ length - RTSOLLEN);
+ }
+ break;
+ case ND_ROUTER_ADVERT:
+#define RTADVLEN 16
+ if (ndo->ndo_vflag) {
+ struct nd_router_advert *p;
+
+ p = (struct nd_router_advert *)dp;
+ ND_TCHECK(p->nd_ra_retransmit);
+ ND_PRINT((ndo,"\n\thop limit %u, Flags [%s]" \
+ ", pref %s, router lifetime %us, reachable time %us, retrans time %us",
+ (u_int)p->nd_ra_curhoplimit,
+ bittok2str(icmp6_opt_ra_flag_values,"none",(p->nd_ra_flags_reserved)),
+ get_rtpref(p->nd_ra_flags_reserved),
+ EXTRACT_16BITS(&p->nd_ra_router_lifetime),
+ EXTRACT_32BITS(&p->nd_ra_reachable),
+ EXTRACT_32BITS(&p->nd_ra_retransmit)));
+
+ icmp6_opt_print(ndo, (const u_char *)dp + RTADVLEN,
+ length - RTADVLEN);
+ }
+ break;
+ case ND_NEIGHBOR_SOLICIT:
+ {
+ struct nd_neighbor_solicit *p;
+ p = (struct nd_neighbor_solicit *)dp;
+ ND_TCHECK(p->nd_ns_target);
+ ND_PRINT((ndo,", who has %s", ip6addr_string(ndo, &p->nd_ns_target)));
+ if (ndo->ndo_vflag) {
+#define NDSOLLEN 24
+ icmp6_opt_print(ndo, (const u_char *)dp + NDSOLLEN,
+ length - NDSOLLEN);
+ }
+ }
+ break;
+ case ND_NEIGHBOR_ADVERT:
+ {
+ struct nd_neighbor_advert *p;
+
+ p = (struct nd_neighbor_advert *)dp;
+ ND_TCHECK(p->nd_na_target);
+ ND_PRINT((ndo,", tgt is %s",
+ ip6addr_string(ndo, &p->nd_na_target)));
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo,", Flags [%s]",
+ bittok2str(icmp6_nd_na_flag_values,
+ "none",
+ EXTRACT_32BITS(&p->nd_na_flags_reserved))));
+#define NDADVLEN 24
+ icmp6_opt_print(ndo, (const u_char *)dp + NDADVLEN,
+ length - NDADVLEN);
+#undef NDADVLEN
+ }
+ }
+ break;
+ case ND_REDIRECT:
+#define RDR(i) ((struct nd_redirect *)(i))
+ ND_TCHECK(RDR(dp)->nd_rd_dst);
+ ND_PRINT((ndo,", %s", getname6(ndo, (const u_char *)&RDR(dp)->nd_rd_dst)));
+ ND_TCHECK(RDR(dp)->nd_rd_target);
+ ND_PRINT((ndo," to %s",
+ getname6(ndo, (const u_char*)&RDR(dp)->nd_rd_target)));
+#define REDIRECTLEN 40
+ if (ndo->ndo_vflag) {
+ icmp6_opt_print(ndo, (const u_char *)dp + REDIRECTLEN,
+ length - REDIRECTLEN);
+ }
+ break;
+#undef REDIRECTLEN
+#undef RDR
+ case ICMP6_ROUTER_RENUMBERING:
+ icmp6_rrenum_print(ndo, bp, ep);
+ break;
+ case ICMP6_NI_QUERY:
+ case ICMP6_NI_REPLY:
+ icmp6_nodeinfo_print(ndo, length, bp, ep);
+ break;
+ case IND_SOLICIT:
+ case IND_ADVERT:
+ break;
+ case ICMP6_V2_MEMBERSHIP_REPORT:
+ mldv2_report_print(ndo, (const u_char *) dp, length);
+ break;
+ case ICMP6_MOBILEPREFIX_SOLICIT: /* fall through */
+ case ICMP6_HADISCOV_REQUEST:
+ ND_TCHECK(dp->icmp6_data16[0]);
+ ND_PRINT((ndo,", id 0x%04x", EXTRACT_16BITS(&dp->icmp6_data16[0])));
+ break;
+ case ICMP6_HADISCOV_REPLY:
+ if (ndo->ndo_vflag) {
+ struct in6_addr *in6;
+ u_char *cp;
+
+ ND_TCHECK(dp->icmp6_data16[0]);
+ ND_PRINT((ndo,", id 0x%04x", EXTRACT_16BITS(&dp->icmp6_data16[0])));
+ cp = (u_char *)dp + length;
+ in6 = (struct in6_addr *)(dp + 1);
+ for (; (u_char *)in6 < cp; in6++) {
+ ND_TCHECK(*in6);
+ ND_PRINT((ndo,", %s", ip6addr_string(ndo, in6)));
+ }
+ }
+ break;
+ case ICMP6_MOBILEPREFIX_ADVERT:
+ if (ndo->ndo_vflag) {
+ ND_TCHECK(dp->icmp6_data16[0]);
+ ND_PRINT((ndo,", id 0x%04x", EXTRACT_16BITS(&dp->icmp6_data16[0])));
+ if (dp->icmp6_data16[1] & 0xc0)
+ ND_PRINT((ndo," "));
+ if (dp->icmp6_data16[1] & 0x80)
+ ND_PRINT((ndo,"M"));
+ if (dp->icmp6_data16[1] & 0x40)
+ ND_PRINT((ndo,"O"));
+#define MPADVLEN 8
+ icmp6_opt_print(ndo, (const u_char *)dp + MPADVLEN,
+ length - MPADVLEN);
+ }
+ break;
+ case ND_RPL_MESSAGE:
+ /* plus 4, because struct icmp6_hdr contains 4 bytes of icmp payload */
+ rpl_print(ndo, dp, &dp->icmp6_data8[0], length-sizeof(struct icmp6_hdr)+4);
+ break;
+ default:
+ ND_PRINT((ndo,", length %u", length));
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, bp,"\n\t", length);
+ return;
+ }
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo,", length %u", length));
+ return;
+trunc:
+ ND_PRINT((ndo, "[|icmp6]"));
+}
+
+static const struct udphdr *
+get_upperlayer(netdissect_options *ndo, const u_char *bp, u_int *prot)
+{
+ const u_char *ep;
+ const struct ip6_hdr *ip6 = (struct ip6_hdr *)bp;
+ const struct udphdr *uh;
+ const struct ip6_hbh *hbh;
+ const struct ip6_frag *fragh;
+ const struct ah *ah;
+ u_int nh;
+ int hlen;
+
+ /* 'ep' points to the end of available data. */
+ ep = ndo->ndo_snapend;
+
+ if (!ND_TTEST(ip6->ip6_nxt))
+ return NULL;
+
+ nh = ip6->ip6_nxt;
+ hlen = sizeof(struct ip6_hdr);
+
+ while (bp < ep) {
+ bp += hlen;
+
+ switch(nh) {
+ case IPPROTO_UDP:
+ case IPPROTO_TCP:
+ uh = (struct udphdr *)bp;
+ if (ND_TTEST(uh->uh_dport)) {
+ *prot = nh;
+ return(uh);
+ }
+ else
+ return(NULL);
+ /* NOTREACHED */
+
+ case IPPROTO_HOPOPTS:
+ case IPPROTO_DSTOPTS:
+ case IPPROTO_ROUTING:
+ hbh = (struct ip6_hbh *)bp;
+ if (!ND_TTEST(hbh->ip6h_len))
+ return(NULL);
+ nh = hbh->ip6h_nxt;
+ hlen = (hbh->ip6h_len + 1) << 3;
+ break;
+
+ case IPPROTO_FRAGMENT: /* this should be odd, but try anyway */
+ fragh = (struct ip6_frag *)bp;
+ if (!ND_TTEST(fragh->ip6f_offlg))
+ return(NULL);
+ /* fragments with non-zero offset are meaningless */
+ if ((EXTRACT_16BITS(&fragh->ip6f_offlg) & IP6F_OFF_MASK) != 0)
+ return(NULL);
+ nh = fragh->ip6f_nxt;
+ hlen = sizeof(struct ip6_frag);
+ break;
+
+ case IPPROTO_AH:
+ ah = (struct ah *)bp;
+ if (!ND_TTEST(ah->ah_len))
+ return(NULL);
+ nh = ah->ah_nxt;
+ hlen = (ah->ah_len + 2) << 2;
+ break;
+
+ default: /* unknown or undecodable header */
+ *prot = nh; /* meaningless, but set here anyway */
+ return(NULL);
+ }
+ }
+
+ return(NULL); /* should be notreached, though */
+}
+
+static void
+icmp6_opt_print(netdissect_options *ndo, const u_char *bp, int resid)
+{
+ const struct nd_opt_hdr *op;
+ const struct nd_opt_prefix_info *opp;
+ const struct nd_opt_mtu *opm;
+ const struct nd_opt_rdnss *oprd;
+ const struct nd_opt_dnssl *opds;
+ const struct nd_opt_advinterval *opa;
+ const struct nd_opt_homeagent_info *oph;
+ const struct nd_opt_route_info *opri;
+ const u_char *cp, *ep, *domp;
+ struct in6_addr in6, *in6p;
+ size_t l;
+ u_int i;
+
+#define ECHECK(var) if ((u_char *)&(var) > ep - sizeof(var)) return
+
+ cp = bp;
+ /* 'ep' points to the end of available data. */
+ ep = ndo->ndo_snapend;
+
+ while (cp < ep) {
+ op = (struct nd_opt_hdr *)cp;
+
+ ECHECK(op->nd_opt_len);
+ if (resid <= 0)
+ return;
+ if (op->nd_opt_len == 0)
+ goto trunc;
+ if (cp + (op->nd_opt_len << 3) > ep)
+ goto trunc;
+
+ ND_PRINT((ndo,"\n\t %s option (%u), length %u (%u): ",
+ tok2str(icmp6_opt_values, "unknown", op->nd_opt_type),
+ op->nd_opt_type,
+ op->nd_opt_len << 3,
+ op->nd_opt_len));
+
+ switch (op->nd_opt_type) {
+ case ND_OPT_SOURCE_LINKADDR:
+ l = (op->nd_opt_len << 3) - 2;
+ print_lladdr(ndo, cp + 2, l);
+ break;
+ case ND_OPT_TARGET_LINKADDR:
+ l = (op->nd_opt_len << 3) - 2;
+ print_lladdr(ndo, cp + 2, l);
+ break;
+ case ND_OPT_PREFIX_INFORMATION:
+ opp = (struct nd_opt_prefix_info *)op;
+ ND_TCHECK(opp->nd_opt_pi_prefix);
+ ND_PRINT((ndo,"%s/%u%s, Flags [%s], valid time %s",
+ ip6addr_string(ndo, &opp->nd_opt_pi_prefix),
+ opp->nd_opt_pi_prefix_len,
+ (op->nd_opt_len != 4) ? "badlen" : "",
+ bittok2str(icmp6_opt_pi_flag_values, "none", opp->nd_opt_pi_flags_reserved),
+ get_lifetime(EXTRACT_32BITS(&opp->nd_opt_pi_valid_time))));
+ ND_PRINT((ndo,", pref. time %s", get_lifetime(EXTRACT_32BITS(&opp->nd_opt_pi_preferred_time))));
+ break;
+ case ND_OPT_REDIRECTED_HEADER:
+ print_unknown_data(ndo, bp,"\n\t ",op->nd_opt_len<<3);
+ /* xxx */
+ break;
+ case ND_OPT_MTU:
+ opm = (struct nd_opt_mtu *)op;
+ ND_TCHECK(opm->nd_opt_mtu_mtu);
+ ND_PRINT((ndo," %u%s",
+ EXTRACT_32BITS(&opm->nd_opt_mtu_mtu),
+ (op->nd_opt_len != 1) ? "bad option length" : "" ));
+ break;
+ case ND_OPT_RDNSS:
+ oprd = (struct nd_opt_rdnss *)op;
+ l = (op->nd_opt_len - 1) / 2;
+ ND_PRINT((ndo," lifetime %us,",
+ EXTRACT_32BITS(&oprd->nd_opt_rdnss_lifetime)));
+ for (i = 0; i < l; i++) {
+ ND_TCHECK(oprd->nd_opt_rdnss_addr[i]);
+ ND_PRINT((ndo," addr: %s",
+ ip6addr_string(ndo, &oprd->nd_opt_rdnss_addr[i])));
+ }
+ break;
+ case ND_OPT_DNSSL:
+ opds = (struct nd_opt_dnssl *)op;
+ ND_PRINT((ndo," lifetime %us, domain(s):",
+ EXTRACT_32BITS(&opds->nd_opt_dnssl_lifetime)));
+ domp = cp + 8; /* domain names, variable-sized, RFC1035-encoded */
+ while (domp < cp + (op->nd_opt_len << 3) && *domp != '\0')
+ {
+ ND_PRINT((ndo, " "));
+ if ((domp = ns_nprint (ndo, domp, bp)) == NULL)
+ goto trunc;
+ }
+ break;
+ case ND_OPT_ADVINTERVAL:
+ opa = (struct nd_opt_advinterval *)op;
+ ND_TCHECK(opa->nd_opt_adv_interval);
+ ND_PRINT((ndo," %ums", EXTRACT_32BITS(&opa->nd_opt_adv_interval)));
+ break;
+ case ND_OPT_HOMEAGENT_INFO:
+ oph = (struct nd_opt_homeagent_info *)op;
+ ND_TCHECK(oph->nd_opt_hai_lifetime);
+ ND_PRINT((ndo," preference %u, lifetime %u",
+ EXTRACT_16BITS(&oph->nd_opt_hai_preference),
+ EXTRACT_16BITS(&oph->nd_opt_hai_lifetime)));
+ break;
+ case ND_OPT_ROUTE_INFO:
+ opri = (struct nd_opt_route_info *)op;
+ ND_TCHECK(opri->nd_opt_rti_lifetime);
+ memset(&in6, 0, sizeof(in6));
+ in6p = (struct in6_addr *)(opri + 1);
+ switch (op->nd_opt_len) {
+ case 1:
+ break;
+ case 2:
+ ND_TCHECK2(*in6p, 8);
+ memcpy(&in6, opri + 1, 8);
+ break;
+ case 3:
+ ND_TCHECK(*in6p);
+ memcpy(&in6, opri + 1, sizeof(in6));
+ break;
+ default:
+ goto trunc;
+ }
+ ND_PRINT((ndo," %s/%u", ip6addr_string(ndo, &in6),
+ opri->nd_opt_rti_prefixlen));
+ ND_PRINT((ndo,", pref=%s", get_rtpref(opri->nd_opt_rti_flags)));
+ ND_PRINT((ndo,", lifetime=%s",
+ get_lifetime(EXTRACT_32BITS(&opri->nd_opt_rti_lifetime))));
+ break;
+ default:
+ if (ndo->ndo_vflag <= 1) {
+ print_unknown_data(ndo,cp+2,"\n\t ", (op->nd_opt_len << 3) - 2); /* skip option header */
+ return;
+ }
+ break;
+ }
+ /* do we want to see an additional hexdump ? */
+ if (ndo->ndo_vflag> 1)
+ print_unknown_data(ndo, cp+2,"\n\t ", (op->nd_opt_len << 3) - 2); /* skip option header */
+
+ cp += op->nd_opt_len << 3;
+ resid -= op->nd_opt_len << 3;
+ }
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "[ndp opt]"));
+ return;
+#undef ECHECK
+}
+
+static void
+mld6_print(netdissect_options *ndo, const u_char *bp)
+{
+ const struct mld6_hdr *mp = (struct mld6_hdr *)bp;
+ const u_char *ep;
+
+ /* 'ep' points to the end of available data. */
+ ep = ndo->ndo_snapend;
+
+ if ((u_char *)mp + sizeof(*mp) > ep)
+ return;
+
+ ND_PRINT((ndo,"max resp delay: %d ", EXTRACT_16BITS(&mp->mld6_maxdelay)));
+ ND_PRINT((ndo,"addr: %s", ip6addr_string(ndo, &mp->mld6_addr)));
+}
+
+static void
+mldv2_report_print(netdissect_options *ndo, const u_char *bp, u_int len)
+{
+ struct icmp6_hdr *icp = (struct icmp6_hdr *) bp;
+ u_int group, nsrcs, ngroups;
+ u_int i, j;
+
+ /* Minimum len is 8 */
+ if (len < 8) {
+ ND_PRINT((ndo," [invalid len %d]", len));
+ return;
+ }
+
+ ND_TCHECK(icp->icmp6_data16[1]);
+ ngroups = EXTRACT_16BITS(&icp->icmp6_data16[1]);
+ ND_PRINT((ndo,", %d group record(s)", ngroups));
+ if (ndo->ndo_vflag > 0) {
+ /* Print the group records */
+ group = 8;
+ for (i = 0; i < ngroups; i++) {
+ /* type(1) + auxlen(1) + numsrc(2) + grp(16) */
+ if (len < group + 20) {
+ ND_PRINT((ndo," [invalid number of groups]"));
+ return;
+ }
+ ND_TCHECK2(bp[group + 4], sizeof(struct in6_addr));
+ ND_PRINT((ndo," [gaddr %s", ip6addr_string(ndo, &bp[group + 4])));
+ ND_PRINT((ndo," %s", tok2str(mldv2report2str, " [v2-report-#%d]",
+ bp[group])));
+ nsrcs = (bp[group + 2] << 8) + bp[group + 3];
+ /* Check the number of sources and print them */
+ if (len < group + 20 + (nsrcs * sizeof(struct in6_addr))) {
+ ND_PRINT((ndo," [invalid number of sources %d]", nsrcs));
+ return;
+ }
+ if (ndo->ndo_vflag == 1)
+ ND_PRINT((ndo,", %d source(s)", nsrcs));
+ else {
+ /* Print the sources */
+ ND_PRINT((ndo," {"));
+ for (j = 0; j < nsrcs; j++) {
+ ND_TCHECK2(bp[group + 20 + j * sizeof(struct in6_addr)],
+ sizeof(struct in6_addr));
+ ND_PRINT((ndo," %s", ip6addr_string(ndo, &bp[group + 20 + j * sizeof(struct in6_addr)])));
+ }
+ ND_PRINT((ndo," }"));
+ }
+ /* Next group record */
+ group += 20 + nsrcs * sizeof(struct in6_addr);
+ ND_PRINT((ndo,"]"));
+ }
+ }
+ return;
+trunc:
+ ND_PRINT((ndo,"[|icmp6]"));
+ return;
+}
+
+static void
+mldv2_query_print(netdissect_options *ndo, const u_char *bp, u_int len)
+{
+ struct icmp6_hdr *icp = (struct icmp6_hdr *) bp;
+ u_int mrc;
+ int mrt, qqi;
+ u_int nsrcs;
+ register u_int i;
+
+ /* Minimum len is 28 */
+ if (len < 28) {
+ ND_PRINT((ndo," [invalid len %d]", len));
+ return;
+ }
+ ND_TCHECK(icp->icmp6_data16[0]);
+ mrc = EXTRACT_16BITS(&icp->icmp6_data16[0]);
+ if (mrc < 32768) {
+ mrt = mrc;
+ } else {
+ mrt = ((mrc & 0x0fff) | 0x1000) << (((mrc & 0x7000) >> 12) + 3);
+ }
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo," [max resp delay=%d]", mrt));
+ }
+ ND_TCHECK2(bp[8], sizeof(struct in6_addr));
+ ND_PRINT((ndo," [gaddr %s", ip6addr_string(ndo, &bp[8])));
+
+ if (ndo->ndo_vflag) {
+ ND_TCHECK(bp[25]);
+ if (bp[24] & 0x08) {
+ ND_PRINT((ndo," sflag"));
+ }
+ if (bp[24] & 0x07) {
+ ND_PRINT((ndo," robustness=%d", bp[24] & 0x07));
+ }
+ if (bp[25] < 128) {
+ qqi = bp[25];
+ } else {
+ qqi = ((bp[25] & 0x0f) | 0x10) << (((bp[25] & 0x70) >> 4) + 3);
+ }
+ ND_PRINT((ndo," qqi=%d", qqi));
+ }
+
+ ND_TCHECK2(bp[26], 2);
+ nsrcs = EXTRACT_16BITS(&bp[26]);
+ if (nsrcs > 0) {
+ if (len < 28 + nsrcs * sizeof(struct in6_addr))
+ ND_PRINT((ndo," [invalid number of sources]"));
+ else if (ndo->ndo_vflag > 1) {
+ ND_PRINT((ndo," {"));
+ for (i = 0; i < nsrcs; i++) {
+ ND_TCHECK2(bp[28 + i * sizeof(struct in6_addr)],
+ sizeof(struct in6_addr));
+ ND_PRINT((ndo," %s", ip6addr_string(ndo, &bp[28 + i * sizeof(struct in6_addr)])));
+ }
+ ND_PRINT((ndo," }"));
+ } else
+ ND_PRINT((ndo,", %d source(s)", nsrcs));
+ }
+ ND_PRINT((ndo,"]"));
+ return;
+trunc:
+ ND_PRINT((ndo,"[|icmp6]"));
+ return;
+}
+
+static void
+dnsname_print(netdissect_options *ndo, const u_char *cp, const u_char *ep)
+{
+ int i;
+
+ /* DNS name decoding - no decompression */
+ ND_PRINT((ndo,", \""));
+ while (cp < ep) {
+ i = *cp++;
+ if (i) {
+ if (i > ep - cp) {
+ ND_PRINT((ndo,"???"));
+ break;
+ }
+ while (i-- && cp < ep) {
+ safeputchar(ndo, *cp);
+ cp++;
+ }
+ if (cp + 1 < ep && *cp)
+ ND_PRINT((ndo,"."));
+ } else {
+ if (cp == ep) {
+ /* FQDN */
+ ND_PRINT((ndo,"."));
+ } else if (cp + 1 == ep && *cp == '\0') {
+ /* truncated */
+ } else {
+ /* invalid */
+ ND_PRINT((ndo,"???"));
+ }
+ break;
+ }
+ }
+ ND_PRINT((ndo,"\""));
+}
+
+static void
+icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp, const u_char *ep)
+{
+ const struct icmp6_nodeinfo *ni6;
+ const struct icmp6_hdr *dp;
+ const u_char *cp;
+ size_t siz, i;
+ int needcomma;
+
+ if (ep < bp)
+ return;
+ dp = (struct icmp6_hdr *)bp;
+ ni6 = (struct icmp6_nodeinfo *)bp;
+ siz = ep - bp;
+
+ switch (ni6->ni_type) {
+ case ICMP6_NI_QUERY:
+ if (siz == sizeof(*dp) + 4) {
+ /* KAME who-are-you */
+ ND_PRINT((ndo," who-are-you request"));
+ break;
+ }
+ ND_PRINT((ndo," node information query"));
+
+ ND_TCHECK2(*dp, sizeof(*ni6));
+ ni6 = (struct icmp6_nodeinfo *)dp;
+ ND_PRINT((ndo," (")); /*)*/
+ switch (EXTRACT_16BITS(&ni6->ni_qtype)) {
+ case NI_QTYPE_NOOP:
+ ND_PRINT((ndo,"noop"));
+ break;
+ case NI_QTYPE_SUPTYPES:
+ ND_PRINT((ndo,"supported qtypes"));
+ i = EXTRACT_16BITS(&ni6->ni_flags);
+ if (i)
+ ND_PRINT((ndo," [%s]", (i & 0x01) ? "C" : ""));
+ break;
+ case NI_QTYPE_FQDN:
+ ND_PRINT((ndo,"DNS name"));
+ break;
+ case NI_QTYPE_NODEADDR:
+ ND_PRINT((ndo,"node addresses"));
+ i = ni6->ni_flags;
+ if (!i)
+ break;
+ /* NI_NODEADDR_FLAG_TRUNCATE undefined for query */
+ ND_PRINT((ndo," [%s%s%s%s%s%s]",
+ (i & NI_NODEADDR_FLAG_ANYCAST) ? "a" : "",
+ (i & NI_NODEADDR_FLAG_GLOBAL) ? "G" : "",
+ (i & NI_NODEADDR_FLAG_SITELOCAL) ? "S" : "",
+ (i & NI_NODEADDR_FLAG_LINKLOCAL) ? "L" : "",
+ (i & NI_NODEADDR_FLAG_COMPAT) ? "C" : "",
+ (i & NI_NODEADDR_FLAG_ALL) ? "A" : ""));
+ break;
+ default:
+ ND_PRINT((ndo,"unknown"));
+ break;
+ }
+
+ if (ni6->ni_qtype == NI_QTYPE_NOOP ||
+ ni6->ni_qtype == NI_QTYPE_SUPTYPES) {
+ if (siz != sizeof(*ni6))
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo,", invalid len"));
+ /*(*/
+ ND_PRINT((ndo,")"));
+ break;
+ }
+
+
+ /* XXX backward compat, icmp-name-lookup-03 */
+ if (siz == sizeof(*ni6)) {
+ ND_PRINT((ndo,", 03 draft"));
+ /*(*/
+ ND_PRINT((ndo,")"));
+ break;
+ }
+
+ switch (ni6->ni_code) {
+ case ICMP6_NI_SUBJ_IPV6:
+ if (!ND_TTEST2(*dp,
+ sizeof(*ni6) + sizeof(struct in6_addr)))
+ break;
+ if (siz != sizeof(*ni6) + sizeof(struct in6_addr)) {
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo,", invalid subject len"));
+ break;
+ }
+ ND_PRINT((ndo,", subject=%s",
+ getname6(ndo, (const u_char *)(ni6 + 1))));
+ break;
+ case ICMP6_NI_SUBJ_FQDN:
+ ND_PRINT((ndo,", subject=DNS name"));
+ cp = (const u_char *)(ni6 + 1);
+ if (cp[0] == ep - cp - 1) {
+ /* icmp-name-lookup-03, pascal string */
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo,", 03 draft"));
+ cp++;
+ ND_PRINT((ndo,", \""));
+ while (cp < ep) {
+ safeputchar(ndo, *cp);
+ cp++;
+ }
+ ND_PRINT((ndo,"\""));
+ } else
+ dnsname_print(ndo, cp, ep);
+ break;
+ case ICMP6_NI_SUBJ_IPV4:
+ if (!ND_TTEST2(*dp, sizeof(*ni6) + sizeof(struct in_addr)))
+ break;
+ if (siz != sizeof(*ni6) + sizeof(struct in_addr)) {
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo,", invalid subject len"));
+ break;
+ }
+ ND_PRINT((ndo,", subject=%s",
+ getname(ndo, (const u_char *)(ni6 + 1))));
+ break;
+ default:
+ ND_PRINT((ndo,", unknown subject"));
+ break;
+ }
+
+ /*(*/
+ ND_PRINT((ndo,")"));
+ break;
+
+ case ICMP6_NI_REPLY:
+ if (icmp6len > siz) {
+ ND_PRINT((ndo,"[|icmp6: node information reply]"));
+ break;
+ }
+
+ needcomma = 0;
+
+ ni6 = (struct icmp6_nodeinfo *)dp;
+ ND_PRINT((ndo," node information reply"));
+ ND_PRINT((ndo," (")); /*)*/
+ switch (ni6->ni_code) {
+ case ICMP6_NI_SUCCESS:
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo,"success"));
+ needcomma++;
+ }
+ break;
+ case ICMP6_NI_REFUSED:
+ ND_PRINT((ndo,"refused"));
+ needcomma++;
+ if (siz != sizeof(*ni6))
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo,", invalid length"));
+ break;
+ case ICMP6_NI_UNKNOWN:
+ ND_PRINT((ndo,"unknown"));
+ needcomma++;
+ if (siz != sizeof(*ni6))
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo,", invalid length"));
+ break;
+ }
+
+ if (ni6->ni_code != ICMP6_NI_SUCCESS) {
+ /*(*/
+ ND_PRINT((ndo,")"));
+ break;
+ }
+
+ switch (EXTRACT_16BITS(&ni6->ni_qtype)) {
+ case NI_QTYPE_NOOP:
+ if (needcomma)
+ ND_PRINT((ndo,", "));
+ ND_PRINT((ndo,"noop"));
+ if (siz != sizeof(*ni6))
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo,", invalid length"));
+ break;
+ case NI_QTYPE_SUPTYPES:
+ if (needcomma)
+ ND_PRINT((ndo,", "));
+ ND_PRINT((ndo,"supported qtypes"));
+ i = EXTRACT_16BITS(&ni6->ni_flags);
+ if (i)
+ ND_PRINT((ndo," [%s]", (i & 0x01) ? "C" : ""));
+ break;
+ case NI_QTYPE_FQDN:
+ if (needcomma)
+ ND_PRINT((ndo,", "));
+ ND_PRINT((ndo,"DNS name"));
+ cp = (const u_char *)(ni6 + 1) + 4;
+ if (cp[0] == ep - cp - 1) {
+ /* icmp-name-lookup-03, pascal string */
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo,", 03 draft"));
+ cp++;
+ ND_PRINT((ndo,", \""));
+ while (cp < ep) {
+ safeputchar(ndo, *cp);
+ cp++;
+ }
+ ND_PRINT((ndo,"\""));
+ } else
+ dnsname_print(ndo, cp, ep);
+ if ((EXTRACT_16BITS(&ni6->ni_flags) & 0x01) != 0)
+ ND_PRINT((ndo," [TTL=%u]", *(uint32_t *)(ni6 + 1)));
+ break;
+ case NI_QTYPE_NODEADDR:
+ if (needcomma)
+ ND_PRINT((ndo,", "));
+ ND_PRINT((ndo,"node addresses"));
+ i = sizeof(*ni6);
+ while (i < siz) {
+ if (i + sizeof(struct in6_addr) + sizeof(int32_t) > siz)
+ break;
+ ND_PRINT((ndo," %s", getname6(ndo, bp + i)));
+ i += sizeof(struct in6_addr);
+ ND_PRINT((ndo,"(%d)", (int32_t)EXTRACT_32BITS(bp + i)));
+ i += sizeof(int32_t);
+ }
+ i = ni6->ni_flags;
+ if (!i)
+ break;
+ ND_PRINT((ndo," [%s%s%s%s%s%s%s]",
+ (i & NI_NODEADDR_FLAG_ANYCAST) ? "a" : "",
+ (i & NI_NODEADDR_FLAG_GLOBAL) ? "G" : "",
+ (i & NI_NODEADDR_FLAG_SITELOCAL) ? "S" : "",
+ (i & NI_NODEADDR_FLAG_LINKLOCAL) ? "L" : "",
+ (i & NI_NODEADDR_FLAG_COMPAT) ? "C" : "",
+ (i & NI_NODEADDR_FLAG_ALL) ? "A" : "",
+ (i & NI_NODEADDR_FLAG_TRUNCATE) ? "T" : ""));
+ break;
+ default:
+ if (needcomma)
+ ND_PRINT((ndo,", "));
+ ND_PRINT((ndo,"unknown"));
+ break;
+ }
+
+ /*(*/
+ ND_PRINT((ndo,")"));
+ break;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|icmp6]"));
+}
+
+static void
+icmp6_rrenum_print(netdissect_options *ndo, const u_char *bp, const u_char *ep)
+{
+ const struct icmp6_router_renum *rr6;
+ const char *cp;
+ struct rr_pco_match *match;
+ struct rr_pco_use *use;
+ char hbuf[NI_MAXHOST];
+ int n;
+
+ if (ep < bp)
+ return;
+ rr6 = (struct icmp6_router_renum *)bp;
+ cp = (const char *)(rr6 + 1);
+
+ ND_TCHECK(rr6->rr_reserved);
+ switch (rr6->rr_code) {
+ case ICMP6_ROUTER_RENUMBERING_COMMAND:
+ ND_PRINT((ndo,"router renum: command"));
+ break;
+ case ICMP6_ROUTER_RENUMBERING_RESULT:
+ ND_PRINT((ndo,"router renum: result"));
+ break;
+ case ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET:
+ ND_PRINT((ndo,"router renum: sequence number reset"));
+ break;
+ default:
+ ND_PRINT((ndo,"router renum: code-#%d", rr6->rr_code));
+ break;
+ }
+
+ ND_PRINT((ndo,", seq=%u", EXTRACT_32BITS(&rr6->rr_seqnum)));
+
+ if (ndo->ndo_vflag) {
+#define F(x, y) ((rr6->rr_flags) & (x) ? (y) : "")
+ ND_PRINT((ndo,"[")); /*]*/
+ if (rr6->rr_flags) {
+ ND_PRINT((ndo,"%s%s%s%s%s,", F(ICMP6_RR_FLAGS_TEST, "T"),
+ F(ICMP6_RR_FLAGS_REQRESULT, "R"),
+ F(ICMP6_RR_FLAGS_FORCEAPPLY, "A"),
+ F(ICMP6_RR_FLAGS_SPECSITE, "S"),
+ F(ICMP6_RR_FLAGS_PREVDONE, "P")));
+ }
+ ND_PRINT((ndo,"seg=%u,", rr6->rr_segnum));
+ ND_PRINT((ndo,"maxdelay=%u", EXTRACT_16BITS(&rr6->rr_maxdelay)));
+ if (rr6->rr_reserved)
+ ND_PRINT((ndo,"rsvd=0x%x", EXTRACT_32BITS(&rr6->rr_reserved)));
+ /*[*/
+ ND_PRINT((ndo,"]"));
+#undef F
+ }
+
+ if (rr6->rr_code == ICMP6_ROUTER_RENUMBERING_COMMAND) {
+ match = (struct rr_pco_match *)cp;
+ cp = (const char *)(match + 1);
+
+ ND_TCHECK(match->rpm_prefix);
+
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo,"\n\t"));
+ else
+ ND_PRINT((ndo," "));
+ ND_PRINT((ndo,"match(")); /*)*/
+ switch (match->rpm_code) {
+ case RPM_PCO_ADD: ND_PRINT((ndo,"add")); break;
+ case RPM_PCO_CHANGE: ND_PRINT((ndo,"change")); break;
+ case RPM_PCO_SETGLOBAL: ND_PRINT((ndo,"setglobal")); break;
+ default: ND_PRINT((ndo,"#%u", match->rpm_code)); break;
+ }
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo,",ord=%u", match->rpm_ordinal));
+ ND_PRINT((ndo,",min=%u", match->rpm_minlen));
+ ND_PRINT((ndo,",max=%u", match->rpm_maxlen));
+ }
+ if (inet_ntop(AF_INET6, &match->rpm_prefix, hbuf, sizeof(hbuf)))
+ ND_PRINT((ndo,",%s/%u", hbuf, match->rpm_matchlen));
+ else
+ ND_PRINT((ndo,",?/%u", match->rpm_matchlen));
+ /*(*/
+ ND_PRINT((ndo,")"));
+
+ n = match->rpm_len - 3;
+ if (n % 4)
+ goto trunc;
+ n /= 4;
+ while (n-- > 0) {
+ use = (struct rr_pco_use *)cp;
+ cp = (const char *)(use + 1);
+
+ ND_TCHECK(use->rpu_prefix);
+
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo,"\n\t"));
+ else
+ ND_PRINT((ndo," "));
+ ND_PRINT((ndo,"use(")); /*)*/
+ if (use->rpu_flags) {
+#define F(x, y) ((use->rpu_flags) & (x) ? (y) : "")
+ ND_PRINT((ndo,"%s%s,",
+ F(ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME, "V"),
+ F(ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME, "P")));
+#undef F
+ }
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo,"mask=0x%x,", use->rpu_ramask));
+ ND_PRINT((ndo,"raflags=0x%x,", use->rpu_raflags));
+ if (~use->rpu_vltime == 0)
+ ND_PRINT((ndo,"vltime=infty,"));
+ else
+ ND_PRINT((ndo,"vltime=%u,",
+ EXTRACT_32BITS(&use->rpu_vltime)));
+ if (~use->rpu_pltime == 0)
+ ND_PRINT((ndo,"pltime=infty,"));
+ else
+ ND_PRINT((ndo,"pltime=%u,",
+ EXTRACT_32BITS(&use->rpu_pltime)));
+ }
+ if (inet_ntop(AF_INET6, &use->rpu_prefix, hbuf,
+ sizeof(hbuf)))
+ ND_PRINT((ndo,"%s/%u/%u", hbuf, use->rpu_uselen,
+ use->rpu_keeplen));
+ else
+ ND_PRINT((ndo,"?/%u/%u", use->rpu_uselen,
+ use->rpu_keeplen));
+ /*(*/
+ ND_PRINT((ndo,")"));
+ }
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo,"[|icmp6]"));
+}
+
+#endif /* INET6 */
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994, 1995, 1996
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-igmp.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+
+#ifndef IN_CLASSD
+#define IN_CLASSD(i) (((int32_t)(i) & 0xf0000000) == 0xe0000000)
+#endif
+
+static const char tstr[] = "[|igmp]";
+
+/* (following from ipmulti/mrouted/prune.h) */
+
+/*
+ * The packet format for a traceroute request.
+ */
+struct tr_query {
+ uint32_t tr_src; /* traceroute source */
+ uint32_t tr_dst; /* traceroute destination */
+ uint32_t tr_raddr; /* traceroute response address */
+ uint32_t tr_rttlqid; /* response ttl and qid */
+};
+
+#define TR_GETTTL(x) (int)(((x) >> 24) & 0xff)
+#define TR_GETQID(x) ((x) & 0x00ffffff)
+
+/*
+ * Traceroute response format. A traceroute response has a tr_query at the
+ * beginning, followed by one tr_resp for each hop taken.
+ */
+struct tr_resp {
+ uint32_t tr_qarr; /* query arrival time */
+ uint32_t tr_inaddr; /* incoming interface address */
+ uint32_t tr_outaddr; /* outgoing interface address */
+ uint32_t tr_rmtaddr; /* parent address in source tree */
+ uint32_t tr_vifin; /* input packet count on interface */
+ uint32_t tr_vifout; /* output packet count on interface */
+ uint32_t tr_pktcnt; /* total incoming packets for src-grp */
+ uint8_t tr_rproto; /* routing proto deployed on router */
+ uint8_t tr_fttl; /* ttl required to forward on outvif */
+ uint8_t tr_smask; /* subnet mask for src addr */
+ uint8_t tr_rflags; /* forwarding error codes */
+};
+
+/* defs within mtrace */
+#define TR_QUERY 1
+#define TR_RESP 2
+
+/* fields for tr_rflags (forwarding error codes) */
+#define TR_NO_ERR 0
+#define TR_WRONG_IF 1
+#define TR_PRUNED 2
+#define TR_OPRUNED 3
+#define TR_SCOPED 4
+#define TR_NO_RTE 5
+#define TR_NO_FWD 7
+#define TR_NO_SPACE 0x81
+#define TR_OLD_ROUTER 0x82
+
+/* fields for tr_rproto (routing protocol) */
+#define TR_PROTO_DVMRP 1
+#define TR_PROTO_MOSPF 2
+#define TR_PROTO_PIM 3
+#define TR_PROTO_CBT 4
+
+/* igmpv3 report types */
+static const struct tok igmpv3report2str[] = {
+ { 1, "is_in" },
+ { 2, "is_ex" },
+ { 3, "to_in" },
+ { 4, "to_ex" },
+ { 5, "allow" },
+ { 6, "block" },
+ { 0, NULL }
+};
+
+static void
+print_mtrace(netdissect_options *ndo,
+ register const u_char *bp, register u_int len)
+{
+ register const struct tr_query *tr = (const struct tr_query *)(bp + 8);
+
+ ND_TCHECK(*tr);
+ if (len < 8 + sizeof (struct tr_query)) {
+ ND_PRINT((ndo, " [invalid len %d]", len));
+ return;
+ }
+ ND_PRINT((ndo, "mtrace %u: %s to %s reply-to %s",
+ TR_GETQID(EXTRACT_32BITS(&tr->tr_rttlqid)),
+ ipaddr_string(ndo, &tr->tr_src), ipaddr_string(ndo, &tr->tr_dst),
+ ipaddr_string(ndo, &tr->tr_raddr)));
+ if (IN_CLASSD(EXTRACT_32BITS(&tr->tr_raddr)))
+ ND_PRINT((ndo, " with-ttl %d", TR_GETTTL(EXTRACT_32BITS(&tr->tr_rttlqid))));
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+print_mresp(netdissect_options *ndo,
+ register const u_char *bp, register u_int len)
+{
+ register const struct tr_query *tr = (const struct tr_query *)(bp + 8);
+
+ ND_TCHECK(*tr);
+ if (len < 8 + sizeof (struct tr_query)) {
+ ND_PRINT((ndo, " [invalid len %d]", len));
+ return;
+ }
+ ND_PRINT((ndo, "mresp %lu: %s to %s reply-to %s",
+ (u_long)TR_GETQID(EXTRACT_32BITS(&tr->tr_rttlqid)),
+ ipaddr_string(ndo, &tr->tr_src), ipaddr_string(ndo, &tr->tr_dst),
+ ipaddr_string(ndo, &tr->tr_raddr)));
+ if (IN_CLASSD(EXTRACT_32BITS(&tr->tr_raddr)))
+ ND_PRINT((ndo, " with-ttl %d", TR_GETTTL(EXTRACT_32BITS(&tr->tr_rttlqid))));
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+print_igmpv3_report(netdissect_options *ndo,
+ register const u_char *bp, register u_int len)
+{
+ u_int group, nsrcs, ngroups;
+ register u_int i, j;
+
+ /* Minimum len is 16, and should be a multiple of 4 */
+ if (len < 16 || len & 0x03) {
+ ND_PRINT((ndo, " [invalid len %d]", len));
+ return;
+ }
+ ND_TCHECK2(bp[6], 2);
+ ngroups = EXTRACT_16BITS(&bp[6]);
+ ND_PRINT((ndo, ", %d group record(s)", ngroups));
+ if (ndo->ndo_vflag > 0) {
+ /* Print the group records */
+ group = 8;
+ for (i=0; i<ngroups; i++) {
+ if (len < group+8) {
+ ND_PRINT((ndo, " [invalid number of groups]"));
+ return;
+ }
+ ND_TCHECK2(bp[group+4], 4);
+ ND_PRINT((ndo, " [gaddr %s", ipaddr_string(ndo, &bp[group+4])));
+ ND_PRINT((ndo, " %s", tok2str(igmpv3report2str, " [v3-report-#%d]",
+ bp[group])));
+ nsrcs = EXTRACT_16BITS(&bp[group+2]);
+ /* Check the number of sources and print them */
+ if (len < group+8+(nsrcs<<2)) {
+ ND_PRINT((ndo, " [invalid number of sources %d]", nsrcs));
+ return;
+ }
+ if (ndo->ndo_vflag == 1)
+ ND_PRINT((ndo, ", %d source(s)", nsrcs));
+ else {
+ /* Print the sources */
+ ND_PRINT((ndo, " {"));
+ for (j=0; j<nsrcs; j++) {
+ ND_TCHECK2(bp[group+8+(j<<2)], 4);
+ ND_PRINT((ndo, " %s", ipaddr_string(ndo, &bp[group+8+(j<<2)])));
+ }
+ ND_PRINT((ndo, " }"));
+ }
+ /* Next group record */
+ group += 8 + (nsrcs << 2);
+ ND_PRINT((ndo, "]"));
+ }
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+print_igmpv3_query(netdissect_options *ndo,
+ register const u_char *bp, register u_int len)
+{
+ u_int mrc;
+ int mrt;
+ u_int nsrcs;
+ register u_int i;
+
+ ND_PRINT((ndo, " v3"));
+ /* Minimum len is 12, and should be a multiple of 4 */
+ if (len < 12 || len & 0x03) {
+ ND_PRINT((ndo, " [invalid len %d]", len));
+ return;
+ }
+ ND_TCHECK(bp[1]);
+ mrc = bp[1];
+ if (mrc < 128) {
+ mrt = mrc;
+ } else {
+ mrt = ((mrc & 0x0f) | 0x10) << (((mrc & 0x70) >> 4) + 3);
+ }
+ if (mrc != 100) {
+ ND_PRINT((ndo, " [max resp time "));
+ if (mrt < 600) {
+ ND_PRINT((ndo, "%.1fs", mrt * 0.1));
+ } else {
+ relts_print(ndo, mrt / 10);
+ }
+ ND_PRINT((ndo, "]"));
+ }
+ ND_TCHECK2(bp[4], 4);
+ if (EXTRACT_32BITS(&bp[4]) == 0)
+ return;
+ ND_PRINT((ndo, " [gaddr %s", ipaddr_string(ndo, &bp[4])));
+ ND_TCHECK2(bp[10], 2);
+ nsrcs = EXTRACT_16BITS(&bp[10]);
+ if (nsrcs > 0) {
+ if (len < 12 + (nsrcs << 2))
+ ND_PRINT((ndo, " [invalid number of sources]"));
+ else if (ndo->ndo_vflag > 1) {
+ ND_PRINT((ndo, " {"));
+ for (i=0; i<nsrcs; i++) {
+ ND_TCHECK2(bp[12+(i<<2)], 4);
+ ND_PRINT((ndo, " %s", ipaddr_string(ndo, &bp[12+(i<<2)])));
+ }
+ ND_PRINT((ndo, " }"));
+ } else
+ ND_PRINT((ndo, ", %d source(s)", nsrcs));
+ }
+ ND_PRINT((ndo, "]"));
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+void
+igmp_print(netdissect_options *ndo,
+ register const u_char *bp, register u_int len)
+{
+ struct cksum_vec vec[1];
+
+ if (ndo->ndo_qflag) {
+ ND_PRINT((ndo, "igmp"));
+ return;
+ }
+
+ ND_TCHECK(bp[0]);
+ switch (bp[0]) {
+ case 0x11:
+ ND_PRINT((ndo, "igmp query"));
+ if (len >= 12)
+ print_igmpv3_query(ndo, bp, len);
+ else {
+ ND_TCHECK(bp[1]);
+ if (bp[1]) {
+ ND_PRINT((ndo, " v2"));
+ if (bp[1] != 100)
+ ND_PRINT((ndo, " [max resp time %d]", bp[1]));
+ } else
+ ND_PRINT((ndo, " v1"));
+ ND_TCHECK2(bp[4], 4);
+ if (EXTRACT_32BITS(&bp[4]))
+ ND_PRINT((ndo, " [gaddr %s]", ipaddr_string(ndo, &bp[4])));
+ if (len != 8)
+ ND_PRINT((ndo, " [len %d]", len));
+ }
+ break;
+ case 0x12:
+ ND_TCHECK2(bp[4], 4);
+ ND_PRINT((ndo, "igmp v1 report %s", ipaddr_string(ndo, &bp[4])));
+ if (len != 8)
+ ND_PRINT((ndo, " [len %d]", len));
+ break;
+ case 0x16:
+ ND_TCHECK2(bp[4], 4);
+ ND_PRINT((ndo, "igmp v2 report %s", ipaddr_string(ndo, &bp[4])));
+ break;
+ case 0x22:
+ ND_PRINT((ndo, "igmp v3 report"));
+ print_igmpv3_report(ndo, bp, len);
+ break;
+ case 0x17:
+ ND_TCHECK2(bp[4], 4);
+ ND_PRINT((ndo, "igmp leave %s", ipaddr_string(ndo, &bp[4])));
+ break;
+ case 0x13:
+ ND_PRINT((ndo, "igmp dvmrp"));
+ if (len < 8)
+ ND_PRINT((ndo, " [len %d]", len));
+ else
+ dvmrp_print(ndo, bp, len);
+ break;
+ case 0x14:
+ ND_PRINT((ndo, "igmp pimv1"));
+ pimv1_print(ndo, bp, len);
+ break;
+ case 0x1e:
+ print_mresp(ndo, bp, len);
+ break;
+ case 0x1f:
+ print_mtrace(ndo, bp, len);
+ break;
+ default:
+ ND_PRINT((ndo, "igmp-%d", bp[0]));
+ break;
+ }
+
+ if (ndo->ndo_vflag && ND_TTEST2(bp[0], len)) {
+ /* Check the IGMP checksum */
+ vec[0].ptr = bp;
+ vec[0].len = len;
+ if (in_cksum(vec, 1))
+ ND_PRINT((ndo, " bad igmp cksum %x!", EXTRACT_16BITS(&bp[2])));
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
--- /dev/null
+/*
+ * Copyright (c) 1996, 1997
+ * 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: (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.
+ *
+ * Initial contribution from Francis Dupont (francis.dupont@inria.fr)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-igrp.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h" /* must come after interface.h */
+
+/* Cisco IGRP definitions */
+
+/* IGRP Header */
+
+struct igrphdr {
+ uint8_t ig_vop; /* protocol version number / opcode */
+#define IGRP_V(x) (((x) & 0xf0) >> 4)
+#define IGRP_OP(x) ((x) & 0x0f)
+ uint8_t ig_ed; /* edition number */
+ uint16_t ig_as; /* autonomous system number */
+ uint16_t ig_ni; /* number of subnet in local net */
+ uint16_t ig_ns; /* number of networks in AS */
+ uint16_t ig_nx; /* number of networks ouside AS */
+ uint16_t ig_sum; /* checksum of IGRP header & data */
+};
+
+#define IGRP_UPDATE 1
+#define IGRP_REQUEST 2
+
+/* IGRP routing entry */
+
+struct igrprte {
+ uint8_t igr_net[3]; /* 3 significant octets of IP address */
+ uint8_t igr_dly[3]; /* delay in tens of microseconds */
+ uint8_t igr_bw[3]; /* bandwidth in units of 1 kb/s */
+ uint8_t igr_mtu[2]; /* MTU in octets */
+ uint8_t igr_rel; /* percent packets successfully tx/rx */
+ uint8_t igr_ld; /* percent of channel occupied */
+ uint8_t igr_hct; /* hop count */
+};
+
+#define IGRP_RTE_SIZE 14 /* don't believe sizeof ! */
+
+static void
+igrp_entry_print(netdissect_options *ndo, register struct igrprte *igr,
+ register int is_interior, register int is_exterior)
+{
+ register u_int delay, bandwidth;
+ u_int metric, mtu;
+
+ if (is_interior)
+ ND_PRINT((ndo, " *.%d.%d.%d", igr->igr_net[0],
+ igr->igr_net[1], igr->igr_net[2]));
+ else if (is_exterior)
+ ND_PRINT((ndo, " X%d.%d.%d.0", igr->igr_net[0],
+ igr->igr_net[1], igr->igr_net[2]));
+ else
+ ND_PRINT((ndo, " %d.%d.%d.0", igr->igr_net[0],
+ igr->igr_net[1], igr->igr_net[2]));
+
+ delay = EXTRACT_24BITS(igr->igr_dly);
+ bandwidth = EXTRACT_24BITS(igr->igr_bw);
+ metric = bandwidth + delay;
+ if (metric > 0xffffff)
+ metric = 0xffffff;
+ mtu = EXTRACT_16BITS(igr->igr_mtu);
+
+ ND_PRINT((ndo, " d=%d b=%d r=%d l=%d M=%d mtu=%d in %d hops",
+ 10 * delay, bandwidth == 0 ? 0 : 10000000 / bandwidth,
+ igr->igr_rel, igr->igr_ld, metric,
+ mtu, igr->igr_hct));
+}
+
+static const struct tok op2str[] = {
+ { IGRP_UPDATE, "update" },
+ { IGRP_REQUEST, "request" },
+ { 0, NULL }
+};
+
+void
+igrp_print(netdissect_options *ndo, register const u_char *bp, u_int length)
+{
+ register struct igrphdr *hdr;
+ register u_char *cp;
+ u_int nint, nsys, next;
+
+ hdr = (struct igrphdr *)bp;
+ cp = (u_char *)(hdr + 1);
+ ND_PRINT((ndo, "igrp:"));
+
+ /* Header */
+ ND_TCHECK(*hdr);
+ nint = EXTRACT_16BITS(&hdr->ig_ni);
+ nsys = EXTRACT_16BITS(&hdr->ig_ns);
+ next = EXTRACT_16BITS(&hdr->ig_nx);
+
+ ND_PRINT((ndo, " %s V%d edit=%d AS=%d (%d/%d/%d)",
+ tok2str(op2str, "op-#%d", IGRP_OP(hdr->ig_vop)),
+ IGRP_V(hdr->ig_vop),
+ hdr->ig_ed,
+ EXTRACT_16BITS(&hdr->ig_as),
+ nint,
+ nsys,
+ next));
+
+ length -= sizeof(*hdr);
+ while (length >= IGRP_RTE_SIZE) {
+ if (nint > 0) {
+ ND_TCHECK2(*cp, IGRP_RTE_SIZE);
+ igrp_entry_print(ndo, (struct igrprte *)cp, 1, 0);
+ --nint;
+ } else if (nsys > 0) {
+ ND_TCHECK2(*cp, IGRP_RTE_SIZE);
+ igrp_entry_print(ndo, (struct igrprte *)cp, 0, 0);
+ --nsys;
+ } else if (next > 0) {
+ ND_TCHECK2(*cp, IGRP_RTE_SIZE);
+ igrp_entry_print(ndo, (struct igrprte *)cp, 0, 1);
+ --next;
+ } else {
+ ND_PRINT((ndo, " [extra bytes %d]", length));
+ break;
+ }
+ cp += IGRP_RTE_SIZE;
+ length -= IGRP_RTE_SIZE;
+ }
+ if (nint == 0 && nsys == 0 && next == 0)
+ return;
+trunc:
+ ND_PRINT((ndo, " [|igrp]"));
+}
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ip.c,v 1.8 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+
+#include "ip.h"
+#include "ipproto.h"
+
+static const char tstr[] = "[|ip]";
+
+static const struct tok ip_option_values[] = {
+ { IPOPT_EOL, "EOL" },
+ { IPOPT_NOP, "NOP" },
+ { IPOPT_TS, "timestamp" },
+ { IPOPT_SECURITY, "security" },
+ { IPOPT_RR, "RR" },
+ { IPOPT_SSRR, "SSRR" },
+ { IPOPT_LSRR, "LSRR" },
+ { IPOPT_RA, "RA" },
+ { IPOPT_RFC1393, "traceroute" },
+ { 0, NULL }
+};
+
+/*
+ * print the recorded route in an IP RR, LSRR or SSRR option.
+ */
+static void
+ip_printroute(netdissect_options *ndo,
+ register const u_char *cp, u_int length)
+{
+ register u_int ptr;
+ register u_int len;
+
+ if (length < 3) {
+ ND_PRINT((ndo, " [bad length %u]", length));
+ return;
+ }
+ if ((length + 1) & 3)
+ ND_PRINT((ndo, " [bad length %u]", length));
+ ptr = cp[2] - 1;
+ if (ptr < 3 || ((ptr + 1) & 3) || ptr > length + 1)
+ ND_PRINT((ndo, " [bad ptr %u]", cp[2]));
+
+ for (len = 3; len < length; len += 4) {
+ ND_PRINT((ndo, " %s", ipaddr_string(ndo, &cp[len])));
+ if (ptr > len)
+ ND_PRINT((ndo, ","));
+ }
+}
+
+/*
+ * If source-routing is present and valid, return the final destination.
+ * Otherwise, return IP destination.
+ *
+ * This is used for UDP and TCP pseudo-header in the checksum
+ * calculation.
+ */
+static uint32_t
+ip_finddst(netdissect_options *ndo,
+ const struct ip *ip)
+{
+ int length;
+ int len;
+ const u_char *cp;
+ uint32_t retval;
+
+ cp = (const u_char *)(ip + 1);
+ length = (IP_HL(ip) << 2) - sizeof(struct ip);
+
+ for (; length > 0; cp += len, length -= len) {
+ int tt;
+
+ ND_TCHECK(*cp);
+ tt = *cp;
+ if (tt == IPOPT_EOL)
+ break;
+ else if (tt == IPOPT_NOP)
+ len = 1;
+ else {
+ ND_TCHECK(cp[1]);
+ len = cp[1];
+ if (len < 2)
+ break;
+ }
+ ND_TCHECK2(*cp, len);
+ switch (tt) {
+
+ case IPOPT_SSRR:
+ case IPOPT_LSRR:
+ if (len < 7)
+ break;
+ UNALIGNED_MEMCPY(&retval, cp + len - 4, 4);
+ return retval;
+ }
+ }
+trunc:
+ UNALIGNED_MEMCPY(&retval, &ip->ip_dst.s_addr, sizeof(uint32_t));
+ return retval;
+}
+
+/*
+ * Compute a V4-style checksum by building a pseudoheader.
+ */
+int
+nextproto4_cksum(netdissect_options *ndo,
+ const struct ip *ip, const uint8_t *data,
+ u_int len, u_int covlen, u_int next_proto)
+{
+ struct phdr {
+ uint32_t src;
+ uint32_t dst;
+ u_char mbz;
+ u_char proto;
+ uint16_t len;
+ } ph;
+ struct cksum_vec vec[2];
+
+ /* pseudo-header.. */
+ ph.len = htons((uint16_t)len);
+ ph.mbz = 0;
+ ph.proto = next_proto;
+ UNALIGNED_MEMCPY(&ph.src, &ip->ip_src.s_addr, sizeof(uint32_t));
+ if (IP_HL(ip) == 5)
+ UNALIGNED_MEMCPY(&ph.dst, &ip->ip_dst.s_addr, sizeof(uint32_t));
+ else
+ ph.dst = ip_finddst(ndo, ip);
+
+ vec[0].ptr = (const uint8_t *)(void *)&ph;
+ vec[0].len = sizeof(ph);
+ vec[1].ptr = data;
+ vec[1].len = covlen;
+ return (in_cksum(vec, 2));
+}
+
+static void
+ip_printts(netdissect_options *ndo,
+ register const u_char *cp, u_int length)
+{
+ register u_int ptr;
+ register u_int len;
+ int hoplen;
+ const char *type;
+
+ if (length < 4) {
+ ND_PRINT((ndo, "[bad length %u]", length));
+ return;
+ }
+ ND_PRINT((ndo, " TS{"));
+ hoplen = ((cp[3]&0xF) != IPOPT_TS_TSONLY) ? 8 : 4;
+ if ((length - 4) & (hoplen-1))
+ ND_PRINT((ndo, "[bad length %u]", length));
+ ptr = cp[2] - 1;
+ len = 0;
+ if (ptr < 4 || ((ptr - 4) & (hoplen-1)) || ptr > length + 1)
+ ND_PRINT((ndo, "[bad ptr %u]", cp[2]));
+ switch (cp[3]&0xF) {
+ case IPOPT_TS_TSONLY:
+ ND_PRINT((ndo, "TSONLY"));
+ break;
+ case IPOPT_TS_TSANDADDR:
+ ND_PRINT((ndo, "TS+ADDR"));
+ break;
+ /*
+ * prespecified should really be 3, but some ones might send 2
+ * instead, and the IPOPT_TS_PRESPEC constant can apparently
+ * have both values, so we have to hard-code it here.
+ */
+
+ case 2:
+ ND_PRINT((ndo, "PRESPEC2.0"));
+ break;
+ case 3: /* IPOPT_TS_PRESPEC */
+ ND_PRINT((ndo, "PRESPEC"));
+ break;
+ default:
+ ND_PRINT((ndo, "[bad ts type %d]", cp[3]&0xF));
+ goto done;
+ }
+
+ type = " ";
+ for (len = 4; len < length; len += hoplen) {
+ if (ptr == len)
+ type = " ^ ";
+ ND_PRINT((ndo, "%s%d@%s", type, EXTRACT_32BITS(&cp[len+hoplen-4]),
+ hoplen!=8 ? "" : ipaddr_string(ndo, &cp[len])));
+ type = " ";
+ }
+
+done:
+ ND_PRINT((ndo, "%s", ptr == len ? " ^ " : ""));
+
+ if (cp[3]>>4)
+ ND_PRINT((ndo, " [%d hops not recorded]} ", cp[3]>>4));
+ else
+ ND_PRINT((ndo, "}"));
+}
+
+/*
+ * print IP options.
+ */
+static void
+ip_optprint(netdissect_options *ndo,
+ register const u_char *cp, u_int length)
+{
+ register u_int option_len;
+ const char *sep = "";
+
+ for (; length > 0; cp += option_len, length -= option_len) {
+ u_int option_code;
+
+ ND_PRINT((ndo, "%s", sep));
+ sep = ",";
+
+ ND_TCHECK(*cp);
+ option_code = *cp;
+
+ ND_PRINT((ndo, "%s",
+ tok2str(ip_option_values,"unknown %u",option_code)));
+
+ if (option_code == IPOPT_NOP ||
+ option_code == IPOPT_EOL)
+ option_len = 1;
+
+ else {
+ ND_TCHECK(cp[1]);
+ option_len = cp[1];
+ if (option_len < 2) {
+ ND_PRINT((ndo, " [bad length %u]", option_len));
+ return;
+ }
+ }
+
+ if (option_len > length) {
+ ND_PRINT((ndo, " [bad length %u]", option_len));
+ return;
+ }
+
+ ND_TCHECK2(*cp, option_len);
+
+ switch (option_code) {
+ case IPOPT_EOL:
+ return;
+
+ case IPOPT_TS:
+ ip_printts(ndo, cp, option_len);
+ break;
+
+ case IPOPT_RR: /* fall through */
+ case IPOPT_SSRR:
+ case IPOPT_LSRR:
+ ip_printroute(ndo, cp, option_len);
+ break;
+
+ case IPOPT_RA:
+ if (option_len < 4) {
+ ND_PRINT((ndo, " [bad length %u]", option_len));
+ break;
+ }
+ ND_TCHECK(cp[3]);
+ if (EXTRACT_16BITS(&cp[2]) != 0)
+ ND_PRINT((ndo, " value %u", EXTRACT_16BITS(&cp[2])));
+ break;
+
+ case IPOPT_NOP: /* nothing to print - fall through */
+ case IPOPT_SECURITY:
+ default:
+ break;
+ }
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+#define IP_RES 0x8000
+
+static const struct tok ip_frag_values[] = {
+ { IP_MF, "+" },
+ { IP_DF, "DF" },
+ { IP_RES, "rsvd" }, /* The RFC3514 evil ;-) bit */
+ { 0, NULL }
+};
+
+struct ip_print_demux_state {
+ const struct ip *ip;
+ const u_char *cp;
+ u_int len, off;
+ u_char nh;
+ int advance;
+};
+
+static void
+ip_print_demux(netdissect_options *ndo,
+ struct ip_print_demux_state *ipds)
+{
+ struct protoent *proto;
+ struct cksum_vec vec[1];
+
+again:
+ switch (ipds->nh) {
+
+ case IPPROTO_AH:
+ ipds->nh = *ipds->cp;
+ ipds->advance = ah_print(ndo, ipds->cp);
+ if (ipds->advance <= 0)
+ break;
+ ipds->cp += ipds->advance;
+ ipds->len -= ipds->advance;
+ goto again;
+
+ case IPPROTO_ESP:
+ {
+ int enh, padlen;
+ ipds->advance = esp_print(ndo, ipds->cp, ipds->len,
+ (const u_char *)ipds->ip,
+ &enh, &padlen);
+ if (ipds->advance <= 0)
+ break;
+ ipds->cp += ipds->advance;
+ ipds->len -= ipds->advance + padlen;
+ ipds->nh = enh & 0xff;
+ goto again;
+ }
+
+ case IPPROTO_IPCOMP:
+ {
+ int enh;
+ ipds->advance = ipcomp_print(ndo, ipds->cp, &enh);
+ if (ipds->advance <= 0)
+ break;
+ ipds->cp += ipds->advance;
+ ipds->len -= ipds->advance;
+ ipds->nh = enh & 0xff;
+ goto again;
+ }
+
+ case IPPROTO_SCTP:
+ sctp_print(ndo, ipds->cp, (const u_char *)ipds->ip, ipds->len);
+ break;
+
+ case IPPROTO_DCCP:
+ dccp_print(ndo, ipds->cp, (const u_char *)ipds->ip, ipds->len);
+ break;
+
+ case IPPROTO_TCP:
+ /* pass on the MF bit plus the offset to detect fragments */
+ tcp_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip,
+ ipds->off & (IP_MF|IP_OFFMASK));
+ break;
+
+ case IPPROTO_UDP:
+ /* pass on the MF bit plus the offset to detect fragments */
+ udp_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip,
+ ipds->off & (IP_MF|IP_OFFMASK));
+ break;
+
+ case IPPROTO_ICMP:
+ /* pass on the MF bit plus the offset to detect fragments */
+ icmp_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip,
+ ipds->off & (IP_MF|IP_OFFMASK));
+ break;
+
+ case IPPROTO_PIGP:
+ /*
+ * XXX - the current IANA protocol number assignments
+ * page lists 9 as "any private interior gateway
+ * (used by Cisco for their IGRP)" and 88 as
+ * "EIGRP" from Cisco.
+ *
+ * Recent BSD <netinet/in.h> headers define
+ * IP_PROTO_PIGP as 9 and IP_PROTO_IGRP as 88.
+ * We define IP_PROTO_PIGP as 9 and
+ * IP_PROTO_EIGRP as 88; those names better
+ * match was the current protocol number
+ * assignments say.
+ */
+ igrp_print(ndo, ipds->cp, ipds->len);
+ break;
+
+ case IPPROTO_EIGRP:
+ eigrp_print(ndo, ipds->cp, ipds->len);
+ break;
+
+ case IPPROTO_ND:
+ ND_PRINT((ndo, " nd %d", ipds->len));
+ break;
+
+ case IPPROTO_EGP:
+ egp_print(ndo, ipds->cp, ipds->len);
+ break;
+
+ case IPPROTO_OSPF:
+ ospf_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip);
+ break;
+
+ case IPPROTO_IGMP:
+ igmp_print(ndo, ipds->cp, ipds->len);
+ break;
+
+ case IPPROTO_IPV4:
+ /* DVMRP multicast tunnel (ip-in-ip encapsulation) */
+ ip_print(ndo, ipds->cp, ipds->len);
+ if (! ndo->ndo_vflag) {
+ ND_PRINT((ndo, " (ipip-proto-4)"));
+ return;
+ }
+ break;
+
+ case IPPROTO_IPV6:
+ /* ip6-in-ip encapsulation */
+ ip6_print(ndo, ipds->cp, ipds->len);
+ break;
+
+ case IPPROTO_RSVP:
+ rsvp_print(ndo, ipds->cp, ipds->len);
+ break;
+
+ case IPPROTO_GRE:
+ /* do it */
+ gre_print(ndo, ipds->cp, ipds->len);
+ break;
+
+ case IPPROTO_MOBILE:
+ mobile_print(ndo, ipds->cp, ipds->len);
+ break;
+
+ case IPPROTO_PIM:
+ vec[0].ptr = ipds->cp;
+ vec[0].len = ipds->len;
+ pim_print(ndo, ipds->cp, ipds->len, in_cksum(vec, 1));
+ break;
+
+ case IPPROTO_VRRP:
+ if (ndo->ndo_packettype == PT_CARP) {
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "carp %s > %s: ",
+ ipaddr_string(ndo, &ipds->ip->ip_src),
+ ipaddr_string(ndo, &ipds->ip->ip_dst)));
+ carp_print(ndo, ipds->cp, ipds->len, ipds->ip->ip_ttl);
+ } else {
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "vrrp %s > %s: ",
+ ipaddr_string(ndo, &ipds->ip->ip_src),
+ ipaddr_string(ndo, &ipds->ip->ip_dst)));
+ vrrp_print(ndo, ipds->cp, ipds->len,
+ (const u_char *)ipds->ip, ipds->ip->ip_ttl);
+ }
+ break;
+
+ case IPPROTO_PGM:
+ pgm_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip);
+ break;
+
+ case IPPROTO_PFSYNC:
+ pfsync_ip_print(ipds->cp, ipds->len, (const u_char *)ipds->ip);
+ break;
+
+ default:
+ if (ndo->ndo_nflag==0 && (proto = getprotobynumber(ipds->nh)) != NULL)
+ ND_PRINT((ndo, " %s", proto->p_name));
+ else
+ ND_PRINT((ndo, " ip-proto-%d", ipds->nh));
+ ND_PRINT((ndo, " %d", ipds->len));
+ break;
+ }
+}
+
+void
+ip_print_inner(netdissect_options *ndo,
+ const u_char *bp,
+ u_int length, u_int nh,
+ const u_char *bp2)
+{
+ struct ip_print_demux_state ipd;
+
+ ipd.ip = (const struct ip *)bp2;
+ ipd.cp = bp;
+ ipd.len = length;
+ ipd.off = 0;
+ ipd.nh = nh;
+ ipd.advance = 0;
+
+ ip_print_demux(ndo, &ipd);
+}
+
+
+/*
+ * print an IP datagram.
+ */
+void
+ip_print(netdissect_options *ndo,
+ const u_char *bp,
+ u_int length)
+{
+ struct ip_print_demux_state ipd;
+ struct ip_print_demux_state *ipds=&ipd;
+ const u_char *ipend;
+ u_int hlen;
+ struct cksum_vec vec[1];
+ uint16_t sum, ip_sum;
+ struct protoent *proto;
+
+ ipds->ip = (const struct ip *)bp;
+ ND_TCHECK(ipds->ip->ip_vhl);
+ if (IP_V(ipds->ip) != 4) { /* print version if != 4 */
+ if (IP_V(ipds->ip) == 6)
+ ND_PRINT((ndo, "IP6, wrong link-layer encapsulation "));
+ else
+ ND_PRINT((ndo, "IP%u ", IP_V(ipds->ip)));
+ }
+ else if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, "IP "));
+
+ ND_TCHECK(*ipds->ip);
+ if (length < sizeof (struct ip)) {
+ ND_PRINT((ndo, "truncated-ip %u", length));
+ return;
+ }
+ hlen = IP_HL(ipds->ip) * 4;
+ if (hlen < sizeof (struct ip)) {
+ ND_PRINT((ndo, "bad-hlen %u", hlen));
+ return;
+ }
+
+ ipds->len = EXTRACT_16BITS(&ipds->ip->ip_len);
+ if (length < ipds->len)
+ ND_PRINT((ndo, "truncated-ip - %u bytes missing! ",
+ ipds->len - length));
+ if (ipds->len < hlen) {
+#ifdef GUESS_TSO
+ if (ipds->len) {
+ ND_PRINT((ndo, "bad-len %u", ipds->len));
+ return;
+ }
+ else {
+ /* we guess that it is a TSO send */
+ ipds->len = length;
+ }
+#else
+ ND_PRINT((ndo, "bad-len %u", ipds->len));
+ return;
+#endif /* GUESS_TSO */
+ }
+
+ /*
+ * Cut off the snapshot length to the end of the IP payload.
+ */
+ ipend = bp + ipds->len;
+ if (ipend < ndo->ndo_snapend)
+ ndo->ndo_snapend = ipend;
+
+ ipds->len -= hlen;
+
+ ipds->off = EXTRACT_16BITS(&ipds->ip->ip_off);
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "(tos 0x%x", (int)ipds->ip->ip_tos));
+ /* ECN bits */
+ if (ipds->ip->ip_tos & 0x03) {
+ switch (ipds->ip->ip_tos & 0x03) {
+ case 1:
+ ND_PRINT((ndo, ",ECT(1)"));
+ break;
+ case 2:
+ ND_PRINT((ndo, ",ECT(0)"));
+ break;
+ case 3:
+ ND_PRINT((ndo, ",CE"));
+ }
+ }
+
+ if (ipds->ip->ip_ttl >= 1)
+ ND_PRINT((ndo, ", ttl %u", ipds->ip->ip_ttl));
+
+ /*
+ * for the firewall guys, print id, offset.
+ * On all but the last stick a "+" in the flags portion.
+ * For unfragmented datagrams, note the don't fragment flag.
+ */
+
+ ND_PRINT((ndo, ", id %u, offset %u, flags [%s], proto %s (%u)",
+ EXTRACT_16BITS(&ipds->ip->ip_id),
+ (ipds->off & 0x1fff) * 8,
+ bittok2str(ip_frag_values, "none", ipds->off&0xe000),
+ tok2str(ipproto_values,"unknown",ipds->ip->ip_p),
+ ipds->ip->ip_p));
+
+ ND_PRINT((ndo, ", length %u", EXTRACT_16BITS(&ipds->ip->ip_len)));
+
+ if ((hlen - sizeof(struct ip)) > 0) {
+ ND_PRINT((ndo, ", options ("));
+ ip_optprint(ndo, (u_char *)(ipds->ip + 1), hlen - sizeof(struct ip));
+ ND_PRINT((ndo, ")"));
+ }
+
+ if (!ndo->ndo_Kflag && (u_char *)ipds->ip + hlen <= ndo->ndo_snapend) {
+ vec[0].ptr = (const uint8_t *)(void *)ipds->ip;
+ vec[0].len = hlen;
+ sum = in_cksum(vec, 1);
+ if (sum != 0) {
+ ip_sum = EXTRACT_16BITS(&ipds->ip->ip_sum);
+ ND_PRINT((ndo, ", bad cksum %x (->%x)!", ip_sum,
+ in_cksum_shouldbe(ip_sum, sum)));
+ }
+ }
+
+ ND_PRINT((ndo, ")\n "));
+ }
+
+ /*
+ * If this is fragment zero, hand it to the next higher
+ * level protocol.
+ */
+ if ((ipds->off & 0x1fff) == 0) {
+ ipds->cp = (const u_char *)ipds->ip + hlen;
+ ipds->nh = ipds->ip->ip_p;
+
+ if (ipds->nh != IPPROTO_TCP && ipds->nh != IPPROTO_UDP &&
+ ipds->nh != IPPROTO_SCTP && ipds->nh != IPPROTO_DCCP) {
+ ND_PRINT((ndo, "%s > %s: ",
+ ipaddr_string(ndo, &ipds->ip->ip_src),
+ ipaddr_string(ndo, &ipds->ip->ip_dst)));
+ }
+ ip_print_demux(ndo, ipds);
+ } else {
+ /* Ultra quiet now means that all this stuff should be suppressed */
+ if (ndo->ndo_qflag > 1) return;
+
+ /*
+ * if this isn't the first frag, we're missing the
+ * next level protocol header. print the ip addr
+ * and the protocol.
+ */
+ if (ipds->off & 0x1fff) {
+ ND_PRINT((ndo, "%s > %s:", ipaddr_string(ndo, &ipds->ip->ip_src),
+ ipaddr_string(ndo, &ipds->ip->ip_dst)));
+ if (!ndo->ndo_nflag && (proto = getprotobynumber(ipds->ip->ip_p)) != NULL)
+ ND_PRINT((ndo, " %s", proto->p_name));
+ else
+ ND_PRINT((ndo, " ip-proto-%d", ipds->ip->ip_p));
+ }
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+}
+
+void
+ipN_print(netdissect_options *ndo, register const u_char *bp, register u_int length)
+{
+ struct ip hdr;
+
+ if (length < 4) {
+ ND_PRINT((ndo, "truncated-ip %d", length));
+ return;
+ }
+ memcpy (&hdr, bp, 4);
+ switch (IP_V(&hdr)) {
+ case 4:
+ ip_print (ndo, bp, length);
+ return;
+ case 6:
+ ip6_print (ndo, bp, length);
+ return;
+ default:
+ ND_PRINT((ndo, "unknown ip %d", IP_V(&hdr)));
+ return;
+ }
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
+
+
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ip6.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#ifdef INET6
+
+#include "ip6.h"
+#include "ipproto.h"
+
+/*
+ * Compute a V6-style checksum by building a pseudoheader.
+ */
+int
+nextproto6_cksum(const struct ip6_hdr *ip6, const uint8_t *data,
+ u_int len, u_int covlen, u_int next_proto)
+{
+ struct {
+ struct in6_addr ph_src;
+ struct in6_addr ph_dst;
+ uint32_t ph_len;
+ uint8_t ph_zero[3];
+ uint8_t ph_nxt;
+ } ph;
+ struct cksum_vec vec[2];
+
+ /* pseudo-header */
+ memset(&ph, 0, sizeof(ph));
+ UNALIGNED_MEMCPY(&ph.ph_src, &ip6->ip6_src, sizeof (struct in6_addr));
+ UNALIGNED_MEMCPY(&ph.ph_dst, &ip6->ip6_dst, sizeof (struct in6_addr));
+ ph.ph_len = htonl(len);
+ ph.ph_nxt = next_proto;
+
+ vec[0].ptr = (const uint8_t *)(void *)&ph;
+ vec[0].len = sizeof(ph);
+ vec[1].ptr = data;
+ vec[1].len = covlen;
+
+ return in_cksum(vec, 2);
+}
+
+/*
+ * print an IP6 datagram.
+ */
+void
+ip6_print(netdissect_options *ndo, const u_char *bp, u_int length)
+{
+ register const struct ip6_hdr *ip6;
+ register int advance;
+ u_int len;
+ const u_char *ipend;
+ register const u_char *cp;
+ register u_int payload_len;
+ int nh;
+ int fragmented = 0;
+ u_int flow;
+
+ ip6 = (const struct ip6_hdr *)bp;
+
+ ND_TCHECK(*ip6);
+ if (length < sizeof (struct ip6_hdr)) {
+ ND_PRINT((ndo, "truncated-ip6 %u", length));
+ return;
+ }
+
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, "IP6 "));
+
+ if (IP6_VERSION(ip6) != 6) {
+ ND_PRINT((ndo,"version error: %u != 6", IP6_VERSION(ip6)));
+ return;
+ }
+
+ payload_len = EXTRACT_16BITS(&ip6->ip6_plen);
+ len = payload_len + sizeof(struct ip6_hdr);
+ if (length < len)
+ ND_PRINT((ndo, "truncated-ip6 - %u bytes missing!",
+ len - length));
+
+ if (ndo->ndo_vflag) {
+ flow = EXTRACT_32BITS(&ip6->ip6_flow);
+ ND_PRINT((ndo, "("));
+#if 0
+ /* rfc1883 */
+ if (flow & 0x0f000000)
+ ND_PRINT((ndo, "pri 0x%02x, ", (flow & 0x0f000000) >> 24));
+ if (flow & 0x00ffffff)
+ ND_PRINT((ndo, "flowlabel 0x%06x, ", flow & 0x00ffffff));
+#else
+ /* RFC 2460 */
+ if (flow & 0x0ff00000)
+ ND_PRINT((ndo, "class 0x%02x, ", (flow & 0x0ff00000) >> 20));
+ if (flow & 0x000fffff)
+ ND_PRINT((ndo, "flowlabel 0x%05x, ", flow & 0x000fffff));
+#endif
+
+ 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));
+ }
+
+ /*
+ * Cut off the snapshot length to the end of the IP payload.
+ */
+ ipend = bp + len;
+ 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 < 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) {
+ ND_PRINT((ndo, "%s > %s: ", ip6addr_string(ndo, &ip6->ip6_src),
+ ip6addr_string(ndo, &ip6->ip6_dst)));
+ }
+
+ switch (nh) {
+ case IPPROTO_HOPOPTS:
+ advance = hbhopt_print(ndo, cp);
+ nh = *cp;
+ break;
+ case IPPROTO_DSTOPTS:
+ advance = dstopt_print(ndo, cp);
+ nh = *cp;
+ break;
+ case IPPROTO_FRAGMENT:
+ advance = frag6_print(ndo, cp, (const u_char *)ip6);
+ if (ndo->ndo_snapend <= cp + advance)
+ return;
+ nh = *cp;
+ fragmented = 1;
+ break;
+
+ case IPPROTO_MOBILITY_OLD:
+ case IPPROTO_MOBILITY:
+ /*
+ * XXX - we don't use "advance"; the current
+ * "Mobility Support in IPv6" draft
+ * (draft-ietf-mobileip-ipv6-24) says that
+ * the next header field in a mobility header
+ * should be IPPROTO_NONE, but speaks of
+ * the possiblity of a future extension in
+ * which payload can be piggybacked atop a
+ * mobility header.
+ */
+ advance = mobility_print(ndo, cp, (const u_char *)ip6);
+ nh = *cp;
+ return;
+ case IPPROTO_ROUTING:
+ advance = rt6_print(ndo, cp, (const u_char *)ip6);
+ nh = *cp;
+ break;
+ case IPPROTO_SCTP:
+ sctp_print(ndo, cp, (const u_char *)ip6, len);
+ return;
+ case IPPROTO_DCCP:
+ dccp_print(ndo, cp, (const u_char *)ip6, len);
+ return;
+ case IPPROTO_TCP:
+ tcp_print(ndo, cp, len, (const u_char *)ip6, fragmented);
+ return;
+ case IPPROTO_UDP:
+ udp_print(ndo, cp, len, (const u_char *)ip6, fragmented);
+ return;
+ case IPPROTO_ICMPV6:
+ icmp6_print(ndo, cp, len, (const u_char *)ip6, fragmented);
+ return;
+ case IPPROTO_AH:
+ advance = ah_print(ndo, cp);
+ nh = *cp;
+ break;
+ case IPPROTO_ESP:
+ {
+ int enh, padlen;
+ advance = esp_print(ndo, cp, len, (const u_char *)ip6, &enh, &padlen);
+ nh = enh & 0xff;
+ len -= padlen;
+ break;
+ }
+ case IPPROTO_IPCOMP:
+ {
+ int enh;
+ advance = ipcomp_print(ndo, cp, &enh);
+ nh = enh & 0xff;
+ break;
+ }
+
+ case IPPROTO_PIM:
+ pim_print(ndo, cp, len, nextproto6_cksum(ip6, cp, len, len,
+ IPPROTO_PIM));
+ return;
+
+ case IPPROTO_OSPF:
+ ospf6_print(ndo, cp, len);
+ return;
+
+ case IPPROTO_IPV6:
+ ip6_print(ndo, cp, len);
+ return;
+
+ case IPPROTO_IPV4:
+ ip_print(ndo, cp, len);
+ return;
+
+ case IPPROTO_PGM:
+ pgm_print(ndo, cp, len, (const u_char *)ip6);
+ return;
+
+ case IPPROTO_GRE:
+ gre_print(ndo, cp, len);
+ return;
+
+ case IPPROTO_RSVP:
+ rsvp_print(ndo, cp, len);
+ return;
+
+ case IPPROTO_NONE:
+ ND_PRINT((ndo, "no next header"));
+ return;
+
+ default:
+ ND_PRINT((ndo, "ip-proto-%d %d", nh, len));
+ return;
+ }
+ }
+
+ return;
+trunc:
+ ND_PRINT((ndo, "[|ip6]"));
+}
+
+#else /* INET6 */
+
+void
+ip6_print(netdissect_options *ndo, const u_char *bp _U_, u_int length)
+{
+ ND_PRINT((ndo, "IP6, length: %u (printing not supported)", length));
+}
+
+#endif /* INET6 */
--- /dev/null
+/*
+ * Copyright (C) 1998 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ip6opts.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef INET6
+#include <tcpdump-stdinc.h>
+
+#include "ip6.h"
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+static void
+ip6_sopt_print(netdissect_options *ndo, const u_char *bp, int len)
+{
+ int i;
+ int optlen;
+
+ for (i = 0; i < len; i += optlen) {
+ if (bp[i] == IP6OPT_PAD1)
+ optlen = 1;
+ else {
+ if (i + 1 < len)
+ optlen = bp[i + 1] + 2;
+ else
+ goto trunc;
+ }
+ if (i + optlen > len)
+ goto trunc;
+
+ switch (bp[i]) {
+ case IP6OPT_PAD1:
+ ND_PRINT((ndo, ", pad1"));
+ break;
+ case IP6OPT_PADN:
+ if (len - i < IP6OPT_MINLEN) {
+ ND_PRINT((ndo, ", padn: trunc"));
+ goto trunc;
+ }
+ ND_PRINT((ndo, ", padn"));
+ break;
+ default:
+ if (len - i < IP6OPT_MINLEN) {
+ ND_PRINT((ndo, ", sopt_type %d: trunc)", bp[i]));
+ goto trunc;
+ }
+ ND_PRINT((ndo, ", sopt_type 0x%02x: len=%d", bp[i], bp[i + 1]));
+ break;
+ }
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[trunc] "));
+}
+
+static void
+ip6_opt_print(netdissect_options *ndo, const u_char *bp, int len)
+{
+ int i;
+ int optlen = 0;
+
+ if (len == 0)
+ return;
+ for (i = 0; i < len; i += optlen) {
+ if (bp[i] == IP6OPT_PAD1)
+ optlen = 1;
+ else {
+ if (i + 1 < len)
+ optlen = bp[i + 1] + 2;
+ else
+ goto trunc;
+ }
+ if (i + optlen > len)
+ goto trunc;
+
+ switch (bp[i]) {
+ case IP6OPT_PAD1:
+ ND_PRINT((ndo, "(pad1)"));
+ break;
+ case IP6OPT_PADN:
+ if (len - i < IP6OPT_MINLEN) {
+ ND_PRINT((ndo, "(padn: trunc)"));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "(padn)"));
+ break;
+ case IP6OPT_ROUTER_ALERT:
+ if (len - i < IP6OPT_RTALERT_LEN) {
+ ND_PRINT((ndo, "(rtalert: trunc)"));
+ goto trunc;
+ }
+ if (bp[i + 1] != IP6OPT_RTALERT_LEN - 2) {
+ ND_PRINT((ndo, "(rtalert: invalid len %d)", bp[i + 1]));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "(rtalert: 0x%04x) ", EXTRACT_16BITS(&bp[i + 2])));
+ break;
+ case IP6OPT_JUMBO:
+ if (len - i < IP6OPT_JUMBO_LEN) {
+ ND_PRINT((ndo, "(jumbo: trunc)"));
+ goto trunc;
+ }
+ if (bp[i + 1] != IP6OPT_JUMBO_LEN - 2) {
+ ND_PRINT((ndo, "(jumbo: invalid len %d)", bp[i + 1]));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "(jumbo: %u) ", EXTRACT_32BITS(&bp[i + 2])));
+ break;
+ case IP6OPT_HOME_ADDRESS:
+ if (len - i < IP6OPT_HOMEADDR_MINLEN) {
+ ND_PRINT((ndo, "(homeaddr: trunc)"));
+ goto trunc;
+ }
+ if (bp[i + 1] < IP6OPT_HOMEADDR_MINLEN - 2) {
+ ND_PRINT((ndo, "(homeaddr: invalid len %d)", bp[i + 1]));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "(homeaddr: %s", ip6addr_string(ndo, &bp[i + 2])));
+ if (bp[i + 1] > IP6OPT_HOMEADDR_MINLEN - 2) {
+ ip6_sopt_print(ndo, &bp[i + IP6OPT_HOMEADDR_MINLEN],
+ (optlen - IP6OPT_HOMEADDR_MINLEN));
+ }
+ ND_PRINT((ndo, ")"));
+ break;
+ default:
+ if (len - i < IP6OPT_MINLEN) {
+ ND_PRINT((ndo, "(type %d: trunc)", bp[i]));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "(opt_type 0x%02x: len=%d)", bp[i], bp[i + 1]));
+ break;
+ }
+ }
+ ND_PRINT((ndo, " "));
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[trunc] "));
+}
+
+int
+hbhopt_print(netdissect_options *ndo, register const u_char *bp)
+{
+ const struct ip6_hbh *dp = (struct ip6_hbh *)bp;
+ int hbhlen = 0;
+
+ ND_TCHECK(dp->ip6h_len);
+ hbhlen = (int)((dp->ip6h_len + 1) << 3);
+ ND_TCHECK2(*dp, hbhlen);
+ ND_PRINT((ndo, "HBH "));
+ if (ndo->ndo_vflag)
+ ip6_opt_print(ndo, (const u_char *)dp + sizeof(*dp), hbhlen - sizeof(*dp));
+
+ return(hbhlen);
+
+ trunc:
+ ND_PRINT((ndo, "[|HBH]"));
+ return(-1);
+}
+
+int
+dstopt_print(netdissect_options *ndo, register const u_char *bp)
+{
+ const struct ip6_dest *dp = (struct ip6_dest *)bp;
+ int dstoptlen = 0;
+
+ ND_TCHECK(dp->ip6d_len);
+ dstoptlen = (int)((dp->ip6d_len + 1) << 3);
+ ND_TCHECK2(*dp, dstoptlen);
+ ND_PRINT((ndo, "DSTOPT "));
+ if (ndo->ndo_vflag) {
+ ip6_opt_print(ndo, (const u_char *)dp + sizeof(*dp),
+ dstoptlen - sizeof(*dp));
+ }
+
+ return(dstoptlen);
+
+ trunc:
+ ND_PRINT((ndo, "[|DSTOPT]"));
+ return(-1);
+}
+#endif /* INET6 */
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ipcomp.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+struct ipcomp {
+ uint8_t comp_nxt; /* Next Header */
+ uint8_t comp_flags; /* Length of data, in 32bit */
+ uint16_t comp_cpi; /* Compression parameter index */
+};
+
+#if defined(HAVE_LIBZ) && defined(HAVE_ZLIB_H)
+#include <zlib.h>
+#endif
+
+#include "interface.h"
+#include "extract.h"
+
+int
+ipcomp_print(netdissect_options *ndo, register const u_char *bp, int *nhdr _U_)
+{
+ register const struct ipcomp *ipcomp;
+ register const u_char *ep;
+ uint16_t cpi;
+#if defined(HAVE_LIBZ) && defined(HAVE_ZLIB_H)
+ int advance;
+#endif
+
+ ipcomp = (struct ipcomp *)bp;
+ cpi = EXTRACT_16BITS(&ipcomp->comp_cpi);
+
+ /* 'ep' points to the end of available data. */
+ ep = ndo->ndo_snapend;
+
+ if ((u_char *)(ipcomp + 1) >= ep - sizeof(struct ipcomp)) {
+ ND_PRINT((ndo, "[|IPCOMP]"));
+ goto fail;
+ }
+ ND_PRINT((ndo, "IPComp(cpi=0x%04x)", cpi));
+
+#if defined(HAVE_LIBZ) && defined(HAVE_ZLIB_H)
+ if (1)
+ goto fail;
+
+ /*
+ * We may want to decompress the packet here. Packet buffer
+ * management is a headache (if we decompress, packet will become
+ * larger).
+ */
+ if (nhdr)
+ *nhdr = ipcomp->comp_nxt;
+ advance = sizeof(struct ipcomp);
+
+ ND_PRINT((ndo, ": "));
+ return advance;
+
+#endif
+fail:
+ return -1;
+}
--- /dev/null
+/*
+ * Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ipfc.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+
+#include "ether.h"
+
+/*
+ * RFC 2625 IP-over-Fibre Channel.
+ */
+
+struct ipfc_header {
+ u_char ipfc_dhost[8];
+ u_char ipfc_shost[8];
+};
+
+#define IPFC_HDRLEN 16
+
+/* Extract src, dst addresses */
+static inline void
+extract_ipfc_addrs(const struct ipfc_header *ipfcp, char *ipfcsrc,
+ char *ipfcdst)
+{
+ /*
+ * We assume that, as per RFC 2625, the lower 48 bits of the
+ * source and destination addresses are MAC addresses.
+ */
+ memcpy(ipfcdst, (const char *)&ipfcp->ipfc_dhost[2], 6);
+ memcpy(ipfcsrc, (const char *)&ipfcp->ipfc_shost[2], 6);
+}
+
+/*
+ * Print the Network_Header
+ */
+static inline void
+ipfc_hdr_print(netdissect_options *ndo,
+ register const struct ipfc_header *ipfcp _U_,
+ register u_int length, register const u_char *ipfcsrc,
+ register const u_char *ipfcdst)
+{
+ const char *srcname, *dstname;
+
+ srcname = etheraddr_string(ndo, ipfcsrc);
+ dstname = etheraddr_string(ndo, ipfcdst);
+
+ /*
+ * XXX - show the upper 16 bits? Do so only if "vflag" is set?
+ */
+ ND_PRINT((ndo, "%s %s %d: ", srcname, dstname, length));
+}
+
+static void
+ipfc_print(netdissect_options *ndo, const u_char *p, u_int length, u_int caplen)
+{
+ const struct ipfc_header *ipfcp = (const struct ipfc_header *)p;
+ struct ether_header ehdr;
+ u_short extracted_ethertype;
+
+ if (caplen < IPFC_HDRLEN) {
+ ND_PRINT((ndo, "[|ipfc]"));
+ return;
+ }
+ /*
+ * Get the network addresses into a canonical form
+ */
+ extract_ipfc_addrs(ipfcp, (char *)ESRC(&ehdr), (char *)EDST(&ehdr));
+
+ if (ndo->ndo_eflag)
+ ipfc_hdr_print(ndo, ipfcp, length, ESRC(&ehdr), EDST(&ehdr));
+
+ /* Skip over Network_Header */
+ length -= IPFC_HDRLEN;
+ p += IPFC_HDRLEN;
+ caplen -= IPFC_HDRLEN;
+
+ /* Try to print the LLC-layer header & higher layers */
+ if (llc_print(ndo, p, length, caplen, ESRC(&ehdr), EDST(&ehdr),
+ &extracted_ethertype) == 0) {
+ /*
+ * Some kinds of LLC packet we cannot
+ * handle intelligently
+ */
+ if (!ndo->ndo_eflag)
+ ipfc_hdr_print(ndo, ipfcp, length + IPFC_HDRLEN,
+ ESRC(&ehdr), EDST(&ehdr));
+ if (extracted_ethertype) {
+ ND_PRINT((ndo, "(LLC %s) ",
+ etherproto_string(htons(extracted_ethertype))));
+ }
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+}
+
+/*
+ * This is the top level routine of the printer. 'p' points
+ * to the Network_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
+ipfc_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, register const u_char *p)
+{
+ ipfc_print(ndo, p, h->len, h->caplen);
+
+ return (IPFC_HDRLEN);
+}
--- /dev/null
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+
+typedef struct ipnet_hdr {
+ uint8_t iph_version;
+ uint8_t iph_family;
+ uint16_t iph_htype;
+ uint32_t iph_pktlen;
+ uint32_t iph_ifindex;
+ uint32_t iph_grifindex;
+ uint32_t iph_zsrc;
+ uint32_t iph_zdst;
+} ipnet_hdr_t;
+
+#define IPH_AF_INET 2 /* Matches Solaris's AF_INET */
+#define IPH_AF_INET6 26 /* Matches Solaris's AF_INET6 */
+
+#ifdef DLT_IPNET
+
+static const struct tok ipnet_values[] = {
+ { IPH_AF_INET, "IPv4" },
+ { IPH_AF_INET6, "IPv6" },
+ { 0, NULL }
+};
+
+static inline void
+ipnet_hdr_print(netdissect_options *ndo, const u_char *bp, u_int length)
+{
+ const ipnet_hdr_t *hdr;
+ hdr = (const ipnet_hdr_t *)bp;
+
+ ND_PRINT((ndo, "%d > %d", hdr->iph_zsrc, hdr->iph_zdst));
+
+ if (!ndo->ndo_qflag) {
+ ND_PRINT((ndo,", family %s (%d)",
+ tok2str(ipnet_values, "Unknown",
+ hdr->iph_family),
+ hdr->iph_family));
+ } else {
+ ND_PRINT((ndo,", %s",
+ tok2str(ipnet_values,
+ "Unknown Ethertype (0x%04x)",
+ hdr->iph_family)));
+ }
+
+ ND_PRINT((ndo, ", length %u: ", length));
+}
+
+static void
+ipnet_print(netdissect_options *ndo, const u_char *p, u_int length, u_int caplen)
+{
+ ipnet_hdr_t *hdr;
+
+ if (caplen < sizeof(ipnet_hdr_t)) {
+ ND_PRINT((ndo, "[|ipnet]"));
+ return;
+ }
+
+ if (ndo->ndo_eflag)
+ ipnet_hdr_print(ndo, p, length);
+
+ length -= sizeof(ipnet_hdr_t);
+ caplen -= sizeof(ipnet_hdr_t);
+ hdr = (ipnet_hdr_t *)p;
+ p += sizeof(ipnet_hdr_t);
+
+ switch (hdr->iph_family) {
+
+ case IPH_AF_INET:
+ ip_print(ndo, p, length);
+ break;
+
+ case IPH_AF_INET6:
+ ip6_print(ndo, p, length);
+ break;
+
+ default:
+ if (!ndo->ndo_eflag)
+ ipnet_hdr_print(ndo, (u_char *)hdr,
+ length + sizeof(ipnet_hdr_t));
+
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ break;
+ }
+}
+
+/*
+ * 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
+ipnet_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, const u_char *p)
+{
+ ipnet_print(ndo, p, h->len, h->caplen);
+
+ return (sizeof(ipnet_hdr_t));
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
+
+#endif /* DLT_IPNET */
--- /dev/null
+/*
+ * Copyright (c) 1994, 1995, 1996
+ * 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: (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.
+ *
+ * Format and print Novell IPX packets.
+ * Contributed by Brad Parker (brad@fcr.com).
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ipx.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+/* well-known sockets */
+#define IPX_SKT_NCP 0x0451
+#define IPX_SKT_SAP 0x0452
+#define IPX_SKT_RIP 0x0453
+#define IPX_SKT_NETBIOS 0x0455
+#define IPX_SKT_DIAGNOSTICS 0x0456
+#define IPX_SKT_NWLINK_DGM 0x0553 /* NWLink datagram, may contain SMB */
+#define IPX_SKT_EIGRP 0x85be /* Cisco EIGRP over IPX */
+
+/* IPX transport header */
+struct ipxHdr {
+ uint16_t cksum; /* Checksum */
+ uint16_t length; /* Length, in bytes, including header */
+ uint8_t tCtl; /* Transport Control (i.e. hop count) */
+ uint8_t pType; /* Packet Type (i.e. level 2 protocol) */
+ uint16_t dstNet[2]; /* destination net */
+ uint8_t dstNode[6]; /* destination node */
+ uint16_t dstSkt; /* destination socket */
+ uint16_t srcNet[2]; /* source net */
+ uint8_t srcNode[6]; /* source node */
+ uint16_t srcSkt; /* source socket */
+};
+
+#define ipxSize 30
+
+static const char *ipxaddr_string(uint32_t, const u_char *);
+static void ipx_decode(netdissect_options *, const struct ipxHdr *, const u_char *, u_int);
+static void ipx_sap_print(netdissect_options *, const u_short *, u_int);
+static void ipx_rip_print(netdissect_options *, const u_short *, u_int);
+
+/*
+ * Print IPX datagram packets.
+ */
+void
+ipx_print(netdissect_options *ndo, const u_char *p, u_int length)
+{
+ const struct ipxHdr *ipx = (const struct ipxHdr *)p;
+
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, "IPX "));
+
+ ND_TCHECK(ipx->srcSkt);
+ ND_PRINT((ndo, "%s.%04x > ",
+ ipxaddr_string(EXTRACT_32BITS(ipx->srcNet), ipx->srcNode),
+ EXTRACT_16BITS(&ipx->srcSkt)));
+
+ ND_PRINT((ndo, "%s.%04x: ",
+ ipxaddr_string(EXTRACT_32BITS(ipx->dstNet), ipx->dstNode),
+ EXTRACT_16BITS(&ipx->dstSkt)));
+
+ /* take length from ipx header */
+ ND_TCHECK(ipx->length);
+ length = EXTRACT_16BITS(&ipx->length);
+
+ ipx_decode(ndo, ipx, (u_char *)ipx + ipxSize, length - ipxSize);
+ return;
+trunc:
+ ND_PRINT((ndo, "[|ipx %d]", length));
+}
+
+static const char *
+ipxaddr_string(uint32_t net, const u_char *node)
+{
+ static char line[256];
+
+ snprintf(line, sizeof(line), "%08x.%02x:%02x:%02x:%02x:%02x:%02x",
+ net, node[0], node[1], node[2], node[3], node[4], node[5]);
+
+ return line;
+}
+
+static void
+ipx_decode(netdissect_options *ndo, const struct ipxHdr *ipx, const u_char *datap, u_int length)
+{
+ register u_short dstSkt;
+
+ dstSkt = EXTRACT_16BITS(&ipx->dstSkt);
+ switch (dstSkt) {
+ case IPX_SKT_NCP:
+ ND_PRINT((ndo, "ipx-ncp %d", length));
+ break;
+ case IPX_SKT_SAP:
+ ipx_sap_print(ndo, (u_short *)datap, length);
+ break;
+ case IPX_SKT_RIP:
+ ipx_rip_print(ndo, (u_short *)datap, length);
+ break;
+ case IPX_SKT_NETBIOS:
+ ND_PRINT((ndo, "ipx-netbios %d", length));
+#ifdef TCPDUMP_DO_SMB
+ ipx_netbios_print(ndo, datap, length);
+#endif
+ break;
+ case IPX_SKT_DIAGNOSTICS:
+ ND_PRINT((ndo, "ipx-diags %d", length));
+ break;
+ case IPX_SKT_NWLINK_DGM:
+ ND_PRINT((ndo, "ipx-nwlink-dgm %d", length));
+#ifdef TCPDUMP_DO_SMB
+ ipx_netbios_print(ndo, datap, length);
+#endif
+ break;
+ case IPX_SKT_EIGRP:
+ eigrp_print(ndo, datap, length);
+ break;
+ default:
+ ND_PRINT((ndo, "ipx-#%x %d", dstSkt, length));
+ break;
+ }
+}
+
+static void
+ipx_sap_print(netdissect_options *ndo, const u_short *ipx, u_int length)
+{
+ int command, i;
+
+ ND_TCHECK(ipx[0]);
+ command = EXTRACT_16BITS(ipx);
+ ipx++;
+ length -= 2;
+
+ switch (command) {
+ case 1:
+ case 3:
+ if (command == 1)
+ ND_PRINT((ndo, "ipx-sap-req"));
+ else
+ ND_PRINT((ndo, "ipx-sap-nearest-req"));
+
+ ND_TCHECK(ipx[0]);
+ ND_PRINT((ndo, " %s", ipxsap_string(htons(EXTRACT_16BITS(&ipx[0])))));
+ break;
+
+ case 2:
+ case 4:
+ if (command == 2)
+ ND_PRINT((ndo, "ipx-sap-resp"));
+ else
+ ND_PRINT((ndo, "ipx-sap-nearest-resp"));
+
+ for (i = 0; i < 8 && length > 0; i++) {
+ ND_TCHECK(ipx[0]);
+ ND_PRINT((ndo, " %s '", ipxsap_string(htons(EXTRACT_16BITS(&ipx[0])))));
+ if (fn_printzp(ndo, (u_char *)&ipx[1], 48, ndo->ndo_snapend)) {
+ ND_PRINT((ndo, "'"));
+ goto trunc;
+ }
+ ND_TCHECK2(ipx[25], 10);
+ ND_PRINT((ndo, "' addr %s",
+ ipxaddr_string(EXTRACT_32BITS(&ipx[25]), (u_char *)&ipx[27])));
+ ipx += 32;
+ length -= 64;
+ }
+ break;
+ default:
+ ND_PRINT((ndo, "ipx-sap-?%x", command));
+ break;
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "[|ipx %d]", length));
+}
+
+static void
+ipx_rip_print(netdissect_options *ndo, const u_short *ipx, u_int length)
+{
+ int command, i;
+
+ ND_TCHECK(ipx[0]);
+ command = EXTRACT_16BITS(ipx);
+ ipx++;
+ length -= 2;
+
+ switch (command) {
+ case 1:
+ ND_PRINT((ndo, "ipx-rip-req"));
+ if (length > 0) {
+ ND_TCHECK(ipx[3]);
+ ND_PRINT((ndo, " %08x/%d.%d", EXTRACT_32BITS(&ipx[0]),
+ EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3])));
+ }
+ break;
+ case 2:
+ ND_PRINT((ndo, "ipx-rip-resp"));
+ for (i = 0; i < 50 && length > 0; i++) {
+ ND_TCHECK(ipx[3]);
+ ND_PRINT((ndo, " %08x/%d.%d", EXTRACT_32BITS(&ipx[0]),
+ EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3])));
+
+ ipx += 4;
+ length -= 8;
+ }
+ break;
+ default:
+ ND_PRINT((ndo, "ipx-rip-?%x", command));
+ break;
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "[|ipx %d]", length));
+}
--- /dev/null
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 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.
+ *
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-isakmp.c,v 1.7 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* The functions from print-esp.c used in this file are only defined when both
+ * OpenSSL and evp.h are detected. Employ the same preprocessor device here.
+ */
+#ifndef HAVE_OPENSSL_EVP_H
+#undef HAVE_LIBCRYPTO
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+
+#include "ip.h"
+#ifdef INET6
+#include "ip6.h"
+#endif
+
+/* refer to RFC 2408 */
+
+typedef u_char cookie_t[8];
+typedef u_char msgid_t[4];
+
+#define PORT_ISAKMP 500
+
+/* 3.1 ISAKMP Header Format (IKEv1 and IKEv2)
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ ! Initiator !
+ ! Cookie !
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ ! Responder !
+ ! Cookie !
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ ! Next Payload ! MjVer ! MnVer ! Exchange Type ! Flags !
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ ! Message ID !
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ ! Length !
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+*/
+struct isakmp {
+ cookie_t i_ck; /* Initiator Cookie */
+ cookie_t r_ck; /* Responder Cookie */
+ uint8_t np; /* Next Payload Type */
+ uint8_t vers;
+#define ISAKMP_VERS_MAJOR 0xf0
+#define ISAKMP_VERS_MAJOR_SHIFT 4
+#define ISAKMP_VERS_MINOR 0x0f
+#define ISAKMP_VERS_MINOR_SHIFT 0
+ uint8_t etype; /* Exchange Type */
+ uint8_t flags; /* Flags */
+ msgid_t msgid;
+ uint32_t len; /* Length */
+};
+
+/* Next Payload Type */
+#define ISAKMP_NPTYPE_NONE 0 /* NONE*/
+#define ISAKMP_NPTYPE_SA 1 /* Security Association */
+#define ISAKMP_NPTYPE_P 2 /* Proposal */
+#define ISAKMP_NPTYPE_T 3 /* Transform */
+#define ISAKMP_NPTYPE_KE 4 /* Key Exchange */
+#define ISAKMP_NPTYPE_ID 5 /* Identification */
+#define ISAKMP_NPTYPE_CERT 6 /* Certificate */
+#define ISAKMP_NPTYPE_CR 7 /* Certificate Request */
+#define ISAKMP_NPTYPE_HASH 8 /* Hash */
+#define ISAKMP_NPTYPE_SIG 9 /* Signature */
+#define ISAKMP_NPTYPE_NONCE 10 /* Nonce */
+#define ISAKMP_NPTYPE_N 11 /* Notification */
+#define ISAKMP_NPTYPE_D 12 /* Delete */
+#define ISAKMP_NPTYPE_VID 13 /* Vendor ID */
+#define ISAKMP_NPTYPE_v2E 46 /* v2 Encrypted payload */
+
+#define IKEv1_MAJOR_VERSION 1
+#define IKEv1_MINOR_VERSION 0
+
+#define IKEv2_MAJOR_VERSION 2
+#define IKEv2_MINOR_VERSION 0
+
+/* Flags */
+#define ISAKMP_FLAG_E 0x01 /* Encryption Bit */
+#define ISAKMP_FLAG_C 0x02 /* Commit Bit */
+#define ISAKMP_FLAG_extra 0x04
+
+/* IKEv2 */
+#define ISAKMP_FLAG_I (1 << 3) /* (I)nitiator */
+#define ISAKMP_FLAG_V (1 << 4) /* (V)ersion */
+#define ISAKMP_FLAG_R (1 << 5) /* (R)esponse */
+
+
+/* 3.2 Payload Generic Header
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ ! Next Payload ! RESERVED ! Payload Length !
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+*/
+struct isakmp_gen {
+ uint8_t np; /* Next Payload */
+ uint8_t critical; /* bit 7 - critical, rest is RESERVED */
+ uint16_t len; /* Payload Length */
+};
+
+/* 3.3 Data Attributes
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ !A! Attribute Type ! AF=0 Attribute Length !
+ !F! ! AF=1 Attribute Value !
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ . AF=0 Attribute Value .
+ . AF=1 Not Transmitted .
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+*/
+struct isakmp_data {
+ uint16_t type; /* defined by DOI-spec, and Attribute Format */
+ uint16_t lorv; /* if f equal 1, Attribute Length */
+ /* if f equal 0, Attribute Value */
+ /* if f equal 1, Attribute Value */
+};
+
+/* 3.4 Security Association Payload */
+ /* MAY NOT be used, because of being defined in ipsec-doi. */
+ /*
+ If the current payload is the last in the message,
+ then the value of the next payload field will be 0.
+ This field MUST NOT contain the
+ values for the Proposal or Transform payloads as they are considered
+ part of the security association negotiation. For example, this
+ field would contain the value "10" (Nonce payload) in the first
+ message of a Base Exchange (see Section 4.4) and the value "0" in the
+ first message of an Identity Protect Exchange (see Section 4.5).
+ */
+struct ikev1_pl_sa {
+ struct isakmp_gen h;
+ uint32_t doi; /* Domain of Interpretation */
+ uint32_t sit; /* Situation */
+};
+
+/* 3.5 Proposal Payload */
+ /*
+ The value of the next payload field MUST only contain the value "2"
+ or "0". If there are additional Proposal payloads in the message,
+ then this field will be 2. If the current Proposal payload is the
+ last within the security association proposal, then this field will
+ be 0.
+ */
+struct ikev1_pl_p {
+ struct isakmp_gen h;
+ uint8_t p_no; /* Proposal # */
+ uint8_t prot_id; /* Protocol */
+ uint8_t spi_size; /* SPI Size */
+ uint8_t num_t; /* Number of Transforms */
+ /* SPI */
+};
+
+/* 3.6 Transform Payload */
+ /*
+ The value of the next payload field MUST only contain the value "3"
+ or "0". If there are additional Transform payloads in the proposal,
+ then this field will be 3. If the current Transform payload is the
+ last within the proposal, then this field will be 0.
+ */
+struct ikev1_pl_t {
+ struct isakmp_gen h;
+ uint8_t t_no; /* Transform # */
+ uint8_t t_id; /* Transform-Id */
+ uint16_t reserved; /* RESERVED2 */
+ /* SA Attributes */
+};
+
+/* 3.7 Key Exchange Payload */
+struct ikev1_pl_ke {
+ struct isakmp_gen h;
+ /* Key Exchange Data */
+};
+
+/* 3.8 Identification Payload */
+ /* MUST NOT to be used, because of being defined in ipsec-doi. */
+struct ikev1_pl_id {
+ struct isakmp_gen h;
+ union {
+ uint8_t id_type; /* ID Type */
+ uint32_t doi_data; /* DOI Specific ID Data */
+ } d;
+ /* Identification Data */
+};
+
+/* 3.9 Certificate Payload */
+struct ikev1_pl_cert {
+ struct isakmp_gen h;
+ uint8_t encode; /* Cert Encoding */
+ char cert; /* Certificate Data */
+ /*
+ This field indicates the type of
+ certificate or certificate-related information contained in the
+ Certificate Data field.
+ */
+};
+
+/* 3.10 Certificate Request Payload */
+struct ikev1_pl_cr {
+ struct isakmp_gen h;
+ uint8_t num_cert; /* # Cert. Types */
+ /*
+ Certificate Types (variable length)
+ -- Contains a list of the types of certificates requested,
+ sorted in order of preference. Each individual certificate
+ type is 1 octet. This field is NOT requiredo
+ */
+ /* # Certificate Authorities (1 octet) */
+ /* Certificate Authorities (variable length) */
+};
+
+/* 3.11 Hash Payload */
+ /* may not be used, because of having only data. */
+struct ikev1_pl_hash {
+ struct isakmp_gen h;
+ /* Hash Data */
+};
+
+/* 3.12 Signature Payload */
+ /* may not be used, because of having only data. */
+struct ikev1_pl_sig {
+ struct isakmp_gen h;
+ /* Signature Data */
+};
+
+/* 3.13 Nonce Payload */
+ /* may not be used, because of having only data. */
+struct ikev1_pl_nonce {
+ struct isakmp_gen h;
+ /* Nonce Data */
+};
+
+/* 3.14 Notification Payload */
+struct ikev1_pl_n {
+ struct isakmp_gen h;
+ uint32_t doi; /* Domain of Interpretation */
+ uint8_t prot_id; /* Protocol-ID */
+ uint8_t spi_size; /* SPI Size */
+ uint16_t type; /* Notify Message Type */
+ /* SPI */
+ /* Notification Data */
+};
+
+/* 3.14.1 Notify Message Types */
+/* NOTIFY MESSAGES - ERROR TYPES */
+#define ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE 1
+#define ISAKMP_NTYPE_DOI_NOT_SUPPORTED 2
+#define ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED 3
+#define ISAKMP_NTYPE_INVALID_COOKIE 4
+#define ISAKMP_NTYPE_INVALID_MAJOR_VERSION 5
+#define ISAKMP_NTYPE_INVALID_MINOR_VERSION 6
+#define ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE 7
+#define ISAKMP_NTYPE_INVALID_FLAGS 8
+#define ISAKMP_NTYPE_INVALID_MESSAGE_ID 9
+#define ISAKMP_NTYPE_INVALID_PROTOCOL_ID 10
+#define ISAKMP_NTYPE_INVALID_SPI 11
+#define ISAKMP_NTYPE_INVALID_TRANSFORM_ID 12
+#define ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED 13
+#define ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN 14
+#define ISAKMP_NTYPE_BAD_PROPOSAL_SYNTAX 15
+#define ISAKMP_NTYPE_PAYLOAD_MALFORMED 16
+#define ISAKMP_NTYPE_INVALID_KEY_INFORMATION 17
+#define ISAKMP_NTYPE_INVALID_ID_INFORMATION 18
+#define ISAKMP_NTYPE_INVALID_CERT_ENCODING 19
+#define ISAKMP_NTYPE_INVALID_CERTIFICATE 20
+#define ISAKMP_NTYPE_BAD_CERT_REQUEST_SYNTAX 21
+#define ISAKMP_NTYPE_INVALID_CERT_AUTHORITY 22
+#define ISAKMP_NTYPE_INVALID_HASH_INFORMATION 23
+#define ISAKMP_NTYPE_AUTHENTICATION_FAILED 24
+#define ISAKMP_NTYPE_INVALID_SIGNATURE 25
+#define ISAKMP_NTYPE_ADDRESS_NOTIFICATION 26
+
+/* 3.15 Delete Payload */
+struct ikev1_pl_d {
+ struct isakmp_gen h;
+ uint32_t doi; /* Domain of Interpretation */
+ uint8_t prot_id; /* Protocol-Id */
+ uint8_t spi_size; /* SPI Size */
+ uint16_t num_spi; /* # of SPIs */
+ /* SPI(es) */
+};
+
+struct ikev1_ph1tab {
+ struct ikev1_ph1 *head;
+ struct ikev1_ph1 *tail;
+ int len;
+};
+
+struct isakmp_ph2tab {
+ struct ikev1_ph2 *head;
+ struct ikev1_ph2 *tail;
+ int len;
+};
+
+/* IKEv2 (RFC4306) */
+
+/* 3.3 Security Association Payload -- generic header */
+/* 3.3.1. Proposal Substructure */
+struct ikev2_p {
+ struct isakmp_gen h;
+ uint8_t p_no; /* Proposal # */
+ uint8_t prot_id; /* Protocol */
+ uint8_t spi_size; /* SPI Size */
+ uint8_t num_t; /* Number of Transforms */
+};
+
+/* 3.3.2. Transform Substructure */
+struct ikev2_t {
+ struct isakmp_gen h;
+ uint8_t t_type; /* Transform Type (ENCR,PRF,INTEG,etc.*/
+ uint8_t res2; /* reserved byte */
+ uint16_t t_id; /* Transform ID */
+};
+
+enum ikev2_t_type {
+ IV2_T_ENCR = 1,
+ IV2_T_PRF = 2,
+ IV2_T_INTEG= 3,
+ IV2_T_DH = 4,
+ IV2_T_ESN = 5,
+};
+
+/* 3.4. Key Exchange Payload */
+struct ikev2_ke {
+ struct isakmp_gen h;
+ uint16_t ke_group;
+ uint16_t ke_res1;
+ /* KE data */
+};
+
+
+/* 3.5. Identification Payloads */
+enum ikev2_id_type {
+ ID_IPV4_ADDR=1,
+ ID_FQDN=2,
+ ID_RFC822_ADDR=3,
+ ID_IPV6_ADDR=5,
+ ID_DER_ASN1_DN=9,
+ ID_DER_ASN1_GN=10,
+ ID_KEY_ID=11,
+};
+struct ikev2_id {
+ struct isakmp_gen h;
+ uint8_t type; /* ID type */
+ uint8_t res1;
+ uint16_t res2;
+ /* SPI */
+ /* Notification Data */
+};
+
+/* 3.10 Notification Payload */
+struct ikev2_n {
+ struct isakmp_gen h;
+ uint8_t prot_id; /* Protocol-ID */
+ uint8_t spi_size; /* SPI Size */
+ uint16_t type; /* Notify Message Type */
+};
+
+enum ikev2_n_type {
+ IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD = 1,
+ IV2_NOTIFY_INVALID_IKE_SPI = 4,
+ IV2_NOTIFY_INVALID_MAJOR_VERSION = 5,
+ IV2_NOTIFY_INVALID_SYNTAX = 7,
+ IV2_NOTIFY_INVALID_MESSAGE_ID = 9,
+ IV2_NOTIFY_INVALID_SPI =11,
+ IV2_NOTIFY_NO_PROPOSAL_CHOSEN =14,
+ IV2_NOTIFY_INVALID_KE_PAYLOAD =17,
+ IV2_NOTIFY_AUTHENTICATION_FAILED =24,
+ IV2_NOTIFY_SINGLE_PAIR_REQUIRED =34,
+ IV2_NOTIFY_NO_ADDITIONAL_SAS =35,
+ IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE =36,
+ IV2_NOTIFY_FAILED_CP_REQUIRED =37,
+ IV2_NOTIFY_INVALID_SELECTORS =39,
+ IV2_NOTIFY_INITIAL_CONTACT =16384,
+ IV2_NOTIFY_SET_WINDOW_SIZE =16385,
+ IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE =16386,
+ IV2_NOTIFY_IPCOMP_SUPPORTED =16387,
+ IV2_NOTIFY_NAT_DETECTION_SOURCE_IP =16388,
+ IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP =16389,
+ IV2_NOTIFY_COOKIE =16390,
+ IV2_NOTIFY_USE_TRANSPORT_MODE =16391,
+ IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED =16392,
+ IV2_NOTIFY_REKEY_SA =16393,
+ IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED =16394,
+ IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO =16395
+};
+
+struct notify_messages {
+ uint16_t type;
+ char *msg;
+};
+
+/* 3.8 Notification Payload */
+struct ikev2_auth {
+ struct isakmp_gen h;
+ uint8_t auth_method; /* Protocol-ID */
+ uint8_t reserved[3];
+ /* authentication data */
+};
+
+enum ikev2_auth_type {
+ IV2_RSA_SIG = 1,
+ IV2_SHARED = 2,
+ IV2_DSS_SIG = 3,
+};
+
+/* refer to RFC 2409 */
+
+#if 0
+/* isakmp sa structure */
+struct oakley_sa {
+ uint8_t proto_id; /* OAKLEY */
+ vchar_t *spi; /* spi */
+ uint8_t dhgrp; /* DH; group */
+ uint8_t auth_t; /* method of authentication */
+ uint8_t prf_t; /* type of prf */
+ uint8_t hash_t; /* type of hash */
+ uint8_t enc_t; /* type of cipher */
+ uint8_t life_t; /* type of duration of lifetime */
+ uint32_t ldur; /* life duration */
+};
+#endif
+
+/* refer to RFC 2407 */
+
+#define IPSEC_DOI 1
+
+/* 4.2 IPSEC Situation Definition */
+#define IPSECDOI_SIT_IDENTITY_ONLY 0x00000001
+#define IPSECDOI_SIT_SECRECY 0x00000002
+#define IPSECDOI_SIT_INTEGRITY 0x00000004
+
+/* 4.4.1 IPSEC Security Protocol Identifiers */
+ /* 4.4.2 IPSEC ISAKMP Transform Values */
+#define IPSECDOI_PROTO_ISAKMP 1
+#define IPSECDOI_KEY_IKE 1
+
+/* 4.4.1 IPSEC Security Protocol Identifiers */
+#define IPSECDOI_PROTO_IPSEC_AH 2
+ /* 4.4.3 IPSEC AH Transform Values */
+#define IPSECDOI_AH_MD5 2
+#define IPSECDOI_AH_SHA 3
+#define IPSECDOI_AH_DES 4
+#define IPSECDOI_AH_SHA2_256 5
+#define IPSECDOI_AH_SHA2_384 6
+#define IPSECDOI_AH_SHA2_512 7
+
+/* 4.4.1 IPSEC Security Protocol Identifiers */
+#define IPSECDOI_PROTO_IPSEC_ESP 3
+ /* 4.4.4 IPSEC ESP Transform Identifiers */
+#define IPSECDOI_ESP_DES_IV64 1
+#define IPSECDOI_ESP_DES 2
+#define IPSECDOI_ESP_3DES 3
+#define IPSECDOI_ESP_RC5 4
+#define IPSECDOI_ESP_IDEA 5
+#define IPSECDOI_ESP_CAST 6
+#define IPSECDOI_ESP_BLOWFISH 7
+#define IPSECDOI_ESP_3IDEA 8
+#define IPSECDOI_ESP_DES_IV32 9
+#define IPSECDOI_ESP_RC4 10
+#define IPSECDOI_ESP_NULL 11
+#define IPSECDOI_ESP_RIJNDAEL 12
+#define IPSECDOI_ESP_AES 12
+
+/* 4.4.1 IPSEC Security Protocol Identifiers */
+#define IPSECDOI_PROTO_IPCOMP 4
+ /* 4.4.5 IPSEC IPCOMP Transform Identifiers */
+#define IPSECDOI_IPCOMP_OUI 1
+#define IPSECDOI_IPCOMP_DEFLATE 2
+#define IPSECDOI_IPCOMP_LZS 3
+
+/* 4.5 IPSEC Security Association Attributes */
+#define IPSECDOI_ATTR_SA_LTYPE 1 /* B */
+#define IPSECDOI_ATTR_SA_LTYPE_DEFAULT 1
+#define IPSECDOI_ATTR_SA_LTYPE_SEC 1
+#define IPSECDOI_ATTR_SA_LTYPE_KB 2
+#define IPSECDOI_ATTR_SA_LDUR 2 /* V */
+#define IPSECDOI_ATTR_SA_LDUR_DEFAULT 28800 /* 8 hours */
+#define IPSECDOI_ATTR_GRP_DESC 3 /* B */
+#define IPSECDOI_ATTR_ENC_MODE 4 /* B */
+ /* default value: host dependent */
+#define IPSECDOI_ATTR_ENC_MODE_TUNNEL 1
+#define IPSECDOI_ATTR_ENC_MODE_TRNS 2
+#define IPSECDOI_ATTR_AUTH 5 /* B */
+ /* 0 means not to use authentication. */
+#define IPSECDOI_ATTR_AUTH_HMAC_MD5 1
+#define IPSECDOI_ATTR_AUTH_HMAC_SHA1 2
+#define IPSECDOI_ATTR_AUTH_DES_MAC 3
+#define IPSECDOI_ATTR_AUTH_KPDK 4 /*RFC-1826(Key/Pad/Data/Key)*/
+ /*
+ * When negotiating ESP without authentication, the Auth
+ * Algorithm attribute MUST NOT be included in the proposal.
+ * When negotiating ESP without confidentiality, the Auth
+ * Algorithm attribute MUST be included in the proposal and
+ * the ESP transform ID must be ESP_NULL.
+ */
+#define IPSECDOI_ATTR_KEY_LENGTH 6 /* B */
+#define IPSECDOI_ATTR_KEY_ROUNDS 7 /* B */
+#define IPSECDOI_ATTR_COMP_DICT_SIZE 8 /* B */
+#define IPSECDOI_ATTR_COMP_PRIVALG 9 /* V */
+
+/* 4.6.1 Security Association Payload */
+struct ipsecdoi_sa {
+ struct isakmp_gen h;
+ uint32_t doi; /* Domain of Interpretation */
+ uint32_t sit; /* Situation */
+};
+
+struct ipsecdoi_secrecy_h {
+ uint16_t len;
+ uint16_t reserved;
+};
+
+/* 4.6.2.1 Identification Type Values */
+struct ipsecdoi_id {
+ struct isakmp_gen h;
+ uint8_t type; /* ID Type */
+ uint8_t proto_id; /* Protocol ID */
+ uint16_t port; /* Port */
+ /* Identification Data */
+};
+
+#define IPSECDOI_ID_IPV4_ADDR 1
+#define IPSECDOI_ID_FQDN 2
+#define IPSECDOI_ID_USER_FQDN 3
+#define IPSECDOI_ID_IPV4_ADDR_SUBNET 4
+#define IPSECDOI_ID_IPV6_ADDR 5
+#define IPSECDOI_ID_IPV6_ADDR_SUBNET 6
+#define IPSECDOI_ID_IPV4_ADDR_RANGE 7
+#define IPSECDOI_ID_IPV6_ADDR_RANGE 8
+#define IPSECDOI_ID_DER_ASN1_DN 9
+#define IPSECDOI_ID_DER_ASN1_GN 10
+#define IPSECDOI_ID_KEY_ID 11
+
+/* 4.6.3 IPSEC DOI Notify Message Types */
+/* Notify Messages - Status Types */
+#define IPSECDOI_NTYPE_RESPONDER_LIFETIME 24576
+#define IPSECDOI_NTYPE_REPLAY_STATUS 24577
+#define IPSECDOI_NTYPE_INITIAL_CONTACT 24578
+
+#define DECLARE_PRINTER(func) static const u_char *ike##func##_print( \
+ netdissect_options *ndo, u_char tpay, \
+ const struct isakmp_gen *ext, \
+ u_int item_len, \
+ const u_char *end_pointer, \
+ uint32_t phase,\
+ uint32_t doi0, \
+ uint32_t proto0, int depth)
+
+DECLARE_PRINTER(v1_sa);
+DECLARE_PRINTER(v1_p);
+DECLARE_PRINTER(v1_t);
+DECLARE_PRINTER(v1_ke);
+DECLARE_PRINTER(v1_id);
+DECLARE_PRINTER(v1_cert);
+DECLARE_PRINTER(v1_cr);
+DECLARE_PRINTER(v1_sig);
+DECLARE_PRINTER(v1_hash);
+DECLARE_PRINTER(v1_nonce);
+DECLARE_PRINTER(v1_n);
+DECLARE_PRINTER(v1_d);
+DECLARE_PRINTER(v1_vid);
+
+DECLARE_PRINTER(v2_sa);
+DECLARE_PRINTER(v2_ke);
+DECLARE_PRINTER(v2_ID);
+DECLARE_PRINTER(v2_cert);
+DECLARE_PRINTER(v2_cr);
+DECLARE_PRINTER(v2_auth);
+DECLARE_PRINTER(v2_nonce);
+DECLARE_PRINTER(v2_n);
+DECLARE_PRINTER(v2_d);
+DECLARE_PRINTER(v2_vid);
+DECLARE_PRINTER(v2_TS);
+DECLARE_PRINTER(v2_cp);
+DECLARE_PRINTER(v2_eap);
+
+static const u_char *ikev2_e_print(netdissect_options *ndo,
+ struct isakmp *base,
+ u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len,
+ const u_char *end_pointer,
+ uint32_t phase,
+ uint32_t doi0,
+ uint32_t proto0, int depth);
+
+
+static const u_char *ike_sub0_print(netdissect_options *ndo,u_char, const struct isakmp_gen *,
+ const u_char *, uint32_t, uint32_t, uint32_t, int);
+static const u_char *ikev1_sub_print(netdissect_options *ndo,u_char, const struct isakmp_gen *,
+ const u_char *, uint32_t, uint32_t, uint32_t, int);
+
+static const u_char *ikev2_sub_print(netdissect_options *ndo,
+ struct isakmp *base,
+ u_char np, const struct isakmp_gen *ext,
+ const u_char *ep, uint32_t phase,
+ uint32_t doi, uint32_t proto,
+ int depth);
+
+
+static char *numstr(int);
+
+static void
+ikev1_print(netdissect_options *ndo,
+ const u_char *bp, u_int length,
+ const u_char *bp2, struct isakmp *base);
+
+#define MAXINITIATORS 20
+int ninitiator = 0;
+union inaddr_u {
+ struct in_addr in4;
+#ifdef INET6
+ struct in6_addr in6;
+#endif
+};
+struct {
+ cookie_t initiator;
+ u_int version;
+ union inaddr_u iaddr;
+ union inaddr_u raddr;
+} cookiecache[MAXINITIATORS];
+
+/* protocol id */
+static const char *protoidstr[] = {
+ NULL, "isakmp", "ipsec-ah", "ipsec-esp", "ipcomp",
+};
+
+/* isakmp->np */
+static const char *npstr[] = {
+ "none", "sa", "p", "t", "ke", "id", "cert", "cr", "hash", /* 0 - 8 */
+ "sig", "nonce", "n", "d", "vid", /* 9 - 13 */
+ "pay14", "pay15", "pay16", "pay17", "pay18", /* 14- 18 */
+ "pay19", "pay20", "pay21", "pay22", "pay23", /* 19- 23 */
+ "pay24", "pay25", "pay26", "pay27", "pay28", /* 24- 28 */
+ "pay29", "pay30", "pay31", "pay32", /* 29- 32 */
+ "v2sa", "v2ke", "v2IDi", "v2IDr", "v2cert",/* 33- 37 */
+ "v2cr", "v2auth","v2nonce", "v2n", "v2d", /* 38- 42 */
+ "v2vid", "v2TSi", "v2TSr", "v2e", "v2cp", /* 43- 47 */
+ "v2eap", /* 48 */
+
+};
+
+/* isakmp->np */
+static const u_char *(*npfunc[])(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len,
+ const u_char *end_pointer,
+ uint32_t phase,
+ uint32_t doi0,
+ uint32_t proto0, int depth) = {
+ NULL,
+ ikev1_sa_print,
+ ikev1_p_print,
+ ikev1_t_print,
+ ikev1_ke_print,
+ ikev1_id_print,
+ ikev1_cert_print,
+ ikev1_cr_print,
+ ikev1_hash_print,
+ ikev1_sig_print,
+ ikev1_nonce_print,
+ ikev1_n_print,
+ ikev1_d_print,
+ ikev1_vid_print, /* 13 */
+ NULL, NULL, NULL, NULL, NULL, /* 14- 18 */
+ NULL, NULL, NULL, NULL, NULL, /* 19- 23 */
+ NULL, NULL, NULL, NULL, NULL, /* 24- 28 */
+ NULL, NULL, NULL, NULL, /* 29- 32 */
+ ikev2_sa_print, /* 33 */
+ ikev2_ke_print, /* 34 */
+ ikev2_ID_print, /* 35 */
+ ikev2_ID_print, /* 36 */
+ ikev2_cert_print, /* 37 */
+ ikev2_cr_print, /* 38 */
+ ikev2_auth_print, /* 39 */
+ ikev2_nonce_print, /* 40 */
+ ikev2_n_print, /* 41 */
+ ikev2_d_print, /* 42 */
+ ikev2_vid_print, /* 43 */
+ ikev2_TS_print, /* 44 */
+ ikev2_TS_print, /* 45 */
+ NULL, /* ikev2_e_print,*/ /* 46 - special */
+ ikev2_cp_print, /* 47 */
+ ikev2_eap_print, /* 48 */
+};
+
+/* isakmp->etype */
+static const char *etypestr[] = {
+/* IKEv1 exchange types */
+ "none", "base", "ident", "auth", "agg", "inf", NULL, NULL, /* 0-7 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 8-15 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 16-23 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 24-31 */
+ "oakley-quick", "oakley-newgroup", /* 32-33 */
+/* IKEv2 exchange types */
+ "ikev2_init", "ikev2_auth", "child_sa", "inf2" /* 34-37 */
+};
+
+#define STR_OR_ID(x, tab) \
+ (((x) < sizeof(tab)/sizeof(tab[0]) && tab[(x)]) ? tab[(x)] : numstr(x))
+#define PROTOIDSTR(x) STR_OR_ID(x, protoidstr)
+#define NPSTR(x) STR_OR_ID(x, npstr)
+#define ETYPESTR(x) STR_OR_ID(x, etypestr)
+
+#define CHECKLEN(p, np) \
+ if (ep < (u_char *)(p)) { \
+ ND_PRINT((ndo," [|%s]", NPSTR(np))); \
+ goto done; \
+ }
+
+
+#define NPFUNC(x) \
+ (((x) < sizeof(npfunc)/sizeof(npfunc[0]) && npfunc[(x)]) \
+ ? npfunc[(x)] : NULL)
+
+static int
+iszero(u_char *p, size_t l)
+{
+ while (l--) {
+ if (*p++)
+ return 0;
+ }
+ return 1;
+}
+
+/* find cookie from initiator cache */
+static int
+cookie_find(cookie_t *in)
+{
+ int i;
+
+ for (i = 0; i < MAXINITIATORS; i++) {
+ if (memcmp(in, &cookiecache[i].initiator, sizeof(*in)) == 0)
+ return i;
+ }
+
+ return -1;
+}
+
+/* record initiator */
+static void
+cookie_record(cookie_t *in, const u_char *bp2)
+{
+ int i;
+ struct ip *ip;
+#ifdef INET6
+ struct ip6_hdr *ip6;
+#endif
+
+ i = cookie_find(in);
+ if (0 <= i) {
+ ninitiator = (i + 1) % MAXINITIATORS;
+ return;
+ }
+
+ ip = (struct ip *)bp2;
+ switch (IP_V(ip)) {
+ case 4:
+ cookiecache[ninitiator].version = 4;
+ UNALIGNED_MEMCPY(&cookiecache[ninitiator].iaddr.in4, &ip->ip_src, sizeof(struct in_addr));
+ UNALIGNED_MEMCPY(&cookiecache[ninitiator].raddr.in4, &ip->ip_dst, sizeof(struct in_addr));
+ break;
+#ifdef INET6
+ case 6:
+ ip6 = (struct ip6_hdr *)bp2;
+ cookiecache[ninitiator].version = 6;
+ UNALIGNED_MEMCPY(&cookiecache[ninitiator].iaddr.in6, &ip6->ip6_src, sizeof(struct in6_addr));
+ UNALIGNED_MEMCPY(&cookiecache[ninitiator].raddr.in6, &ip6->ip6_dst, sizeof(struct in6_addr));
+ break;
+#endif
+ default:
+ return;
+ }
+ UNALIGNED_MEMCPY(&cookiecache[ninitiator].initiator, in, sizeof(*in));
+ ninitiator = (ninitiator + 1) % MAXINITIATORS;
+}
+
+#define cookie_isinitiator(x, y) cookie_sidecheck((x), (y), 1)
+#define cookie_isresponder(x, y) cookie_sidecheck((x), (y), 0)
+static int
+cookie_sidecheck(int i, const u_char *bp2, int initiator)
+{
+ struct ip *ip;
+#ifdef INET6
+ struct ip6_hdr *ip6;
+#endif
+
+ ip = (struct ip *)bp2;
+ switch (IP_V(ip)) {
+ case 4:
+ if (cookiecache[i].version != 4)
+ return 0;
+ if (initiator) {
+ if (UNALIGNED_MEMCMP(&ip->ip_src, &cookiecache[i].iaddr.in4, sizeof(struct in_addr)) == 0)
+ return 1;
+ } else {
+ if (UNALIGNED_MEMCMP(&ip->ip_src, &cookiecache[i].raddr.in4, sizeof(struct in_addr)) == 0)
+ return 1;
+ }
+ break;
+#ifdef INET6
+ case 6:
+ if (cookiecache[i].version != 6)
+ return 0;
+ ip6 = (struct ip6_hdr *)bp2;
+ if (initiator) {
+ if (UNALIGNED_MEMCMP(&ip6->ip6_src, &cookiecache[i].iaddr.in6, sizeof(struct in6_addr)) == 0)
+ return 1;
+ } else {
+ if (UNALIGNED_MEMCMP(&ip6->ip6_src, &cookiecache[i].raddr.in6, sizeof(struct in6_addr)) == 0)
+ return 1;
+ }
+ break;
+#endif /* INET6 */
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static void
+hexprint(netdissect_options *ndo, caddr_t loc, size_t len)
+{
+ u_char *p;
+ size_t i;
+
+ p = (u_char *)loc;
+ for (i = 0; i < len; i++)
+ ND_PRINT((ndo,"%02x", p[i] & 0xff));
+}
+
+static int
+rawprint(netdissect_options *ndo, caddr_t loc, size_t len)
+{
+ ND_TCHECK2(*loc, len);
+
+ hexprint(ndo, loc, len);
+ return 1;
+trunc:
+ return 0;
+}
+
+
+/*
+ * returns false if we run out of data buffer
+ */
+static int ike_show_somedata(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep)
+{
+ /* there is too much data, just show some of it */
+ const u_char *end = ep - 20;
+ int elen = 20;
+ int len = ep - cp;
+ if(len > 10) {
+ len = 10;
+ }
+
+ /* really shouldn't happen because of above */
+ if(end < cp + len) {
+ end = cp+len;
+ elen = ep - end;
+ }
+
+ ND_PRINT((ndo," data=("));
+ if(!rawprint(ndo, (caddr_t)(cp), len)) goto trunc;
+ ND_PRINT((ndo, "..."));
+ if(elen) {
+ if(!rawprint(ndo, (caddr_t)(end), elen)) goto trunc;
+ }
+ ND_PRINT((ndo,")"));
+ return 1;
+
+trunc:
+ return 0;
+}
+
+struct attrmap {
+ const char *type;
+ u_int nvalue;
+ const char *value[30]; /*XXX*/
+};
+
+static const u_char *
+ikev1_attrmap_print(netdissect_options *ndo,
+ const u_char *p, const u_char *ep,
+ const struct attrmap *map, size_t nmap)
+{
+ int totlen;
+ uint32_t t, v;
+
+ if (p[0] & 0x80)
+ totlen = 4;
+ else
+ totlen = 4 + EXTRACT_16BITS(&p[2]);
+ if (ep < p + totlen) {
+ ND_PRINT((ndo,"[|attr]"));
+ return ep + 1;
+ }
+
+ ND_PRINT((ndo,"("));
+ t = EXTRACT_16BITS(&p[0]) & 0x7fff;
+ if (map && t < nmap && map[t].type)
+ ND_PRINT((ndo,"type=%s ", map[t].type));
+ else
+ ND_PRINT((ndo,"type=#%d ", t));
+ if (p[0] & 0x80) {
+ ND_PRINT((ndo,"value="));
+ v = EXTRACT_16BITS(&p[2]);
+ if (map && t < nmap && v < map[t].nvalue && map[t].value[v])
+ ND_PRINT((ndo,"%s", map[t].value[v]));
+ else
+ rawprint(ndo, (caddr_t)&p[2], 2);
+ } else {
+ ND_PRINT((ndo,"len=%d value=", EXTRACT_16BITS(&p[2])));
+ rawprint(ndo, (caddr_t)&p[4], EXTRACT_16BITS(&p[2]));
+ }
+ ND_PRINT((ndo,")"));
+ return p + totlen;
+}
+
+static const u_char *
+ikev1_attr_print(netdissect_options *ndo, const u_char *p, const u_char *ep)
+{
+ int totlen;
+ uint32_t t;
+
+ if (p[0] & 0x80)
+ totlen = 4;
+ else
+ totlen = 4 + EXTRACT_16BITS(&p[2]);
+ if (ep < p + totlen) {
+ ND_PRINT((ndo,"[|attr]"));
+ return ep + 1;
+ }
+
+ ND_PRINT((ndo,"("));
+ t = EXTRACT_16BITS(&p[0]) & 0x7fff;
+ ND_PRINT((ndo,"type=#%d ", t));
+ if (p[0] & 0x80) {
+ ND_PRINT((ndo,"value="));
+ t = p[2];
+ rawprint(ndo, (caddr_t)&p[2], 2);
+ } else {
+ ND_PRINT((ndo,"len=%d value=", EXTRACT_16BITS(&p[2])));
+ rawprint(ndo, (caddr_t)&p[4], EXTRACT_16BITS(&p[2]));
+ }
+ ND_PRINT((ndo,")"));
+ return p + totlen;
+}
+
+static const u_char *
+ikev1_sa_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_,
+ const u_char *ep, uint32_t phase, uint32_t doi0 _U_,
+ uint32_t proto0, int depth)
+{
+ const struct ikev1_pl_sa *p;
+ struct ikev1_pl_sa sa;
+ uint32_t doi, sit, ident;
+ const u_char *cp, *np;
+ int t;
+
+ ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_SA)));
+
+ p = (struct ikev1_pl_sa *)ext;
+ ND_TCHECK(*p);
+ UNALIGNED_MEMCPY(&sa, ext, sizeof(sa));
+ doi = ntohl(sa.doi);
+ sit = ntohl(sa.sit);
+ if (doi != 1) {
+ ND_PRINT((ndo," doi=%d", doi));
+ ND_PRINT((ndo," situation=%u", (uint32_t)ntohl(sa.sit)));
+ return (u_char *)(p + 1);
+ }
+
+ ND_PRINT((ndo," doi=ipsec"));
+ ND_PRINT((ndo," situation="));
+ t = 0;
+ if (sit & 0x01) {
+ ND_PRINT((ndo,"identity"));
+ t++;
+ }
+ if (sit & 0x02) {
+ ND_PRINT((ndo,"%ssecrecy", t ? "+" : ""));
+ t++;
+ }
+ if (sit & 0x04)
+ ND_PRINT((ndo,"%sintegrity", t ? "+" : ""));
+
+ np = (u_char *)ext + sizeof(sa);
+ if (sit != 0x01) {
+ ND_TCHECK2(*(ext + 1), sizeof(ident));
+ UNALIGNED_MEMCPY(&ident, ext + 1, sizeof(ident));
+ ND_PRINT((ndo," ident=%u", (uint32_t)ntohl(ident)));
+ np += sizeof(ident);
+ }
+
+ ext = (struct isakmp_gen *)np;
+ ND_TCHECK(*ext);
+
+ cp = ikev1_sub_print(ndo, ISAKMP_NPTYPE_P, ext, ep, phase, doi, proto0,
+ depth);
+
+ return cp;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_SA)));
+ return NULL;
+}
+
+static const u_char *
+ikev1_p_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext, u_int item_len _U_,
+ const u_char *ep, uint32_t phase, uint32_t doi0,
+ uint32_t proto0 _U_, int depth)
+{
+ const struct ikev1_pl_p *p;
+ struct ikev1_pl_p prop;
+ const u_char *cp;
+
+ ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_P)));
+
+ p = (struct ikev1_pl_p *)ext;
+ ND_TCHECK(*p);
+ UNALIGNED_MEMCPY(&prop, ext, sizeof(prop));
+ ND_PRINT((ndo," #%d protoid=%s transform=%d",
+ prop.p_no, PROTOIDSTR(prop.prot_id), prop.num_t));
+ if (prop.spi_size) {
+ ND_PRINT((ndo," spi="));
+ if (!rawprint(ndo, (caddr_t)(p + 1), prop.spi_size))
+ goto trunc;
+ }
+
+ ext = (struct isakmp_gen *)((u_char *)(p + 1) + prop.spi_size);
+ ND_TCHECK(*ext);
+
+ cp = ikev1_sub_print(ndo, ISAKMP_NPTYPE_T, ext, ep, phase, doi0,
+ prop.prot_id, depth);
+
+ return cp;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_P)));
+ return NULL;
+}
+
+static const char *ikev1_p_map[] = {
+ NULL, "ike",
+};
+
+static const char *ikev2_t_type_map[]={
+ NULL, "encr", "prf", "integ", "dh", "esn"
+};
+
+static const char *ah_p_map[] = {
+ NULL, "(reserved)", "md5", "sha", "1des",
+ "sha2-256", "sha2-384", "sha2-512",
+};
+
+static const char *prf_p_map[] = {
+ NULL, "hmac-md5", "hmac-sha", "hmac-tiger",
+ "aes128_xcbc"
+};
+
+static const char *integ_p_map[] = {
+ NULL, "hmac-md5", "hmac-sha", "dec-mac",
+ "kpdk-md5", "aes-xcbc"
+};
+
+static const char *esn_p_map[] = {
+ "no-esn", "esn"
+};
+
+static const char *dh_p_map[] = {
+ NULL, "modp768",
+ "modp1024", /* group 2 */
+ "EC2N 2^155", /* group 3 */
+ "EC2N 2^185", /* group 4 */
+ "modp1536", /* group 5 */
+ "iana-grp06", "iana-grp07", /* reserved */
+ "iana-grp08", "iana-grp09",
+ "iana-grp10", "iana-grp11",
+ "iana-grp12", "iana-grp13",
+ "modp2048", /* group 14 */
+ "modp3072", /* group 15 */
+ "modp4096", /* group 16 */
+ "modp6144", /* group 17 */
+ "modp8192", /* group 18 */
+};
+
+static const char *esp_p_map[] = {
+ NULL, "1des-iv64", "1des", "3des", "rc5", "idea", "cast",
+ "blowfish", "3idea", "1des-iv32", "rc4", "null", "aes"
+};
+
+static const char *ipcomp_p_map[] = {
+ NULL, "oui", "deflate", "lzs",
+};
+
+static const struct attrmap ipsec_t_map[] = {
+ { NULL, 0, { NULL } },
+ { "lifetype", 3, { NULL, "sec", "kb", }, },
+ { "life", 0, { NULL } },
+ { "group desc", 18, { NULL, "modp768",
+ "modp1024", /* group 2 */
+ "EC2N 2^155", /* group 3 */
+ "EC2N 2^185", /* group 4 */
+ "modp1536", /* group 5 */
+ "iana-grp06", "iana-grp07", /* reserved */
+ "iana-grp08", "iana-grp09",
+ "iana-grp10", "iana-grp11",
+ "iana-grp12", "iana-grp13",
+ "modp2048", /* group 14 */
+ "modp3072", /* group 15 */
+ "modp4096", /* group 16 */
+ "modp6144", /* group 17 */
+ "modp8192", /* group 18 */
+ }, },
+ { "enc mode", 3, { NULL, "tunnel", "transport", }, },
+ { "auth", 5, { NULL, "hmac-md5", "hmac-sha1", "1des-mac", "keyed", }, },
+ { "keylen", 0, { NULL } },
+ { "rounds", 0, { NULL } },
+ { "dictsize", 0, { NULL } },
+ { "privalg", 0, { NULL } },
+};
+
+static const struct attrmap encr_t_map[] = {
+ { NULL, 0, { NULL } }, { NULL, 0, { NULL } }, /* 0, 1 */
+ { NULL, 0, { NULL } }, { NULL, 0, { NULL } }, /* 2, 3 */
+ { NULL, 0, { NULL } }, { NULL, 0, { NULL } }, /* 4, 5 */
+ { NULL, 0, { NULL } }, { NULL, 0, { NULL } }, /* 6, 7 */
+ { NULL, 0, { NULL } }, { NULL, 0, { NULL } }, /* 8, 9 */
+ { NULL, 0, { NULL } }, { NULL, 0, { NULL } }, /* 10,11*/
+ { NULL, 0, { NULL } }, { NULL, 0, { NULL } }, /* 12,13*/
+ { "keylen", 14, { NULL }},
+};
+
+static const struct attrmap oakley_t_map[] = {
+ { NULL, 0, { NULL } },
+ { "enc", 8, { NULL, "1des", "idea", "blowfish", "rc5",
+ "3des", "cast", "aes", }, },
+ { "hash", 7, { NULL, "md5", "sha1", "tiger",
+ "sha2-256", "sha2-384", "sha2-512", }, },
+ { "auth", 6, { NULL, "preshared", "dss", "rsa sig", "rsa enc",
+ "rsa enc revised", }, },
+ { "group desc", 18, { NULL, "modp768",
+ "modp1024", /* group 2 */
+ "EC2N 2^155", /* group 3 */
+ "EC2N 2^185", /* group 4 */
+ "modp1536", /* group 5 */
+ "iana-grp06", "iana-grp07", /* reserved */
+ "iana-grp08", "iana-grp09",
+ "iana-grp10", "iana-grp11",
+ "iana-grp12", "iana-grp13",
+ "modp2048", /* group 14 */
+ "modp3072", /* group 15 */
+ "modp4096", /* group 16 */
+ "modp6144", /* group 17 */
+ "modp8192", /* group 18 */
+ }, },
+ { "group type", 4, { NULL, "MODP", "ECP", "EC2N", }, },
+ { "group prime", 0, { NULL } },
+ { "group gen1", 0, { NULL } },
+ { "group gen2", 0, { NULL } },
+ { "group curve A", 0, { NULL } },
+ { "group curve B", 0, { NULL } },
+ { "lifetype", 3, { NULL, "sec", "kb", }, },
+ { "lifeduration", 0, { NULL } },
+ { "prf", 0, { NULL } },
+ { "keylen", 0, { NULL } },
+ { "field", 0, { NULL } },
+ { "order", 0, { NULL } },
+};
+
+static const u_char *
+ikev1_t_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext, u_int item_len,
+ const u_char *ep, uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto, int depth _U_)
+{
+ const struct ikev1_pl_t *p;
+ struct ikev1_pl_t t;
+ const u_char *cp;
+ const char *idstr;
+ const struct attrmap *map;
+ size_t nmap;
+ const u_char *ep2;
+
+ ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_T)));
+
+ p = (struct ikev1_pl_t *)ext;
+ ND_TCHECK(*p);
+ UNALIGNED_MEMCPY(&t, ext, sizeof(t));
+
+ switch (proto) {
+ case 1:
+ idstr = STR_OR_ID(t.t_id, ikev1_p_map);
+ map = oakley_t_map;
+ nmap = sizeof(oakley_t_map)/sizeof(oakley_t_map[0]);
+ break;
+ case 2:
+ idstr = STR_OR_ID(t.t_id, ah_p_map);
+ map = ipsec_t_map;
+ nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
+ break;
+ case 3:
+ idstr = STR_OR_ID(t.t_id, esp_p_map);
+ map = ipsec_t_map;
+ nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
+ break;
+ case 4:
+ idstr = STR_OR_ID(t.t_id, ipcomp_p_map);
+ map = ipsec_t_map;
+ nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
+ break;
+ default:
+ idstr = NULL;
+ map = NULL;
+ nmap = 0;
+ break;
+ }
+
+ if (idstr)
+ ND_PRINT((ndo," #%d id=%s ", t.t_no, idstr));
+ else
+ ND_PRINT((ndo," #%d id=%d ", t.t_no, t.t_id));
+ cp = (u_char *)(p + 1);
+ ep2 = (u_char *)p + item_len;
+ while (cp < ep && cp < ep2) {
+ if (map && nmap) {
+ cp = ikev1_attrmap_print(ndo, cp, (ep < ep2) ? ep : ep2,
+ map, nmap);
+ } else
+ cp = ikev1_attr_print(ndo, cp, (ep < ep2) ? ep : ep2);
+ }
+ if (ep < ep2)
+ ND_PRINT((ndo,"..."));
+ return cp;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_T)));
+ return NULL;
+}
+
+static const u_char *
+ikev1_ke_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext, u_int item_len _U_,
+ const u_char *ep _U_, uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ struct isakmp_gen e;
+
+ ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_KE)));
+
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&e, ext, sizeof(e));
+ ND_PRINT((ndo," key len=%d", ntohs(e.len) - 4));
+ if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
+ ND_PRINT((ndo," "));
+ if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
+ goto trunc;
+ }
+ return (u_char *)ext + ntohs(e.len);
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_KE)));
+ return NULL;
+}
+
+static const u_char *
+ikev1_id_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext, u_int item_len,
+ const u_char *ep _U_, uint32_t phase, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+#define USE_IPSECDOI_IN_PHASE1 1
+ const struct ikev1_pl_id *p;
+ struct ikev1_pl_id id;
+ static const char *idtypestr[] = {
+ "IPv4", "IPv4net", "IPv6", "IPv6net",
+ };
+ static const char *ipsecidtypestr[] = {
+ NULL, "IPv4", "FQDN", "user FQDN", "IPv4net", "IPv6",
+ "IPv6net", "IPv4range", "IPv6range", "ASN1 DN", "ASN1 GN",
+ "keyid",
+ };
+ int len;
+ const u_char *data;
+
+ ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_ID)));
+
+ p = (struct ikev1_pl_id *)ext;
+ ND_TCHECK(*p);
+ UNALIGNED_MEMCPY(&id, ext, sizeof(id));
+ if (sizeof(*p) < item_len) {
+ data = (u_char *)(p + 1);
+ len = item_len - sizeof(*p);
+ } else {
+ data = NULL;
+ len = 0;
+ }
+
+#if 0 /*debug*/
+ ND_PRINT((ndo," [phase=%d doi=%d proto=%d]", phase, doi, proto));
+#endif
+ switch (phase) {
+#ifndef USE_IPSECDOI_IN_PHASE1
+ case 1:
+#endif
+ default:
+ ND_PRINT((ndo," idtype=%s", STR_OR_ID(id.d.id_type, idtypestr)));
+ ND_PRINT((ndo," doi_data=%u",
+ (uint32_t)(ntohl(id.d.doi_data) & 0xffffff)));
+ break;
+
+#ifdef USE_IPSECDOI_IN_PHASE1
+ case 1:
+#endif
+ case 2:
+ {
+ const struct ipsecdoi_id *p;
+ struct ipsecdoi_id id;
+ struct protoent *pe;
+
+ p = (struct ipsecdoi_id *)ext;
+ ND_TCHECK(*p);
+ UNALIGNED_MEMCPY(&id, ext, sizeof(id));
+ ND_PRINT((ndo," idtype=%s", STR_OR_ID(id.type, ipsecidtypestr)));
+ /* A protocol ID of 0 DOES NOT mean IPPROTO_IP! */
+ pe = id.proto_id ? getprotobynumber(id.proto_id) : NULL;
+ if (pe)
+ ND_PRINT((ndo," protoid=%s", pe->p_name));
+ else
+ ND_PRINT((ndo," protoid=%u", id.proto_id));
+ ND_PRINT((ndo," port=%d", ntohs(id.port)));
+ if (!len)
+ break;
+ if (data == NULL)
+ goto trunc;
+ ND_TCHECK2(*data, len);
+ switch (id.type) {
+ case IPSECDOI_ID_IPV4_ADDR:
+ if (len < 4)
+ ND_PRINT((ndo," len=%d [bad: < 4]", len));
+ else
+ ND_PRINT((ndo," len=%d %s", len, ipaddr_string(ndo, data)));
+ len = 0;
+ break;
+ case IPSECDOI_ID_FQDN:
+ case IPSECDOI_ID_USER_FQDN:
+ {
+ int i;
+ ND_PRINT((ndo," len=%d ", len));
+ for (i = 0; i < len; i++)
+ safeputchar(ndo, data[i]);
+ len = 0;
+ break;
+ }
+ case IPSECDOI_ID_IPV4_ADDR_SUBNET:
+ {
+ const u_char *mask;
+ if (len < 8)
+ ND_PRINT((ndo," len=%d [bad: < 8]", len));
+ else {
+ mask = data + sizeof(struct in_addr);
+ ND_PRINT((ndo," len=%d %s/%u.%u.%u.%u", len,
+ ipaddr_string(ndo, data),
+ mask[0], mask[1], mask[2], mask[3]));
+ }
+ len = 0;
+ break;
+ }
+#ifdef INET6
+ case IPSECDOI_ID_IPV6_ADDR:
+ if (len < 16)
+ ND_PRINT((ndo," len=%d [bad: < 16]", len));
+ else
+ ND_PRINT((ndo," len=%d %s", len, ip6addr_string(ndo, data)));
+ len = 0;
+ break;
+ case IPSECDOI_ID_IPV6_ADDR_SUBNET:
+ {
+ const u_char *mask;
+ if (len < 20)
+ ND_PRINT((ndo," len=%d [bad: < 20]", len));
+ else {
+ mask = (u_char *)(data + sizeof(struct in6_addr));
+ /*XXX*/
+ ND_PRINT((ndo," len=%d %s/0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", len,
+ ip6addr_string(ndo, data),
+ mask[0], mask[1], mask[2], mask[3],
+ mask[4], mask[5], mask[6], mask[7],
+ mask[8], mask[9], mask[10], mask[11],
+ mask[12], mask[13], mask[14], mask[15]));
+ }
+ len = 0;
+ break;
+ }
+#endif /*INET6*/
+ case IPSECDOI_ID_IPV4_ADDR_RANGE:
+ if (len < 8)
+ ND_PRINT((ndo," len=%d [bad: < 8]", len));
+ else {
+ ND_PRINT((ndo," len=%d %s-%s", len,
+ ipaddr_string(ndo, data),
+ ipaddr_string(ndo, data + sizeof(struct in_addr))));
+ }
+ len = 0;
+ break;
+#ifdef INET6
+ case IPSECDOI_ID_IPV6_ADDR_RANGE:
+ if (len < 32)
+ ND_PRINT((ndo," len=%d [bad: < 32]", len));
+ else {
+ ND_PRINT((ndo," len=%d %s-%s", len,
+ ip6addr_string(ndo, data),
+ ip6addr_string(ndo, data + sizeof(struct in6_addr))));
+ }
+ len = 0;
+ break;
+#endif /*INET6*/
+ case IPSECDOI_ID_DER_ASN1_DN:
+ case IPSECDOI_ID_DER_ASN1_GN:
+ case IPSECDOI_ID_KEY_ID:
+ break;
+ }
+ break;
+ }
+ }
+ if (data && len) {
+ ND_PRINT((ndo," len=%d", len));
+ if (2 < ndo->ndo_vflag) {
+ ND_PRINT((ndo," "));
+ if (!rawprint(ndo, (caddr_t)data, len))
+ goto trunc;
+ }
+ }
+ return (u_char *)ext + item_len;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_ID)));
+ return NULL;
+}
+
+static const u_char *
+ikev1_cert_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext, u_int item_len _U_,
+ const u_char *ep _U_, uint32_t phase _U_,
+ uint32_t doi0 _U_,
+ uint32_t proto0 _U_, int depth _U_)
+{
+ const struct ikev1_pl_cert *p;
+ struct ikev1_pl_cert cert;
+ static const char *certstr[] = {
+ "none", "pkcs7", "pgp", "dns",
+ "x509sign", "x509ke", "kerberos", "crl",
+ "arl", "spki", "x509attr",
+ };
+
+ ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_CERT)));
+
+ p = (struct ikev1_pl_cert *)ext;
+ ND_TCHECK(*p);
+ UNALIGNED_MEMCPY(&cert, ext, sizeof(cert));
+ ND_PRINT((ndo," len=%d", item_len - 4));
+ ND_PRINT((ndo," type=%s", STR_OR_ID((cert.encode), certstr)));
+ if (2 < ndo->ndo_vflag && 4 < item_len) {
+ ND_PRINT((ndo," "));
+ if (!rawprint(ndo, (caddr_t)(ext + 1), item_len - 4))
+ goto trunc;
+ }
+ return (u_char *)ext + item_len;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_CERT)));
+ return NULL;
+}
+
+static const u_char *
+ikev1_cr_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext, u_int item_len _U_,
+ const u_char *ep _U_, uint32_t phase _U_, uint32_t doi0 _U_,
+ uint32_t proto0 _U_, int depth _U_)
+{
+ const struct ikev1_pl_cert *p;
+ struct ikev1_pl_cert cert;
+ static const char *certstr[] = {
+ "none", "pkcs7", "pgp", "dns",
+ "x509sign", "x509ke", "kerberos", "crl",
+ "arl", "spki", "x509attr",
+ };
+
+ ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_CR)));
+
+ p = (struct ikev1_pl_cert *)ext;
+ ND_TCHECK(*p);
+ UNALIGNED_MEMCPY(&cert, ext, sizeof(cert));
+ ND_PRINT((ndo," len=%d", item_len - 4));
+ ND_PRINT((ndo," type=%s", STR_OR_ID((cert.encode), certstr)));
+ if (2 < ndo->ndo_vflag && 4 < item_len) {
+ ND_PRINT((ndo," "));
+ if (!rawprint(ndo, (caddr_t)(ext + 1), item_len - 4))
+ goto trunc;
+ }
+ return (u_char *)ext + item_len;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_CR)));
+ return NULL;
+}
+
+static const u_char *
+ikev1_hash_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext, u_int item_len _U_,
+ const u_char *ep _U_, uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ struct isakmp_gen e;
+
+ ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_HASH)));
+
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&e, ext, sizeof(e));
+ ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
+ if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
+ ND_PRINT((ndo," "));
+ if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
+ goto trunc;
+ }
+ return (u_char *)ext + ntohs(e.len);
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_HASH)));
+ return NULL;
+}
+
+static const u_char *
+ikev1_sig_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext, u_int item_len _U_,
+ const u_char *ep _U_, uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ struct isakmp_gen e;
+
+ ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_SIG)));
+
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&e, ext, sizeof(e));
+ ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
+ if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
+ ND_PRINT((ndo," "));
+ if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
+ goto trunc;
+ }
+ return (u_char *)ext + ntohs(e.len);
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_SIG)));
+ return NULL;
+}
+
+static const u_char *
+ikev1_nonce_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_,
+ const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ struct isakmp_gen e;
+
+ ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_NONCE)));
+
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&e, ext, sizeof(e));
+ ND_PRINT((ndo," n len=%d", ntohs(e.len) - 4));
+ if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
+ ND_PRINT((ndo," "));
+ if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
+ goto trunc;
+ } else if (1 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
+ ND_PRINT((ndo," "));
+ if (!ike_show_somedata(ndo, (u_char *)(caddr_t)(ext + 1), ep))
+ goto trunc;
+ }
+ return (u_char *)ext + ntohs(e.len);
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_NONCE)));
+ return NULL;
+}
+
+static const u_char *
+ikev1_n_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext, u_int item_len,
+ const u_char *ep, uint32_t phase, uint32_t doi0 _U_,
+ uint32_t proto0 _U_, int depth)
+{
+ struct ikev1_pl_n *p, n;
+ const u_char *cp;
+ u_char *ep2;
+ uint32_t doi;
+ uint32_t proto;
+ static const char *notify_error_str[] = {
+ NULL, "INVALID-PAYLOAD-TYPE",
+ "DOI-NOT-SUPPORTED", "SITUATION-NOT-SUPPORTED",
+ "INVALID-COOKIE", "INVALID-MAJOR-VERSION",
+ "INVALID-MINOR-VERSION", "INVALID-EXCHANGE-TYPE",
+ "INVALID-FLAGS", "INVALID-MESSAGE-ID",
+ "INVALID-PROTOCOL-ID", "INVALID-SPI",
+ "INVALID-TRANSFORM-ID", "ATTRIBUTES-NOT-SUPPORTED",
+ "NO-PROPOSAL-CHOSEN", "BAD-PROPOSAL-SYNTAX",
+ "PAYLOAD-MALFORMED", "INVALID-KEY-INFORMATION",
+ "INVALID-ID-INFORMATION", "INVALID-CERT-ENCODING",
+ "INVALID-CERTIFICATE", "CERT-TYPE-UNSUPPORTED",
+ "INVALID-CERT-AUTHORITY", "INVALID-HASH-INFORMATION",
+ "AUTHENTICATION-FAILED", "INVALID-SIGNATURE",
+ "ADDRESS-NOTIFICATION", "NOTIFY-SA-LIFETIME",
+ "CERTIFICATE-UNAVAILABLE", "UNSUPPORTED-EXCHANGE-TYPE",
+ "UNEQUAL-PAYLOAD-LENGTHS",
+ };
+ static const char *ipsec_notify_error_str[] = {
+ "RESERVED",
+ };
+ static const char *notify_status_str[] = {
+ "CONNECTED",
+ };
+ static const char *ipsec_notify_status_str[] = {
+ "RESPONDER-LIFETIME", "REPLAY-STATUS",
+ "INITIAL-CONTACT",
+ };
+/* NOTE: these macro must be called with x in proper range */
+
+/* 0 - 8191 */
+#define NOTIFY_ERROR_STR(x) \
+ STR_OR_ID((x), notify_error_str)
+
+/* 8192 - 16383 */
+#define IPSEC_NOTIFY_ERROR_STR(x) \
+ STR_OR_ID((u_int)((x) - 8192), ipsec_notify_error_str)
+
+/* 16384 - 24575 */
+#define NOTIFY_STATUS_STR(x) \
+ STR_OR_ID((u_int)((x) - 16384), notify_status_str)
+
+/* 24576 - 32767 */
+#define IPSEC_NOTIFY_STATUS_STR(x) \
+ STR_OR_ID((u_int)((x) - 24576), ipsec_notify_status_str)
+
+ ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_N)));
+
+ p = (struct ikev1_pl_n *)ext;
+ ND_TCHECK(*p);
+ UNALIGNED_MEMCPY(&n, ext, sizeof(n));
+ doi = ntohl(n.doi);
+ proto = n.prot_id;
+ if (doi != 1) {
+ ND_PRINT((ndo," doi=%d", doi));
+ ND_PRINT((ndo," proto=%d", proto));
+ if (ntohs(n.type) < 8192)
+ ND_PRINT((ndo," type=%s", NOTIFY_ERROR_STR(ntohs(n.type))));
+ else if (ntohs(n.type) < 16384)
+ ND_PRINT((ndo," type=%s", numstr(ntohs(n.type))));
+ else if (ntohs(n.type) < 24576)
+ ND_PRINT((ndo," type=%s", NOTIFY_STATUS_STR(ntohs(n.type))));
+ else
+ ND_PRINT((ndo," type=%s", numstr(ntohs(n.type))));
+ if (n.spi_size) {
+ ND_PRINT((ndo," spi="));
+ if (!rawprint(ndo, (caddr_t)(p + 1), n.spi_size))
+ goto trunc;
+ }
+ return (u_char *)(p + 1) + n.spi_size;
+ }
+
+ ND_PRINT((ndo," doi=ipsec"));
+ ND_PRINT((ndo," proto=%s", PROTOIDSTR(proto)));
+ if (ntohs(n.type) < 8192)
+ ND_PRINT((ndo," type=%s", NOTIFY_ERROR_STR(ntohs(n.type))));
+ else if (ntohs(n.type) < 16384)
+ ND_PRINT((ndo," type=%s", IPSEC_NOTIFY_ERROR_STR(ntohs(n.type))));
+ else if (ntohs(n.type) < 24576)
+ ND_PRINT((ndo," type=%s", NOTIFY_STATUS_STR(ntohs(n.type))));
+ else if (ntohs(n.type) < 32768)
+ ND_PRINT((ndo," type=%s", IPSEC_NOTIFY_STATUS_STR(ntohs(n.type))));
+ else
+ ND_PRINT((ndo," type=%s", numstr(ntohs(n.type))));
+ if (n.spi_size) {
+ ND_PRINT((ndo," spi="));
+ if (!rawprint(ndo, (caddr_t)(p + 1), n.spi_size))
+ goto trunc;
+ }
+
+ cp = (u_char *)(p + 1) + n.spi_size;
+ ep2 = (u_char *)p + item_len;
+
+ if (cp < ep) {
+ ND_PRINT((ndo," orig=("));
+ switch (ntohs(n.type)) {
+ case IPSECDOI_NTYPE_RESPONDER_LIFETIME:
+ {
+ const struct attrmap *map = oakley_t_map;
+ size_t nmap = sizeof(oakley_t_map)/sizeof(oakley_t_map[0]);
+ while (cp < ep && cp < ep2) {
+ cp = ikev1_attrmap_print(ndo, cp,
+ (ep < ep2) ? ep : ep2, map, nmap);
+ }
+ break;
+ }
+ case IPSECDOI_NTYPE_REPLAY_STATUS:
+ ND_PRINT((ndo,"replay detection %sabled",
+ EXTRACT_32BITS(cp) ? "en" : "dis"));
+ break;
+ case ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN:
+ if (ikev1_sub_print(ndo, ISAKMP_NPTYPE_SA,
+ (struct isakmp_gen *)cp, ep, phase, doi, proto,
+ depth) == NULL)
+ return NULL;
+ break;
+ default:
+ /* NULL is dummy */
+ isakmp_print(ndo, cp,
+ item_len - sizeof(*p) - n.spi_size,
+ NULL);
+ }
+ ND_PRINT((ndo,")"));
+ }
+ return (u_char *)ext + item_len;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_N)));
+ return NULL;
+}
+
+static const u_char *
+ikev1_d_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext, u_int item_len _U_,
+ const u_char *ep _U_, uint32_t phase _U_, uint32_t doi0 _U_,
+ uint32_t proto0 _U_, int depth _U_)
+{
+ const struct ikev1_pl_d *p;
+ struct ikev1_pl_d d;
+ const uint8_t *q;
+ uint32_t doi;
+ uint32_t proto;
+ int i;
+
+ ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_D)));
+
+ p = (struct ikev1_pl_d *)ext;
+ ND_TCHECK(*p);
+ UNALIGNED_MEMCPY(&d, ext, sizeof(d));
+ doi = ntohl(d.doi);
+ proto = d.prot_id;
+ if (doi != 1) {
+ ND_PRINT((ndo," doi=%u", doi));
+ ND_PRINT((ndo," proto=%u", proto));
+ } else {
+ ND_PRINT((ndo," doi=ipsec"));
+ ND_PRINT((ndo," proto=%s", PROTOIDSTR(proto)));
+ }
+ ND_PRINT((ndo," spilen=%u", d.spi_size));
+ ND_PRINT((ndo," nspi=%u", ntohs(d.num_spi)));
+ ND_PRINT((ndo," spi="));
+ q = (uint8_t *)(p + 1);
+ for (i = 0; i < ntohs(d.num_spi); i++) {
+ if (i != 0)
+ ND_PRINT((ndo,","));
+ if (!rawprint(ndo, (caddr_t)q, d.spi_size))
+ goto trunc;
+ q += d.spi_size;
+ }
+ return q;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_D)));
+ return NULL;
+}
+
+static const u_char *
+ikev1_vid_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ struct isakmp_gen e;
+
+ ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_VID)));
+
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&e, ext, sizeof(e));
+ ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
+ if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
+ ND_PRINT((ndo," "));
+ if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
+ goto trunc;
+ }
+ return (u_char *)ext + ntohs(e.len);
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_VID)));
+ return NULL;
+}
+
+/************************************************************/
+/* */
+/* IKE v2 - rfc4306 - dissector */
+/* */
+/************************************************************/
+
+static void
+ikev2_pay_print(netdissect_options *ndo, const char *payname, int critical)
+{
+ ND_PRINT((ndo,"%s%s:", payname, critical&0x80 ? "[C]" : ""));
+}
+
+static const u_char *
+ikev2_gen_print(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext)
+{
+ struct isakmp_gen e;
+
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&e, ext, sizeof(e));
+ ikev2_pay_print(ndo, NPSTR(tpay), e.critical);
+
+ ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
+ if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
+ ND_PRINT((ndo," "));
+ if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
+ goto trunc;
+ }
+ return (u_char *)ext + ntohs(e.len);
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
+ return NULL;
+}
+
+static const u_char *
+ikev2_t_print(netdissect_options *ndo, u_char tpay _U_, int pcount,
+ const struct isakmp_gen *ext, u_int item_len,
+ const u_char *ep, uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ const struct ikev2_t *p;
+ struct ikev2_t t;
+ uint16_t t_id;
+ const u_char *cp;
+ const char *idstr;
+ const struct attrmap *map;
+ size_t nmap;
+ const u_char *ep2;
+
+ p = (struct ikev2_t *)ext;
+ ND_TCHECK(*p);
+ UNALIGNED_MEMCPY(&t, ext, sizeof(t));
+ ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_T), t.h.critical);
+
+ t_id = ntohs(t.t_id);
+
+ map = NULL;
+ nmap = 0;
+
+ switch (t.t_type) {
+ case IV2_T_ENCR:
+ idstr = STR_OR_ID(t_id, esp_p_map);
+ map = encr_t_map;
+ nmap = sizeof(encr_t_map)/sizeof(encr_t_map[0]);
+ break;
+
+ case IV2_T_PRF:
+ idstr = STR_OR_ID(t_id, prf_p_map);
+ break;
+
+ case IV2_T_INTEG:
+ idstr = STR_OR_ID(t_id, integ_p_map);
+ break;
+
+ case IV2_T_DH:
+ idstr = STR_OR_ID(t_id, dh_p_map);
+ break;
+
+ case IV2_T_ESN:
+ idstr = STR_OR_ID(t_id, esn_p_map);
+ break;
+
+ default:
+ idstr = NULL;
+ break;
+ }
+
+ if (idstr)
+ ND_PRINT((ndo," #%u type=%s id=%s ", pcount,
+ STR_OR_ID(t.t_type, ikev2_t_type_map),
+ idstr));
+ else
+ ND_PRINT((ndo," #%u type=%s id=%u ", pcount,
+ STR_OR_ID(t.t_type, ikev2_t_type_map),
+ t.t_id));
+ cp = (u_char *)(p + 1);
+ ep2 = (u_char *)p + item_len;
+ while (cp < ep && cp < ep2) {
+ if (map && nmap) {
+ cp = ikev1_attrmap_print(ndo, cp, (ep < ep2) ? ep : ep2,
+ map, nmap);
+ } else
+ cp = ikev1_attr_print(ndo, cp, (ep < ep2) ? ep : ep2);
+ }
+ if (ep < ep2)
+ ND_PRINT((ndo,"..."));
+ return cp;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_T)));
+ return NULL;
+}
+
+static const u_char *
+ikev2_p_print(netdissect_options *ndo, u_char tpay _U_, int pcount _U_,
+ const struct isakmp_gen *ext, u_int item_len _U_,
+ const u_char *ep, uint32_t phase, uint32_t doi0,
+ uint32_t proto0 _U_, int depth)
+{
+ const struct ikev2_p *p;
+ struct ikev2_p prop;
+ const u_char *cp;
+
+ p = (struct ikev2_p *)ext;
+ ND_TCHECK(*p);
+ UNALIGNED_MEMCPY(&prop, ext, sizeof(prop));
+ ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_P), prop.h.critical);
+
+ ND_PRINT((ndo," #%u protoid=%s transform=%d len=%u",
+ prop.p_no, PROTOIDSTR(prop.prot_id),
+ prop.num_t, ntohs(prop.h.len)));
+ if (prop.spi_size) {
+ ND_PRINT((ndo," spi="));
+ if (!rawprint(ndo, (caddr_t)(p + 1), prop.spi_size))
+ goto trunc;
+ }
+
+ ext = (struct isakmp_gen *)((u_char *)(p + 1) + prop.spi_size);
+ ND_TCHECK(*ext);
+
+ cp = ikev2_sub_print(ndo, NULL, ISAKMP_NPTYPE_T, ext, ep, phase, doi0,
+ prop.prot_id, depth);
+
+ return cp;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_P)));
+ return NULL;
+}
+
+static const u_char *
+ikev2_sa_print(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext1,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ struct isakmp_gen e;
+ int osa_length, sa_length;
+
+ ND_TCHECK(*ext1);
+ UNALIGNED_MEMCPY(&e, ext1, sizeof(e));
+ ikev2_pay_print(ndo, "sa", e.critical);
+
+ osa_length= ntohs(e.len);
+ sa_length = osa_length - 4;
+ ND_PRINT((ndo," len=%d", sa_length));
+
+ ikev2_sub_print(ndo, NULL, ISAKMP_NPTYPE_P,
+ ext1+1, ep,
+ 0, 0, 0, depth);
+
+ return (u_char *)ext1 + osa_length;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
+ return NULL;
+}
+
+static const u_char *
+ikev2_ke_print(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ struct ikev2_ke ke;
+ struct ikev2_ke *k;
+
+ k = (struct ikev2_ke *)ext;
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&ke, ext, sizeof(ke));
+ ikev2_pay_print(ndo, NPSTR(tpay), ke.h.critical);
+
+ ND_PRINT((ndo," len=%u group=%s", ntohs(ke.h.len) - 8,
+ STR_OR_ID(ntohs(ke.ke_group), dh_p_map)));
+
+ if (2 < ndo->ndo_vflag && 8 < ntohs(ke.h.len)) {
+ ND_PRINT((ndo," "));
+ if (!rawprint(ndo, (caddr_t)(k + 1), ntohs(ke.h.len) - 8))
+ goto trunc;
+ }
+ return (u_char *)ext + ntohs(ke.h.len);
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
+ return NULL;
+}
+
+static const u_char *
+ikev2_ID_print(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ struct ikev2_id id;
+ int id_len, idtype_len, i;
+ unsigned int dumpascii, dumphex;
+ unsigned char *typedata;
+
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&id, ext, sizeof(id));
+ ikev2_pay_print(ndo, NPSTR(tpay), id.h.critical);
+
+ id_len = ntohs(id.h.len);
+
+ ND_PRINT((ndo," len=%d", id_len - 4));
+ if (2 < ndo->ndo_vflag && 4 < id_len) {
+ ND_PRINT((ndo," "));
+ if (!rawprint(ndo, (caddr_t)(ext + 1), id_len - 4))
+ goto trunc;
+ }
+
+ idtype_len =id_len - sizeof(struct ikev2_id);
+ dumpascii = 0;
+ dumphex = 0;
+ typedata = (unsigned char *)(ext)+sizeof(struct ikev2_id);
+
+ switch(id.type) {
+ case ID_IPV4_ADDR:
+ ND_PRINT((ndo, " ipv4:"));
+ dumphex=1;
+ break;
+ case ID_FQDN:
+ ND_PRINT((ndo, " fqdn:"));
+ dumpascii=1;
+ break;
+ case ID_RFC822_ADDR:
+ ND_PRINT((ndo, " rfc822:"));
+ dumpascii=1;
+ break;
+ case ID_IPV6_ADDR:
+ ND_PRINT((ndo, " ipv6:"));
+ dumphex=1;
+ break;
+ case ID_DER_ASN1_DN:
+ ND_PRINT((ndo, " dn:"));
+ dumphex=1;
+ break;
+ case ID_DER_ASN1_GN:
+ ND_PRINT((ndo, " gn:"));
+ dumphex=1;
+ break;
+ case ID_KEY_ID:
+ ND_PRINT((ndo, " keyid:"));
+ dumphex=1;
+ break;
+ }
+
+ if(dumpascii) {
+ ND_TCHECK2(*typedata, idtype_len);
+ for(i=0; i<idtype_len; i++) {
+ if(ND_ISPRINT(typedata[i])) {
+ ND_PRINT((ndo, "%c", typedata[i]));
+ } else {
+ ND_PRINT((ndo, "."));
+ }
+ }
+ }
+ if(dumphex) {
+ if (!rawprint(ndo, (caddr_t)typedata, idtype_len))
+ goto trunc;
+ }
+
+ return (u_char *)ext + id_len;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
+ return NULL;
+}
+
+static const u_char *
+ikev2_cert_print(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ return ikev2_gen_print(ndo, tpay, ext);
+}
+
+static const u_char *
+ikev2_cr_print(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ return ikev2_gen_print(ndo, tpay, ext);
+}
+
+static const u_char *
+ikev2_auth_print(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ struct ikev2_auth a;
+ const char *v2_auth[]={ "invalid", "rsasig",
+ "shared-secret", "dsssig" };
+ u_char *authdata = (u_char*)ext + sizeof(a);
+ unsigned int len;
+
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&a, ext, sizeof(a));
+ ikev2_pay_print(ndo, NPSTR(tpay), a.h.critical);
+ len = ntohs(a.h.len);
+
+ ND_PRINT((ndo," len=%d method=%s", len-4,
+ STR_OR_ID(a.auth_method, v2_auth)));
+
+ if (1 < ndo->ndo_vflag && 4 < len) {
+ ND_PRINT((ndo," authdata=("));
+ if (!rawprint(ndo, (caddr_t)authdata, len - sizeof(a)))
+ goto trunc;
+ ND_PRINT((ndo,") "));
+ } else if(ndo->ndo_vflag && 4 < len) {
+ if(!ike_show_somedata(ndo, authdata, ep)) goto trunc;
+ }
+
+ return (u_char *)ext + len;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
+ return NULL;
+}
+
+static const u_char *
+ikev2_nonce_print(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ struct isakmp_gen e;
+
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&e, ext, sizeof(e));
+ ikev2_pay_print(ndo, "nonce", e.critical);
+
+ ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
+ if (1 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
+ ND_PRINT((ndo," nonce=("));
+ if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
+ goto trunc;
+ ND_PRINT((ndo,") "));
+ } else if(ndo->ndo_vflag && 4 < ntohs(e.len)) {
+ if(!ike_show_somedata(ndo, (const u_char *)(ext+1), ep)) goto trunc;
+ }
+
+ return (u_char *)ext + ntohs(e.len);
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
+ return NULL;
+}
+
+/* notify payloads */
+static const u_char *
+ikev2_n_print(netdissect_options *ndo, u_char tpay _U_,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ struct ikev2_n *p, n;
+ const u_char *cp;
+ u_char showspi, showdata, showsomedata;
+ const char *notify_name;
+ uint32_t type;
+
+ p = (struct ikev2_n *)ext;
+ ND_TCHECK(*p);
+ UNALIGNED_MEMCPY(&n, ext, sizeof(n));
+ ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_N), n.h.critical);
+
+ showspi = 1;
+ showdata = 0;
+ showsomedata=0;
+ notify_name=NULL;
+
+ ND_PRINT((ndo," prot_id=%s", PROTOIDSTR(n.prot_id)));
+
+ type = ntohs(n.type);
+
+ /* notify space is annoying sparse */
+ switch(type) {
+ case IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD:
+ notify_name = "unsupported_critical_payload";
+ showspi = 0;
+ break;
+
+ case IV2_NOTIFY_INVALID_IKE_SPI:
+ notify_name = "invalid_ike_spi";
+ showspi = 1;
+ break;
+
+ case IV2_NOTIFY_INVALID_MAJOR_VERSION:
+ notify_name = "invalid_major_version";
+ showspi = 0;
+ break;
+
+ case IV2_NOTIFY_INVALID_SYNTAX:
+ notify_name = "invalid_syntax";
+ showspi = 1;
+ break;
+
+ case IV2_NOTIFY_INVALID_MESSAGE_ID:
+ notify_name = "invalid_message_id";
+ showspi = 1;
+ break;
+
+ case IV2_NOTIFY_INVALID_SPI:
+ notify_name = "invalid_spi";
+ showspi = 1;
+ break;
+
+ case IV2_NOTIFY_NO_PROPOSAL_CHOSEN:
+ notify_name = "no_protocol_chosen";
+ showspi = 1;
+ break;
+
+ case IV2_NOTIFY_INVALID_KE_PAYLOAD:
+ notify_name = "invalid_ke_payload";
+ showspi = 1;
+ break;
+
+ case IV2_NOTIFY_AUTHENTICATION_FAILED:
+ notify_name = "authentication_failed";
+ showspi = 1;
+ break;
+
+ case IV2_NOTIFY_SINGLE_PAIR_REQUIRED:
+ notify_name = "single_pair_required";
+ showspi = 1;
+ break;
+
+ case IV2_NOTIFY_NO_ADDITIONAL_SAS:
+ notify_name = "no_additional_sas";
+ showspi = 0;
+ break;
+
+ case IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE:
+ notify_name = "internal_address_failure";
+ showspi = 0;
+ break;
+
+ case IV2_NOTIFY_FAILED_CP_REQUIRED:
+ notify_name = "failed:cp_required";
+ showspi = 0;
+ break;
+
+ case IV2_NOTIFY_INVALID_SELECTORS:
+ notify_name = "invalid_selectors";
+ showspi = 0;
+ break;
+
+ case IV2_NOTIFY_INITIAL_CONTACT:
+ notify_name = "initial_contact";
+ showspi = 0;
+ break;
+
+ case IV2_NOTIFY_SET_WINDOW_SIZE:
+ notify_name = "set_window_size";
+ showspi = 0;
+ break;
+
+ case IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE:
+ notify_name = "additional_ts_possible";
+ showspi = 0;
+ break;
+
+ case IV2_NOTIFY_IPCOMP_SUPPORTED:
+ notify_name = "ipcomp_supported";
+ showspi = 0;
+ break;
+
+ case IV2_NOTIFY_NAT_DETECTION_SOURCE_IP:
+ notify_name = "nat_detection_source_ip";
+ showspi = 1;
+ break;
+
+ case IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP:
+ notify_name = "nat_detection_destination_ip";
+ showspi = 1;
+ break;
+
+ case IV2_NOTIFY_COOKIE:
+ notify_name = "cookie";
+ showspi = 1;
+ showsomedata= 1;
+ showdata= 0;
+ break;
+
+ case IV2_NOTIFY_USE_TRANSPORT_MODE:
+ notify_name = "use_transport_mode";
+ showspi = 0;
+ break;
+
+ case IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED:
+ notify_name = "http_cert_lookup_supported";
+ showspi = 0;
+ break;
+
+ case IV2_NOTIFY_REKEY_SA:
+ notify_name = "rekey_sa";
+ showspi = 1;
+ break;
+
+ case IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED:
+ notify_name = "tfc_padding_not_supported";
+ showspi = 0;
+ break;
+
+ case IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO:
+ notify_name = "non_first_fragment_also";
+ showspi = 0;
+ break;
+
+ default:
+ if (type < 8192) {
+ notify_name="error";
+ } else if(type < 16384) {
+ notify_name="private-error";
+ } else if(type < 40960) {
+ notify_name="status";
+ } else {
+ notify_name="private-status";
+ }
+ }
+
+ if(notify_name) {
+ ND_PRINT((ndo," type=%u(%s)", type, notify_name));
+ }
+
+
+ if (showspi && n.spi_size) {
+ ND_PRINT((ndo," spi="));
+ if (!rawprint(ndo, (caddr_t)(p + 1), n.spi_size))
+ goto trunc;
+ }
+
+ cp = (u_char *)(p + 1) + n.spi_size;
+
+ if(3 < ndo->ndo_vflag) {
+ showdata = 1;
+ }
+
+ if ((showdata || (showsomedata && ep-cp < 30)) && cp < ep) {
+ ND_PRINT((ndo," data=("));
+ if (!rawprint(ndo, (caddr_t)(cp), ep - cp))
+ goto trunc;
+
+ ND_PRINT((ndo,")"));
+
+ } else if(showsomedata && cp < ep) {
+ if(!ike_show_somedata(ndo, cp, ep)) goto trunc;
+ }
+
+ return (u_char *)ext + item_len;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_N)));
+ return NULL;
+}
+
+static const u_char *
+ikev2_d_print(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ return ikev2_gen_print(ndo, tpay, ext);
+}
+
+static const u_char *
+ikev2_vid_print(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ struct isakmp_gen e;
+ const u_char *vid;
+ int i, len;
+
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&e, ext, sizeof(e));
+ ikev2_pay_print(ndo, NPSTR(tpay), e.critical);
+ ND_PRINT((ndo," len=%d vid=", ntohs(e.len) - 4));
+
+ vid = (const u_char *)(ext+1);
+ len = ntohs(e.len) - 4;
+ ND_TCHECK2(*vid, len);
+ for(i=0; i<len; i++) {
+ if(ND_ISPRINT(vid[i])) ND_PRINT((ndo, "%c", vid[i]));
+ else ND_PRINT((ndo, "."));
+ }
+ if (2 < ndo->ndo_vflag && 4 < len) {
+ ND_PRINT((ndo," "));
+ if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
+ goto trunc;
+ }
+ return (u_char *)ext + ntohs(e.len);
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
+ return NULL;
+}
+
+static const u_char *
+ikev2_TS_print(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ return ikev2_gen_print(ndo, tpay, ext);
+}
+
+static const u_char *
+ikev2_e_print(netdissect_options *ndo,
+#ifndef HAVE_LIBCRYPTO
+ _U_
+#endif
+ struct isakmp *base,
+ u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+#ifndef HAVE_LIBCRYPTO
+ _U_
+#endif
+ uint32_t phase,
+#ifndef HAVE_LIBCRYPTO
+ _U_
+#endif
+ uint32_t doi,
+#ifndef HAVE_LIBCRYPTO
+ _U_
+#endif
+ uint32_t proto,
+#ifndef HAVE_LIBCRYPTO
+ _U_
+#endif
+ int depth)
+{
+ struct isakmp_gen e;
+ u_char *dat;
+ volatile int dlen;
+
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&e, ext, sizeof(e));
+ ikev2_pay_print(ndo, NPSTR(tpay), e.critical);
+
+ dlen = ntohs(e.len)-4;
+
+ ND_PRINT((ndo," len=%d", dlen));
+ if (2 < ndo->ndo_vflag && 4 < dlen) {
+ ND_PRINT((ndo," "));
+ if (!rawprint(ndo, (caddr_t)(ext + 1), dlen))
+ goto trunc;
+ }
+
+ dat = (u_char *)(ext+1);
+ ND_TCHECK2(*dat, dlen);
+
+#ifdef HAVE_LIBCRYPTO
+ /* try to decypt it! */
+ if(esp_print_decrypt_buffer_by_ikev2(ndo,
+ base->flags & ISAKMP_FLAG_I,
+ base->i_ck, base->r_ck,
+ dat, dat+dlen)) {
+
+ ext = (const struct isakmp_gen *)ndo->ndo_packetp;
+
+ /* got it decrypted, print stuff inside. */
+ ikev2_sub_print(ndo, base, e.np, ext, ndo->ndo_snapend,
+ phase, doi, proto, depth+1);
+ }
+#endif
+
+
+ /* always return NULL, because E must be at end, and NP refers
+ * to what was inside.
+ */
+ return NULL;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
+ return NULL;
+}
+
+static const u_char *
+ikev2_cp_print(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ return ikev2_gen_print(ndo, tpay, ext);
+}
+
+static const u_char *
+ikev2_eap_print(netdissect_options *ndo, u_char tpay,
+ const struct isakmp_gen *ext,
+ u_int item_len _U_, const u_char *ep _U_,
+ uint32_t phase _U_, uint32_t doi _U_,
+ uint32_t proto _U_, int depth _U_)
+{
+ return ikev2_gen_print(ndo, tpay, ext);
+}
+
+static const u_char *
+ike_sub0_print(netdissect_options *ndo,
+ u_char np, const struct isakmp_gen *ext, const u_char *ep,
+
+ uint32_t phase, uint32_t doi, uint32_t proto, int depth)
+{
+ const u_char *cp;
+ struct isakmp_gen e;
+ u_int item_len;
+
+ cp = (u_char *)ext;
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&e, ext, sizeof(e));
+
+ /*
+ * Since we can't have a payload length of less than 4 bytes,
+ * we need to bail out here if the generic header is nonsensical
+ * or truncated, otherwise we could loop forever processing
+ * zero-length items or otherwise misdissect the packet.
+ */
+ item_len = ntohs(e.len);
+ if (item_len <= 4)
+ return NULL;
+
+ if (NPFUNC(np)) {
+ /*
+ * XXX - what if item_len is too short, or too long,
+ * for this payload type?
+ */
+ cp = (*npfunc[np])(ndo, np, ext, item_len, ep, phase, doi, proto, depth);
+ } else {
+ ND_PRINT((ndo,"%s", NPSTR(np)));
+ cp += item_len;
+ }
+
+ return cp;
+trunc:
+ ND_PRINT((ndo," [|isakmp]"));
+ return NULL;
+}
+
+static const u_char *
+ikev1_sub_print(netdissect_options *ndo,
+ u_char np, const struct isakmp_gen *ext, const u_char *ep,
+ uint32_t phase, uint32_t doi, uint32_t proto, int depth)
+{
+ const u_char *cp;
+ int i;
+ struct isakmp_gen e;
+
+ cp = (const u_char *)ext;
+
+ while (np) {
+ ND_TCHECK(*ext);
+
+ UNALIGNED_MEMCPY(&e, ext, sizeof(e));
+
+ ND_TCHECK2(*ext, ntohs(e.len));
+
+ depth++;
+ ND_PRINT((ndo,"\n"));
+ for (i = 0; i < depth; i++)
+ ND_PRINT((ndo," "));
+ ND_PRINT((ndo,"("));
+ cp = ike_sub0_print(ndo, np, ext, ep, phase, doi, proto, depth);
+ ND_PRINT((ndo,")"));
+ depth--;
+
+ if (cp == NULL) {
+ /* Zero-length subitem */
+ return NULL;
+ }
+
+ np = e.np;
+ ext = (struct isakmp_gen *)cp;
+ }
+ return cp;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(np)));
+ return NULL;
+}
+
+static char *
+numstr(int x)
+{
+ static char buf[20];
+ snprintf(buf, sizeof(buf), "#%d", x);
+ return buf;
+}
+
+static void
+ikev1_print(netdissect_options *ndo,
+ const u_char *bp, u_int length,
+ const u_char *bp2, struct isakmp *base)
+{
+ const struct isakmp *p;
+ const u_char *ep;
+ u_char np;
+ int i;
+ int phase;
+
+ p = (const struct isakmp *)bp;
+ ep = ndo->ndo_snapend;
+
+ phase = (EXTRACT_32BITS(base->msgid) == 0) ? 1 : 2;
+ if (phase == 1)
+ ND_PRINT((ndo," phase %d", phase));
+ else
+ ND_PRINT((ndo," phase %d/others", phase));
+
+ i = cookie_find(&base->i_ck);
+ if (i < 0) {
+ if (iszero((u_char *)&base->r_ck, sizeof(base->r_ck))) {
+ /* the first packet */
+ ND_PRINT((ndo," I"));
+ if (bp2)
+ cookie_record(&base->i_ck, bp2);
+ } else
+ ND_PRINT((ndo," ?"));
+ } else {
+ if (bp2 && cookie_isinitiator(i, bp2))
+ ND_PRINT((ndo," I"));
+ else if (bp2 && cookie_isresponder(i, bp2))
+ ND_PRINT((ndo," R"));
+ else
+ ND_PRINT((ndo," ?"));
+ }
+
+ ND_PRINT((ndo," %s", ETYPESTR(base->etype)));
+ if (base->flags) {
+ ND_PRINT((ndo,"[%s%s]", base->flags & ISAKMP_FLAG_E ? "E" : "",
+ base->flags & ISAKMP_FLAG_C ? "C" : ""));
+ }
+
+ if (ndo->ndo_vflag) {
+ const struct isakmp_gen *ext;
+
+ ND_PRINT((ndo,":"));
+
+ /* regardless of phase... */
+ if (base->flags & ISAKMP_FLAG_E) {
+ /*
+ * encrypted, nothing we can do right now.
+ * we hope to decrypt the packet in the future...
+ */
+ ND_PRINT((ndo," [encrypted %s]", NPSTR(base->np)));
+ goto done;
+ }
+
+ CHECKLEN(p + 1, base->np);
+ np = base->np;
+ ext = (struct isakmp_gen *)(p + 1);
+ ikev1_sub_print(ndo, np, ext, ep, phase, 0, 0, 0);
+ }
+
+done:
+ if (ndo->ndo_vflag) {
+ if (ntohl(base->len) != length) {
+ ND_PRINT((ndo," (len mismatch: isakmp %u/ip %u)",
+ (uint32_t)ntohl(base->len), length));
+ }
+ }
+}
+
+static const u_char *
+ikev2_sub0_print(netdissect_options *ndo, struct isakmp *base,
+ u_char np, int pcount,
+ const struct isakmp_gen *ext, const u_char *ep,
+ uint32_t phase, uint32_t doi, uint32_t proto, int depth)
+{
+ const u_char *cp;
+ struct isakmp_gen e;
+ u_int item_len;
+
+ cp = (u_char *)ext;
+ ND_TCHECK(*ext);
+ UNALIGNED_MEMCPY(&e, ext, sizeof(e));
+
+ /*
+ * Since we can't have a payload length of less than 4 bytes,
+ * we need to bail out here if the generic header is nonsensical
+ * or truncated, otherwise we could loop forever processing
+ * zero-length items or otherwise misdissect the packet.
+ */
+ item_len = ntohs(e.len);
+ if (item_len <= 4)
+ return NULL;
+
+ if(np == ISAKMP_NPTYPE_P) {
+ cp = ikev2_p_print(ndo, np, pcount, ext, item_len,
+ ep, phase, doi, proto, depth);
+ } else if(np == ISAKMP_NPTYPE_T) {
+ cp = ikev2_t_print(ndo, np, pcount, ext, item_len,
+ ep, phase, doi, proto, depth);
+ } else if(np == ISAKMP_NPTYPE_v2E) {
+ cp = ikev2_e_print(ndo, base, np, ext, item_len,
+ ep, phase, doi, proto, depth);
+ } else if (NPFUNC(np)) {
+ /*
+ * XXX - what if item_len is too short, or too long,
+ * for this payload type?
+ */
+ cp = (*npfunc[np])(ndo, np, /*pcount,*/ ext, item_len,
+ ep, phase, doi, proto, depth);
+ } else {
+ ND_PRINT((ndo,"%s", NPSTR(np)));
+ cp += item_len;
+ }
+
+ return cp;
+trunc:
+ ND_PRINT((ndo," [|isakmp]"));
+ return NULL;
+}
+
+static const u_char *
+ikev2_sub_print(netdissect_options *ndo,
+ struct isakmp *base,
+ u_char np, const struct isakmp_gen *ext, const u_char *ep,
+ uint32_t phase, uint32_t doi, uint32_t proto, int depth)
+{
+ const u_char *cp;
+ int i;
+ int pcount;
+ struct isakmp_gen e;
+
+ cp = (const u_char *)ext;
+ pcount = 0;
+ while (np) {
+ pcount++;
+ ND_TCHECK(*ext);
+
+ UNALIGNED_MEMCPY(&e, ext, sizeof(e));
+
+ ND_TCHECK2(*ext, ntohs(e.len));
+
+ depth++;
+ ND_PRINT((ndo,"\n"));
+ for (i = 0; i < depth; i++)
+ ND_PRINT((ndo," "));
+ ND_PRINT((ndo,"("));
+ cp = ikev2_sub0_print(ndo, base, np, pcount,
+ ext, ep, phase, doi, proto, depth);
+ ND_PRINT((ndo,")"));
+ depth--;
+
+ if (cp == NULL) {
+ /* Zero-length subitem */
+ return NULL;
+ }
+
+ np = e.np;
+ ext = (struct isakmp_gen *)cp;
+ }
+ return cp;
+trunc:
+ ND_PRINT((ndo," [|%s]", NPSTR(np)));
+ return NULL;
+}
+
+static void
+ikev2_print(netdissect_options *ndo,
+ const u_char *bp, u_int length,
+ const u_char *bp2 _U_, struct isakmp *base)
+{
+ const struct isakmp *p;
+ const u_char *ep;
+ u_char np;
+ int phase;
+
+ p = (const struct isakmp *)bp;
+ ep = ndo->ndo_snapend;
+
+ phase = (EXTRACT_32BITS(base->msgid) == 0) ? 1 : 2;
+ if (phase == 1)
+ ND_PRINT((ndo, " parent_sa"));
+ else
+ ND_PRINT((ndo, " child_sa "));
+
+ ND_PRINT((ndo, " %s", ETYPESTR(base->etype)));
+ if (base->flags) {
+ ND_PRINT((ndo, "[%s%s%s]",
+ base->flags & ISAKMP_FLAG_I ? "I" : "",
+ base->flags & ISAKMP_FLAG_V ? "V" : "",
+ base->flags & ISAKMP_FLAG_R ? "R" : ""));
+ }
+
+ if (ndo->ndo_vflag) {
+ const struct isakmp_gen *ext;
+
+ ND_PRINT((ndo, ":"));
+
+ /* regardless of phase... */
+ if (base->flags & ISAKMP_FLAG_E) {
+ /*
+ * encrypted, nothing we can do right now.
+ * we hope to decrypt the packet in the future...
+ */
+ ND_PRINT((ndo, " [encrypted %s]", NPSTR(base->np)));
+ goto done;
+ }
+
+ CHECKLEN(p + 1, base->np)
+
+ np = base->np;
+ ext = (struct isakmp_gen *)(p + 1);
+ ikev2_sub_print(ndo, base, np, ext, ep, phase, 0, 0, 0);
+ }
+
+done:
+ if (ndo->ndo_vflag) {
+ if (ntohl(base->len) != length) {
+ ND_PRINT((ndo, " (len mismatch: isakmp %u/ip %u)",
+ (uint32_t)ntohl(base->len), length));
+ }
+ }
+}
+
+void
+isakmp_print(netdissect_options *ndo,
+ const u_char *bp, u_int length,
+ const u_char *bp2)
+{
+ const struct isakmp *p;
+ struct isakmp base;
+ const u_char *ep;
+ int major, minor;
+
+#ifdef HAVE_LIBCRYPTO
+ /* initialize SAs */
+ if (ndo->ndo_sa_list_head == NULL) {
+ if (ndo->ndo_espsecret)
+ esp_print_decodesecret(ndo);
+ }
+#endif
+
+ p = (const struct isakmp *)bp;
+ ep = ndo->ndo_snapend;
+
+ if ((struct isakmp *)ep < p + 1) {
+ ND_PRINT((ndo,"[|isakmp]"));
+ return;
+ }
+
+ UNALIGNED_MEMCPY(&base, p, sizeof(base));
+
+ ND_PRINT((ndo,"isakmp"));
+ major = (base.vers & ISAKMP_VERS_MAJOR)
+ >> ISAKMP_VERS_MAJOR_SHIFT;
+ minor = (base.vers & ISAKMP_VERS_MINOR)
+ >> ISAKMP_VERS_MINOR_SHIFT;
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo," %d.%d", major, minor));
+ }
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo," msgid "));
+ hexprint(ndo, (caddr_t)&base.msgid, sizeof(base.msgid));
+ }
+
+ if (1 < ndo->ndo_vflag) {
+ ND_PRINT((ndo," cookie "));
+ hexprint(ndo, (caddr_t)&base.i_ck, sizeof(base.i_ck));
+ ND_PRINT((ndo,"->"));
+ hexprint(ndo, (caddr_t)&base.r_ck, sizeof(base.r_ck));
+ }
+ ND_PRINT((ndo,":"));
+
+ switch(major) {
+ case IKEv1_MAJOR_VERSION:
+ ikev1_print(ndo, bp, length, bp2, &base);
+ break;
+
+ case IKEv2_MAJOR_VERSION:
+ ikev2_print(ndo, bp, length, bp2, &base);
+ break;
+ }
+}
+
+void
+isakmp_rfc3948_print(netdissect_options *ndo,
+ const u_char *bp, u_int length,
+ const u_char *bp2)
+{
+
+ if(length == 1 && bp[0]==0xff) {
+ ND_PRINT((ndo, "isakmp-nat-keep-alive"));
+ return;
+ }
+
+ if(length < 4) {
+ goto trunc;
+ }
+
+ /*
+ * see if this is an IKE packet
+ */
+ if(bp[0]==0 && bp[1]==0 && bp[2]==0 && bp[3]==0) {
+ ND_PRINT((ndo, "NONESP-encap: "));
+ isakmp_print(ndo, bp+4, length-4, bp2);
+ return;
+ }
+
+ /* must be an ESP packet */
+ {
+ int nh, enh, padlen;
+ int advance;
+
+ ND_PRINT((ndo, "UDP-encap: "));
+
+ advance = esp_print(ndo, bp, length, bp2, &enh, &padlen);
+ if(advance <= 0)
+ return;
+
+ bp += advance;
+ length -= advance + padlen;
+ nh = enh & 0xff;
+
+ ip_print_inner(ndo, bp, length, nh, bp2);
+ return;
+ }
+
+trunc:
+ ND_PRINT((ndo,"[|isakmp]"));
+ return;
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
+
+
+
+
--- /dev/null
+/*
+ * Copyright (c) 1992, 1993, 1994, 1995, 1996
+ * 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: (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.
+ *
+ * Original code by Matt Thomas, Digital Equipment Corporation
+ *
+ * Extensively modified by Hannes Gredler (hannes@juniper.net) for more
+ * complete IS-IS & CLNP support.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-isoclns.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "ether.h"
+#include "nlpid.h"
+#include "extract.h"
+#include "gmpls.h"
+#include "oui.h"
+#include "signature.h"
+
+/*
+ * IS-IS is defined in ISO 10589. Look there for protocol definitions.
+ */
+
+#define SYSTEM_ID_LEN ETHER_ADDR_LEN
+#define NODE_ID_LEN SYSTEM_ID_LEN+1
+#define LSP_ID_LEN SYSTEM_ID_LEN+2
+
+#define ISIS_VERSION 1
+#define ESIS_VERSION 1
+#define CLNP_VERSION 1
+
+#define ISIS_PDU_TYPE_MASK 0x1F
+#define ESIS_PDU_TYPE_MASK 0x1F
+#define CLNP_PDU_TYPE_MASK 0x1F
+#define CLNP_FLAG_MASK 0xE0
+#define ISIS_LAN_PRIORITY_MASK 0x7F
+
+#define ISIS_PDU_L1_LAN_IIH 15
+#define ISIS_PDU_L2_LAN_IIH 16
+#define ISIS_PDU_PTP_IIH 17
+#define ISIS_PDU_L1_LSP 18
+#define ISIS_PDU_L2_LSP 20
+#define ISIS_PDU_L1_CSNP 24
+#define ISIS_PDU_L2_CSNP 25
+#define ISIS_PDU_L1_PSNP 26
+#define ISIS_PDU_L2_PSNP 27
+
+static const struct tok isis_pdu_values[] = {
+ { ISIS_PDU_L1_LAN_IIH, "L1 Lan IIH"},
+ { ISIS_PDU_L2_LAN_IIH, "L2 Lan IIH"},
+ { ISIS_PDU_PTP_IIH, "p2p IIH"},
+ { ISIS_PDU_L1_LSP, "L1 LSP"},
+ { ISIS_PDU_L2_LSP, "L2 LSP"},
+ { ISIS_PDU_L1_CSNP, "L1 CSNP"},
+ { ISIS_PDU_L2_CSNP, "L2 CSNP"},
+ { ISIS_PDU_L1_PSNP, "L1 PSNP"},
+ { ISIS_PDU_L2_PSNP, "L2 PSNP"},
+ { 0, NULL}
+};
+
+/*
+ * A TLV is a tuple of a type, length and a value and is normally used for
+ * encoding information in all sorts of places. This is an enumeration of
+ * the well known types.
+ *
+ * list taken from rfc3359 plus some memory from veterans ;-)
+ */
+
+#define ISIS_TLV_AREA_ADDR 1 /* iso10589 */
+#define ISIS_TLV_IS_REACH 2 /* iso10589 */
+#define ISIS_TLV_ESNEIGH 3 /* iso10589 */
+#define ISIS_TLV_PART_DIS 4 /* iso10589 */
+#define ISIS_TLV_PREFIX_NEIGH 5 /* iso10589 */
+#define ISIS_TLV_ISNEIGH 6 /* iso10589 */
+#define ISIS_TLV_ISNEIGH_VARLEN 7 /* iso10589 */
+#define ISIS_TLV_PADDING 8 /* iso10589 */
+#define ISIS_TLV_LSP 9 /* iso10589 */
+#define ISIS_TLV_AUTH 10 /* iso10589, rfc3567 */
+#define ISIS_TLV_CHECKSUM 12 /* rfc3358 */
+#define ISIS_TLV_CHECKSUM_MINLEN 2
+#define ISIS_TLV_LSP_BUFFERSIZE 14 /* iso10589 rev2 */
+#define ISIS_TLV_LSP_BUFFERSIZE_MINLEN 2
+#define ISIS_TLV_EXT_IS_REACH 22 /* draft-ietf-isis-traffic-05 */
+#define ISIS_TLV_IS_ALIAS_ID 24 /* draft-ietf-isis-ext-lsp-frags-02 */
+#define ISIS_TLV_DECNET_PHASE4 42
+#define ISIS_TLV_LUCENT_PRIVATE 66
+#define ISIS_TLV_INT_IP_REACH 128 /* rfc1195, rfc2966 */
+#define ISIS_TLV_PROTOCOLS 129 /* rfc1195 */
+#define ISIS_TLV_EXT_IP_REACH 130 /* rfc1195, rfc2966 */
+#define ISIS_TLV_IDRP_INFO 131 /* rfc1195 */
+#define ISIS_TLV_IDRP_INFO_MINLEN 1
+#define ISIS_TLV_IPADDR 132 /* rfc1195 */
+#define ISIS_TLV_IPAUTH 133 /* rfc1195 */
+#define ISIS_TLV_TE_ROUTER_ID 134 /* draft-ietf-isis-traffic-05 */
+#define ISIS_TLV_EXTD_IP_REACH 135 /* draft-ietf-isis-traffic-05 */
+#define ISIS_TLV_HOSTNAME 137 /* rfc2763 */
+#define ISIS_TLV_SHARED_RISK_GROUP 138 /* draft-ietf-isis-gmpls-extensions */
+#define ISIS_TLV_MT_PORT_CAP 143 /* rfc6165 */
+#define ISIS_TLV_MT_CAPABILITY 144 /* rfc6329 */
+#define ISIS_TLV_NORTEL_PRIVATE1 176
+#define ISIS_TLV_NORTEL_PRIVATE2 177
+#define ISIS_TLV_RESTART_SIGNALING 211 /* rfc3847 */
+#define ISIS_TLV_RESTART_SIGNALING_FLAGLEN 1
+#define ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN 2
+#define ISIS_TLV_MT_IS_REACH 222 /* draft-ietf-isis-wg-multi-topology-05 */
+#define ISIS_TLV_MT_SUPPORTED 229 /* draft-ietf-isis-wg-multi-topology-05 */
+#define ISIS_TLV_MT_SUPPORTED_MINLEN 2
+#define ISIS_TLV_IP6ADDR 232 /* draft-ietf-isis-ipv6-02 */
+#define ISIS_TLV_MT_IP_REACH 235 /* draft-ietf-isis-wg-multi-topology-05 */
+#define ISIS_TLV_IP6_REACH 236 /* draft-ietf-isis-ipv6-02 */
+#define ISIS_TLV_MT_IP6_REACH 237 /* draft-ietf-isis-wg-multi-topology-05 */
+#define ISIS_TLV_PTP_ADJ 240 /* rfc3373 */
+#define ISIS_TLV_IIH_SEQNR 241 /* draft-shen-isis-iih-sequence-00 */
+#define ISIS_TLV_IIH_SEQNR_MINLEN 4
+#define ISIS_TLV_VENDOR_PRIVATE 250 /* draft-ietf-isis-experimental-tlv-01 */
+#define ISIS_TLV_VENDOR_PRIVATE_MINLEN 3
+
+static const struct tok isis_tlv_values[] = {
+ { ISIS_TLV_AREA_ADDR, "Area address(es)"},
+ { ISIS_TLV_IS_REACH, "IS Reachability"},
+ { ISIS_TLV_ESNEIGH, "ES Neighbor(s)"},
+ { ISIS_TLV_PART_DIS, "Partition DIS"},
+ { ISIS_TLV_PREFIX_NEIGH, "Prefix Neighbors"},
+ { ISIS_TLV_ISNEIGH, "IS Neighbor(s)"},
+ { ISIS_TLV_ISNEIGH_VARLEN, "IS Neighbor(s) (variable length)"},
+ { ISIS_TLV_PADDING, "Padding"},
+ { ISIS_TLV_LSP, "LSP entries"},
+ { ISIS_TLV_AUTH, "Authentication"},
+ { ISIS_TLV_CHECKSUM, "Checksum"},
+ { ISIS_TLV_LSP_BUFFERSIZE, "LSP Buffersize"},
+ { ISIS_TLV_EXT_IS_REACH, "Extended IS Reachability"},
+ { ISIS_TLV_IS_ALIAS_ID, "IS Alias ID"},
+ { ISIS_TLV_DECNET_PHASE4, "DECnet Phase IV"},
+ { ISIS_TLV_LUCENT_PRIVATE, "Lucent Proprietary"},
+ { ISIS_TLV_INT_IP_REACH, "IPv4 Internal Reachability"},
+ { ISIS_TLV_PROTOCOLS, "Protocols supported"},
+ { ISIS_TLV_EXT_IP_REACH, "IPv4 External Reachability"},
+ { ISIS_TLV_IDRP_INFO, "Inter-Domain Information Type"},
+ { ISIS_TLV_IPADDR, "IPv4 Interface address(es)"},
+ { ISIS_TLV_IPAUTH, "IPv4 authentication (deprecated)"},
+ { ISIS_TLV_TE_ROUTER_ID, "Traffic Engineering Router ID"},
+ { ISIS_TLV_EXTD_IP_REACH, "Extended IPv4 Reachability"},
+ { ISIS_TLV_SHARED_RISK_GROUP, "Shared Risk Link Group"},
+ { ISIS_TLV_MT_PORT_CAP, "Multi-Topology-Aware Port Capability"},
+ { ISIS_TLV_MT_CAPABILITY, "Multi-Topology Capability"},
+ { ISIS_TLV_NORTEL_PRIVATE1, "Nortel Proprietary"},
+ { ISIS_TLV_NORTEL_PRIVATE2, "Nortel Proprietary"},
+ { ISIS_TLV_HOSTNAME, "Hostname"},
+ { ISIS_TLV_RESTART_SIGNALING, "Restart Signaling"},
+ { ISIS_TLV_MT_IS_REACH, "Multi Topology IS Reachability"},
+ { ISIS_TLV_MT_SUPPORTED, "Multi Topology"},
+ { ISIS_TLV_IP6ADDR, "IPv6 Interface address(es)"},
+ { ISIS_TLV_MT_IP_REACH, "Multi-Topology IPv4 Reachability"},
+ { ISIS_TLV_IP6_REACH, "IPv6 reachability"},
+ { ISIS_TLV_MT_IP6_REACH, "Multi-Topology IP6 Reachability"},
+ { ISIS_TLV_PTP_ADJ, "Point-to-point Adjacency State"},
+ { ISIS_TLV_IIH_SEQNR, "Hello PDU Sequence Number"},
+ { ISIS_TLV_VENDOR_PRIVATE, "Vendor Private"},
+ { 0, NULL }
+};
+
+#define ESIS_OPTION_PROTOCOLS 129
+#define ESIS_OPTION_QOS_MAINTENANCE 195 /* iso9542 */
+#define ESIS_OPTION_SECURITY 197 /* iso9542 */
+#define ESIS_OPTION_ES_CONF_TIME 198 /* iso9542 */
+#define ESIS_OPTION_PRIORITY 205 /* iso9542 */
+#define ESIS_OPTION_ADDRESS_MASK 225 /* iso9542 */
+#define ESIS_OPTION_SNPA_MASK 226 /* iso9542 */
+
+static const struct tok esis_option_values[] = {
+ { ESIS_OPTION_PROTOCOLS, "Protocols supported"},
+ { ESIS_OPTION_QOS_MAINTENANCE, "QoS Maintenance" },
+ { ESIS_OPTION_SECURITY, "Security" },
+ { ESIS_OPTION_ES_CONF_TIME, "ES Configuration Time" },
+ { ESIS_OPTION_PRIORITY, "Priority" },
+ { ESIS_OPTION_ADDRESS_MASK, "Addressk Mask" },
+ { ESIS_OPTION_SNPA_MASK, "SNPA Mask" },
+ { 0, NULL }
+};
+
+#define CLNP_OPTION_DISCARD_REASON 193
+#define CLNP_OPTION_QOS_MAINTENANCE 195 /* iso8473 */
+#define CLNP_OPTION_SECURITY 197 /* iso8473 */
+#define CLNP_OPTION_SOURCE_ROUTING 200 /* iso8473 */
+#define CLNP_OPTION_ROUTE_RECORDING 203 /* iso8473 */
+#define CLNP_OPTION_PADDING 204 /* iso8473 */
+#define CLNP_OPTION_PRIORITY 205 /* iso8473 */
+
+static const struct tok clnp_option_values[] = {
+ { CLNP_OPTION_DISCARD_REASON, "Discard Reason"},
+ { CLNP_OPTION_PRIORITY, "Priority"},
+ { CLNP_OPTION_QOS_MAINTENANCE, "QoS Maintenance"},
+ { CLNP_OPTION_SECURITY, "Security"},
+ { CLNP_OPTION_SOURCE_ROUTING, "Source Routing"},
+ { CLNP_OPTION_ROUTE_RECORDING, "Route Recording"},
+ { CLNP_OPTION_PADDING, "Padding"},
+ { 0, NULL }
+};
+
+static const struct tok clnp_option_rfd_class_values[] = {
+ { 0x0, "General"},
+ { 0x8, "Address"},
+ { 0x9, "Source Routeing"},
+ { 0xa, "Lifetime"},
+ { 0xb, "PDU Discarded"},
+ { 0xc, "Reassembly"},
+ { 0, NULL }
+};
+
+static const struct tok clnp_option_rfd_general_values[] = {
+ { 0x0, "Reason not specified"},
+ { 0x1, "Protocol procedure error"},
+ { 0x2, "Incorrect checksum"},
+ { 0x3, "PDU discarded due to congestion"},
+ { 0x4, "Header syntax error (cannot be parsed)"},
+ { 0x5, "Segmentation needed but not permitted"},
+ { 0x6, "Incomplete PDU received"},
+ { 0x7, "Duplicate option"},
+ { 0, NULL }
+};
+
+static const struct tok clnp_option_rfd_address_values[] = {
+ { 0x0, "Destination address unreachable"},
+ { 0x1, "Destination address unknown"},
+ { 0, NULL }
+};
+
+static const struct tok clnp_option_rfd_source_routeing_values[] = {
+ { 0x0, "Unspecified source routeing error"},
+ { 0x1, "Syntax error in source routeing field"},
+ { 0x2, "Unknown address in source routeing field"},
+ { 0x3, "Path not acceptable"},
+ { 0, NULL }
+};
+
+static const struct tok clnp_option_rfd_lifetime_values[] = {
+ { 0x0, "Lifetime expired while data unit in transit"},
+ { 0x1, "Lifetime expired during reassembly"},
+ { 0, NULL }
+};
+
+static const struct tok clnp_option_rfd_pdu_discard_values[] = {
+ { 0x0, "Unsupported option not specified"},
+ { 0x1, "Unsupported protocol version"},
+ { 0x2, "Unsupported security option"},
+ { 0x3, "Unsupported source routeing option"},
+ { 0x4, "Unsupported recording of route option"},
+ { 0, NULL }
+};
+
+static const struct tok clnp_option_rfd_reassembly_values[] = {
+ { 0x0, "Reassembly interference"},
+ { 0, NULL }
+};
+
+/* array of 16 error-classes */
+static const struct tok *clnp_option_rfd_error_class[] = {
+ clnp_option_rfd_general_values,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ clnp_option_rfd_address_values,
+ clnp_option_rfd_source_routeing_values,
+ clnp_option_rfd_lifetime_values,
+ clnp_option_rfd_pdu_discard_values,
+ clnp_option_rfd_reassembly_values,
+ NULL,
+ NULL,
+ NULL
+};
+
+#define CLNP_OPTION_OPTION_QOS_MASK 0x3f
+#define CLNP_OPTION_SCOPE_MASK 0xc0
+#define CLNP_OPTION_SCOPE_SA_SPEC 0x40
+#define CLNP_OPTION_SCOPE_DA_SPEC 0x80
+#define CLNP_OPTION_SCOPE_GLOBAL 0xc0
+
+static const struct tok clnp_option_scope_values[] = {
+ { CLNP_OPTION_SCOPE_SA_SPEC, "Source Address Specific"},
+ { CLNP_OPTION_SCOPE_DA_SPEC, "Destination Address Specific"},
+ { CLNP_OPTION_SCOPE_GLOBAL, "Globally unique"},
+ { 0, NULL }
+};
+
+static const struct tok clnp_option_sr_rr_values[] = {
+ { 0x0, "partial"},
+ { 0x1, "complete"},
+ { 0, NULL }
+};
+
+static const struct tok clnp_option_sr_rr_string_values[] = {
+ { CLNP_OPTION_SOURCE_ROUTING, "source routing"},
+ { CLNP_OPTION_ROUTE_RECORDING, "recording of route in progress"},
+ { 0, NULL }
+};
+
+static const struct tok clnp_option_qos_global_values[] = {
+ { 0x20, "reserved"},
+ { 0x10, "sequencing vs. delay"},
+ { 0x08, "congested"},
+ { 0x04, "delay vs. cost"},
+ { 0x02, "error vs. delay"},
+ { 0x01, "error vs. cost"},
+ { 0, NULL }
+};
+
+#define ISIS_SUBTLV_EXT_IS_REACH_ADMIN_GROUP 3 /* draft-ietf-isis-traffic-05 */
+#define ISIS_SUBTLV_EXT_IS_REACH_LINK_LOCAL_REMOTE_ID 4 /* rfc4205 */
+#define ISIS_SUBTLV_EXT_IS_REACH_LINK_REMOTE_ID 5 /* draft-ietf-isis-traffic-05 */
+#define ISIS_SUBTLV_EXT_IS_REACH_IPV4_INTF_ADDR 6 /* draft-ietf-isis-traffic-05 */
+#define ISIS_SUBTLV_EXT_IS_REACH_IPV4_NEIGHBOR_ADDR 8 /* draft-ietf-isis-traffic-05 */
+#define ISIS_SUBTLV_EXT_IS_REACH_MAX_LINK_BW 9 /* draft-ietf-isis-traffic-05 */
+#define ISIS_SUBTLV_EXT_IS_REACH_RESERVABLE_BW 10 /* draft-ietf-isis-traffic-05 */
+#define ISIS_SUBTLV_EXT_IS_REACH_UNRESERVED_BW 11 /* rfc4124 */
+#define ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS_OLD 12 /* draft-ietf-tewg-diff-te-proto-06 */
+#define ISIS_SUBTLV_EXT_IS_REACH_TE_METRIC 18 /* draft-ietf-isis-traffic-05 */
+#define ISIS_SUBTLV_EXT_IS_REACH_LINK_ATTRIBUTE 19 /* draft-ietf-isis-link-attr-01 */
+#define ISIS_SUBTLV_EXT_IS_REACH_LINK_PROTECTION_TYPE 20 /* rfc4205 */
+#define ISIS_SUBTLV_EXT_IS_REACH_INTF_SW_CAP_DESCR 21 /* rfc4205 */
+#define ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS 22 /* rfc4124 */
+
+#define ISIS_SUBTLV_SPB_METRIC 29 /* rfc6329 */
+
+static const struct tok isis_ext_is_reach_subtlv_values[] = {
+ { ISIS_SUBTLV_EXT_IS_REACH_ADMIN_GROUP, "Administrative groups" },
+ { ISIS_SUBTLV_EXT_IS_REACH_LINK_LOCAL_REMOTE_ID, "Link Local/Remote Identifier" },
+ { ISIS_SUBTLV_EXT_IS_REACH_LINK_REMOTE_ID, "Link Remote Identifier" },
+ { ISIS_SUBTLV_EXT_IS_REACH_IPV4_INTF_ADDR, "IPv4 interface address" },
+ { ISIS_SUBTLV_EXT_IS_REACH_IPV4_NEIGHBOR_ADDR, "IPv4 neighbor address" },
+ { ISIS_SUBTLV_EXT_IS_REACH_MAX_LINK_BW, "Maximum link bandwidth" },
+ { ISIS_SUBTLV_EXT_IS_REACH_RESERVABLE_BW, "Reservable link bandwidth" },
+ { ISIS_SUBTLV_EXT_IS_REACH_UNRESERVED_BW, "Unreserved bandwidth" },
+ { ISIS_SUBTLV_EXT_IS_REACH_TE_METRIC, "Traffic Engineering Metric" },
+ { ISIS_SUBTLV_EXT_IS_REACH_LINK_ATTRIBUTE, "Link Attribute" },
+ { ISIS_SUBTLV_EXT_IS_REACH_LINK_PROTECTION_TYPE, "Link Protection Type" },
+ { ISIS_SUBTLV_EXT_IS_REACH_INTF_SW_CAP_DESCR, "Interface Switching Capability" },
+ { ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS_OLD, "Bandwidth Constraints (old)" },
+ { ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS, "Bandwidth Constraints" },
+ { ISIS_SUBTLV_SPB_METRIC, "SPB Metric" },
+ { 250, "Reserved for cisco specific extensions" },
+ { 251, "Reserved for cisco specific extensions" },
+ { 252, "Reserved for cisco specific extensions" },
+ { 253, "Reserved for cisco specific extensions" },
+ { 254, "Reserved for cisco specific extensions" },
+ { 255, "Reserved for future expansion" },
+ { 0, NULL }
+};
+
+#define ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG32 1 /* draft-ietf-isis-admin-tags-01 */
+#define ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG64 2 /* draft-ietf-isis-admin-tags-01 */
+#define ISIS_SUBTLV_EXTD_IP_REACH_MGMT_PREFIX_COLOR 117 /* draft-ietf-isis-wg-multi-topology-05 */
+
+static const struct tok isis_ext_ip_reach_subtlv_values[] = {
+ { ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG32, "32-Bit Administrative tag" },
+ { ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG64, "64-Bit Administrative tag" },
+ { ISIS_SUBTLV_EXTD_IP_REACH_MGMT_PREFIX_COLOR, "Management Prefix Color" },
+ { 0, NULL }
+};
+
+static const struct tok isis_subtlv_link_attribute_values[] = {
+ { 0x01, "Local Protection Available" },
+ { 0x02, "Link excluded from local protection path" },
+ { 0x04, "Local maintenance required"},
+ { 0, NULL }
+};
+
+#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 const 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 }
+};
+
+#define ISIS_SUBTLV_IDRP_RES 0
+#define ISIS_SUBTLV_IDRP_LOCAL 1
+#define ISIS_SUBTLV_IDRP_ASN 2
+
+static const struct tok isis_subtlv_idrp_values[] = {
+ { ISIS_SUBTLV_IDRP_RES, "Reserved"},
+ { ISIS_SUBTLV_IDRP_LOCAL, "Routing-Domain Specific"},
+ { ISIS_SUBTLV_IDRP_ASN, "AS Number Tag"},
+ { 0, NULL}
+};
+
+#define ISIS_SUBTLV_SPB_MCID 4
+#define ISIS_SUBTLV_SPB_DIGEST 5
+#define ISIS_SUBTLV_SPB_BVID 6
+
+#define ISIS_SUBTLV_SPB_INSTANCE 1
+#define ISIS_SUBTLV_SPBM_SI 3
+
+#define ISIS_SPB_MCID_LEN 51
+#define ISIS_SUBTLV_SPB_MCID_MIN_LEN 102
+#define ISIS_SUBTLV_SPB_DIGEST_MIN_LEN 33
+#define ISIS_SUBTLV_SPB_BVID_MIN_LEN 6
+#define ISIS_SUBTLV_SPB_INSTANCE_MIN_LEN 19
+#define ISIS_SUBTLV_SPB_INSTANCE_VLAN_TUPLE_LEN 8
+
+static const struct tok isis_mt_port_cap_subtlv_values[] = {
+ { ISIS_SUBTLV_SPB_MCID, "SPB MCID" },
+ { ISIS_SUBTLV_SPB_DIGEST, "SPB Digest" },
+ { ISIS_SUBTLV_SPB_BVID, "SPB BVID" },
+ { 0, NULL }
+};
+
+static const struct tok isis_mt_capability_subtlv_values[] = {
+ { ISIS_SUBTLV_SPB_INSTANCE, "SPB Instance" },
+ { ISIS_SUBTLV_SPBM_SI, "SPBM Service Identifier and Unicast Address" },
+ { 0, NULL }
+};
+
+struct isis_spb_mcid {
+ uint8_t format_id;
+ uint8_t name[32];
+ uint8_t revision_lvl[2];
+ uint8_t digest[16];
+};
+
+struct isis_subtlv_spb_mcid {
+ struct isis_spb_mcid mcid;
+ struct isis_spb_mcid aux_mcid;
+};
+
+struct isis_subtlv_spb_instance {
+ uint8_t cist_root_id[8];
+ uint8_t cist_external_root_path_cost[4];
+ uint8_t bridge_priority[2];
+ uint8_t spsourceid[4];
+ uint8_t no_of_trees;
+};
+
+#define CLNP_SEGMENT_PART 0x80
+#define CLNP_MORE_SEGMENTS 0x40
+#define CLNP_REQUEST_ER 0x20
+
+static const struct tok clnp_flag_values[] = {
+ { CLNP_SEGMENT_PART, "Segmentation permitted"},
+ { CLNP_MORE_SEGMENTS, "more Segments"},
+ { CLNP_REQUEST_ER, "request Error Report"},
+ { 0, NULL}
+};
+
+#define ISIS_MASK_LSP_OL_BIT(x) ((x)&0x4)
+#define ISIS_MASK_LSP_ISTYPE_BITS(x) ((x)&0x3)
+#define ISIS_MASK_LSP_PARTITION_BIT(x) ((x)&0x80)
+#define ISIS_MASK_LSP_ATT_BITS(x) ((x)&0x78)
+#define ISIS_MASK_LSP_ATT_ERROR_BIT(x) ((x)&0x40)
+#define ISIS_MASK_LSP_ATT_EXPENSE_BIT(x) ((x)&0x20)
+#define ISIS_MASK_LSP_ATT_DELAY_BIT(x) ((x)&0x10)
+#define ISIS_MASK_LSP_ATT_DEFAULT_BIT(x) ((x)&0x8)
+
+#define ISIS_MASK_MTID(x) ((x)&0x0fff)
+#define ISIS_MASK_MTFLAGS(x) ((x)&0xf000)
+
+static const struct tok isis_mt_flag_values[] = {
+ { 0x4000, "ATT bit set"},
+ { 0x8000, "Overload bit set"},
+ { 0, NULL}
+};
+
+#define ISIS_MASK_TLV_EXTD_IP_UPDOWN(x) ((x)&0x80)
+#define ISIS_MASK_TLV_EXTD_IP_SUBTLV(x) ((x)&0x40)
+
+#define ISIS_MASK_TLV_EXTD_IP6_IE(x) ((x)&0x40)
+#define ISIS_MASK_TLV_EXTD_IP6_SUBTLV(x) ((x)&0x20)
+
+#define ISIS_LSP_TLV_METRIC_SUPPORTED(x) ((x)&0x80)
+#define ISIS_LSP_TLV_METRIC_IE(x) ((x)&0x40)
+#define ISIS_LSP_TLV_METRIC_UPDOWN(x) ((x)&0x80)
+#define ISIS_LSP_TLV_METRIC_VALUE(x) ((x)&0x3f)
+
+#define ISIS_MASK_TLV_SHARED_RISK_GROUP(x) ((x)&0x1)
+
+static const struct tok isis_mt_values[] = {
+ { 0, "IPv4 unicast"},
+ { 1, "In-Band Management"},
+ { 2, "IPv6 unicast"},
+ { 3, "Multicast"},
+ { 4095, "Development, Experimental or Proprietary"},
+ { 0, NULL }
+};
+
+static const struct tok isis_iih_circuit_type_values[] = {
+ { 1, "Level 1 only"},
+ { 2, "Level 2 only"},
+ { 3, "Level 1, Level 2"},
+ { 0, NULL}
+};
+
+#define ISIS_LSP_TYPE_UNUSED0 0
+#define ISIS_LSP_TYPE_LEVEL_1 1
+#define ISIS_LSP_TYPE_UNUSED2 2
+#define ISIS_LSP_TYPE_LEVEL_2 3
+
+static const struct tok isis_lsp_istype_values[] = {
+ { ISIS_LSP_TYPE_UNUSED0, "Unused 0x0 (invalid)"},
+ { ISIS_LSP_TYPE_LEVEL_1, "L1 IS"},
+ { ISIS_LSP_TYPE_UNUSED2, "Unused 0x2 (invalid)"},
+ { ISIS_LSP_TYPE_LEVEL_2, "L2 IS"},
+ { 0, NULL }
+};
+
+/*
+ * Katz's point to point adjacency TLV uses codes to tell us the state of
+ * the remote adjacency. Enumerate them.
+ */
+
+#define ISIS_PTP_ADJ_UP 0
+#define ISIS_PTP_ADJ_INIT 1
+#define ISIS_PTP_ADJ_DOWN 2
+
+static const struct tok isis_ptp_adjancey_values[] = {
+ { ISIS_PTP_ADJ_UP, "Up" },
+ { ISIS_PTP_ADJ_INIT, "Initializing" },
+ { ISIS_PTP_ADJ_DOWN, "Down" },
+ { 0, NULL}
+};
+
+struct isis_tlv_ptp_adj {
+ uint8_t adjacency_state;
+ uint8_t extd_local_circuit_id[4];
+ uint8_t neighbor_sysid[SYSTEM_ID_LEN];
+ uint8_t neighbor_extd_local_circuit_id[4];
+};
+
+static void osi_print_cksum(netdissect_options *, const uint8_t *pptr, uint16_t checksum,
+ u_int checksum_offset, u_int length);
+static int clnp_print(netdissect_options *, const uint8_t *, u_int);
+static void esis_print(netdissect_options *, const uint8_t *, u_int);
+static int isis_print(netdissect_options *, const uint8_t *, u_int);
+
+struct isis_metric_block {
+ uint8_t metric_default;
+ uint8_t metric_delay;
+ uint8_t metric_expense;
+ uint8_t metric_error;
+};
+
+struct isis_tlv_is_reach {
+ struct isis_metric_block isis_metric_block;
+ uint8_t neighbor_nodeid[NODE_ID_LEN];
+};
+
+struct isis_tlv_es_reach {
+ struct isis_metric_block isis_metric_block;
+ uint8_t neighbor_sysid[SYSTEM_ID_LEN];
+};
+
+struct isis_tlv_ip_reach {
+ struct isis_metric_block isis_metric_block;
+ uint8_t prefix[4];
+ uint8_t mask[4];
+};
+
+static const struct tok isis_is_reach_virtual_values[] = {
+ { 0, "IsNotVirtual"},
+ { 1, "IsVirtual"},
+ { 0, NULL }
+};
+
+static const struct tok isis_restart_flag_values[] = {
+ { 0x1, "Restart Request"},
+ { 0x2, "Restart Acknowledgement"},
+ { 0x4, "Suppress adjacency advertisement"},
+ { 0, NULL }
+};
+
+struct isis_common_header {
+ uint8_t nlpid;
+ uint8_t fixed_len;
+ uint8_t version; /* Protocol version */
+ uint8_t id_length;
+ uint8_t pdu_type; /* 3 MSbits are reserved */
+ uint8_t pdu_version; /* Packet format version */
+ uint8_t reserved;
+ uint8_t max_area;
+};
+
+struct isis_iih_lan_header {
+ uint8_t circuit_type;
+ uint8_t source_id[SYSTEM_ID_LEN];
+ uint8_t holding_time[2];
+ uint8_t pdu_len[2];
+ uint8_t priority;
+ uint8_t lan_id[NODE_ID_LEN];
+};
+
+struct isis_iih_ptp_header {
+ uint8_t circuit_type;
+ uint8_t source_id[SYSTEM_ID_LEN];
+ uint8_t holding_time[2];
+ uint8_t pdu_len[2];
+ uint8_t circuit_id;
+};
+
+struct isis_lsp_header {
+ uint8_t pdu_len[2];
+ uint8_t remaining_lifetime[2];
+ uint8_t lsp_id[LSP_ID_LEN];
+ uint8_t sequence_number[4];
+ uint8_t checksum[2];
+ uint8_t typeblock;
+};
+
+struct isis_csnp_header {
+ uint8_t pdu_len[2];
+ uint8_t source_id[NODE_ID_LEN];
+ uint8_t start_lsp_id[LSP_ID_LEN];
+ uint8_t end_lsp_id[LSP_ID_LEN];
+};
+
+struct isis_psnp_header {
+ uint8_t pdu_len[2];
+ uint8_t source_id[NODE_ID_LEN];
+};
+
+struct isis_tlv_lsp {
+ uint8_t remaining_lifetime[2];
+ uint8_t lsp_id[LSP_ID_LEN];
+ uint8_t sequence_number[4];
+ uint8_t checksum[2];
+};
+
+#define ISIS_COMMON_HEADER_SIZE (sizeof(struct isis_common_header))
+#define ISIS_IIH_LAN_HEADER_SIZE (sizeof(struct isis_iih_lan_header))
+#define ISIS_IIH_PTP_HEADER_SIZE (sizeof(struct isis_iih_ptp_header))
+#define ISIS_LSP_HEADER_SIZE (sizeof(struct isis_lsp_header))
+#define ISIS_CSNP_HEADER_SIZE (sizeof(struct isis_csnp_header))
+#define ISIS_PSNP_HEADER_SIZE (sizeof(struct isis_psnp_header))
+
+void isoclns_print(netdissect_options *ndo,
+ const uint8_t *p, u_int length, u_int caplen)
+{
+ if (caplen <= 1) { /* enough bytes on the wire ? */
+ ND_PRINT((ndo, "|OSI"));
+ return;
+ }
+
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "OSI NLPID %s (0x%02x): ", tok2str(nlpid_values, "Unknown", *p), *p));
+
+ switch (*p) {
+
+ case NLPID_CLNP:
+ if (!clnp_print(ndo, p, length))
+ print_unknown_data(ndo, p, "\n\t", caplen);
+ break;
+
+ case NLPID_ESIS:
+ esis_print(ndo, p, length);
+ return;
+
+ case NLPID_ISIS:
+ if (!isis_print(ndo, p, length))
+ print_unknown_data(ndo, p, "\n\t", caplen);
+ break;
+
+ case NLPID_NULLNS:
+ ND_PRINT((ndo, "%slength: %u", ndo->ndo_eflag ? "" : ", ", length));
+ break;
+
+ case NLPID_Q933:
+ q933_print(ndo, p + 1, length - 1);
+ break;
+
+ case NLPID_IP:
+ ip_print(ndo, p + 1, length - 1);
+ break;
+
+ case NLPID_IP6:
+ ip6_print(ndo, p + 1, length - 1);
+ break;
+
+ case NLPID_PPP:
+ ppp_print(ndo, p + 1, length - 1);
+ break;
+
+ default:
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, "OSI NLPID 0x%02x unknown", *p));
+ ND_PRINT((ndo, "%slength: %u", ndo->ndo_eflag ? "" : ", ", length));
+ if (caplen > 1)
+ print_unknown_data(ndo, p, "\n\t", caplen);
+ break;
+ }
+}
+
+#define CLNP_PDU_ER 1
+#define CLNP_PDU_DT 28
+#define CLNP_PDU_MD 29
+#define CLNP_PDU_ERQ 30
+#define CLNP_PDU_ERP 31
+
+static const struct tok clnp_pdu_values[] = {
+ { CLNP_PDU_ER, "Error Report"},
+ { CLNP_PDU_MD, "MD"},
+ { CLNP_PDU_DT, "Data"},
+ { CLNP_PDU_ERQ, "Echo Request"},
+ { CLNP_PDU_ERP, "Echo Response"},
+ { 0, NULL }
+};
+
+struct clnp_header_t {
+ uint8_t nlpid;
+ uint8_t length_indicator;
+ uint8_t version;
+ uint8_t lifetime; /* units of 500ms */
+ uint8_t type;
+ uint8_t segment_length[2];
+ uint8_t cksum[2];
+};
+
+struct clnp_segment_header_t {
+ uint8_t data_unit_id[2];
+ uint8_t segment_offset[2];
+ uint8_t total_length[2];
+};
+
+/*
+ * clnp_print
+ * Decode CLNP packets. Return 0 on error.
+ */
+
+static int
+clnp_print(netdissect_options *ndo,
+ const uint8_t *pptr, u_int length)
+{
+ const uint8_t *optr,*source_address,*dest_address;
+ u_int li,tlen,nsap_offset,source_address_length,dest_address_length, clnp_pdu_type, clnp_flags;
+ const struct clnp_header_t *clnp_header;
+ const struct clnp_segment_header_t *clnp_segment_header;
+ uint8_t rfd_error_major,rfd_error_minor;
+
+ clnp_header = (const struct clnp_header_t *) pptr;
+ ND_TCHECK(*clnp_header);
+
+ li = clnp_header->length_indicator;
+ optr = pptr;
+
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, "CLNP"));
+
+ /*
+ * Sanity checking of the header.
+ */
+
+ if (clnp_header->version != CLNP_VERSION) {
+ ND_PRINT((ndo, "version %d packet not supported", clnp_header->version));
+ return (0);
+ }
+
+ /* FIXME further header sanity checking */
+
+ clnp_pdu_type = clnp_header->type & CLNP_PDU_TYPE_MASK;
+ clnp_flags = clnp_header->type & CLNP_FLAG_MASK;
+
+ pptr += sizeof(struct clnp_header_t);
+ li -= sizeof(struct clnp_header_t);
+ dest_address_length = *pptr;
+ dest_address = pptr + 1;
+
+ pptr += (1 + dest_address_length);
+ li -= (1 + dest_address_length);
+ source_address_length = *pptr;
+ source_address = pptr +1;
+
+ pptr += (1 + source_address_length);
+ li -= (1 + source_address_length);
+
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "%s%s > %s, %s, length %u",
+ ndo->ndo_eflag ? "" : ", ",
+ isonsap_string(source_address, source_address_length),
+ isonsap_string(dest_address, dest_address_length),
+ tok2str(clnp_pdu_values,"unknown (%u)",clnp_pdu_type),
+ length));
+ return (1);
+ }
+ ND_PRINT((ndo, "%slength %u", ndo->ndo_eflag ? "" : ", ", length));
+
+ ND_PRINT((ndo, "\n\t%s PDU, hlen: %u, v: %u, lifetime: %u.%us, Segment PDU length: %u, checksum: 0x%04x",
+ tok2str(clnp_pdu_values, "unknown (%u)",clnp_pdu_type),
+ clnp_header->length_indicator,
+ clnp_header->version,
+ clnp_header->lifetime/2,
+ (clnp_header->lifetime%2)*5,
+ EXTRACT_16BITS(clnp_header->segment_length),
+ EXTRACT_16BITS(clnp_header->cksum)));
+
+ osi_print_cksum(ndo, optr, EXTRACT_16BITS(clnp_header->cksum), 7,
+ clnp_header->length_indicator);
+
+ ND_PRINT((ndo, "\n\tFlags [%s]",
+ bittok2str(clnp_flag_values, "none", clnp_flags)));
+
+ ND_PRINT((ndo, "\n\tsource address (length %u): %s\n\tdest address (length %u): %s",
+ source_address_length,
+ isonsap_string(source_address, source_address_length),
+ dest_address_length,
+ isonsap_string(dest_address, dest_address_length)));
+
+ if (clnp_flags & CLNP_SEGMENT_PART) {
+ clnp_segment_header = (const struct clnp_segment_header_t *) pptr;
+ ND_TCHECK(*clnp_segment_header);
+ ND_PRINT((ndo, "\n\tData Unit ID: 0x%04x, Segment Offset: %u, Total PDU Length: %u",
+ EXTRACT_16BITS(clnp_segment_header->data_unit_id),
+ EXTRACT_16BITS(clnp_segment_header->segment_offset),
+ EXTRACT_16BITS(clnp_segment_header->total_length)));
+ pptr+=sizeof(const struct clnp_segment_header_t);
+ li-=sizeof(const struct clnp_segment_header_t);
+ }
+
+ /* now walk the options */
+ while (li >= 2) {
+ u_int op, opli;
+ const uint8_t *tptr;
+
+ ND_TCHECK2(*pptr, 2);
+ if (li < 2) {
+ ND_PRINT((ndo, ", bad opts/li"));
+ return (0);
+ }
+ op = *pptr++;
+ opli = *pptr++;
+ li -= 2;
+ ND_TCHECK2(*pptr, opli);
+ if (opli > li) {
+ ND_PRINT((ndo, ", opt (%d) too long", op));
+ return (0);
+ }
+ li -= opli;
+ tptr = pptr;
+ tlen = opli;
+
+ ND_PRINT((ndo, "\n\t %s Option #%u, length %u, value: ",
+ tok2str(clnp_option_values,"Unknown",op),
+ op,
+ opli));
+
+ switch (op) {
+
+
+ case CLNP_OPTION_ROUTE_RECORDING: /* those two options share the format */
+ case CLNP_OPTION_SOURCE_ROUTING:
+ ND_PRINT((ndo, "%s %s",
+ tok2str(clnp_option_sr_rr_values,"Unknown",*tptr),
+ tok2str(clnp_option_sr_rr_string_values, "Unknown Option %u", op)));
+ nsap_offset=*(tptr+1);
+ if (nsap_offset == 0) {
+ ND_PRINT((ndo, " Bad NSAP offset (0)"));
+ break;
+ }
+ nsap_offset-=1; /* offset to nsap list */
+ if (nsap_offset > tlen) {
+ ND_PRINT((ndo, " Bad NSAP offset (past end of option)"));
+ break;
+ }
+ tptr+=nsap_offset;
+ tlen-=nsap_offset;
+ while (tlen > 0) {
+ source_address_length=*tptr;
+ if (tlen < source_address_length+1) {
+ ND_PRINT((ndo, "\n\t NSAP address goes past end of option"));
+ break;
+ }
+ if (source_address_length > 0) {
+ source_address=(tptr+1);
+ ND_TCHECK2(*source_address, source_address_length);
+ ND_PRINT((ndo, "\n\t NSAP address (length %u): %s",
+ source_address_length,
+ isonsap_string(source_address, source_address_length)));
+ }
+ tlen-=source_address_length+1;
+ }
+ break;
+
+ case CLNP_OPTION_PRIORITY:
+ ND_PRINT((ndo, "0x%1x", *tptr&0x0f));
+ break;
+
+ case CLNP_OPTION_QOS_MAINTENANCE:
+ ND_PRINT((ndo, "\n\t Format Code: %s",
+ tok2str(clnp_option_scope_values, "Reserved", *tptr&CLNP_OPTION_SCOPE_MASK)));
+
+ if ((*tptr&CLNP_OPTION_SCOPE_MASK) == CLNP_OPTION_SCOPE_GLOBAL)
+ ND_PRINT((ndo, "\n\t QoS Flags [%s]",
+ bittok2str(clnp_option_qos_global_values,
+ "none",
+ *tptr&CLNP_OPTION_OPTION_QOS_MASK)));
+ break;
+
+ case CLNP_OPTION_SECURITY:
+ ND_PRINT((ndo, "\n\t Format Code: %s, Security-Level %u",
+ tok2str(clnp_option_scope_values,"Reserved",*tptr&CLNP_OPTION_SCOPE_MASK),
+ *(tptr+1)));
+ break;
+
+ case CLNP_OPTION_DISCARD_REASON:
+ rfd_error_major = (*tptr&0xf0) >> 4;
+ rfd_error_minor = *tptr&0x0f;
+ ND_PRINT((ndo, "\n\t Class: %s Error (0x%01x), %s (0x%01x)",
+ tok2str(clnp_option_rfd_class_values,"Unknown",rfd_error_major),
+ rfd_error_major,
+ tok2str(clnp_option_rfd_error_class[rfd_error_major],"Unknown",rfd_error_minor),
+ rfd_error_minor));
+ break;
+
+ case CLNP_OPTION_PADDING:
+ ND_PRINT((ndo, "padding data"));
+ break;
+
+ /*
+ * FIXME those are the defined Options that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+
+ default:
+ print_unknown_data(ndo, tptr, "\n\t ", opli);
+ break;
+ }
+ if (ndo->ndo_vflag > 1)
+ print_unknown_data(ndo, pptr, "\n\t ", opli);
+ pptr += opli;
+ }
+
+ switch (clnp_pdu_type) {
+
+ case CLNP_PDU_ER: /* fall through */
+ case CLNP_PDU_ERP:
+ ND_TCHECK(*pptr);
+ if (*(pptr) == NLPID_CLNP) {
+ ND_PRINT((ndo, "\n\t-----original packet-----\n\t"));
+ /* FIXME recursion protection */
+ clnp_print(ndo, pptr, length - clnp_header->length_indicator);
+ break;
+ }
+
+ case CLNP_PDU_DT:
+ case CLNP_PDU_MD:
+ case CLNP_PDU_ERQ:
+
+ default:
+ /* dump the PDU specific data */
+ if (length-(pptr-optr) > 0) {
+ ND_PRINT((ndo, "\n\t undecoded non-header data, length %u", length-clnp_header->length_indicator));
+ print_unknown_data(ndo, pptr, "\n\t ", length - (pptr - optr));
+ }
+ }
+
+ return (1);
+
+ trunc:
+ ND_PRINT((ndo, "[|clnp]"));
+ return (1);
+
+}
+
+
+#define ESIS_PDU_REDIRECT 6
+#define ESIS_PDU_ESH 2
+#define ESIS_PDU_ISH 4
+
+static const struct tok esis_pdu_values[] = {
+ { ESIS_PDU_REDIRECT, "redirect"},
+ { ESIS_PDU_ESH, "ESH"},
+ { ESIS_PDU_ISH, "ISH"},
+ { 0, NULL }
+};
+
+struct esis_header_t {
+ uint8_t nlpid;
+ uint8_t length_indicator;
+ uint8_t version;
+ uint8_t reserved;
+ uint8_t type;
+ uint8_t holdtime[2];
+ uint8_t cksum[2];
+};
+
+static void
+esis_print(netdissect_options *ndo,
+ const uint8_t *pptr, u_int length)
+{
+ const uint8_t *optr;
+ u_int li,esis_pdu_type,source_address_length, source_address_number;
+ const struct esis_header_t *esis_header;
+
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, "ES-IS"));
+
+ if (length <= 2) {
+ ND_PRINT((ndo, ndo->ndo_qflag ? "bad pkt!" : "no header at all!"));
+ return;
+ }
+
+ esis_header = (const struct esis_header_t *) pptr;
+ ND_TCHECK(*esis_header);
+ li = esis_header->length_indicator;
+ optr = pptr;
+
+ /*
+ * Sanity checking of the header.
+ */
+
+ if (esis_header->nlpid != NLPID_ESIS) {
+ ND_PRINT((ndo, " nlpid 0x%02x packet not supported", esis_header->nlpid));
+ return;
+ }
+
+ if (esis_header->version != ESIS_VERSION) {
+ ND_PRINT((ndo, " version %d packet not supported", esis_header->version));
+ return;
+ }
+
+ if (li > length) {
+ ND_PRINT((ndo, " length indicator(%d) > PDU size (%d)!", li, length));
+ return;
+ }
+
+ if (li < sizeof(struct esis_header_t) + 2) {
+ ND_PRINT((ndo, " length indicator < min PDU size %d:", li));
+ while (pptr < ndo->ndo_snapend)
+ ND_PRINT((ndo, "%02X", *pptr++));
+ return;
+ }
+
+ esis_pdu_type = esis_header->type & ESIS_PDU_TYPE_MASK;
+
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "%s%s, length %u",
+ ndo->ndo_eflag ? "" : ", ",
+ tok2str(esis_pdu_values,"unknown type (%u)",esis_pdu_type),
+ length));
+ return;
+ } else
+ ND_PRINT((ndo, "%slength %u\n\t%s (%u)",
+ ndo->ndo_eflag ? "" : ", ",
+ length,
+ tok2str(esis_pdu_values,"unknown type: %u", esis_pdu_type),
+ esis_pdu_type));
+
+ ND_PRINT((ndo, ", v: %u%s", esis_header->version, esis_header->version == ESIS_VERSION ? "" : "unsupported" ));
+ ND_PRINT((ndo, ", checksum: 0x%04x", EXTRACT_16BITS(esis_header->cksum)));
+
+ osi_print_cksum(ndo, pptr, EXTRACT_16BITS(esis_header->cksum), 7, li);
+
+ ND_PRINT((ndo, ", holding time: %us, length indicator: %u",
+ EXTRACT_16BITS(esis_header->holdtime), li));
+
+ if (ndo->ndo_vflag > 1)
+ print_unknown_data(ndo, optr, "\n\t", sizeof(struct esis_header_t));
+
+ pptr += sizeof(struct esis_header_t);
+ li -= sizeof(struct esis_header_t);
+
+ switch (esis_pdu_type) {
+ case ESIS_PDU_REDIRECT: {
+ const uint8_t *dst, *snpa, *neta;
+ u_int dstl, snpal, netal;
+
+ ND_TCHECK(*pptr);
+ if (li < 1) {
+ ND_PRINT((ndo, ", bad redirect/li"));
+ return;
+ }
+ dstl = *pptr;
+ pptr++;
+ li--;
+ ND_TCHECK2(*pptr, dstl);
+ if (li < dstl) {
+ ND_PRINT((ndo, ", bad redirect/li"));
+ return;
+ }
+ dst = pptr;
+ pptr += dstl;
+ li -= dstl;
+ ND_PRINT((ndo, "\n\t %s", isonsap_string(dst, dstl)));
+
+ ND_TCHECK(*pptr);
+ if (li < 1) {
+ ND_PRINT((ndo, ", bad redirect/li"));
+ return;
+ }
+ snpal = *pptr;
+ pptr++;
+ li--;
+ ND_TCHECK2(*pptr, snpal);
+ if (li < snpal) {
+ ND_PRINT((ndo, ", bad redirect/li"));
+ return;
+ }
+ snpa = pptr;
+ pptr += snpal;
+ li -= snpal;
+ ND_TCHECK(*pptr);
+ if (li < 1) {
+ ND_PRINT((ndo, ", bad redirect/li"));
+ return;
+ }
+ netal = *pptr;
+ pptr++;
+ ND_TCHECK2(*pptr, netal);
+ if (li < netal) {
+ ND_PRINT((ndo, ", bad redirect/li"));
+ return;
+ }
+ neta = pptr;
+ pptr += netal;
+ li -= netal;
+
+ if (netal == 0)
+ ND_PRINT((ndo, "\n\t %s", etheraddr_string(ndo, snpa)));
+ else
+ ND_PRINT((ndo, "\n\t %s", isonsap_string(neta, netal)));
+ break;
+ }
+
+ case ESIS_PDU_ESH:
+ ND_TCHECK(*pptr);
+ if (li < 1) {
+ ND_PRINT((ndo, ", bad esh/li"));
+ return;
+ }
+ source_address_number = *pptr;
+ pptr++;
+ li--;
+
+ ND_PRINT((ndo, "\n\t Number of Source Addresses: %u", source_address_number));
+
+ while (source_address_number > 0) {
+ ND_TCHECK(*pptr);
+ if (li < 1) {
+ ND_PRINT((ndo, ", bad esh/li"));
+ return;
+ }
+ source_address_length = *pptr;
+ pptr++;
+ li--;
+
+ ND_TCHECK2(*pptr, source_address_length);
+ if (li < source_address_length) {
+ ND_PRINT((ndo, ", bad esh/li"));
+ return;
+ }
+ ND_PRINT((ndo, "\n\t NET (length: %u): %s",
+ source_address_length,
+ isonsap_string(pptr, source_address_length)));
+ pptr += source_address_length;
+ li -= source_address_length;
+ source_address_number--;
+ }
+
+ break;
+
+ case ESIS_PDU_ISH: {
+ ND_TCHECK(*pptr);
+ if (li < 1) {
+ ND_PRINT((ndo, ", bad ish/li"));
+ return;
+ }
+ source_address_length = *pptr;
+ pptr++;
+ li--;
+ ND_TCHECK2(*pptr, source_address_length);
+ if (li < source_address_length) {
+ ND_PRINT((ndo, ", bad ish/li"));
+ return;
+ }
+ ND_PRINT((ndo, "\n\t NET (length: %u): %s", source_address_length, isonsap_string(pptr, source_address_length)));
+ pptr += source_address_length;
+ li -= source_address_length;
+ break;
+ }
+
+ default:
+ if (ndo->ndo_vflag <= 1) {
+ if (pptr < ndo->ndo_snapend)
+ print_unknown_data(ndo, pptr, "\n\t ", ndo->ndo_snapend - pptr);
+ }
+ return;
+ }
+
+ /* now walk the options */
+ while (li != 0) {
+ u_int op, opli;
+ const uint8_t *tptr;
+
+ if (li < 2) {
+ ND_PRINT((ndo, ", bad opts/li"));
+ return;
+ }
+ ND_TCHECK2(*pptr, 2);
+ op = *pptr++;
+ opli = *pptr++;
+ li -= 2;
+ if (opli > li) {
+ ND_PRINT((ndo, ", opt (%d) too long", op));
+ return;
+ }
+ li -= opli;
+ tptr = pptr;
+
+ ND_PRINT((ndo, "\n\t %s Option #%u, length %u, value: ",
+ tok2str(esis_option_values,"Unknown",op),
+ op,
+ opli));
+
+ switch (op) {
+
+ case ESIS_OPTION_ES_CONF_TIME:
+ if (opli == 2) {
+ ND_TCHECK2(*pptr, 2);
+ ND_PRINT((ndo, "%us", EXTRACT_16BITS(tptr)));
+ } else
+ ND_PRINT((ndo, "(bad length)"));
+ break;
+
+ case ESIS_OPTION_PROTOCOLS:
+ while (opli>0) {
+ ND_TCHECK(*pptr);
+ ND_PRINT((ndo, "%s (0x%02x)",
+ tok2str(nlpid_values,
+ "unknown",
+ *tptr),
+ *tptr));
+ if (opli>1) /* further NPLIDs ? - put comma */
+ ND_PRINT((ndo, ", "));
+ tptr++;
+ opli--;
+ }
+ break;
+
+ /*
+ * FIXME those are the defined Options that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+
+ case ESIS_OPTION_QOS_MAINTENANCE:
+ case ESIS_OPTION_SECURITY:
+ case ESIS_OPTION_PRIORITY:
+ case ESIS_OPTION_ADDRESS_MASK:
+ case ESIS_OPTION_SNPA_MASK:
+
+ default:
+ print_unknown_data(ndo, tptr, "\n\t ", opli);
+ break;
+ }
+ if (ndo->ndo_vflag > 1)
+ print_unknown_data(ndo, pptr, "\n\t ", opli);
+ pptr += opli;
+ }
+trunc:
+ return;
+}
+
+static void
+isis_print_mcid(netdissect_options *ndo,
+ const struct isis_spb_mcid *mcid)
+{
+ int i;
+
+ ND_PRINT((ndo, "ID: %d, Name: ", mcid->format_id));
+
+ for(i=0; i<32; i++)
+ {
+ ND_PRINT((ndo, "%c", mcid->name[i]));
+ if(mcid->name[i] == '\0')
+ break;
+ }
+
+ ND_PRINT((ndo, "\n\t Lvl: %d", EXTRACT_16BITS(mcid->revision_lvl)));
+
+ ND_PRINT((ndo, ", Digest: "));
+
+ for(i=0;i<16;i++)
+ ND_PRINT((ndo, "%.2x ", mcid->digest[i]));
+}
+
+static int
+isis_print_mt_port_cap_subtlv(netdissect_options *ndo,
+ const uint8_t *tptr, int len)
+{
+ int stlv_type, stlv_len;
+ const struct isis_subtlv_spb_mcid *subtlv_spb_mcid;
+ int i;
+
+ while (len > 0)
+ {
+ stlv_type = *(tptr++);
+ stlv_len = *(tptr++);
+
+ /* first lets see if we know the subTLVs name*/
+ ND_PRINT((ndo, "\n\t %s subTLV #%u, length: %u",
+ tok2str(isis_mt_port_cap_subtlv_values, "unknown", stlv_type),
+ stlv_type,
+ stlv_len));
+
+ /*len -= TLV_TYPE_LEN_OFFSET;*/
+ len = len -2;
+
+ switch (stlv_type)
+ {
+ case ISIS_SUBTLV_SPB_MCID:
+ {
+ if (!ND_TTEST2(*(tptr), ISIS_SUBTLV_SPB_MCID_MIN_LEN))
+ goto trunctlv;
+
+ subtlv_spb_mcid = (struct isis_subtlv_spb_mcid *)tptr;
+
+ ND_PRINT((ndo, "\n\t MCID: "));
+ isis_print_mcid(ndo, &(subtlv_spb_mcid->mcid));
+
+ /*tptr += SPB_MCID_MIN_LEN;
+ len -= SPB_MCID_MIN_LEN; */
+
+ ND_PRINT((ndo, "\n\t AUX-MCID: "));
+ isis_print_mcid(ndo, &(subtlv_spb_mcid->aux_mcid));
+
+ /*tptr += SPB_MCID_MIN_LEN;
+ len -= SPB_MCID_MIN_LEN; */
+ tptr = tptr + sizeof(struct isis_subtlv_spb_mcid);
+ len = len - sizeof(struct isis_subtlv_spb_mcid);
+
+ break;
+ }
+
+ case ISIS_SUBTLV_SPB_DIGEST:
+ {
+ if (!ND_TTEST2(*(tptr), ISIS_SUBTLV_SPB_DIGEST_MIN_LEN))
+ goto trunctlv;
+
+ ND_PRINT((ndo, "\n\t RES: %d V: %d A: %d D: %d",
+ (*(tptr) >> 5), (((*tptr)>> 4) & 0x01),
+ ((*(tptr) >> 2) & 0x03), ((*tptr) & 0x03)));
+
+ tptr++;
+
+ ND_PRINT((ndo, "\n\t Digest: "));
+
+ for(i=1;i<=8; i++)
+ {
+ ND_PRINT((ndo, "%08x ", EXTRACT_32BITS(tptr)));
+ if (i%4 == 0 && i != 8)
+ ND_PRINT((ndo, "\n\t "));
+ tptr = tptr + 4;
+ }
+
+ len = len - ISIS_SUBTLV_SPB_DIGEST_MIN_LEN;
+
+ break;
+ }
+
+ case ISIS_SUBTLV_SPB_BVID:
+ {
+ if (!ND_TTEST2(*(tptr), stlv_len))
+ goto trunctlv;
+
+ while (len)
+ {
+ if (!ND_TTEST2(*(tptr), ISIS_SUBTLV_SPB_BVID_MIN_LEN))
+ goto trunctlv;
+
+ ND_PRINT((ndo, "\n\t ECT: %08x",
+ EXTRACT_32BITS(tptr)));
+
+ tptr = tptr+4;
+
+ ND_PRINT((ndo, " BVID: %d, U:%01x M:%01x ",
+ (EXTRACT_16BITS (tptr) >> 4) ,
+ (EXTRACT_16BITS (tptr) >> 3) & 0x01,
+ (EXTRACT_16BITS (tptr) >> 2) & 0x01));
+
+ tptr = tptr + 2;
+ len = len - ISIS_SUBTLV_SPB_BVID_MIN_LEN;
+ }
+
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+
+ return 0;
+
+ trunctlv:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+ return(1);
+}
+
+static int
+isis_print_mt_capability_subtlv(netdissect_options *ndo,
+ const uint8_t *tptr, int len)
+{
+ int stlv_type, stlv_len, tmp;
+
+ while (len > 0)
+ {
+ stlv_type = *(tptr++);
+ stlv_len = *(tptr++);
+
+ /* first lets see if we know the subTLVs name*/
+ ND_PRINT((ndo, "\n\t %s subTLV #%u, length: %u",
+ tok2str(isis_mt_capability_subtlv_values, "unknown", stlv_type),
+ stlv_type,
+ stlv_len));
+
+ len = len - 2;
+
+ switch (stlv_type)
+ {
+ case ISIS_SUBTLV_SPB_INSTANCE:
+
+ if (!ND_TTEST2(*(tptr), ISIS_SUBTLV_SPB_INSTANCE_MIN_LEN))
+ goto trunctlv;
+
+ ND_PRINT((ndo, "\n\t CIST Root-ID: %08x", EXTRACT_32BITS(tptr)));
+ tptr = tptr+4;
+ ND_PRINT((ndo, " %08x", EXTRACT_32BITS(tptr)));
+ tptr = tptr+4;
+ ND_PRINT((ndo, ", Path Cost: %08x", EXTRACT_32BITS(tptr)));
+ tptr = tptr+4;
+ ND_PRINT((ndo, ", Prio: %d", EXTRACT_16BITS(tptr)));
+ tptr = tptr + 2;
+ ND_PRINT((ndo, "\n\t RES: %d",
+ EXTRACT_16BITS(tptr) >> 5));
+ ND_PRINT((ndo, ", V: %d",
+ (EXTRACT_16BITS(tptr) >> 4) & 0x0001));
+ ND_PRINT((ndo, ", SPSource-ID: %d",
+ (EXTRACT_32BITS(tptr) & 0x000fffff)));
+ tptr = tptr+4;
+ ND_PRINT((ndo, ", No of Trees: %x", *(tptr)));
+
+ tmp = *(tptr++);
+
+ len = len - ISIS_SUBTLV_SPB_INSTANCE_MIN_LEN;
+
+ while (tmp)
+ {
+ if (!ND_TTEST2(*(tptr), ISIS_SUBTLV_SPB_INSTANCE_VLAN_TUPLE_LEN))
+ goto trunctlv;
+
+ ND_PRINT((ndo, "\n\t U:%d, M:%d, A:%d, RES:%d",
+ *(tptr) >> 7, (*(tptr) >> 6) & 0x01,
+ (*(tptr) >> 5) & 0x01, (*(tptr) & 0x1f)));
+
+ tptr++;
+
+ ND_PRINT((ndo, ", ECT: %08x", EXTRACT_32BITS(tptr)));
+
+ tptr = tptr + 4;
+
+ ND_PRINT((ndo, ", BVID: %d, SPVID: %d",
+ (EXTRACT_24BITS(tptr) >> 12) & 0x000fff,
+ EXTRACT_24BITS(tptr) & 0x000fff));
+
+ tptr = tptr + 3;
+ len = len - ISIS_SUBTLV_SPB_INSTANCE_VLAN_TUPLE_LEN;
+ tmp--;
+ }
+
+ break;
+
+ case ISIS_SUBTLV_SPBM_SI:
+
+ if (!ND_TTEST2(*(tptr), 6))
+ goto trunctlv;
+
+ ND_PRINT((ndo, "\n\t BMAC: %08x", EXTRACT_32BITS(tptr)));
+ tptr = tptr+4;
+ ND_PRINT((ndo, "%04x", EXTRACT_16BITS(tptr)));
+ tptr = tptr+2;
+
+ ND_PRINT((ndo, ", RES: %d, VID: %d", EXTRACT_16BITS(tptr) >> 12,
+ (EXTRACT_16BITS(tptr)) & 0x0fff));
+
+ tptr = tptr+2;
+ len = len - 8;
+ stlv_len = stlv_len - 8;
+
+ while (stlv_len)
+ {
+ ND_PRINT((ndo, "\n\t T: %d, R: %d, RES: %d, ISID: %d",
+ (EXTRACT_32BITS(tptr) >> 31),
+ (EXTRACT_32BITS(tptr) >> 30) & 0x01,
+ (EXTRACT_32BITS(tptr) >> 24) & 0x03f,
+ (EXTRACT_32BITS(tptr)) & 0x0ffffff));
+
+ tptr = tptr + 4;
+ len = len - 4;
+ stlv_len = stlv_len - 4;
+ }
+
+ break;
+
+ default:
+ break;
+ }
+ }
+ return 0;
+
+ trunctlv:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+ return(1);
+}
+
+/* shared routine for printing system, node and lsp-ids */
+static char *
+isis_print_id(const uint8_t *cp, int id_len)
+{
+ int i;
+ static char id[sizeof("xxxx.xxxx.xxxx.yy-zz")];
+ char *pos = id;
+
+ for (i = 1; i <= SYSTEM_ID_LEN; i++) {
+ snprintf(pos, sizeof(id) - (pos - id), "%02x", *cp++);
+ pos += strlen(pos);
+ if (i == 2 || i == 4)
+ *pos++ = '.';
+ }
+ if (id_len >= NODE_ID_LEN) {
+ snprintf(pos, sizeof(id) - (pos - id), ".%02x", *cp++);
+ pos += strlen(pos);
+ }
+ if (id_len == LSP_ID_LEN)
+ snprintf(pos, sizeof(id) - (pos - id), "-%02x", *cp);
+ return (id);
+}
+
+/* print the 4-byte metric block which is common found in the old-style TLVs */
+static int
+isis_print_metric_block(netdissect_options *ndo,
+ const struct isis_metric_block *isis_metric_block)
+{
+ ND_PRINT((ndo, ", Default Metric: %d, %s",
+ ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block->metric_default),
+ ISIS_LSP_TLV_METRIC_IE(isis_metric_block->metric_default) ? "External" : "Internal"));
+ if (!ISIS_LSP_TLV_METRIC_SUPPORTED(isis_metric_block->metric_delay))
+ ND_PRINT((ndo, "\n\t\t Delay Metric: %d, %s",
+ ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block->metric_delay),
+ ISIS_LSP_TLV_METRIC_IE(isis_metric_block->metric_delay) ? "External" : "Internal"));
+ if (!ISIS_LSP_TLV_METRIC_SUPPORTED(isis_metric_block->metric_expense))
+ ND_PRINT((ndo, "\n\t\t Expense Metric: %d, %s",
+ ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block->metric_expense),
+ ISIS_LSP_TLV_METRIC_IE(isis_metric_block->metric_expense) ? "External" : "Internal"));
+ if (!ISIS_LSP_TLV_METRIC_SUPPORTED(isis_metric_block->metric_error))
+ ND_PRINT((ndo, "\n\t\t Error Metric: %d, %s",
+ ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block->metric_error),
+ ISIS_LSP_TLV_METRIC_IE(isis_metric_block->metric_error) ? "External" : "Internal"));
+
+ return(1); /* everything is ok */
+}
+
+static int
+isis_print_tlv_ip_reach(netdissect_options *ndo,
+ const uint8_t *cp, const char *ident, int length)
+{
+ int prefix_len;
+ const struct isis_tlv_ip_reach *tlv_ip_reach;
+
+ tlv_ip_reach = (const struct isis_tlv_ip_reach *)cp;
+
+ while (length > 0) {
+ if ((size_t)length < sizeof(*tlv_ip_reach)) {
+ ND_PRINT((ndo, "short IPv4 Reachability (%d vs %lu)",
+ length,
+ (unsigned long)sizeof(*tlv_ip_reach)));
+ return (0);
+ }
+
+ if (!ND_TTEST(*tlv_ip_reach))
+ return (0);
+
+ prefix_len = mask2plen(EXTRACT_32BITS(tlv_ip_reach->mask));
+
+ if (prefix_len == -1)
+ ND_PRINT((ndo, "%sIPv4 prefix: %s mask %s",
+ ident,
+ ipaddr_string(ndo, (tlv_ip_reach->prefix)),
+ ipaddr_string(ndo, (tlv_ip_reach->mask))));
+ else
+ ND_PRINT((ndo, "%sIPv4 prefix: %15s/%u",
+ ident,
+ ipaddr_string(ndo, (tlv_ip_reach->prefix)),
+ prefix_len));
+
+ ND_PRINT((ndo, ", Distribution: %s, Metric: %u, %s",
+ ISIS_LSP_TLV_METRIC_UPDOWN(tlv_ip_reach->isis_metric_block.metric_default) ? "down" : "up",
+ ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->isis_metric_block.metric_default),
+ ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->isis_metric_block.metric_default) ? "External" : "Internal"));
+
+ if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach->isis_metric_block.metric_delay))
+ ND_PRINT((ndo, "%s Delay Metric: %u, %s",
+ ident,
+ ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->isis_metric_block.metric_delay),
+ ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->isis_metric_block.metric_delay) ? "External" : "Internal"));
+
+ if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach->isis_metric_block.metric_expense))
+ ND_PRINT((ndo, "%s Expense Metric: %u, %s",
+ ident,
+ ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->isis_metric_block.metric_expense),
+ ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->isis_metric_block.metric_expense) ? "External" : "Internal"));
+
+ if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach->isis_metric_block.metric_error))
+ ND_PRINT((ndo, "%s Error Metric: %u, %s",
+ ident,
+ ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->isis_metric_block.metric_error),
+ ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->isis_metric_block.metric_error) ? "External" : "Internal"));
+
+ length -= sizeof(struct isis_tlv_ip_reach);
+ tlv_ip_reach++;
+ }
+ return (1);
+}
+
+/*
+ * this is the common IP-REACH subTLV decoder it is called
+ * from various EXTD-IP REACH TLVs (135,235,236,237)
+ */
+
+static int
+isis_print_ip_reach_subtlv(netdissect_options *ndo,
+ const uint8_t *tptr, int subt, int subl,
+ const char *ident)
+{
+ /* first lets see if we know the subTLVs name*/
+ ND_PRINT((ndo, "%s%s subTLV #%u, length: %u",
+ ident, tok2str(isis_ext_ip_reach_subtlv_values, "unknown", subt),
+ subt, subl));
+
+ if (!ND_TTEST2(*tptr,subl))
+ goto trunctlv;
+
+ switch(subt) {
+ case ISIS_SUBTLV_EXTD_IP_REACH_MGMT_PREFIX_COLOR: /* fall through */
+ case ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG32:
+ while (subl >= 4) {
+ ND_PRINT((ndo, ", 0x%08x (=%u)",
+ EXTRACT_32BITS(tptr),
+ EXTRACT_32BITS(tptr)));
+ tptr+=4;
+ subl-=4;
+ }
+ break;
+ case ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG64:
+ while (subl >= 8) {
+ ND_PRINT((ndo, ", 0x%08x%08x",
+ EXTRACT_32BITS(tptr),
+ EXTRACT_32BITS(tptr+4)));
+ tptr+=8;
+ subl-=8;
+ }
+ break;
+ default:
+ if (!print_unknown_data(ndo, tptr, "\n\t\t ", subl))
+ return(0);
+ break;
+ }
+ return(1);
+
+trunctlv:
+ ND_PRINT((ndo, "%spacket exceeded snapshot", ident));
+ return(0);
+}
+
+/*
+ * this is the common IS-REACH subTLV decoder it is called
+ * from isis_print_ext_is_reach()
+ */
+
+static int
+isis_print_is_reach_subtlv(netdissect_options *ndo,
+ const uint8_t *tptr, u_int subt, u_int subl,
+ const char *ident)
+{
+ u_int te_class,priority_level,gmpls_switch_cap;
+ union { /* int to float conversion buffer for several subTLVs */
+ float f;
+ uint32_t i;
+ } bw;
+
+ /* first lets see if we know the subTLVs name*/
+ ND_PRINT((ndo, "%s%s subTLV #%u, length: %u",
+ ident, tok2str(isis_ext_is_reach_subtlv_values, "unknown", subt),
+ subt, subl));
+
+ if (!ND_TTEST2(*tptr,subl))
+ goto trunctlv;
+
+ switch(subt) {
+ case ISIS_SUBTLV_EXT_IS_REACH_ADMIN_GROUP:
+ case ISIS_SUBTLV_EXT_IS_REACH_LINK_LOCAL_REMOTE_ID:
+ case ISIS_SUBTLV_EXT_IS_REACH_LINK_REMOTE_ID:
+ if (subl >= 4) {
+ ND_PRINT((ndo, ", 0x%08x", EXTRACT_32BITS(tptr)));
+ if (subl == 8) /* rfc4205 */
+ ND_PRINT((ndo, ", 0x%08x", EXTRACT_32BITS(tptr+4)));
+ }
+ break;
+ case ISIS_SUBTLV_EXT_IS_REACH_IPV4_INTF_ADDR:
+ case ISIS_SUBTLV_EXT_IS_REACH_IPV4_NEIGHBOR_ADDR:
+ if (subl >= sizeof(struct in_addr))
+ ND_PRINT((ndo, ", %s", ipaddr_string(ndo, tptr)));
+ break;
+ case ISIS_SUBTLV_EXT_IS_REACH_MAX_LINK_BW :
+ case ISIS_SUBTLV_EXT_IS_REACH_RESERVABLE_BW:
+ if (subl >= 4) {
+ bw.i = EXTRACT_32BITS(tptr);
+ ND_PRINT((ndo, ", %.3f Mbps", bw.f * 8 / 1000000));
+ }
+ break;
+ case ISIS_SUBTLV_EXT_IS_REACH_UNRESERVED_BW :
+ if (subl >= 32) {
+ for (te_class = 0; te_class < 8; te_class++) {
+ bw.i = EXTRACT_32BITS(tptr);
+ ND_PRINT((ndo, "%s TE-Class %u: %.3f Mbps",
+ ident,
+ te_class,
+ bw.f * 8 / 1000000));
+ tptr+=4;
+ }
+ }
+ break;
+ case ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS: /* fall through */
+ case ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS_OLD:
+ ND_PRINT((ndo, "%sBandwidth Constraints Model ID: %s (%u)",
+ ident,
+ tok2str(diffserv_te_bc_values, "unknown", *tptr),
+ *tptr));
+ tptr++;
+ /* decode BCs until the subTLV ends */
+ for (te_class = 0; te_class < (subl-1)/4; te_class++) {
+ bw.i = EXTRACT_32BITS(tptr);
+ ND_PRINT((ndo, "%s Bandwidth constraint CT%u: %.3f Mbps",
+ ident,
+ te_class,
+ bw.f * 8 / 1000000));
+ tptr+=4;
+ }
+ break;
+ case ISIS_SUBTLV_EXT_IS_REACH_TE_METRIC:
+ if (subl >= 3)
+ ND_PRINT((ndo, ", %u", EXTRACT_24BITS(tptr)));
+ break;
+ case ISIS_SUBTLV_EXT_IS_REACH_LINK_ATTRIBUTE:
+ if (subl == 2) {
+ ND_PRINT((ndo, ", [ %s ] (0x%04x)",
+ bittok2str(isis_subtlv_link_attribute_values,
+ "Unknown",
+ EXTRACT_16BITS(tptr)),
+ EXTRACT_16BITS(tptr)));
+ }
+ break;
+ case ISIS_SUBTLV_EXT_IS_REACH_LINK_PROTECTION_TYPE:
+ if (subl >= 2) {
+ ND_PRINT((ndo, ", %s, Priority %u",
+ bittok2str(gmpls_link_prot_values, "none", *tptr),
+ *(tptr+1)));
+ }
+ break;
+ case ISIS_SUBTLV_SPB_METRIC:
+ if (subl >= 6) {
+ ND_PRINT((ndo, ", LM: %u", EXTRACT_24BITS(tptr)));
+ tptr=tptr+3;
+ ND_PRINT((ndo, ", P: %u", *(tptr)));
+ tptr++;
+ ND_PRINT((ndo, ", P-ID: %u", EXTRACT_16BITS(tptr)));
+ }
+ break;
+ case ISIS_SUBTLV_EXT_IS_REACH_INTF_SW_CAP_DESCR:
+ if (subl >= 36) {
+ gmpls_switch_cap = *tptr;
+ ND_PRINT((ndo, "%s Interface Switching Capability:%s",
+ ident,
+ tok2str(gmpls_switch_cap_values, "Unknown", gmpls_switch_cap)));
+ ND_PRINT((ndo, ", LSP Encoding: %s",
+ tok2str(gmpls_encoding_values, "Unknown", *(tptr + 1))));
+ tptr+=4;
+ ND_PRINT((ndo, "%s Max LSP Bandwidth:", ident));
+ for (priority_level = 0; priority_level < 8; priority_level++) {
+ bw.i = EXTRACT_32BITS(tptr);
+ ND_PRINT((ndo, "%s priority level %d: %.3f Mbps",
+ ident,
+ priority_level,
+ bw.f * 8 / 1000000));
+ tptr+=4;
+ }
+ subl-=36;
+ switch (gmpls_switch_cap) {
+ case GMPLS_PSC1:
+ case GMPLS_PSC2:
+ case GMPLS_PSC3:
+ case GMPLS_PSC4:
+ bw.i = EXTRACT_32BITS(tptr);
+ ND_PRINT((ndo, "%s Min LSP Bandwidth: %.3f Mbps", ident, bw.f * 8 / 1000000));
+ ND_PRINT((ndo, "%s Interface MTU: %u", ident, EXTRACT_16BITS(tptr + 4)));
+ break;
+ case GMPLS_TSC:
+ bw.i = EXTRACT_32BITS(tptr);
+ ND_PRINT((ndo, "%s Min LSP Bandwidth: %.3f Mbps", ident, bw.f * 8 / 1000000));
+ ND_PRINT((ndo, "%s Indication %s", ident,
+ tok2str(gmpls_switch_cap_tsc_indication_values, "Unknown (%u)", *(tptr + 4))));
+ break;
+ default:
+ /* there is some optional stuff left to decode but this is as of yet
+ not specified so just lets hexdump what is left */
+ if(subl>0){
+ if (!print_unknown_data(ndo, tptr, "\n\t\t ", subl))
+ return(0);
+ }
+ }
+ }
+ break;
+ default:
+ if (!print_unknown_data(ndo, tptr, "\n\t\t ", subl))
+ return(0);
+ break;
+ }
+ return(1);
+
+trunctlv:
+ ND_PRINT((ndo, "%spacket exceeded snapshot", ident));
+ return(0);
+}
+
+
+/*
+ * this is the common IS-REACH decoder it is called
+ * from various EXTD-IS REACH style TLVs (22,24,222)
+ */
+
+static int
+isis_print_ext_is_reach(netdissect_options *ndo,
+ const uint8_t *tptr, const char *ident, int tlv_type)
+{
+ char ident_buffer[20];
+ int subtlv_type,subtlv_len,subtlv_sum_len;
+ int proc_bytes = 0; /* how many bytes did we process ? */
+
+ if (!ND_TTEST2(*tptr, NODE_ID_LEN))
+ return(0);
+
+ ND_PRINT((ndo, "%sIS Neighbor: %s", ident, isis_print_id(tptr, NODE_ID_LEN)));
+ tptr+=(NODE_ID_LEN);
+
+ if (tlv_type != ISIS_TLV_IS_ALIAS_ID) { /* the Alias TLV Metric field is implicit 0 */
+ if (!ND_TTEST2(*tptr, 3)) /* and is therefore skipped */
+ return(0);
+ ND_PRINT((ndo, ", Metric: %d", EXTRACT_24BITS(tptr)));
+ tptr+=3;
+ }
+
+ if (!ND_TTEST2(*tptr, 1))
+ return(0);
+ subtlv_sum_len=*(tptr++); /* read out subTLV length */
+ proc_bytes=NODE_ID_LEN+3+1;
+ ND_PRINT((ndo, ", %ssub-TLVs present",subtlv_sum_len ? "" : "no "));
+ if (subtlv_sum_len) {
+ ND_PRINT((ndo, " (%u)", subtlv_sum_len));
+ while (subtlv_sum_len>0) {
+ if (!ND_TTEST2(*tptr,2))
+ return(0);
+ subtlv_type=*(tptr++);
+ subtlv_len=*(tptr++);
+ /* prepend the ident string */
+ snprintf(ident_buffer, sizeof(ident_buffer), "%s ",ident);
+ if (!isis_print_is_reach_subtlv(ndo, tptr, subtlv_type, subtlv_len, ident_buffer))
+ return(0);
+ tptr+=subtlv_len;
+ subtlv_sum_len-=(subtlv_len+2);
+ proc_bytes+=(subtlv_len+2);
+ }
+ }
+ return(proc_bytes);
+}
+
+/*
+ * this is the common Multi Topology ID decoder
+ * it is called from various MT-TLVs (222,229,235,237)
+ */
+
+static int
+isis_print_mtid(netdissect_options *ndo,
+ const uint8_t *tptr, const char *ident)
+{
+ if (!ND_TTEST2(*tptr, 2))
+ return(0);
+
+ ND_PRINT((ndo, "%s%s",
+ ident,
+ tok2str(isis_mt_values,
+ "Reserved for IETF Consensus",
+ ISIS_MASK_MTID(EXTRACT_16BITS(tptr)))));
+
+ ND_PRINT((ndo, " Topology (0x%03x), Flags: [%s]",
+ ISIS_MASK_MTID(EXTRACT_16BITS(tptr)),
+ bittok2str(isis_mt_flag_values, "none",ISIS_MASK_MTFLAGS(EXTRACT_16BITS(tptr)))));
+
+ return(2);
+}
+
+/*
+ * this is the common extended IP reach decoder
+ * it is called from TLVs (135,235,236,237)
+ * we process the TLV and optional subTLVs and return
+ * the amount of processed bytes
+ */
+
+static int
+isis_print_extd_ip_reach(netdissect_options *ndo,
+ const uint8_t *tptr, const char *ident, uint16_t afi)
+{
+ char ident_buffer[20];
+#ifdef INET6
+ uint8_t prefix[sizeof(struct in6_addr)]; /* shared copy buffer for IPv4 and IPv6 prefixes */
+#else
+ uint8_t prefix[sizeof(struct in_addr)]; /* shared copy buffer for IPv4 prefixes */
+#endif
+ u_int metric, status_byte, bit_length, byte_length, sublen, processed, subtlvtype, subtlvlen;
+
+ if (!ND_TTEST2(*tptr, 4))
+ return (0);
+ metric = EXTRACT_32BITS(tptr);
+ processed=4;
+ tptr+=4;
+
+ if (afi == AF_INET) {
+ if (!ND_TTEST2(*tptr, 1)) /* fetch status byte */
+ return (0);
+ status_byte=*(tptr++);
+ bit_length = status_byte&0x3f;
+ if (bit_length > 32) {
+ ND_PRINT((ndo, "%sIPv4 prefix: bad bit length %u",
+ ident,
+ bit_length));
+ return (0);
+ }
+ processed++;
+#ifdef INET6
+ } else if (afi == AF_INET6) {
+ if (!ND_TTEST2(*tptr, 1)) /* fetch status & prefix_len byte */
+ return (0);
+ status_byte=*(tptr++);
+ bit_length=*(tptr++);
+ if (bit_length > 128) {
+ ND_PRINT((ndo, "%sIPv6 prefix: bad bit length %u",
+ ident,
+ bit_length));
+ return (0);
+ }
+ processed+=2;
+#endif
+ } else
+ return (0); /* somebody is fooling us */
+
+ byte_length = (bit_length + 7) / 8; /* prefix has variable length encoding */
+
+ if (!ND_TTEST2(*tptr, byte_length))
+ return (0);
+ memset(prefix, 0, sizeof prefix); /* clear the copy buffer */
+ memcpy(prefix,tptr,byte_length); /* copy as much as is stored in the TLV */
+ tptr+=byte_length;
+ processed+=byte_length;
+
+ if (afi == AF_INET)
+ ND_PRINT((ndo, "%sIPv4 prefix: %15s/%u",
+ ident,
+ ipaddr_string(ndo, prefix),
+ bit_length));
+#ifdef INET6
+ if (afi == AF_INET6)
+ ND_PRINT((ndo, "%sIPv6 prefix: %s/%u",
+ ident,
+ ip6addr_string(ndo, prefix),
+ bit_length));
+#endif
+
+ ND_PRINT((ndo, ", Distribution: %s, Metric: %u",
+ ISIS_MASK_TLV_EXTD_IP_UPDOWN(status_byte) ? "down" : "up",
+ metric));
+
+ if (afi == AF_INET && ISIS_MASK_TLV_EXTD_IP_SUBTLV(status_byte))
+ ND_PRINT((ndo, ", sub-TLVs present"));
+#ifdef INET6
+ if (afi == AF_INET6)
+ ND_PRINT((ndo, ", %s%s",
+ ISIS_MASK_TLV_EXTD_IP6_IE(status_byte) ? "External" : "Internal",
+ ISIS_MASK_TLV_EXTD_IP6_SUBTLV(status_byte) ? ", sub-TLVs present" : ""));
+#endif
+
+ if ((afi == AF_INET && ISIS_MASK_TLV_EXTD_IP_SUBTLV(status_byte))
+#ifdef INET6
+ || (afi == AF_INET6 && ISIS_MASK_TLV_EXTD_IP6_SUBTLV(status_byte))
+#endif
+ ) {
+ /* assume that one prefix can hold more
+ than one subTLV - therefore the first byte must reflect
+ the aggregate bytecount of the subTLVs for this prefix
+ */
+ if (!ND_TTEST2(*tptr, 1))
+ return (0);
+ sublen=*(tptr++);
+ processed+=sublen+1;
+ ND_PRINT((ndo, " (%u)", sublen)); /* print out subTLV length */
+
+ while (sublen>0) {
+ if (!ND_TTEST2(*tptr,2))
+ return (0);
+ subtlvtype=*(tptr++);
+ subtlvlen=*(tptr++);
+ /* prepend the ident string */
+ snprintf(ident_buffer, sizeof(ident_buffer), "%s ",ident);
+ if (!isis_print_ip_reach_subtlv(ndo, tptr, subtlvtype, subtlvlen, ident_buffer))
+ return(0);
+ tptr+=subtlvlen;
+ sublen-=(subtlvlen+2);
+ }
+ }
+ return (processed);
+}
+
+/*
+ * isis_print
+ * Decode IS-IS packets. Return 0 on error.
+ */
+
+static int
+isis_print(netdissect_options *ndo,
+ const uint8_t *p, u_int length)
+{
+ const struct isis_common_header *isis_header;
+
+ const struct isis_iih_lan_header *header_iih_lan;
+ const struct isis_iih_ptp_header *header_iih_ptp;
+ struct isis_lsp_header *header_lsp;
+ const struct isis_csnp_header *header_csnp;
+ const struct isis_psnp_header *header_psnp;
+
+ const struct isis_tlv_lsp *tlv_lsp;
+ const struct isis_tlv_ptp_adj *tlv_ptp_adj;
+ const struct isis_tlv_is_reach *tlv_is_reach;
+ const struct isis_tlv_es_reach *tlv_es_reach;
+
+ uint8_t pdu_type, max_area, id_length, tlv_type, tlv_len, tmp, alen, lan_alen, prefix_len;
+ uint8_t ext_is_len, ext_ip_len, mt_len;
+ const uint8_t *optr, *pptr, *tptr;
+ u_short packet_len,pdu_len, key_id;
+ u_int i,vendor_id;
+ int sigcheck;
+
+ packet_len=length;
+ optr = p; /* initialize the _o_riginal pointer to the packet start -
+ need it for parsing the checksum TLV and authentication
+ TLV verification */
+ isis_header = (const struct isis_common_header *)p;
+ ND_TCHECK(*isis_header);
+ pptr = p+(ISIS_COMMON_HEADER_SIZE);
+ header_iih_lan = (const struct isis_iih_lan_header *)pptr;
+ header_iih_ptp = (const struct isis_iih_ptp_header *)pptr;
+ header_lsp = (struct isis_lsp_header *)pptr;
+ header_csnp = (const struct isis_csnp_header *)pptr;
+ header_psnp = (const struct isis_psnp_header *)pptr;
+
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, "IS-IS"));
+
+ /*
+ * Sanity checking of the header.
+ */
+
+ if (isis_header->version != ISIS_VERSION) {
+ ND_PRINT((ndo, "version %d packet not supported", isis_header->version));
+ return (0);
+ }
+
+ if ((isis_header->id_length != SYSTEM_ID_LEN) && (isis_header->id_length != 0)) {
+ ND_PRINT((ndo, "system ID length of %d is not supported",
+ isis_header->id_length));
+ return (0);
+ }
+
+ if (isis_header->pdu_version != ISIS_VERSION) {
+ ND_PRINT((ndo, "version %d packet not supported", isis_header->pdu_version));
+ return (0);
+ }
+
+ max_area = isis_header->max_area;
+ switch(max_area) {
+ case 0:
+ max_area = 3; /* silly shit */
+ break;
+ case 255:
+ ND_PRINT((ndo, "bad packet -- 255 areas"));
+ return (0);
+ default:
+ break;
+ }
+
+ id_length = isis_header->id_length;
+ switch(id_length) {
+ case 0:
+ id_length = 6; /* silly shit again */
+ break;
+ case 1: /* 1-8 are valid sys-ID lenghts */
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ break;
+ case 255:
+ id_length = 0; /* entirely useless */
+ break;
+ default:
+ break;
+ }
+
+ /* toss any non 6-byte sys-ID len PDUs */
+ if (id_length != 6 ) {
+ ND_PRINT((ndo, "bad packet -- illegal sys-ID length (%u)", id_length));
+ return (0);
+ }
+
+ pdu_type=isis_header->pdu_type;
+
+ /* in non-verbose mode print the basic PDU Type plus PDU specific brief information*/
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "%s%s",
+ ndo->ndo_eflag ? "" : ", ",
+ tok2str(isis_pdu_values, "unknown PDU-Type %u", pdu_type)));
+
+ switch (pdu_type) {
+
+ case ISIS_PDU_L1_LAN_IIH:
+ case ISIS_PDU_L2_LAN_IIH:
+ ND_PRINT((ndo, ", src-id %s",
+ isis_print_id(header_iih_lan->source_id, SYSTEM_ID_LEN)));
+ ND_PRINT((ndo, ", lan-id %s, prio %u",
+ isis_print_id(header_iih_lan->lan_id,NODE_ID_LEN),
+ header_iih_lan->priority));
+ break;
+ case ISIS_PDU_PTP_IIH:
+ ND_PRINT((ndo, ", src-id %s", isis_print_id(header_iih_ptp->source_id, SYSTEM_ID_LEN)));
+ break;
+ case ISIS_PDU_L1_LSP:
+ case ISIS_PDU_L2_LSP:
+ ND_PRINT((ndo, ", lsp-id %s, seq 0x%08x, lifetime %5us",
+ isis_print_id(header_lsp->lsp_id, LSP_ID_LEN),
+ EXTRACT_32BITS(header_lsp->sequence_number),
+ EXTRACT_16BITS(header_lsp->remaining_lifetime)));
+ break;
+ case ISIS_PDU_L1_CSNP:
+ case ISIS_PDU_L2_CSNP:
+ ND_PRINT((ndo, ", src-id %s", isis_print_id(header_csnp->source_id, NODE_ID_LEN)));
+ break;
+ case ISIS_PDU_L1_PSNP:
+ case ISIS_PDU_L2_PSNP:
+ ND_PRINT((ndo, ", src-id %s", isis_print_id(header_psnp->source_id, NODE_ID_LEN)));
+ break;
+
+ }
+ ND_PRINT((ndo, ", length %u", length));
+
+ return(1);
+ }
+
+ /* ok they seem to want to know everything - lets fully decode it */
+ ND_PRINT((ndo, "%slength %u", ndo->ndo_eflag ? "" : ", ", length));
+
+ ND_PRINT((ndo, "\n\t%s, hlen: %u, v: %u, pdu-v: %u, sys-id-len: %u (%u), max-area: %u (%u)",
+ tok2str(isis_pdu_values,
+ "unknown, type %u",
+ pdu_type),
+ isis_header->fixed_len,
+ isis_header->version,
+ isis_header->pdu_version,
+ id_length,
+ isis_header->id_length,
+ max_area,
+ isis_header->max_area));
+
+ if (ndo->ndo_vflag > 1) {
+ if (!print_unknown_data(ndo, optr, "\n\t", 8)) /* provide the _o_riginal pointer */
+ return(0); /* for optionally debugging the common header */
+ }
+
+ switch (pdu_type) {
+
+ case ISIS_PDU_L1_LAN_IIH:
+ case ISIS_PDU_L2_LAN_IIH:
+ if (isis_header->fixed_len != (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_LAN_HEADER_SIZE)) {
+ ND_PRINT((ndo, ", bogus fixed header length %u should be %lu",
+ isis_header->fixed_len, (unsigned long)ISIS_IIH_LAN_HEADER_SIZE));
+ return (0);
+ }
+
+ pdu_len=EXTRACT_16BITS(header_iih_lan->pdu_len);
+ if (packet_len>pdu_len) {
+ packet_len=pdu_len; /* do TLV decoding as long as it makes sense */
+ length=pdu_len;
+ }
+
+ ND_TCHECK(*header_iih_lan);
+ ND_PRINT((ndo, "\n\t source-id: %s, holding time: %us, Flags: [%s]",
+ isis_print_id(header_iih_lan->source_id,SYSTEM_ID_LEN),
+ EXTRACT_16BITS(header_iih_lan->holding_time),
+ tok2str(isis_iih_circuit_type_values,
+ "unknown circuit type 0x%02x",
+ header_iih_lan->circuit_type)));
+
+ ND_PRINT((ndo, "\n\t lan-id: %s, Priority: %u, PDU length: %u",
+ isis_print_id(header_iih_lan->lan_id, NODE_ID_LEN),
+ (header_iih_lan->priority) & ISIS_LAN_PRIORITY_MASK,
+ pdu_len));
+
+ if (ndo->ndo_vflag > 1) {
+ if (!print_unknown_data(ndo, pptr, "\n\t ", ISIS_IIH_LAN_HEADER_SIZE))
+ return(0);
+ }
+
+ packet_len -= (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_LAN_HEADER_SIZE);
+ pptr = p + (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_LAN_HEADER_SIZE);
+ break;
+
+ case ISIS_PDU_PTP_IIH:
+ if (isis_header->fixed_len != (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_PTP_HEADER_SIZE)) {
+ ND_PRINT((ndo, ", bogus fixed header length %u should be %lu",
+ isis_header->fixed_len, (unsigned long)ISIS_IIH_PTP_HEADER_SIZE));
+ return (0);
+ }
+
+ pdu_len=EXTRACT_16BITS(header_iih_ptp->pdu_len);
+ if (packet_len>pdu_len) {
+ packet_len=pdu_len; /* do TLV decoding as long as it makes sense */
+ length=pdu_len;
+ }
+
+ ND_TCHECK(*header_iih_ptp);
+ ND_PRINT((ndo, "\n\t source-id: %s, holding time: %us, Flags: [%s]",
+ isis_print_id(header_iih_ptp->source_id,SYSTEM_ID_LEN),
+ EXTRACT_16BITS(header_iih_ptp->holding_time),
+ tok2str(isis_iih_circuit_type_values,
+ "unknown circuit type 0x%02x",
+ header_iih_ptp->circuit_type)));
+
+ ND_PRINT((ndo, "\n\t circuit-id: 0x%02x, PDU length: %u",
+ header_iih_ptp->circuit_id,
+ pdu_len));
+
+ if (ndo->ndo_vflag > 1) {
+ if (!print_unknown_data(ndo, pptr, "\n\t ", ISIS_IIH_PTP_HEADER_SIZE))
+ return(0);
+ }
+
+ packet_len -= (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_PTP_HEADER_SIZE);
+ pptr = p + (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_PTP_HEADER_SIZE);
+ break;
+
+ case ISIS_PDU_L1_LSP:
+ case ISIS_PDU_L2_LSP:
+ if (isis_header->fixed_len != (ISIS_COMMON_HEADER_SIZE+ISIS_LSP_HEADER_SIZE)) {
+ ND_PRINT((ndo, ", bogus fixed header length %u should be %lu",
+ isis_header->fixed_len, (unsigned long)ISIS_LSP_HEADER_SIZE));
+ return (0);
+ }
+
+ pdu_len=EXTRACT_16BITS(header_lsp->pdu_len);
+ if (packet_len>pdu_len) {
+ packet_len=pdu_len; /* do TLV decoding as long as it makes sense */
+ length=pdu_len;
+ }
+
+ ND_TCHECK(*header_lsp);
+ ND_PRINT((ndo, "\n\t lsp-id: %s, seq: 0x%08x, lifetime: %5us\n\t chksum: 0x%04x",
+ isis_print_id(header_lsp->lsp_id, LSP_ID_LEN),
+ EXTRACT_32BITS(header_lsp->sequence_number),
+ EXTRACT_16BITS(header_lsp->remaining_lifetime),
+ EXTRACT_16BITS(header_lsp->checksum)));
+
+
+ osi_print_cksum(ndo, (uint8_t *)header_lsp->lsp_id,
+ EXTRACT_16BITS(header_lsp->checksum), 12, length-12);
+
+ /*
+ * Clear checksum and lifetime prior to signature verification.
+ */
+ header_lsp->checksum[0] = 0;
+ header_lsp->checksum[1] = 0;
+ header_lsp->remaining_lifetime[0] = 0;
+ header_lsp->remaining_lifetime[1] = 0;
+
+
+ ND_PRINT((ndo, ", PDU length: %u, Flags: [ %s",
+ pdu_len,
+ ISIS_MASK_LSP_OL_BIT(header_lsp->typeblock) ? "Overload bit set, " : ""));
+
+ if (ISIS_MASK_LSP_ATT_BITS(header_lsp->typeblock)) {
+ ND_PRINT((ndo, "%s", ISIS_MASK_LSP_ATT_DEFAULT_BIT(header_lsp->typeblock) ? "default " : ""));
+ ND_PRINT((ndo, "%s", ISIS_MASK_LSP_ATT_DELAY_BIT(header_lsp->typeblock) ? "delay " : ""));
+ ND_PRINT((ndo, "%s", ISIS_MASK_LSP_ATT_EXPENSE_BIT(header_lsp->typeblock) ? "expense " : ""));
+ ND_PRINT((ndo, "%s", ISIS_MASK_LSP_ATT_ERROR_BIT(header_lsp->typeblock) ? "error " : ""));
+ ND_PRINT((ndo, "ATT bit set, "));
+ }
+ ND_PRINT((ndo, "%s", ISIS_MASK_LSP_PARTITION_BIT(header_lsp->typeblock) ? "P bit set, " : ""));
+ ND_PRINT((ndo, "%s ]", tok2str(isis_lsp_istype_values, "Unknown(0x%x)",
+ ISIS_MASK_LSP_ISTYPE_BITS(header_lsp->typeblock))));
+
+ if (ndo->ndo_vflag > 1) {
+ if (!print_unknown_data(ndo, pptr, "\n\t ", ISIS_LSP_HEADER_SIZE))
+ return(0);
+ }
+
+ packet_len -= (ISIS_COMMON_HEADER_SIZE+ISIS_LSP_HEADER_SIZE);
+ pptr = p + (ISIS_COMMON_HEADER_SIZE+ISIS_LSP_HEADER_SIZE);
+ break;
+
+ case ISIS_PDU_L1_CSNP:
+ case ISIS_PDU_L2_CSNP:
+ if (isis_header->fixed_len != (ISIS_COMMON_HEADER_SIZE+ISIS_CSNP_HEADER_SIZE)) {
+ ND_PRINT((ndo, ", bogus fixed header length %u should be %lu",
+ isis_header->fixed_len, (unsigned long)ISIS_CSNP_HEADER_SIZE));
+ return (0);
+ }
+
+ pdu_len=EXTRACT_16BITS(header_csnp->pdu_len);
+ if (packet_len>pdu_len) {
+ packet_len=pdu_len; /* do TLV decoding as long as it makes sense */
+ length=pdu_len;
+ }
+
+ ND_TCHECK(*header_csnp);
+ ND_PRINT((ndo, "\n\t source-id: %s, PDU length: %u",
+ isis_print_id(header_csnp->source_id, NODE_ID_LEN),
+ pdu_len));
+ ND_PRINT((ndo, "\n\t start lsp-id: %s",
+ isis_print_id(header_csnp->start_lsp_id, LSP_ID_LEN)));
+ ND_PRINT((ndo, "\n\t end lsp-id: %s",
+ isis_print_id(header_csnp->end_lsp_id, LSP_ID_LEN)));
+
+ if (ndo->ndo_vflag > 1) {
+ if (!print_unknown_data(ndo, pptr, "\n\t ", ISIS_CSNP_HEADER_SIZE))
+ return(0);
+ }
+
+ packet_len -= (ISIS_COMMON_HEADER_SIZE+ISIS_CSNP_HEADER_SIZE);
+ pptr = p + (ISIS_COMMON_HEADER_SIZE+ISIS_CSNP_HEADER_SIZE);
+ break;
+
+ case ISIS_PDU_L1_PSNP:
+ case ISIS_PDU_L2_PSNP:
+ if (isis_header->fixed_len != (ISIS_COMMON_HEADER_SIZE+ISIS_PSNP_HEADER_SIZE)) {
+ ND_PRINT((ndo, "- bogus fixed header length %u should be %lu",
+ isis_header->fixed_len, (unsigned long)ISIS_PSNP_HEADER_SIZE));
+ return (0);
+ }
+
+ pdu_len=EXTRACT_16BITS(header_psnp->pdu_len);
+ if (packet_len>pdu_len) {
+ packet_len=pdu_len; /* do TLV decoding as long as it makes sense */
+ length=pdu_len;
+ }
+
+ ND_TCHECK(*header_psnp);
+ ND_PRINT((ndo, "\n\t source-id: %s, PDU length: %u",
+ isis_print_id(header_psnp->source_id, NODE_ID_LEN),
+ pdu_len));
+
+ if (ndo->ndo_vflag > 1) {
+ if (!print_unknown_data(ndo, pptr, "\n\t ", ISIS_PSNP_HEADER_SIZE))
+ return(0);
+ }
+
+ packet_len -= (ISIS_COMMON_HEADER_SIZE+ISIS_PSNP_HEADER_SIZE);
+ pptr = p + (ISIS_COMMON_HEADER_SIZE+ISIS_PSNP_HEADER_SIZE);
+ break;
+
+ default:
+ (void)print_unknown_data(ndo, pptr, "\n\t ", length);
+ return (0);
+ }
+
+ /*
+ * Now print the TLV's.
+ */
+
+ while (packet_len >= 2) {
+ if (pptr == ndo->ndo_snapend) {
+ return (1);
+ }
+
+ if (!ND_TTEST2(*pptr, 2)) {
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot (%ld) bytes",
+ (long)(pptr - ndo->ndo_snapend)));
+ return (1);
+ }
+ tlv_type = *pptr++;
+ tlv_len = *pptr++;
+ tmp =tlv_len; /* copy temporary len & pointer to packet data */
+ tptr = pptr;
+ packet_len -= 2;
+ if (tlv_len > packet_len) {
+ break;
+ }
+
+ /* first lets see if we know the TLVs name*/
+ ND_PRINT((ndo, "\n\t %s TLV #%u, length: %u",
+ tok2str(isis_tlv_values,
+ "unknown",
+ tlv_type),
+ tlv_type,
+ tlv_len));
+
+ if (tlv_len == 0) /* something is malformed */
+ continue;
+
+ /* now check if we have a decoder otherwise do a hexdump at the end*/
+ switch (tlv_type) {
+ case ISIS_TLV_AREA_ADDR:
+ if (!ND_TTEST2(*tptr, 1))
+ goto trunctlv;
+ alen = *tptr++;
+ while (tmp && alen < tmp) {
+ ND_PRINT((ndo, "\n\t Area address (length: %u): %s",
+ alen,
+ isonsap_string(tptr, alen)));
+ tptr += alen;
+ tmp -= alen + 1;
+ if (tmp==0) /* if this is the last area address do not attemt a boundary check */
+ break;
+ if (!ND_TTEST2(*tptr, 1))
+ goto trunctlv;
+ alen = *tptr++;
+ }
+ break;
+ case ISIS_TLV_ISNEIGH:
+ while (tmp >= ETHER_ADDR_LEN) {
+ if (!ND_TTEST2(*tptr, ETHER_ADDR_LEN))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t SNPA: %s", isis_print_id(tptr, ETHER_ADDR_LEN)));
+ tmp -= ETHER_ADDR_LEN;
+ tptr += ETHER_ADDR_LEN;
+ }
+ break;
+
+ case ISIS_TLV_ISNEIGH_VARLEN:
+ if (!ND_TTEST2(*tptr, 1) || tmp < 3) /* min. TLV length */
+ goto trunctlv;
+ lan_alen = *tptr++; /* LAN address length */
+ if (lan_alen == 0) {
+ ND_PRINT((ndo, "\n\t LAN address length 0 bytes (invalid)"));
+ break;
+ }
+ tmp --;
+ ND_PRINT((ndo, "\n\t LAN address length %u bytes ", lan_alen));
+ while (tmp >= lan_alen) {
+ if (!ND_TTEST2(*tptr, lan_alen))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t\tIS Neighbor: %s", isis_print_id(tptr, lan_alen)));
+ tmp -= lan_alen;
+ tptr +=lan_alen;
+ }
+ break;
+
+ case ISIS_TLV_PADDING:
+ break;
+
+ case ISIS_TLV_MT_IS_REACH:
+ mt_len = isis_print_mtid(ndo, tptr, "\n\t ");
+ if (mt_len == 0) /* did something go wrong ? */
+ goto trunctlv;
+ tptr+=mt_len;
+ tmp-=mt_len;
+ while (tmp >= 2+NODE_ID_LEN+3+1) {
+ ext_is_len = isis_print_ext_is_reach(ndo, tptr, "\n\t ", tlv_type);
+ if (ext_is_len == 0) /* did something go wrong ? */
+ goto trunctlv;
+
+ tmp-=ext_is_len;
+ tptr+=ext_is_len;
+ }
+ break;
+
+ case ISIS_TLV_IS_ALIAS_ID:
+ while (tmp >= NODE_ID_LEN+1) { /* is it worth attempting a decode ? */
+ ext_is_len = isis_print_ext_is_reach(ndo, tptr, "\n\t ", tlv_type);
+ if (ext_is_len == 0) /* did something go wrong ? */
+ goto trunctlv;
+ tmp-=ext_is_len;
+ tptr+=ext_is_len;
+ }
+ break;
+
+ case ISIS_TLV_EXT_IS_REACH:
+ while (tmp >= NODE_ID_LEN+3+1) { /* is it worth attempting a decode ? */
+ ext_is_len = isis_print_ext_is_reach(ndo, tptr, "\n\t ", tlv_type);
+ if (ext_is_len == 0) /* did something go wrong ? */
+ goto trunctlv;
+ tmp-=ext_is_len;
+ tptr+=ext_is_len;
+ }
+ break;
+ case ISIS_TLV_IS_REACH:
+ if (!ND_TTEST2(*tptr,1)) /* check if there is one byte left to read out the virtual flag */
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t %s",
+ tok2str(isis_is_reach_virtual_values,
+ "bogus virtual flag 0x%02x",
+ *tptr++)));
+ tlv_is_reach = (const struct isis_tlv_is_reach *)tptr;
+ while (tmp >= sizeof(struct isis_tlv_is_reach)) {
+ if (!ND_TTEST(*tlv_is_reach))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t IS Neighbor: %s",
+ isis_print_id(tlv_is_reach->neighbor_nodeid, NODE_ID_LEN)));
+ isis_print_metric_block(ndo, &tlv_is_reach->isis_metric_block);
+ tmp -= sizeof(struct isis_tlv_is_reach);
+ tlv_is_reach++;
+ }
+ break;
+
+ case ISIS_TLV_ESNEIGH:
+ tlv_es_reach = (const struct isis_tlv_es_reach *)tptr;
+ while (tmp >= sizeof(struct isis_tlv_es_reach)) {
+ if (!ND_TTEST(*tlv_es_reach))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t ES Neighbor: %s",
+ isis_print_id(tlv_es_reach->neighbor_sysid, SYSTEM_ID_LEN)));
+ isis_print_metric_block(ndo, &tlv_es_reach->isis_metric_block);
+ tmp -= sizeof(struct isis_tlv_es_reach);
+ tlv_es_reach++;
+ }
+ break;
+
+ /* those two TLVs share the same format */
+ case ISIS_TLV_INT_IP_REACH:
+ case ISIS_TLV_EXT_IP_REACH:
+ if (!isis_print_tlv_ip_reach(ndo, pptr, "\n\t ", tlv_len))
+ return (1);
+ break;
+
+ case ISIS_TLV_EXTD_IP_REACH:
+ while (tmp>0) {
+ ext_ip_len = isis_print_extd_ip_reach(ndo, tptr, "\n\t ", AF_INET);
+ if (ext_ip_len == 0) /* did something go wrong ? */
+ goto trunctlv;
+ tptr+=ext_ip_len;
+ tmp-=ext_ip_len;
+ }
+ break;
+
+ case ISIS_TLV_MT_IP_REACH:
+ mt_len = isis_print_mtid(ndo, tptr, "\n\t ");
+ if (mt_len == 0) { /* did something go wrong ? */
+ goto trunctlv;
+ }
+ tptr+=mt_len;
+ tmp-=mt_len;
+
+ while (tmp>0) {
+ ext_ip_len = isis_print_extd_ip_reach(ndo, tptr, "\n\t ", AF_INET);
+ if (ext_ip_len == 0) /* did something go wrong ? */
+ goto trunctlv;
+ tptr+=ext_ip_len;
+ tmp-=ext_ip_len;
+ }
+ break;
+
+#ifdef INET6
+ case ISIS_TLV_IP6_REACH:
+ while (tmp>0) {
+ ext_ip_len = isis_print_extd_ip_reach(ndo, tptr, "\n\t ", AF_INET6);
+ if (ext_ip_len == 0) /* did something go wrong ? */
+ goto trunctlv;
+ tptr+=ext_ip_len;
+ tmp-=ext_ip_len;
+ }
+ break;
+
+ case ISIS_TLV_MT_IP6_REACH:
+ mt_len = isis_print_mtid(ndo, tptr, "\n\t ");
+ if (mt_len == 0) { /* did something go wrong ? */
+ goto trunctlv;
+ }
+ tptr+=mt_len;
+ tmp-=mt_len;
+
+ while (tmp>0) {
+ ext_ip_len = isis_print_extd_ip_reach(ndo, tptr, "\n\t ", AF_INET6);
+ if (ext_ip_len == 0) /* did something go wrong ? */
+ goto trunctlv;
+ tptr+=ext_ip_len;
+ tmp-=ext_ip_len;
+ }
+ break;
+
+ case ISIS_TLV_IP6ADDR:
+ while (tmp>=sizeof(struct in6_addr)) {
+ if (!ND_TTEST2(*tptr, sizeof(struct in6_addr)))
+ goto trunctlv;
+
+ ND_PRINT((ndo, "\n\t IPv6 interface address: %s",
+ ip6addr_string(ndo, tptr)));
+
+ tptr += sizeof(struct in6_addr);
+ tmp -= sizeof(struct in6_addr);
+ }
+ break;
+#endif
+ case ISIS_TLV_AUTH:
+ if (!ND_TTEST2(*tptr, 1))
+ goto trunctlv;
+
+ ND_PRINT((ndo, "\n\t %s: ",
+ tok2str(isis_subtlv_auth_values,
+ "unknown Authentication type 0x%02x",
+ *tptr)));
+
+ switch (*tptr) {
+ case ISIS_SUBTLV_AUTH_SIMPLE:
+ for(i=1;i<tlv_len;i++) {
+ if (!ND_TTEST2(*(tptr + i), 1))
+ goto trunctlv;
+ ND_PRINT((ndo, "%c", *(tptr + i)));
+ }
+ break;
+ case ISIS_SUBTLV_AUTH_MD5:
+ for(i=1;i<tlv_len;i++) {
+ if (!ND_TTEST2(*(tptr + i), 1))
+ goto trunctlv;
+ ND_PRINT((ndo, "%02x", *(tptr + i)));
+ }
+ if (tlv_len != ISIS_SUBTLV_AUTH_MD5_LEN+1)
+ ND_PRINT((ndo, ", (malformed subTLV) "));
+
+#ifdef HAVE_LIBCRYPTO
+ sigcheck = signature_verify(ndo, optr, length,
+ (unsigned char *)tptr + 1);
+#else
+ sigcheck = CANT_CHECK_SIGNATURE;
+#endif
+ ND_PRINT((ndo, " (%s)", tok2str(signature_check_values, "Unknown", sigcheck)));
+
+ break;
+ case ISIS_SUBTLV_AUTH_GENERIC:
+ key_id = EXTRACT_16BITS((tptr+1));
+ ND_PRINT((ndo, "%u, password: ", key_id));
+ for(i=1 + sizeof(uint16_t);i<tlv_len;i++) {
+ if (!ND_TTEST2(*(tptr + i), 1))
+ goto trunctlv;
+ ND_PRINT((ndo, "%02x", *(tptr + i)));
+ }
+ break;
+ case ISIS_SUBTLV_AUTH_PRIVATE:
+ default:
+ if (!print_unknown_data(ndo, tptr + 1, "\n\t\t ", tlv_len - 1))
+ return(0);
+ break;
+ }
+ break;
+
+ case ISIS_TLV_PTP_ADJ:
+ tlv_ptp_adj = (const struct isis_tlv_ptp_adj *)tptr;
+ if(tmp>=1) {
+ if (!ND_TTEST2(*tptr, 1))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t Adjacency State: %s (%u)",
+ tok2str(isis_ptp_adjancey_values, "unknown", *tptr),
+ *tptr));
+ tmp--;
+ }
+ if(tmp>sizeof(tlv_ptp_adj->extd_local_circuit_id)) {
+ if (!ND_TTEST2(tlv_ptp_adj->extd_local_circuit_id,
+ sizeof(tlv_ptp_adj->extd_local_circuit_id)))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t Extended Local circuit-ID: 0x%08x",
+ EXTRACT_32BITS(tlv_ptp_adj->extd_local_circuit_id)));
+ tmp-=sizeof(tlv_ptp_adj->extd_local_circuit_id);
+ }
+ if(tmp>=SYSTEM_ID_LEN) {
+ if (!ND_TTEST2(tlv_ptp_adj->neighbor_sysid, SYSTEM_ID_LEN))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t Neighbor System-ID: %s",
+ isis_print_id(tlv_ptp_adj->neighbor_sysid, SYSTEM_ID_LEN)));
+ tmp-=SYSTEM_ID_LEN;
+ }
+ if(tmp>=sizeof(tlv_ptp_adj->neighbor_extd_local_circuit_id)) {
+ if (!ND_TTEST2(tlv_ptp_adj->neighbor_extd_local_circuit_id,
+ sizeof(tlv_ptp_adj->neighbor_extd_local_circuit_id)))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t Neighbor Extended Local circuit-ID: 0x%08x",
+ EXTRACT_32BITS(tlv_ptp_adj->neighbor_extd_local_circuit_id)));
+ }
+ break;
+
+ case ISIS_TLV_PROTOCOLS:
+ ND_PRINT((ndo, "\n\t NLPID(s): "));
+ while (tmp>0) {
+ if (!ND_TTEST2(*(tptr), 1))
+ goto trunctlv;
+ ND_PRINT((ndo, "%s (0x%02x)",
+ tok2str(nlpid_values,
+ "unknown",
+ *tptr),
+ *tptr));
+ if (tmp>1) /* further NPLIDs ? - put comma */
+ ND_PRINT((ndo, ", "));
+ tptr++;
+ tmp--;
+ }
+ break;
+
+ case ISIS_TLV_MT_PORT_CAP:
+ {
+ if (!ND_TTEST2(*(tptr), 2))
+ goto trunctlv;
+
+ ND_PRINT((ndo, "\n\t RES: %d, MTID(s): %d",
+ (EXTRACT_16BITS (tptr) >> 12),
+ (EXTRACT_16BITS (tptr) & 0x0fff)));
+
+ tmp = tmp-2;
+ tptr = tptr+2;
+
+ if (tmp)
+ isis_print_mt_port_cap_subtlv(ndo, tptr, tmp);
+
+ break;
+ }
+
+ case ISIS_TLV_MT_CAPABILITY:
+
+ if (!ND_TTEST2(*(tptr), 2))
+ goto trunctlv;
+
+ ND_PRINT((ndo, "\n\t O: %d, RES: %d, MTID(s): %d",
+ (EXTRACT_16BITS(tptr) >> 15) & 0x01,
+ (EXTRACT_16BITS(tptr) >> 12) & 0x07,
+ EXTRACT_16BITS(tptr) & 0x0fff));
+
+ tmp = tmp-2;
+ tptr = tptr+2;
+
+ if (tmp)
+ isis_print_mt_capability_subtlv(ndo, tptr, tmp);
+
+ break;
+
+ case ISIS_TLV_TE_ROUTER_ID:
+ if (!ND_TTEST2(*pptr, sizeof(struct in_addr)))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t Traffic Engineering Router ID: %s", ipaddr_string(ndo, pptr)));
+ break;
+
+ case ISIS_TLV_IPADDR:
+ while (tmp>=sizeof(struct in_addr)) {
+ if (!ND_TTEST2(*tptr, sizeof(struct in_addr)))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t IPv4 interface address: %s", ipaddr_string(ndo, tptr)));
+ tptr += sizeof(struct in_addr);
+ tmp -= sizeof(struct in_addr);
+ }
+ break;
+
+ case ISIS_TLV_HOSTNAME:
+ ND_PRINT((ndo, "\n\t Hostname: "));
+ while (tmp>0) {
+ if (!ND_TTEST2(*tptr, 1))
+ goto trunctlv;
+ ND_PRINT((ndo, "%c", *tptr++));
+ tmp--;
+ }
+ break;
+
+ case ISIS_TLV_SHARED_RISK_GROUP:
+ if (tmp < NODE_ID_LEN)
+ break;
+ if (!ND_TTEST2(*tptr, NODE_ID_LEN))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t IS Neighbor: %s", isis_print_id(tptr, NODE_ID_LEN)));
+ tptr+=(NODE_ID_LEN);
+ tmp-=(NODE_ID_LEN);
+
+ if (tmp < 1)
+ break;
+ if (!ND_TTEST2(*tptr, 1))
+ goto trunctlv;
+ ND_PRINT((ndo, ", Flags: [%s]", ISIS_MASK_TLV_SHARED_RISK_GROUP(*tptr++) ? "numbered" : "unnumbered"));
+ tmp--;
+
+ if (tmp < sizeof(struct in_addr))
+ break;
+ if (!ND_TTEST2(*tptr, sizeof(struct in_addr)))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t IPv4 interface address: %s", ipaddr_string(ndo, tptr)));
+ tptr+=sizeof(struct in_addr);
+ tmp-=sizeof(struct in_addr);
+
+ if (tmp < sizeof(struct in_addr))
+ break;
+ if (!ND_TTEST2(*tptr, sizeof(struct in_addr)))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t IPv4 neighbor address: %s", ipaddr_string(ndo, tptr)));
+ tptr+=sizeof(struct in_addr);
+ tmp-=sizeof(struct in_addr);
+
+ while (tmp>=4) {
+ if (!ND_TTEST2(*tptr, 4))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t Link-ID: 0x%08x", EXTRACT_32BITS(tptr)));
+ tptr+=4;
+ tmp-=4;
+ }
+ break;
+
+ case ISIS_TLV_LSP:
+ tlv_lsp = (const struct isis_tlv_lsp *)tptr;
+ while(tmp>=sizeof(struct isis_tlv_lsp)) {
+ if (!ND_TTEST((tlv_lsp->lsp_id)[LSP_ID_LEN-1]))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t lsp-id: %s",
+ isis_print_id(tlv_lsp->lsp_id, LSP_ID_LEN)));
+ if (!ND_TTEST2(tlv_lsp->sequence_number, 4))
+ goto trunctlv;
+ ND_PRINT((ndo, ", seq: 0x%08x", EXTRACT_32BITS(tlv_lsp->sequence_number)));
+ if (!ND_TTEST2(tlv_lsp->remaining_lifetime, 2))
+ goto trunctlv;
+ ND_PRINT((ndo, ", lifetime: %5ds", EXTRACT_16BITS(tlv_lsp->remaining_lifetime)));
+ if (!ND_TTEST2(tlv_lsp->checksum, 2))
+ goto trunctlv;
+ ND_PRINT((ndo, ", chksum: 0x%04x", EXTRACT_16BITS(tlv_lsp->checksum)));
+ tmp-=sizeof(struct isis_tlv_lsp);
+ tlv_lsp++;
+ }
+ break;
+
+ case ISIS_TLV_CHECKSUM:
+ if (tmp < ISIS_TLV_CHECKSUM_MINLEN)
+ break;
+ if (!ND_TTEST2(*tptr, ISIS_TLV_CHECKSUM_MINLEN))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t checksum: 0x%04x ", EXTRACT_16BITS(tptr)));
+ /* do not attempt to verify the checksum if it is zero
+ * most likely a HMAC-MD5 TLV is also present and
+ * to avoid conflicts the checksum TLV is zeroed.
+ * see rfc3358 for details
+ */
+ osi_print_cksum(ndo, optr, EXTRACT_16BITS(tptr), tptr-optr, length);
+ break;
+
+ case ISIS_TLV_MT_SUPPORTED:
+ if (tmp < ISIS_TLV_MT_SUPPORTED_MINLEN)
+ break;
+ while (tmp>1) {
+ /* length can only be a multiple of 2, otherwise there is
+ something broken -> so decode down until length is 1 */
+ if (tmp!=1) {
+ mt_len = isis_print_mtid(ndo, tptr, "\n\t ");
+ if (mt_len == 0) /* did something go wrong ? */
+ goto trunctlv;
+ tptr+=mt_len;
+ tmp-=mt_len;
+ } else {
+ ND_PRINT((ndo, "\n\t malformed MT-ID"));
+ break;
+ }
+ }
+ break;
+
+ case ISIS_TLV_RESTART_SIGNALING:
+ /* first attempt to decode the flags */
+ if (tmp < ISIS_TLV_RESTART_SIGNALING_FLAGLEN)
+ break;
+ if (!ND_TTEST2(*tptr, ISIS_TLV_RESTART_SIGNALING_FLAGLEN))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t Flags [%s]",
+ bittok2str(isis_restart_flag_values, "none", *tptr)));
+ tptr+=ISIS_TLV_RESTART_SIGNALING_FLAGLEN;
+ tmp-=ISIS_TLV_RESTART_SIGNALING_FLAGLEN;
+
+ /* is there anything other than the flags field? */
+ if (tmp == 0)
+ break;
+
+ if (tmp < ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN)
+ break;
+ if (!ND_TTEST2(*tptr, ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN))
+ goto trunctlv;
+
+ ND_PRINT((ndo, ", Remaining holding time %us", EXTRACT_16BITS(tptr)));
+ tptr+=ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN;
+ tmp-=ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN;
+
+ /* is there an additional sysid field present ?*/
+ if (tmp == SYSTEM_ID_LEN) {
+ if (!ND_TTEST2(*tptr, SYSTEM_ID_LEN))
+ goto trunctlv;
+ ND_PRINT((ndo, ", for %s", isis_print_id(tptr,SYSTEM_ID_LEN)));
+ }
+ break;
+
+ case ISIS_TLV_IDRP_INFO:
+ if (tmp < ISIS_TLV_IDRP_INFO_MINLEN)
+ break;
+ if (!ND_TTEST2(*tptr, ISIS_TLV_IDRP_INFO_MINLEN))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t Inter-Domain Information Type: %s",
+ tok2str(isis_subtlv_idrp_values,
+ "Unknown (0x%02x)",
+ *tptr)));
+ switch (*tptr++) {
+ case ISIS_SUBTLV_IDRP_ASN:
+ if (!ND_TTEST2(*tptr, 2)) /* fetch AS number */
+ goto trunctlv;
+ ND_PRINT((ndo, "AS Number: %u", EXTRACT_16BITS(tptr)));
+ break;
+ case ISIS_SUBTLV_IDRP_LOCAL:
+ case ISIS_SUBTLV_IDRP_RES:
+ default:
+ if (!print_unknown_data(ndo, tptr, "\n\t ", tlv_len - 1))
+ return(0);
+ break;
+ }
+ break;
+
+ case ISIS_TLV_LSP_BUFFERSIZE:
+ if (tmp < ISIS_TLV_LSP_BUFFERSIZE_MINLEN)
+ break;
+ if (!ND_TTEST2(*tptr, ISIS_TLV_LSP_BUFFERSIZE_MINLEN))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t LSP Buffersize: %u", EXTRACT_16BITS(tptr)));
+ break;
+
+ case ISIS_TLV_PART_DIS:
+ while (tmp >= SYSTEM_ID_LEN) {
+ if (!ND_TTEST2(*tptr, SYSTEM_ID_LEN))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t %s", isis_print_id(tptr, SYSTEM_ID_LEN)));
+ tptr+=SYSTEM_ID_LEN;
+ tmp-=SYSTEM_ID_LEN;
+ }
+ break;
+
+ case ISIS_TLV_PREFIX_NEIGH:
+ if (tmp < sizeof(struct isis_metric_block))
+ break;
+ if (!ND_TTEST2(*tptr, sizeof(struct isis_metric_block)))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t Metric Block"));
+ isis_print_metric_block(ndo, (const struct isis_metric_block *)tptr);
+ tptr+=sizeof(struct isis_metric_block);
+ tmp-=sizeof(struct isis_metric_block);
+
+ while(tmp>0) {
+ if (!ND_TTEST2(*tptr, 1))
+ goto trunctlv;
+ prefix_len=*tptr++; /* read out prefix length in semioctets*/
+ if (prefix_len < 2) {
+ ND_PRINT((ndo, "\n\t\tAddress: prefix length %u < 2", prefix_len));
+ break;
+ }
+ tmp--;
+ if (tmp < prefix_len/2)
+ break;
+ if (!ND_TTEST2(*tptr, prefix_len / 2))
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t\tAddress: %s/%u",
+ isonsap_string(tptr, prefix_len / 2), prefix_len * 4));
+ tptr+=prefix_len/2;
+ tmp-=prefix_len/2;
+ }
+ break;
+
+ case ISIS_TLV_IIH_SEQNR:
+ if (tmp < ISIS_TLV_IIH_SEQNR_MINLEN)
+ break;
+ if (!ND_TTEST2(*tptr, ISIS_TLV_IIH_SEQNR_MINLEN)) /* check if four bytes are on the wire */
+ goto trunctlv;
+ ND_PRINT((ndo, "\n\t Sequence number: %u", EXTRACT_32BITS(tptr)));
+ break;
+
+ case ISIS_TLV_VENDOR_PRIVATE:
+ if (tmp < ISIS_TLV_VENDOR_PRIVATE_MINLEN)
+ break;
+ if (!ND_TTEST2(*tptr, ISIS_TLV_VENDOR_PRIVATE_MINLEN)) /* check if enough byte for a full oui */
+ goto trunctlv;
+ vendor_id = EXTRACT_24BITS(tptr);
+ ND_PRINT((ndo, "\n\t Vendor: %s (%u)",
+ tok2str(oui_values, "Unknown", vendor_id),
+ vendor_id));
+ tptr+=3;
+ tmp-=3;
+ if (tmp > 0) /* hexdump the rest */
+ if (!print_unknown_data(ndo, tptr, "\n\t\t", tmp))
+ return(0);
+ break;
+ /*
+ * FIXME those are the defined TLVs that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+
+ case ISIS_TLV_DECNET_PHASE4:
+ case ISIS_TLV_LUCENT_PRIVATE:
+ case ISIS_TLV_IPAUTH:
+ case ISIS_TLV_NORTEL_PRIVATE1:
+ case ISIS_TLV_NORTEL_PRIVATE2:
+
+ default:
+ if (ndo->ndo_vflag <= 1) {
+ if (!print_unknown_data(ndo, pptr, "\n\t\t", tlv_len))
+ return(0);
+ }
+ break;
+ }
+ /* do we want to see an additionally hexdump ? */
+ if (ndo->ndo_vflag> 1) {
+ if (!print_unknown_data(ndo, pptr, "\n\t ", tlv_len))
+ return(0);
+ }
+
+ pptr += tlv_len;
+ packet_len -= tlv_len;
+ }
+
+ if (packet_len != 0) {
+ ND_PRINT((ndo, "\n\t %u straggler bytes", packet_len));
+ }
+ return (1);
+
+ trunc:
+ ND_PRINT((ndo, "[|isis]"));
+ return (1);
+
+ trunctlv:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+ return(1);
+}
+
+static void
+osi_print_cksum(netdissect_options *ndo,
+ const uint8_t *pptr, uint16_t checksum,
+ u_int checksum_offset, u_int length)
+{
+ uint16_t calculated_checksum;
+
+ /* do not attempt to verify the checksum if it is zero,
+ * if the total length is nonsense,
+ * if the offset is nonsense,
+ * or the base pointer is not sane
+ */
+ if (!checksum
+ || length > ndo->ndo_snaplen
+ || checksum_offset > ndo->ndo_snaplen
+ || checksum_offset > length) {
+ ND_PRINT((ndo, "(unverified)"));
+ } else {
+ const char *truncated = "trunc";
+ //printf("\nosi_print_cksum: %p %u %u %u\n", pptr, checksum_offset, length, ndo->ndo_snaplen);
+ //ND_TCHECK2(pptr, checksum_offset+length);
+ calculated_checksum = create_osi_cksum(pptr, checksum_offset, length);
+ if (checksum == calculated_checksum) {
+ ND_PRINT((ndo, " (correct)"));
+ } else {
+ truncated = "incorrect";
+ //trunc:
+ ND_PRINT((ndo, " (%s should be 0x%04x)", truncated, calculated_checksum));
+ }
+ }
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/* NetBSD: print-juniper.c,v 1.2 2007/07/24 11:53:45 drochner Exp */
+
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-juniper.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+#include "ppp.h"
+#include "llc.h"
+#include "nlpid.h"
+#include "ethertype.h"
+#include "atm.h"
+
+#define JUNIPER_BPF_OUT 0 /* Outgoing packet */
+#define JUNIPER_BPF_IN 1 /* Incoming packet */
+#define JUNIPER_BPF_PKT_IN 0x1 /* Incoming packet */
+#define JUNIPER_BPF_NO_L2 0x2 /* L2 header stripped */
+#define JUNIPER_BPF_IIF 0x4 /* IIF is valid */
+#define JUNIPER_BPF_FILTER 0x40 /* BPF filtering is supported */
+#define JUNIPER_BPF_EXT 0x80 /* extensions present */
+#define JUNIPER_MGC_NUMBER 0x4d4743 /* = "MGC" */
+
+#define JUNIPER_LSQ_COOKIE_RE (1 << 3)
+#define JUNIPER_LSQ_COOKIE_DIR (1 << 2)
+#define JUNIPER_LSQ_L3_PROTO_SHIFT 4
+#define JUNIPER_LSQ_L3_PROTO_MASK (0x17 << JUNIPER_LSQ_L3_PROTO_SHIFT)
+#define JUNIPER_LSQ_L3_PROTO_IPV4 (0 << JUNIPER_LSQ_L3_PROTO_SHIFT)
+#define JUNIPER_LSQ_L3_PROTO_IPV6 (1 << JUNIPER_LSQ_L3_PROTO_SHIFT)
+#define JUNIPER_LSQ_L3_PROTO_MPLS (2 << JUNIPER_LSQ_L3_PROTO_SHIFT)
+#define JUNIPER_LSQ_L3_PROTO_ISO (3 << JUNIPER_LSQ_L3_PROTO_SHIFT)
+#define AS_PIC_COOKIE_LEN 8
+
+#define JUNIPER_IPSEC_O_ESP_ENCRYPT_ESP_AUTHEN_TYPE 1
+#define JUNIPER_IPSEC_O_ESP_ENCRYPT_AH_AUTHEN_TYPE 2
+#define JUNIPER_IPSEC_O_ESP_AUTHENTICATION_TYPE 3
+#define JUNIPER_IPSEC_O_AH_AUTHENTICATION_TYPE 4
+#define JUNIPER_IPSEC_O_ESP_ENCRYPTION_TYPE 5
+
+static const struct tok juniper_ipsec_type_values[] = {
+ { JUNIPER_IPSEC_O_ESP_ENCRYPT_ESP_AUTHEN_TYPE, "ESP ENCR-AUTH" },
+ { JUNIPER_IPSEC_O_ESP_ENCRYPT_AH_AUTHEN_TYPE, "ESP ENCR-AH AUTH" },
+ { JUNIPER_IPSEC_O_ESP_AUTHENTICATION_TYPE, "ESP AUTH" },
+ { JUNIPER_IPSEC_O_AH_AUTHENTICATION_TYPE, "AH AUTH" },
+ { JUNIPER_IPSEC_O_ESP_ENCRYPTION_TYPE, "ESP ENCR" },
+ { 0, NULL}
+};
+
+static const struct tok juniper_direction_values[] = {
+ { JUNIPER_BPF_IN, "In"},
+ { JUNIPER_BPF_OUT, "Out"},
+ { 0, NULL}
+};
+
+/* codepoints for encoding extensions to a .pcap file */
+enum {
+ JUNIPER_EXT_TLV_IFD_IDX = 1,
+ JUNIPER_EXT_TLV_IFD_NAME = 2,
+ JUNIPER_EXT_TLV_IFD_MEDIATYPE = 3,
+ JUNIPER_EXT_TLV_IFL_IDX = 4,
+ JUNIPER_EXT_TLV_IFL_UNIT = 5,
+ JUNIPER_EXT_TLV_IFL_ENCAPS = 6,
+ JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE = 7,
+ JUNIPER_EXT_TLV_TTP_IFL_ENCAPS = 8
+};
+
+/* 1 byte type and 1-byte length */
+#define JUNIPER_EXT_TLV_OVERHEAD 2
+
+static const struct tok jnx_ext_tlv_values[] = {
+ { JUNIPER_EXT_TLV_IFD_IDX, "Device Interface Index" },
+ { JUNIPER_EXT_TLV_IFD_NAME,"Device Interface Name" },
+ { JUNIPER_EXT_TLV_IFD_MEDIATYPE, "Device Media Type" },
+ { JUNIPER_EXT_TLV_IFL_IDX, "Logical Interface Index" },
+ { JUNIPER_EXT_TLV_IFL_UNIT,"Logical Unit Number" },
+ { JUNIPER_EXT_TLV_IFL_ENCAPS, "Logical Interface Encapsulation" },
+ { JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE, "TTP derived Device Media Type" },
+ { JUNIPER_EXT_TLV_TTP_IFL_ENCAPS, "TTP derived Logical Interface Encapsulation" },
+ { 0, NULL }
+};
+
+static const struct tok jnx_flag_values[] = {
+ { JUNIPER_BPF_EXT, "Ext" },
+ { JUNIPER_BPF_FILTER, "Filter" },
+ { JUNIPER_BPF_IIF, "IIF" },
+ { JUNIPER_BPF_NO_L2, "no-L2" },
+ { JUNIPER_BPF_PKT_IN, "In" },
+ { 0, NULL }
+};
+
+#define JUNIPER_IFML_ETHER 1
+#define JUNIPER_IFML_FDDI 2
+#define JUNIPER_IFML_TOKENRING 3
+#define JUNIPER_IFML_PPP 4
+#define JUNIPER_IFML_FRAMERELAY 5
+#define JUNIPER_IFML_CISCOHDLC 6
+#define JUNIPER_IFML_SMDSDXI 7
+#define JUNIPER_IFML_ATMPVC 8
+#define JUNIPER_IFML_PPP_CCC 9
+#define JUNIPER_IFML_FRAMERELAY_CCC 10
+#define JUNIPER_IFML_IPIP 11
+#define JUNIPER_IFML_GRE 12
+#define JUNIPER_IFML_PIM 13
+#define JUNIPER_IFML_PIMD 14
+#define JUNIPER_IFML_CISCOHDLC_CCC 15
+#define JUNIPER_IFML_VLAN_CCC 16
+#define JUNIPER_IFML_MLPPP 17
+#define JUNIPER_IFML_MLFR 18
+#define JUNIPER_IFML_ML 19
+#define JUNIPER_IFML_LSI 20
+#define JUNIPER_IFML_DFE 21
+#define JUNIPER_IFML_ATM_CELLRELAY_CCC 22
+#define JUNIPER_IFML_CRYPTO 23
+#define JUNIPER_IFML_GGSN 24
+#define JUNIPER_IFML_LSI_PPP 25
+#define JUNIPER_IFML_LSI_CISCOHDLC 26
+#define JUNIPER_IFML_PPP_TCC 27
+#define JUNIPER_IFML_FRAMERELAY_TCC 28
+#define JUNIPER_IFML_CISCOHDLC_TCC 29
+#define JUNIPER_IFML_ETHERNET_CCC 30
+#define JUNIPER_IFML_VT 31
+#define JUNIPER_IFML_EXTENDED_VLAN_CCC 32
+#define JUNIPER_IFML_ETHER_OVER_ATM 33
+#define JUNIPER_IFML_MONITOR 34
+#define JUNIPER_IFML_ETHERNET_TCC 35
+#define JUNIPER_IFML_VLAN_TCC 36
+#define JUNIPER_IFML_EXTENDED_VLAN_TCC 37
+#define JUNIPER_IFML_CONTROLLER 38
+#define JUNIPER_IFML_MFR 39
+#define JUNIPER_IFML_LS 40
+#define JUNIPER_IFML_ETHERNET_VPLS 41
+#define JUNIPER_IFML_ETHERNET_VLAN_VPLS 42
+#define JUNIPER_IFML_ETHERNET_EXTENDED_VLAN_VPLS 43
+#define JUNIPER_IFML_LT 44
+#define JUNIPER_IFML_SERVICES 45
+#define JUNIPER_IFML_ETHER_VPLS_OVER_ATM 46
+#define JUNIPER_IFML_FR_PORT_CCC 47
+#define JUNIPER_IFML_FRAMERELAY_EXT_CCC 48
+#define JUNIPER_IFML_FRAMERELAY_EXT_TCC 49
+#define JUNIPER_IFML_FRAMERELAY_FLEX 50
+#define JUNIPER_IFML_GGSNI 51
+#define JUNIPER_IFML_ETHERNET_FLEX 52
+#define JUNIPER_IFML_COLLECTOR 53
+#define JUNIPER_IFML_AGGREGATOR 54
+#define JUNIPER_IFML_LAPD 55
+#define JUNIPER_IFML_PPPOE 56
+#define JUNIPER_IFML_PPP_SUBORDINATE 57
+#define JUNIPER_IFML_CISCOHDLC_SUBORDINATE 58
+#define JUNIPER_IFML_DFC 59
+#define JUNIPER_IFML_PICPEER 60
+
+static const struct tok juniper_ifmt_values[] = {
+ { JUNIPER_IFML_ETHER, "Ethernet" },
+ { JUNIPER_IFML_FDDI, "FDDI" },
+ { JUNIPER_IFML_TOKENRING, "Token-Ring" },
+ { JUNIPER_IFML_PPP, "PPP" },
+ { JUNIPER_IFML_PPP_SUBORDINATE, "PPP-Subordinate" },
+ { JUNIPER_IFML_FRAMERELAY, "Frame-Relay" },
+ { JUNIPER_IFML_CISCOHDLC, "Cisco-HDLC" },
+ { JUNIPER_IFML_SMDSDXI, "SMDS-DXI" },
+ { JUNIPER_IFML_ATMPVC, "ATM-PVC" },
+ { JUNIPER_IFML_PPP_CCC, "PPP-CCC" },
+ { JUNIPER_IFML_FRAMERELAY_CCC, "Frame-Relay-CCC" },
+ { JUNIPER_IFML_FRAMERELAY_EXT_CCC, "Extended FR-CCC" },
+ { JUNIPER_IFML_IPIP, "IP-over-IP" },
+ { JUNIPER_IFML_GRE, "GRE" },
+ { JUNIPER_IFML_PIM, "PIM-Encapsulator" },
+ { JUNIPER_IFML_PIMD, "PIM-Decapsulator" },
+ { JUNIPER_IFML_CISCOHDLC_CCC, "Cisco-HDLC-CCC" },
+ { JUNIPER_IFML_VLAN_CCC, "VLAN-CCC" },
+ { JUNIPER_IFML_EXTENDED_VLAN_CCC, "Extended-VLAN-CCC" },
+ { JUNIPER_IFML_MLPPP, "Multilink-PPP" },
+ { JUNIPER_IFML_MLFR, "Multilink-FR" },
+ { JUNIPER_IFML_MFR, "Multilink-FR-UNI-NNI" },
+ { JUNIPER_IFML_ML, "Multilink" },
+ { JUNIPER_IFML_LS, "LinkService" },
+ { JUNIPER_IFML_LSI, "LSI" },
+ { JUNIPER_IFML_ATM_CELLRELAY_CCC, "ATM-CCC-Cell-Relay" },
+ { JUNIPER_IFML_CRYPTO, "IPSEC-over-IP" },
+ { JUNIPER_IFML_GGSN, "GGSN" },
+ { JUNIPER_IFML_PPP_TCC, "PPP-TCC" },
+ { JUNIPER_IFML_FRAMERELAY_TCC, "Frame-Relay-TCC" },
+ { JUNIPER_IFML_FRAMERELAY_EXT_TCC, "Extended FR-TCC" },
+ { JUNIPER_IFML_CISCOHDLC_TCC, "Cisco-HDLC-TCC" },
+ { JUNIPER_IFML_ETHERNET_CCC, "Ethernet-CCC" },
+ { JUNIPER_IFML_VT, "VPN-Loopback-tunnel" },
+ { JUNIPER_IFML_ETHER_OVER_ATM, "Ethernet-over-ATM" },
+ { JUNIPER_IFML_ETHER_VPLS_OVER_ATM, "Ethernet-VPLS-over-ATM" },
+ { JUNIPER_IFML_MONITOR, "Monitor" },
+ { JUNIPER_IFML_ETHERNET_TCC, "Ethernet-TCC" },
+ { JUNIPER_IFML_VLAN_TCC, "VLAN-TCC" },
+ { JUNIPER_IFML_EXTENDED_VLAN_TCC, "Extended-VLAN-TCC" },
+ { JUNIPER_IFML_CONTROLLER, "Controller" },
+ { JUNIPER_IFML_ETHERNET_VPLS, "VPLS" },
+ { JUNIPER_IFML_ETHERNET_VLAN_VPLS, "VLAN-VPLS" },
+ { JUNIPER_IFML_ETHERNET_EXTENDED_VLAN_VPLS, "Extended-VLAN-VPLS" },
+ { JUNIPER_IFML_LT, "Logical-tunnel" },
+ { JUNIPER_IFML_SERVICES, "General-Services" },
+ { JUNIPER_IFML_PPPOE, "PPPoE" },
+ { JUNIPER_IFML_ETHERNET_FLEX, "Flexible-Ethernet-Services" },
+ { JUNIPER_IFML_FRAMERELAY_FLEX, "Flexible-FrameRelay" },
+ { JUNIPER_IFML_COLLECTOR, "Flow-collection" },
+ { JUNIPER_IFML_PICPEER, "PIC Peer" },
+ { JUNIPER_IFML_DFC, "Dynamic-Flow-Capture" },
+ {0, NULL}
+};
+
+#define JUNIPER_IFLE_ATM_SNAP 2
+#define JUNIPER_IFLE_ATM_NLPID 3
+#define JUNIPER_IFLE_ATM_VCMUX 4
+#define JUNIPER_IFLE_ATM_LLC 5
+#define JUNIPER_IFLE_ATM_PPP_VCMUX 6
+#define JUNIPER_IFLE_ATM_PPP_LLC 7
+#define JUNIPER_IFLE_ATM_PPP_FUNI 8
+#define JUNIPER_IFLE_ATM_CCC 9
+#define JUNIPER_IFLE_FR_NLPID 10
+#define JUNIPER_IFLE_FR_SNAP 11
+#define JUNIPER_IFLE_FR_PPP 12
+#define JUNIPER_IFLE_FR_CCC 13
+#define JUNIPER_IFLE_ENET2 14
+#define JUNIPER_IFLE_IEEE8023_SNAP 15
+#define JUNIPER_IFLE_IEEE8023_LLC 16
+#define JUNIPER_IFLE_PPP 17
+#define JUNIPER_IFLE_CISCOHDLC 18
+#define JUNIPER_IFLE_PPP_CCC 19
+#define JUNIPER_IFLE_IPIP_NULL 20
+#define JUNIPER_IFLE_PIM_NULL 21
+#define JUNIPER_IFLE_GRE_NULL 22
+#define JUNIPER_IFLE_GRE_PPP 23
+#define JUNIPER_IFLE_PIMD_DECAPS 24
+#define JUNIPER_IFLE_CISCOHDLC_CCC 25
+#define JUNIPER_IFLE_ATM_CISCO_NLPID 26
+#define JUNIPER_IFLE_VLAN_CCC 27
+#define JUNIPER_IFLE_MLPPP 28
+#define JUNIPER_IFLE_MLFR 29
+#define JUNIPER_IFLE_LSI_NULL 30
+#define JUNIPER_IFLE_AGGREGATE_UNUSED 31
+#define JUNIPER_IFLE_ATM_CELLRELAY_CCC 32
+#define JUNIPER_IFLE_CRYPTO 33
+#define JUNIPER_IFLE_GGSN 34
+#define JUNIPER_IFLE_ATM_TCC 35
+#define JUNIPER_IFLE_FR_TCC 36
+#define JUNIPER_IFLE_PPP_TCC 37
+#define JUNIPER_IFLE_CISCOHDLC_TCC 38
+#define JUNIPER_IFLE_ETHERNET_CCC 39
+#define JUNIPER_IFLE_VT 40
+#define JUNIPER_IFLE_ATM_EOA_LLC 41
+#define JUNIPER_IFLE_EXTENDED_VLAN_CCC 42
+#define JUNIPER_IFLE_ATM_SNAP_TCC 43
+#define JUNIPER_IFLE_MONITOR 44
+#define JUNIPER_IFLE_ETHERNET_TCC 45
+#define JUNIPER_IFLE_VLAN_TCC 46
+#define JUNIPER_IFLE_EXTENDED_VLAN_TCC 47
+#define JUNIPER_IFLE_MFR 48
+#define JUNIPER_IFLE_ETHERNET_VPLS 49
+#define JUNIPER_IFLE_ETHERNET_VLAN_VPLS 50
+#define JUNIPER_IFLE_ETHERNET_EXTENDED_VLAN_VPLS 51
+#define JUNIPER_IFLE_SERVICES 52
+#define JUNIPER_IFLE_ATM_ETHER_VPLS_ATM_LLC 53
+#define JUNIPER_IFLE_FR_PORT_CCC 54
+#define JUNIPER_IFLE_ATM_MLPPP_LLC 55
+#define JUNIPER_IFLE_ATM_EOA_CCC 56
+#define JUNIPER_IFLE_LT_VLAN 57
+#define JUNIPER_IFLE_COLLECTOR 58
+#define JUNIPER_IFLE_AGGREGATOR 59
+#define JUNIPER_IFLE_LAPD 60
+#define JUNIPER_IFLE_ATM_PPPOE_LLC 61
+#define JUNIPER_IFLE_ETHERNET_PPPOE 62
+#define JUNIPER_IFLE_PPPOE 63
+#define JUNIPER_IFLE_PPP_SUBORDINATE 64
+#define JUNIPER_IFLE_CISCOHDLC_SUBORDINATE 65
+#define JUNIPER_IFLE_DFC 66
+#define JUNIPER_IFLE_PICPEER 67
+
+static const struct tok juniper_ifle_values[] = {
+ { JUNIPER_IFLE_AGGREGATOR, "Aggregator" },
+ { JUNIPER_IFLE_ATM_CCC, "CCC over ATM" },
+ { JUNIPER_IFLE_ATM_CELLRELAY_CCC, "ATM CCC Cell Relay" },
+ { JUNIPER_IFLE_ATM_CISCO_NLPID, "CISCO compatible NLPID" },
+ { JUNIPER_IFLE_ATM_EOA_CCC, "Ethernet over ATM CCC" },
+ { JUNIPER_IFLE_ATM_EOA_LLC, "Ethernet over ATM LLC" },
+ { JUNIPER_IFLE_ATM_ETHER_VPLS_ATM_LLC, "Ethernet VPLS over ATM LLC" },
+ { JUNIPER_IFLE_ATM_LLC, "ATM LLC" },
+ { JUNIPER_IFLE_ATM_MLPPP_LLC, "MLPPP over ATM LLC" },
+ { JUNIPER_IFLE_ATM_NLPID, "ATM NLPID" },
+ { JUNIPER_IFLE_ATM_PPPOE_LLC, "PPPoE over ATM LLC" },
+ { JUNIPER_IFLE_ATM_PPP_FUNI, "PPP over FUNI" },
+ { JUNIPER_IFLE_ATM_PPP_LLC, "PPP over ATM LLC" },
+ { JUNIPER_IFLE_ATM_PPP_VCMUX, "PPP over ATM VCMUX" },
+ { JUNIPER_IFLE_ATM_SNAP, "ATM SNAP" },
+ { JUNIPER_IFLE_ATM_SNAP_TCC, "ATM SNAP TCC" },
+ { JUNIPER_IFLE_ATM_TCC, "ATM VCMUX TCC" },
+ { JUNIPER_IFLE_ATM_VCMUX, "ATM VCMUX" },
+ { JUNIPER_IFLE_CISCOHDLC, "C-HDLC" },
+ { JUNIPER_IFLE_CISCOHDLC_CCC, "C-HDLC CCC" },
+ { JUNIPER_IFLE_CISCOHDLC_SUBORDINATE, "C-HDLC via dialer" },
+ { JUNIPER_IFLE_CISCOHDLC_TCC, "C-HDLC TCC" },
+ { JUNIPER_IFLE_COLLECTOR, "Collector" },
+ { JUNIPER_IFLE_CRYPTO, "Crypto" },
+ { JUNIPER_IFLE_ENET2, "Ethernet" },
+ { JUNIPER_IFLE_ETHERNET_CCC, "Ethernet CCC" },
+ { JUNIPER_IFLE_ETHERNET_EXTENDED_VLAN_VPLS, "Extended VLAN VPLS" },
+ { JUNIPER_IFLE_ETHERNET_PPPOE, "PPPoE over Ethernet" },
+ { JUNIPER_IFLE_ETHERNET_TCC, "Ethernet TCC" },
+ { JUNIPER_IFLE_ETHERNET_VLAN_VPLS, "VLAN VPLS" },
+ { JUNIPER_IFLE_ETHERNET_VPLS, "VPLS" },
+ { JUNIPER_IFLE_EXTENDED_VLAN_CCC, "Extended VLAN CCC" },
+ { JUNIPER_IFLE_EXTENDED_VLAN_TCC, "Extended VLAN TCC" },
+ { JUNIPER_IFLE_FR_CCC, "FR CCC" },
+ { JUNIPER_IFLE_FR_NLPID, "FR NLPID" },
+ { JUNIPER_IFLE_FR_PORT_CCC, "FR CCC" },
+ { JUNIPER_IFLE_FR_PPP, "FR PPP" },
+ { JUNIPER_IFLE_FR_SNAP, "FR SNAP" },
+ { JUNIPER_IFLE_FR_TCC, "FR TCC" },
+ { JUNIPER_IFLE_GGSN, "GGSN" },
+ { JUNIPER_IFLE_GRE_NULL, "GRE NULL" },
+ { JUNIPER_IFLE_GRE_PPP, "PPP over GRE" },
+ { JUNIPER_IFLE_IPIP_NULL, "IPIP" },
+ { JUNIPER_IFLE_LAPD, "LAPD" },
+ { JUNIPER_IFLE_LSI_NULL, "LSI Null" },
+ { JUNIPER_IFLE_LT_VLAN, "LT VLAN" },
+ { JUNIPER_IFLE_MFR, "MFR" },
+ { JUNIPER_IFLE_MLFR, "MLFR" },
+ { JUNIPER_IFLE_MLPPP, "MLPPP" },
+ { JUNIPER_IFLE_MONITOR, "Monitor" },
+ { JUNIPER_IFLE_PIMD_DECAPS, "PIMd" },
+ { JUNIPER_IFLE_PIM_NULL, "PIM Null" },
+ { JUNIPER_IFLE_PPP, "PPP" },
+ { JUNIPER_IFLE_PPPOE, "PPPoE" },
+ { JUNIPER_IFLE_PPP_CCC, "PPP CCC" },
+ { JUNIPER_IFLE_PPP_SUBORDINATE, "" },
+ { JUNIPER_IFLE_PPP_TCC, "PPP TCC" },
+ { JUNIPER_IFLE_SERVICES, "General Services" },
+ { JUNIPER_IFLE_VLAN_CCC, "VLAN CCC" },
+ { JUNIPER_IFLE_VLAN_TCC, "VLAN TCC" },
+ { JUNIPER_IFLE_VT, "VT" },
+ {0, NULL}
+};
+
+struct juniper_cookie_table_t {
+ uint32_t pictype; /* pic type */
+ uint8_t cookie_len; /* cookie len */
+ const char *s; /* pic name */
+};
+
+static const struct juniper_cookie_table_t juniper_cookie_table[] = {
+#ifdef DLT_JUNIPER_ATM1
+ { DLT_JUNIPER_ATM1, 4, "ATM1"},
+#endif
+#ifdef DLT_JUNIPER_ATM2
+ { DLT_JUNIPER_ATM2, 8, "ATM2"},
+#endif
+#ifdef DLT_JUNIPER_MLPPP
+ { DLT_JUNIPER_MLPPP, 2, "MLPPP"},
+#endif
+#ifdef DLT_JUNIPER_MLFR
+ { DLT_JUNIPER_MLFR, 2, "MLFR"},
+#endif
+#ifdef DLT_JUNIPER_MFR
+ { DLT_JUNIPER_MFR, 4, "MFR"},
+#endif
+#ifdef DLT_JUNIPER_PPPOE
+ { DLT_JUNIPER_PPPOE, 0, "PPPoE"},
+#endif
+#ifdef DLT_JUNIPER_PPPOE_ATM
+ { DLT_JUNIPER_PPPOE_ATM, 0, "PPPoE ATM"},
+#endif
+#ifdef DLT_JUNIPER_GGSN
+ { DLT_JUNIPER_GGSN, 8, "GGSN"},
+#endif
+#ifdef DLT_JUNIPER_MONITOR
+ { DLT_JUNIPER_MONITOR, 8, "MONITOR"},
+#endif
+#ifdef DLT_JUNIPER_SERVICES
+ { DLT_JUNIPER_SERVICES, 8, "AS"},
+#endif
+#ifdef DLT_JUNIPER_ES
+ { DLT_JUNIPER_ES, 0, "ES"},
+#endif
+ { 0, 0, NULL }
+};
+
+struct juniper_l2info_t {
+ uint32_t length;
+ uint32_t caplen;
+ uint32_t pictype;
+ uint8_t direction;
+ uint8_t header_len;
+ uint8_t cookie_len;
+ uint8_t cookie_type;
+ uint8_t cookie[8];
+ uint8_t bundle;
+ uint16_t proto;
+ uint8_t flags;
+};
+
+#define LS_COOKIE_ID 0x54
+#define AS_COOKIE_ID 0x47
+#define LS_MLFR_COOKIE_LEN 4
+#define ML_MLFR_COOKIE_LEN 2
+#define LS_MFR_COOKIE_LEN 6
+#define ATM1_COOKIE_LEN 4
+#define ATM2_COOKIE_LEN 8
+
+#define ATM2_PKT_TYPE_MASK 0x70
+#define ATM2_GAP_COUNT_MASK 0x3F
+
+#define JUNIPER_PROTO_NULL 1
+#define JUNIPER_PROTO_IPV4 2
+#define JUNIPER_PROTO_IPV6 6
+
+#define MFR_BE_MASK 0xc0
+
+static const struct tok juniper_protocol_values[] = {
+ { JUNIPER_PROTO_NULL, "Null" },
+ { JUNIPER_PROTO_IPV4, "IPv4" },
+ { JUNIPER_PROTO_IPV6, "IPv6" },
+ { 0, NULL}
+};
+
+static int ip_heuristic_guess(netdissect_options *, register const u_char *, u_int);
+static int juniper_ppp_heuristic_guess(netdissect_options *, register const u_char *, u_int);
+static int juniper_parse_header(netdissect_options *, const u_char *, const struct pcap_pkthdr *, struct juniper_l2info_t *);
+
+#ifdef DLT_JUNIPER_GGSN
+u_int
+juniper_ggsn_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ struct juniper_l2info_t l2info;
+ struct juniper_ggsn_header {
+ uint8_t svc_id;
+ uint8_t flags_len;
+ uint8_t proto;
+ uint8_t flags;
+ uint8_t vlan_id[2];
+ uint8_t res[2];
+ };
+ const struct juniper_ggsn_header *gh;
+
+ l2info.pictype = DLT_JUNIPER_GGSN;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+ gh = (struct juniper_ggsn_header *)&l2info.cookie;
+
+ if (ndo->ndo_eflag) {
+ ND_PRINT((ndo, "proto %s (%u), vlan %u: ",
+ tok2str(juniper_protocol_values,"Unknown",gh->proto),
+ gh->proto,
+ EXTRACT_16BITS(&gh->vlan_id[0])));
+ }
+
+ switch (gh->proto) {
+ case JUNIPER_PROTO_IPV4:
+ ip_print(ndo, p, l2info.length);
+ break;
+ case JUNIPER_PROTO_IPV6:
+ ip6_print(ndo, p, l2info.length);
+ break;
+ default:
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, "unknown GGSN proto (%u)", gh->proto));
+ }
+
+ return l2info.header_len;
+}
+#endif
+
+#ifdef DLT_JUNIPER_ES
+u_int
+juniper_es_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ struct juniper_l2info_t l2info;
+ struct juniper_ipsec_header {
+ uint8_t sa_index[2];
+ uint8_t ttl;
+ uint8_t type;
+ uint8_t spi[4];
+ uint8_t src_ip[4];
+ uint8_t dst_ip[4];
+ };
+ u_int rewrite_len,es_type_bundle;
+ const struct juniper_ipsec_header *ih;
+
+ l2info.pictype = DLT_JUNIPER_ES;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+ ih = (struct juniper_ipsec_header *)p;
+
+ switch (ih->type) {
+ case JUNIPER_IPSEC_O_ESP_ENCRYPT_ESP_AUTHEN_TYPE:
+ case JUNIPER_IPSEC_O_ESP_ENCRYPT_AH_AUTHEN_TYPE:
+ rewrite_len = 0;
+ es_type_bundle = 1;
+ break;
+ case JUNIPER_IPSEC_O_ESP_AUTHENTICATION_TYPE:
+ case JUNIPER_IPSEC_O_AH_AUTHENTICATION_TYPE:
+ case JUNIPER_IPSEC_O_ESP_ENCRYPTION_TYPE:
+ rewrite_len = 16;
+ es_type_bundle = 0;
+ break;
+ default:
+ ND_PRINT((ndo, "ES Invalid type %u, length %u",
+ ih->type,
+ l2info.length));
+ return l2info.header_len;
+ }
+
+ l2info.length-=rewrite_len;
+ p+=rewrite_len;
+
+ if (ndo->ndo_eflag) {
+ if (!es_type_bundle) {
+ ND_PRINT((ndo, "ES SA, index %u, ttl %u type %s (%u), spi %u, Tunnel %s > %s, length %u\n",
+ EXTRACT_16BITS(&ih->sa_index),
+ ih->ttl,
+ tok2str(juniper_ipsec_type_values,"Unknown",ih->type),
+ ih->type,
+ EXTRACT_32BITS(&ih->spi),
+ ipaddr_string(ndo, &ih->src_ip),
+ ipaddr_string(ndo, &ih->dst_ip),
+ l2info.length));
+ } else {
+ ND_PRINT((ndo, "ES SA, index %u, ttl %u type %s (%u), length %u\n",
+ EXTRACT_16BITS(&ih->sa_index),
+ ih->ttl,
+ tok2str(juniper_ipsec_type_values,"Unknown",ih->type),
+ ih->type,
+ l2info.length));
+ }
+ }
+
+ ip_print(ndo, p, l2info.length);
+ return l2info.header_len;
+}
+#endif
+
+#ifdef DLT_JUNIPER_MONITOR
+u_int
+juniper_monitor_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ struct juniper_l2info_t l2info;
+ struct juniper_monitor_header {
+ uint8_t pkt_type;
+ uint8_t padding;
+ uint8_t iif[2];
+ uint8_t service_id[4];
+ };
+ const struct juniper_monitor_header *mh;
+
+ l2info.pictype = DLT_JUNIPER_MONITOR;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+ mh = (struct juniper_monitor_header *)p;
+
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "service-id %u, iif %u, pkt-type %u: ",
+ EXTRACT_32BITS(&mh->service_id),
+ EXTRACT_16BITS(&mh->iif),
+ mh->pkt_type));
+
+ /* no proto field - lets guess by first byte of IP header*/
+ ip_heuristic_guess (ndo, p, l2info.length);
+
+ return l2info.header_len;
+}
+#endif
+
+#ifdef DLT_JUNIPER_SERVICES
+u_int
+juniper_services_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ struct juniper_l2info_t l2info;
+ struct juniper_services_header {
+ uint8_t svc_id;
+ uint8_t flags_len;
+ uint8_t svc_set_id[2];
+ uint8_t dir_iif[4];
+ };
+ const struct juniper_services_header *sh;
+
+ l2info.pictype = DLT_JUNIPER_SERVICES;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+ sh = (struct juniper_services_header *)p;
+
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "service-id %u flags 0x%02x service-set-id 0x%04x iif %u: ",
+ sh->svc_id,
+ sh->flags_len,
+ EXTRACT_16BITS(&sh->svc_set_id),
+ EXTRACT_24BITS(&sh->dir_iif[1])));
+
+ /* no proto field - lets guess by first byte of IP header*/
+ ip_heuristic_guess (ndo, p, l2info.length);
+
+ return l2info.header_len;
+}
+#endif
+
+#ifdef DLT_JUNIPER_PPPOE
+u_int
+juniper_pppoe_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ struct juniper_l2info_t l2info;
+
+ l2info.pictype = DLT_JUNIPER_PPPOE;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+ /* this DLT contains nothing but raw ethernet frames */
+ ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
+ return l2info.header_len;
+}
+#endif
+
+#ifdef DLT_JUNIPER_ETHER
+u_int
+juniper_ether_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ struct juniper_l2info_t l2info;
+
+ l2info.pictype = DLT_JUNIPER_ETHER;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+ /* this DLT contains nothing but raw Ethernet frames */
+ ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
+ return l2info.header_len;
+}
+#endif
+
+#ifdef DLT_JUNIPER_PPP
+u_int
+juniper_ppp_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ struct juniper_l2info_t l2info;
+
+ l2info.pictype = DLT_JUNIPER_PPP;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+ /* this DLT contains nothing but raw ppp frames */
+ ppp_print(ndo, p, l2info.length);
+ return l2info.header_len;
+}
+#endif
+
+#ifdef DLT_JUNIPER_FRELAY
+u_int
+juniper_frelay_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ struct juniper_l2info_t l2info;
+
+ l2info.pictype = DLT_JUNIPER_FRELAY;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+ /* this DLT contains nothing but raw frame-relay frames */
+ fr_print(ndo, p, l2info.length);
+ return l2info.header_len;
+}
+#endif
+
+#ifdef DLT_JUNIPER_CHDLC
+u_int
+juniper_chdlc_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ struct juniper_l2info_t l2info;
+
+ l2info.pictype = DLT_JUNIPER_CHDLC;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+ /* this DLT contains nothing but raw c-hdlc frames */
+ chdlc_print(ndo, p, l2info.length);
+ return l2info.header_len;
+}
+#endif
+
+#ifdef DLT_JUNIPER_PPPOE_ATM
+u_int
+juniper_pppoe_atm_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ struct juniper_l2info_t l2info;
+ uint16_t extracted_ethertype;
+
+ l2info.pictype = DLT_JUNIPER_PPPOE_ATM;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+
+ extracted_ethertype = EXTRACT_16BITS(p);
+ /* this DLT contains nothing but raw PPPoE frames,
+ * prepended with a type field*/
+ if (ethertype_print(ndo, extracted_ethertype,
+ p+ETHERTYPE_LEN,
+ l2info.length-ETHERTYPE_LEN,
+ l2info.caplen-ETHERTYPE_LEN) == 0)
+ /* ether_type not known, probably it wasn't one */
+ ND_PRINT((ndo, "unknown ethertype 0x%04x", extracted_ethertype));
+
+ return l2info.header_len;
+}
+#endif
+
+#ifdef DLT_JUNIPER_MLPPP
+u_int
+juniper_mlppp_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ struct juniper_l2info_t l2info;
+
+ l2info.pictype = DLT_JUNIPER_MLPPP;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ /* suppress Bundle-ID if frame was captured on a child-link
+ * best indicator if the cookie looks like a proto */
+ if (ndo->ndo_eflag &&
+ EXTRACT_16BITS(&l2info.cookie) != PPP_OSI &&
+ EXTRACT_16BITS(&l2info.cookie) != (PPP_ADDRESS << 8 | PPP_CONTROL))
+ ND_PRINT((ndo, "Bundle-ID %u: ", l2info.bundle));
+
+ p+=l2info.header_len;
+
+ /* first try the LSQ protos */
+ switch(l2info.proto) {
+ case JUNIPER_LSQ_L3_PROTO_IPV4:
+ /* IP traffic going to the RE would not have a cookie
+ * -> this must be incoming IS-IS over PPP
+ */
+ if (l2info.cookie[4] == (JUNIPER_LSQ_COOKIE_RE|JUNIPER_LSQ_COOKIE_DIR))
+ ppp_print(ndo, p, l2info.length);
+ else
+ ip_print(ndo, p, l2info.length);
+ return l2info.header_len;
+ case JUNIPER_LSQ_L3_PROTO_IPV6:
+ ip6_print(ndo, p,l2info.length);
+ return l2info.header_len;
+ case JUNIPER_LSQ_L3_PROTO_MPLS:
+ mpls_print(ndo, p, l2info.length);
+ return l2info.header_len;
+ case JUNIPER_LSQ_L3_PROTO_ISO:
+ isoclns_print(ndo, p, l2info.length, l2info.caplen);
+ return l2info.header_len;
+ default:
+ break;
+ }
+
+ /* zero length cookie ? */
+ switch (EXTRACT_16BITS(&l2info.cookie)) {
+ case PPP_OSI:
+ ppp_print(ndo, p - 2, l2info.length + 2);
+ break;
+ case (PPP_ADDRESS << 8 | PPP_CONTROL): /* fall through */
+ default:
+ ppp_print(ndo, p, l2info.length);
+ break;
+ }
+
+ return l2info.header_len;
+}
+#endif
+
+
+#ifdef DLT_JUNIPER_MFR
+u_int
+juniper_mfr_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ struct juniper_l2info_t l2info;
+
+ l2info.pictype = DLT_JUNIPER_MFR;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+
+ /* child-link ? */
+ if (l2info.cookie_len == 0) {
+ mfr_print(ndo, p, l2info.length);
+ return l2info.header_len;
+ }
+
+ /* first try the LSQ protos */
+ if (l2info.cookie_len == AS_PIC_COOKIE_LEN) {
+ switch(l2info.proto) {
+ case JUNIPER_LSQ_L3_PROTO_IPV4:
+ ip_print(ndo, p, l2info.length);
+ return l2info.header_len;
+ case JUNIPER_LSQ_L3_PROTO_IPV6:
+ ip6_print(ndo, p,l2info.length);
+ return l2info.header_len;
+ case JUNIPER_LSQ_L3_PROTO_MPLS:
+ mpls_print(ndo, p, l2info.length);
+ return l2info.header_len;
+ case JUNIPER_LSQ_L3_PROTO_ISO:
+ isoclns_print(ndo, p, l2info.length, l2info.caplen);
+ return l2info.header_len;
+ default:
+ break;
+ }
+ return l2info.header_len;
+ }
+
+ /* suppress Bundle-ID if frame was captured on a child-link */
+ if (ndo->ndo_eflag && EXTRACT_32BITS(l2info.cookie) != 1)
+ ND_PRINT((ndo, "Bundle-ID %u, ", l2info.bundle));
+ switch (l2info.proto) {
+ case (LLCSAP_ISONS<<8 | LLCSAP_ISONS):
+ isoclns_print(ndo, p + 1, l2info.length - 1, l2info.caplen - 1);
+ break;
+ case (LLC_UI<<8 | NLPID_Q933):
+ case (LLC_UI<<8 | NLPID_IP):
+ case (LLC_UI<<8 | NLPID_IP6):
+ /* pass IP{4,6} to the OSI layer for proper link-layer printing */
+ isoclns_print(ndo, p - 1, l2info.length + 1, l2info.caplen + 1);
+ break;
+ default:
+ ND_PRINT((ndo, "unknown protocol 0x%04x, length %u", l2info.proto, l2info.length));
+ }
+
+ return l2info.header_len;
+}
+#endif
+
+#ifdef DLT_JUNIPER_MLFR
+u_int
+juniper_mlfr_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ struct juniper_l2info_t l2info;
+
+ l2info.pictype = DLT_JUNIPER_MLFR;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+
+ /* suppress Bundle-ID if frame was captured on a child-link */
+ if (ndo->ndo_eflag && EXTRACT_32BITS(l2info.cookie) != 1)
+ ND_PRINT((ndo, "Bundle-ID %u, ", l2info.bundle));
+ switch (l2info.proto) {
+ case (LLC_UI):
+ case (LLC_UI<<8):
+ isoclns_print(ndo, p, l2info.length, l2info.caplen);
+ break;
+ case (LLC_UI<<8 | NLPID_Q933):
+ case (LLC_UI<<8 | NLPID_IP):
+ case (LLC_UI<<8 | NLPID_IP6):
+ /* pass IP{4,6} to the OSI layer for proper link-layer printing */
+ isoclns_print(ndo, p - 1, l2info.length + 1, l2info.caplen + 1);
+ break;
+ default:
+ ND_PRINT((ndo, "unknown protocol 0x%04x, length %u", l2info.proto, l2info.length));
+ }
+
+ return l2info.header_len;
+}
+#endif
+
+/*
+ * ATM1 PIC cookie format
+ *
+ * +-----+-------------------------+-------------------------------+
+ * |fmtid| vc index | channel ID |
+ * +-----+-------------------------+-------------------------------+
+ */
+
+#ifdef DLT_JUNIPER_ATM1
+u_int
+juniper_atm1_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ uint16_t extracted_ethertype;
+
+ struct juniper_l2info_t l2info;
+
+ l2info.pictype = DLT_JUNIPER_ATM1;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+
+ if (l2info.cookie[0] == 0x80) { /* OAM cell ? */
+ oam_print(ndo, p, l2info.length, ATM_OAM_NOHEC);
+ return l2info.header_len;
+ }
+
+ if (EXTRACT_24BITS(p) == 0xfefe03 || /* NLPID encaps ? */
+ EXTRACT_24BITS(p) == 0xaaaa03) { /* SNAP encaps ? */
+
+ if (llc_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL,
+ &extracted_ethertype) != 0)
+ return l2info.header_len;
+ }
+
+ if (p[0] == 0x03) { /* Cisco style NLPID encaps ? */
+ isoclns_print(ndo, p + 1, l2info.length - 1, l2info.caplen - 1);
+ /* FIXME check if frame was recognized */
+ return l2info.header_len;
+ }
+
+ if (ip_heuristic_guess(ndo, p, l2info.length) != 0) /* last try - vcmux encaps ? */
+ return l2info.header_len;
+
+ return l2info.header_len;
+}
+#endif
+
+/*
+ * ATM2 PIC cookie format
+ *
+ * +-------------------------------+---------+---+-----+-----------+
+ * | channel ID | reserv |AAL| CCRQ| gap cnt |
+ * +-------------------------------+---------+---+-----+-----------+
+ */
+
+#ifdef DLT_JUNIPER_ATM2
+u_int
+juniper_atm2_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ uint16_t extracted_ethertype;
+
+ struct juniper_l2info_t l2info;
+
+ l2info.pictype = DLT_JUNIPER_ATM2;
+ if (juniper_parse_header(ndo, p, h, &l2info) == 0)
+ return l2info.header_len;
+
+ p+=l2info.header_len;
+
+ if (l2info.cookie[7] & ATM2_PKT_TYPE_MASK) { /* OAM cell ? */
+ oam_print(ndo, p, l2info.length, ATM_OAM_NOHEC);
+ return l2info.header_len;
+ }
+
+ if (EXTRACT_24BITS(p) == 0xfefe03 || /* NLPID encaps ? */
+ EXTRACT_24BITS(p) == 0xaaaa03) { /* SNAP encaps ? */
+
+ if (llc_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL,
+ &extracted_ethertype) != 0)
+ return l2info.header_len;
+ }
+
+ if (l2info.direction != JUNIPER_BPF_PKT_IN && /* ether-over-1483 encaps ? */
+ (EXTRACT_32BITS(l2info.cookie) & ATM2_GAP_COUNT_MASK)) {
+ ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
+ return l2info.header_len;
+ }
+
+ if (p[0] == 0x03) { /* Cisco style NLPID encaps ? */
+ isoclns_print(ndo, p + 1, l2info.length - 1, l2info.caplen - 1);
+ /* FIXME check if frame was recognized */
+ return l2info.header_len;
+ }
+
+ if(juniper_ppp_heuristic_guess(ndo, p, l2info.length) != 0) /* PPPoA vcmux encaps ? */
+ return l2info.header_len;
+
+ if (ip_heuristic_guess(ndo, p, l2info.length) != 0) /* last try - vcmux encaps ? */
+ return l2info.header_len;
+
+ return l2info.header_len;
+}
+#endif
+
+
+/* try to guess, based on all PPP protos that are supported in
+ * a juniper router if the payload data is encapsulated using PPP */
+static int
+juniper_ppp_heuristic_guess(netdissect_options *ndo,
+ register const u_char *p, u_int length)
+{
+ switch(EXTRACT_16BITS(p)) {
+ case PPP_IP :
+ case PPP_OSI :
+ case PPP_MPLS_UCAST :
+ case PPP_MPLS_MCAST :
+ case PPP_IPCP :
+ case PPP_OSICP :
+ case PPP_MPLSCP :
+ case PPP_LCP :
+ case PPP_PAP :
+ case PPP_CHAP :
+ case PPP_ML :
+#ifdef INET6
+ case PPP_IPV6 :
+ case PPP_IPV6CP :
+#endif
+ ppp_print(ndo, p, length);
+ break;
+
+ default:
+ return 0; /* did not find a ppp header */
+ break;
+ }
+ return 1; /* we printed a ppp packet */
+}
+
+static int
+ip_heuristic_guess(netdissect_options *ndo,
+ register const u_char *p, u_int length)
+{
+ switch(p[0]) {
+ case 0x45:
+ case 0x46:
+ case 0x47:
+ case 0x48:
+ case 0x49:
+ case 0x4a:
+ case 0x4b:
+ case 0x4c:
+ case 0x4d:
+ case 0x4e:
+ case 0x4f:
+ ip_print(ndo, p, length);
+ break;
+ case 0x60:
+ case 0x61:
+ case 0x62:
+ case 0x63:
+ case 0x64:
+ case 0x65:
+ case 0x66:
+ case 0x67:
+ case 0x68:
+ case 0x69:
+ case 0x6a:
+ case 0x6b:
+ case 0x6c:
+ case 0x6d:
+ case 0x6e:
+ case 0x6f:
+ ip6_print(ndo, p, length);
+ break;
+ default:
+ return 0; /* did not find a ip header */
+ break;
+ }
+ return 1; /* we printed an v4/v6 packet */
+}
+
+static int
+juniper_read_tlv_value(const u_char *p, u_int tlv_type, u_int tlv_len)
+{
+ int tlv_value;
+
+ /* TLVs < 128 are little endian encoded */
+ if (tlv_type < 128) {
+ switch (tlv_len) {
+ case 1:
+ tlv_value = *p;
+ break;
+ case 2:
+ tlv_value = EXTRACT_LE_16BITS(p);
+ break;
+ case 3:
+ tlv_value = EXTRACT_LE_24BITS(p);
+ break;
+ case 4:
+ tlv_value = EXTRACT_LE_32BITS(p);
+ break;
+ default:
+ tlv_value = -1;
+ break;
+ }
+ } else {
+ /* TLVs >= 128 are big endian encoded */
+ switch (tlv_len) {
+ case 1:
+ tlv_value = *p;
+ break;
+ case 2:
+ tlv_value = EXTRACT_16BITS(p);
+ break;
+ case 3:
+ tlv_value = EXTRACT_24BITS(p);
+ break;
+ case 4:
+ tlv_value = EXTRACT_32BITS(p);
+ break;
+ default:
+ tlv_value = -1;
+ break;
+ }
+ }
+ return tlv_value;
+}
+
+static int
+juniper_parse_header(netdissect_options *ndo,
+ const u_char *p, const struct pcap_pkthdr *h, struct juniper_l2info_t *l2info)
+{
+ const struct juniper_cookie_table_t *lp = juniper_cookie_table;
+ u_int idx, jnx_ext_len, jnx_header_len = 0;
+ uint8_t tlv_type,tlv_len;
+ uint32_t control_word;
+ int tlv_value;
+ const u_char *tptr;
+
+
+ l2info->header_len = 0;
+ l2info->cookie_len = 0;
+ l2info->proto = 0;
+
+
+ l2info->length = h->len;
+ l2info->caplen = h->caplen;
+ ND_TCHECK2(p[0], 4);
+ l2info->flags = p[3];
+ l2info->direction = p[3]&JUNIPER_BPF_PKT_IN;
+
+ if (EXTRACT_24BITS(p) != JUNIPER_MGC_NUMBER) { /* magic number found ? */
+ ND_PRINT((ndo, "no magic-number found!"));
+ return 0;
+ }
+
+ if (ndo->ndo_eflag) /* print direction */
+ ND_PRINT((ndo, "%3s ", tok2str(juniper_direction_values, "---", l2info->direction)));
+
+ /* magic number + flags */
+ jnx_header_len = 4;
+
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, "\n\tJuniper PCAP Flags [%s]",
+ bittok2str(jnx_flag_values, "none", l2info->flags)));
+
+ /* extensions present ? - calculate how much bytes to skip */
+ if ((l2info->flags & JUNIPER_BPF_EXT ) == JUNIPER_BPF_EXT ) {
+
+ tptr = p+jnx_header_len;
+
+ /* ok to read extension length ? */
+ ND_TCHECK2(tptr[0], 2);
+ jnx_ext_len = EXTRACT_16BITS(tptr);
+ jnx_header_len += 2;
+ tptr +=2;
+
+ /* nail up the total length -
+ * just in case something goes wrong
+ * with TLV parsing */
+ jnx_header_len += jnx_ext_len;
+
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, ", PCAP Extension(s) total length %u", jnx_ext_len));
+
+ ND_TCHECK2(tptr[0], jnx_ext_len);
+ while (jnx_ext_len > JUNIPER_EXT_TLV_OVERHEAD) {
+ tlv_type = *(tptr++);
+ tlv_len = *(tptr++);
+ tlv_value = 0;
+
+ /* sanity check */
+ if (tlv_type == 0 || tlv_len == 0)
+ break;
+
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, "\n\t %s Extension TLV #%u, length %u, value ",
+ tok2str(jnx_ext_tlv_values,"Unknown",tlv_type),
+ tlv_type,
+ tlv_len));
+
+ tlv_value = juniper_read_tlv_value(tptr, tlv_type, tlv_len);
+ switch (tlv_type) {
+ case JUNIPER_EXT_TLV_IFD_NAME:
+ /* FIXME */
+ break;
+ case JUNIPER_EXT_TLV_IFD_MEDIATYPE:
+ case JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE:
+ if (tlv_value != -1) {
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, "%s (%u)",
+ tok2str(juniper_ifmt_values, "Unknown", tlv_value),
+ tlv_value));
+ }
+ break;
+ case JUNIPER_EXT_TLV_IFL_ENCAPS:
+ case JUNIPER_EXT_TLV_TTP_IFL_ENCAPS:
+ if (tlv_value != -1) {
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, "%s (%u)",
+ tok2str(juniper_ifle_values, "Unknown", tlv_value),
+ tlv_value));
+ }
+ break;
+ case JUNIPER_EXT_TLV_IFL_IDX: /* fall through */
+ case JUNIPER_EXT_TLV_IFL_UNIT:
+ case JUNIPER_EXT_TLV_IFD_IDX:
+ default:
+ if (tlv_value != -1) {
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, "%u", tlv_value));
+ }
+ break;
+ }
+
+ tptr+=tlv_len;
+ jnx_ext_len -= tlv_len+JUNIPER_EXT_TLV_OVERHEAD;
+ }
+
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, "\n\t-----original packet-----\n\t"));
+ }
+
+ if ((l2info->flags & JUNIPER_BPF_NO_L2 ) == JUNIPER_BPF_NO_L2 ) {
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "no-L2-hdr, "));
+
+ /* there is no link-layer present -
+ * perform the v4/v6 heuristics
+ * to figure out what it is
+ */
+ ND_TCHECK2(p[jnx_header_len + 4], 1);
+ if (ip_heuristic_guess(ndo, p + jnx_header_len + 4,
+ l2info->length - (jnx_header_len + 4)) == 0)
+ ND_PRINT((ndo, "no IP-hdr found!"));
+
+ l2info->header_len=jnx_header_len+4;
+ return 0; /* stop parsing the output further */
+
+ }
+ l2info->header_len = jnx_header_len;
+ p+=l2info->header_len;
+ l2info->length -= l2info->header_len;
+ l2info->caplen -= l2info->header_len;
+
+ /* search through the cookie table and copy values matching for our PIC type */
+ while (lp->s != NULL) {
+ if (lp->pictype == l2info->pictype) {
+
+ l2info->cookie_len += lp->cookie_len;
+
+ switch (p[0]) {
+ case LS_COOKIE_ID:
+ l2info->cookie_type = LS_COOKIE_ID;
+ l2info->cookie_len += 2;
+ break;
+ case AS_COOKIE_ID:
+ l2info->cookie_type = AS_COOKIE_ID;
+ l2info->cookie_len = 8;
+ break;
+
+ default:
+ l2info->bundle = l2info->cookie[0];
+ break;
+ }
+
+
+#ifdef DLT_JUNIPER_MFR
+ /* MFR child links don't carry cookies */
+ if (l2info->pictype == DLT_JUNIPER_MFR &&
+ (p[0] & MFR_BE_MASK) == MFR_BE_MASK) {
+ l2info->cookie_len = 0;
+ }
+#endif
+
+ l2info->header_len += l2info->cookie_len;
+ l2info->length -= l2info->cookie_len;
+ l2info->caplen -= l2info->cookie_len;
+
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "%s-PIC, cookie-len %u",
+ lp->s,
+ l2info->cookie_len));
+
+ if (l2info->cookie_len > 0) {
+ ND_TCHECK2(p[0], l2info->cookie_len);
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, ", cookie 0x"));
+ for (idx = 0; idx < l2info->cookie_len; idx++) {
+ l2info->cookie[idx] = p[idx]; /* copy cookie data */
+ if (ndo->ndo_eflag) ND_PRINT((ndo, "%02x", p[idx]));
+ }
+ }
+
+ if (ndo->ndo_eflag) ND_PRINT((ndo, ": ")); /* print demarc b/w L2/L3*/
+
+
+ l2info->proto = EXTRACT_16BITS(p+l2info->cookie_len);
+ break;
+ }
+ ++lp;
+ }
+ p+=l2info->cookie_len;
+
+ /* DLT_ specific parsing */
+ switch(l2info->pictype) {
+#ifdef DLT_JUNIPER_MLPPP
+ case DLT_JUNIPER_MLPPP:
+ switch (l2info->cookie_type) {
+ case LS_COOKIE_ID:
+ l2info->bundle = l2info->cookie[1];
+ break;
+ case AS_COOKIE_ID:
+ l2info->bundle = (EXTRACT_16BITS(&l2info->cookie[6])>>3)&0xfff;
+ l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;
+ break;
+ default:
+ l2info->bundle = l2info->cookie[0];
+ break;
+ }
+ break;
+#endif
+#ifdef DLT_JUNIPER_MLFR
+ case DLT_JUNIPER_MLFR:
+ switch (l2info->cookie_type) {
+ case LS_COOKIE_ID:
+ l2info->bundle = l2info->cookie[1];
+ l2info->proto = EXTRACT_16BITS(p);
+ l2info->header_len += 2;
+ l2info->length -= 2;
+ l2info->caplen -= 2;
+ break;
+ case AS_COOKIE_ID:
+ l2info->bundle = (EXTRACT_16BITS(&l2info->cookie[6])>>3)&0xfff;
+ l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;
+ break;
+ default:
+ l2info->bundle = l2info->cookie[0];
+ l2info->header_len += 2;
+ l2info->length -= 2;
+ l2info->caplen -= 2;
+ break;
+ }
+ break;
+#endif
+#ifdef DLT_JUNIPER_MFR
+ case DLT_JUNIPER_MFR:
+ switch (l2info->cookie_type) {
+ case LS_COOKIE_ID:
+ l2info->bundle = l2info->cookie[1];
+ l2info->proto = EXTRACT_16BITS(p);
+ l2info->header_len += 2;
+ l2info->length -= 2;
+ l2info->caplen -= 2;
+ break;
+ case AS_COOKIE_ID:
+ l2info->bundle = (EXTRACT_16BITS(&l2info->cookie[6])>>3)&0xfff;
+ l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;
+ break;
+ default:
+ l2info->bundle = l2info->cookie[0];
+ break;
+ }
+ break;
+#endif
+#ifdef DLT_JUNIPER_ATM2
+ case DLT_JUNIPER_ATM2:
+ ND_TCHECK2(p[0], 4);
+ /* ATM cell relay control word present ? */
+ if (l2info->cookie[7] & ATM2_PKT_TYPE_MASK) {
+ control_word = EXTRACT_32BITS(p);
+ /* some control word heuristics */
+ switch(control_word) {
+ case 0: /* zero control word */
+ case 0x08000000: /* < JUNOS 7.4 control-word */
+ case 0x08380000: /* cntl word plus cell length (56) >= JUNOS 7.4*/
+ l2info->header_len += 4;
+ break;
+ default:
+ break;
+ }
+
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "control-word 0x%08x ", control_word));
+ }
+ break;
+#endif
+#ifdef DLT_JUNIPER_GGSN
+ case DLT_JUNIPER_GGSN:
+ break;
+#endif
+#ifdef DLT_JUNIPER_ATM1
+ case DLT_JUNIPER_ATM1:
+ break;
+#endif
+#ifdef DLT_JUNIPER_PPP
+ case DLT_JUNIPER_PPP:
+ break;
+#endif
+#ifdef DLT_JUNIPER_CHDLC
+ case DLT_JUNIPER_CHDLC:
+ break;
+#endif
+#ifdef DLT_JUNIPER_ETHER
+ case DLT_JUNIPER_ETHER:
+ break;
+#endif
+#ifdef DLT_JUNIPER_FRELAY
+ case DLT_JUNIPER_FRELAY:
+ break;
+#endif
+
+ default:
+ ND_PRINT((ndo, "Unknown Juniper DLT_ type %u: ", l2info->pictype));
+ break;
+ }
+
+ if (ndo->ndo_eflag > 1)
+ ND_PRINT((ndo, "hlen %u, proto 0x%04x, ", l2info->header_len, l2info->proto));
+
+ return 1; /* everything went ok so far. continue parsing */
+ trunc:
+ ND_PRINT((ndo, "[|juniper_hdr], length %u", h->len));
+ return 0;
+}
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1995, 1996, 1997
+ * 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: (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.
+ *
+ * Initial contribution from John Hawkinson (jhawk@mit.edu).
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-krb.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+static const char tstr[] = " [|kerberos]";
+
+static const u_char *c_print(netdissect_options *, register const u_char *, register const u_char *);
+static const u_char *krb4_print_hdr(netdissect_options *, const u_char *);
+static void krb4_print(netdissect_options *, const u_char *);
+
+#define AUTH_MSG_KDC_REQUEST 1<<1
+#define AUTH_MSG_KDC_REPLY 2<<1
+#define AUTH_MSG_APPL_REQUEST 3<<1
+#define AUTH_MSG_APPL_REQUEST_MUTUAL 4<<1
+#define AUTH_MSG_ERR_REPLY 5<<1
+#define AUTH_MSG_PRIVATE 6<<1
+#define AUTH_MSG_SAFE 7<<1
+#define AUTH_MSG_APPL_ERR 8<<1
+#define AUTH_MSG_DIE 63<<1
+
+#define KERB_ERR_OK 0
+#define KERB_ERR_NAME_EXP 1
+#define KERB_ERR_SERVICE_EXP 2
+#define KERB_ERR_AUTH_EXP 3
+#define KERB_ERR_PKT_VER 4
+#define KERB_ERR_NAME_MAST_KEY_VER 5
+#define KERB_ERR_SERV_MAST_KEY_VER 6
+#define KERB_ERR_BYTE_ORDER 7
+#define KERB_ERR_PRINCIPAL_UNKNOWN 8
+#define KERB_ERR_PRINCIPAL_NOT_UNIQUE 9
+#define KERB_ERR_NULL_KEY 10
+
+struct krb {
+ uint8_t pvno; /* Protocol Version */
+ uint8_t type; /* Type+B */
+};
+
+static const struct tok type2str[] = {
+ { AUTH_MSG_KDC_REQUEST, "KDC_REQUEST" },
+ { AUTH_MSG_KDC_REPLY, "KDC_REPLY" },
+ { AUTH_MSG_APPL_REQUEST, "APPL_REQUEST" },
+ { AUTH_MSG_APPL_REQUEST_MUTUAL, "APPL_REQUEST_MUTUAL" },
+ { AUTH_MSG_ERR_REPLY, "ERR_REPLY" },
+ { AUTH_MSG_PRIVATE, "PRIVATE" },
+ { AUTH_MSG_SAFE, "SAFE" },
+ { AUTH_MSG_APPL_ERR, "APPL_ERR" },
+ { AUTH_MSG_DIE, "DIE" },
+ { 0, NULL }
+};
+
+static const struct tok kerr2str[] = {
+ { KERB_ERR_OK, "OK" },
+ { KERB_ERR_NAME_EXP, "NAME_EXP" },
+ { KERB_ERR_SERVICE_EXP, "SERVICE_EXP" },
+ { KERB_ERR_AUTH_EXP, "AUTH_EXP" },
+ { KERB_ERR_PKT_VER, "PKT_VER" },
+ { KERB_ERR_NAME_MAST_KEY_VER, "NAME_MAST_KEY_VER" },
+ { KERB_ERR_SERV_MAST_KEY_VER, "SERV_MAST_KEY_VER" },
+ { KERB_ERR_BYTE_ORDER, "BYTE_ORDER" },
+ { KERB_ERR_PRINCIPAL_UNKNOWN, "PRINCIPAL_UNKNOWN" },
+ { KERB_ERR_PRINCIPAL_NOT_UNIQUE,"PRINCIPAL_NOT_UNIQUE" },
+ { KERB_ERR_NULL_KEY, "NULL_KEY"},
+ { 0, NULL}
+};
+
+static const u_char *
+c_print(netdissect_options *ndo,
+ register const u_char *s, register const u_char *ep)
+{
+ register u_char c;
+ register int flag;
+
+ flag = 1;
+ while (s < ep) {
+ c = *s++;
+ if (c == '\0') {
+ flag = 0;
+ break;
+ }
+ if (!ND_ISASCII(c)) {
+ c = ND_TOASCII(c);
+ ND_PRINT((ndo, "M-"));
+ }
+ if (!ND_ISPRINT(c)) {
+ c ^= 0x40; /* DEL to ?, others to alpha */
+ ND_PRINT((ndo, "^"));
+ }
+ ND_PRINT((ndo, "%c", c));
+ }
+ if (flag)
+ return NULL;
+ return (s);
+}
+
+static const u_char *
+krb4_print_hdr(netdissect_options *ndo,
+ const u_char *cp)
+{
+ cp += 2;
+
+#define PRINT if ((cp = c_print(ndo, cp, ndo->ndo_snapend)) == NULL) goto trunc
+
+ PRINT;
+ ND_PRINT((ndo, "."));
+ PRINT;
+ ND_PRINT((ndo, "@"));
+ PRINT;
+ return (cp);
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return (NULL);
+
+#undef PRINT
+}
+
+static void
+krb4_print(netdissect_options *ndo,
+ const u_char *cp)
+{
+ register const struct krb *kp;
+ u_char type;
+ u_short len;
+
+#define PRINT if ((cp = c_print(ndo, cp, ndo->ndo_snapend)) == NULL) goto trunc
+/* True if struct krb is little endian */
+#define IS_LENDIAN(kp) (((kp)->type & 0x01) != 0)
+#define KTOHSP(kp, cp) (IS_LENDIAN(kp) ? EXTRACT_LE_16BITS(cp) : EXTRACT_16BITS(cp))
+
+ kp = (struct krb *)cp;
+
+ if ((&kp->type) >= ndo->ndo_snapend) {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+
+ type = kp->type & (0xFF << 1);
+
+ ND_PRINT((ndo, " %s %s: ",
+ IS_LENDIAN(kp) ? "le" : "be", tok2str(type2str, NULL, type)));
+
+ switch (type) {
+
+ case AUTH_MSG_KDC_REQUEST:
+ if ((cp = krb4_print_hdr(ndo, cp)) == NULL)
+ return;
+ cp += 4; /* ctime */
+ ND_TCHECK(*cp);
+ ND_PRINT((ndo, " %dmin ", *cp++ * 5));
+ PRINT;
+ ND_PRINT((ndo, "."));
+ PRINT;
+ break;
+
+ case AUTH_MSG_APPL_REQUEST:
+ cp += 2;
+ ND_TCHECK(*cp);
+ ND_PRINT((ndo, "v%d ", *cp++));
+ PRINT;
+ ND_TCHECK(*cp);
+ ND_PRINT((ndo, " (%d)", *cp++));
+ ND_TCHECK(*cp);
+ ND_PRINT((ndo, " (%d)", *cp));
+ break;
+
+ case AUTH_MSG_KDC_REPLY:
+ if ((cp = krb4_print_hdr(ndo, cp)) == NULL)
+ return;
+ cp += 10; /* timestamp + n + exp + kvno */
+ ND_TCHECK2(*cp, sizeof(short));
+ len = KTOHSP(kp, cp);
+ ND_PRINT((ndo, " (%d)", len));
+ break;
+
+ case AUTH_MSG_ERR_REPLY:
+ if ((cp = krb4_print_hdr(ndo, cp)) == NULL)
+ return;
+ cp += 4; /* timestamp */
+ ND_TCHECK2(*cp, sizeof(short));
+ ND_PRINT((ndo, " %s ", tok2str(kerr2str, NULL, KTOHSP(kp, cp))));
+ cp += 4;
+ PRINT;
+ break;
+
+ default:
+ ND_PRINT((ndo, "(unknown)"));
+ break;
+ }
+
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+void
+krb_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ register const struct krb *kp;
+
+ kp = (struct krb *)dat;
+
+ if (dat >= ndo->ndo_snapend) {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+
+ switch (kp->pvno) {
+
+ case 1:
+ case 2:
+ case 3:
+ ND_PRINT((ndo, " v%d", kp->pvno));
+ break;
+
+ case 4:
+ ND_PRINT((ndo, " v%d", kp->pvno));
+ krb4_print(ndo, (const u_char *)kp);
+ break;
+
+ case 106:
+ case 107:
+ ND_PRINT((ndo, " v5"));
+ /* Decode ASN.1 here "someday" */
+ break;
+ }
+ return;
+}
--- /dev/null
+/*
+ * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * L2TP support contributed by Motonori Shindo (mshindo@mshindo.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-l2tp.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+#define L2TP_FLAG_TYPE 0x8000 /* Type (0=Data, 1=Control) */
+#define L2TP_FLAG_LENGTH 0x4000 /* Length */
+#define L2TP_FLAG_SEQUENCE 0x0800 /* Sequence */
+#define L2TP_FLAG_OFFSET 0x0200 /* Offset */
+#define L2TP_FLAG_PRIORITY 0x0100 /* Priority */
+
+#define L2TP_VERSION_MASK 0x000f /* Version Mask */
+#define L2TP_VERSION_L2F 0x0001 /* L2F */
+#define L2TP_VERSION_L2TP 0x0002 /* L2TP */
+
+#define L2TP_AVP_HDR_FLAG_MANDATORY 0x8000 /* Mandatory Flag */
+#define L2TP_AVP_HDR_FLAG_HIDDEN 0x4000 /* Hidden Flag */
+#define L2TP_AVP_HDR_LEN_MASK 0x03ff /* Length Mask */
+
+#define L2TP_FRAMING_CAP_SYNC_MASK 0x00000001 /* Synchronous */
+#define L2TP_FRAMING_CAP_ASYNC_MASK 0x00000002 /* Asynchronous */
+
+#define L2TP_FRAMING_TYPE_SYNC_MASK 0x00000001 /* Synchronous */
+#define L2TP_FRAMING_TYPE_ASYNC_MASK 0x00000002 /* Asynchronous */
+
+#define L2TP_BEARER_CAP_DIGITAL_MASK 0x00000001 /* Digital */
+#define L2TP_BEARER_CAP_ANALOG_MASK 0x00000002 /* Analog */
+
+#define L2TP_BEARER_TYPE_DIGITAL_MASK 0x00000001 /* Digital */
+#define L2TP_BEARER_TYPE_ANALOG_MASK 0x00000002 /* Analog */
+
+/* Authen Type */
+#define L2TP_AUTHEN_TYPE_RESERVED 0x0000 /* Reserved */
+#define L2TP_AUTHEN_TYPE_TEXTUAL 0x0001 /* Textual username/password exchange */
+#define L2TP_AUTHEN_TYPE_CHAP 0x0002 /* PPP CHAP */
+#define L2TP_AUTHEN_TYPE_PAP 0x0003 /* PPP PAP */
+#define L2TP_AUTHEN_TYPE_NO_AUTH 0x0004 /* No Authentication */
+#define L2TP_AUTHEN_TYPE_MSCHAPv1 0x0005 /* MSCHAPv1 */
+
+#define L2TP_PROXY_AUTH_ID_MASK 0x00ff
+
+static const char tstr[] = " [|l2tp]";
+
+#define L2TP_MSGTYPE_SCCRQ 1 /* Start-Control-Connection-Request */
+#define L2TP_MSGTYPE_SCCRP 2 /* Start-Control-Connection-Reply */
+#define L2TP_MSGTYPE_SCCCN 3 /* Start-Control-Connection-Connected */
+#define L2TP_MSGTYPE_STOPCCN 4 /* Stop-Control-Connection-Notification */
+#define L2TP_MSGTYPE_HELLO 6 /* Hello */
+#define L2TP_MSGTYPE_OCRQ 7 /* Outgoing-Call-Request */
+#define L2TP_MSGTYPE_OCRP 8 /* Outgoing-Call-Reply */
+#define L2TP_MSGTYPE_OCCN 9 /* Outgoing-Call-Connected */
+#define L2TP_MSGTYPE_ICRQ 10 /* Incoming-Call-Request */
+#define L2TP_MSGTYPE_ICRP 11 /* Incoming-Call-Reply */
+#define L2TP_MSGTYPE_ICCN 12 /* Incoming-Call-Connected */
+#define L2TP_MSGTYPE_CDN 14 /* Call-Disconnect-Notify */
+#define L2TP_MSGTYPE_WEN 15 /* WAN-Error-Notify */
+#define L2TP_MSGTYPE_SLI 16 /* Set-Link-Info */
+
+static const struct tok l2tp_msgtype2str[] = {
+ { L2TP_MSGTYPE_SCCRQ, "SCCRQ" },
+ { L2TP_MSGTYPE_SCCRP, "SCCRP" },
+ { L2TP_MSGTYPE_SCCCN, "SCCCN" },
+ { L2TP_MSGTYPE_STOPCCN, "StopCCN" },
+ { L2TP_MSGTYPE_HELLO, "HELLO" },
+ { L2TP_MSGTYPE_OCRQ, "OCRQ" },
+ { L2TP_MSGTYPE_OCRP, "OCRP" },
+ { L2TP_MSGTYPE_OCCN, "OCCN" },
+ { L2TP_MSGTYPE_ICRQ, "ICRQ" },
+ { L2TP_MSGTYPE_ICRP, "ICRP" },
+ { L2TP_MSGTYPE_ICCN, "ICCN" },
+ { L2TP_MSGTYPE_CDN, "CDN" },
+ { L2TP_MSGTYPE_WEN, "WEN" },
+ { L2TP_MSGTYPE_SLI, "SLI" },
+ { 0, NULL }
+};
+
+#define L2TP_AVP_MSGTYPE 0 /* Message Type */
+#define L2TP_AVP_RESULT_CODE 1 /* Result Code */
+#define L2TP_AVP_PROTO_VER 2 /* Protocol Version */
+#define L2TP_AVP_FRAMING_CAP 3 /* Framing Capabilities */
+#define L2TP_AVP_BEARER_CAP 4 /* Bearer Capabilities */
+#define L2TP_AVP_TIE_BREAKER 5 /* Tie Breaker */
+#define L2TP_AVP_FIRM_VER 6 /* Firmware Revision */
+#define L2TP_AVP_HOST_NAME 7 /* Host Name */
+#define L2TP_AVP_VENDOR_NAME 8 /* Vendor Name */
+#define L2TP_AVP_ASSND_TUN_ID 9 /* Assigned Tunnel ID */
+#define L2TP_AVP_RECV_WIN_SIZE 10 /* Receive Window Size */
+#define L2TP_AVP_CHALLENGE 11 /* Challenge */
+#define L2TP_AVP_Q931_CC 12 /* Q.931 Cause Code */
+#define L2TP_AVP_CHALLENGE_RESP 13 /* Challenge Response */
+#define L2TP_AVP_ASSND_SESS_ID 14 /* Assigned Session ID */
+#define L2TP_AVP_CALL_SER_NUM 15 /* Call Serial Number */
+#define L2TP_AVP_MINIMUM_BPS 16 /* Minimum BPS */
+#define L2TP_AVP_MAXIMUM_BPS 17 /* Maximum BPS */
+#define L2TP_AVP_BEARER_TYPE 18 /* Bearer Type */
+#define L2TP_AVP_FRAMING_TYPE 19 /* Framing Type */
+#define L2TP_AVP_PACKET_PROC_DELAY 20 /* Packet Processing Delay (OBSOLETE) */
+#define L2TP_AVP_CALLED_NUMBER 21 /* Called Number */
+#define L2TP_AVP_CALLING_NUMBER 22 /* Calling Number */
+#define L2TP_AVP_SUB_ADDRESS 23 /* Sub-Address */
+#define L2TP_AVP_TX_CONN_SPEED 24 /* (Tx) Connect Speed */
+#define L2TP_AVP_PHY_CHANNEL_ID 25 /* Physical Channel ID */
+#define L2TP_AVP_INI_RECV_LCP 26 /* Initial Received LCP CONFREQ */
+#define L2TP_AVP_LAST_SENT_LCP 27 /* Last Sent LCP CONFREQ */
+#define L2TP_AVP_LAST_RECV_LCP 28 /* Last Received LCP CONFREQ */
+#define L2TP_AVP_PROXY_AUTH_TYPE 29 /* Proxy Authen Type */
+#define L2TP_AVP_PROXY_AUTH_NAME 30 /* Proxy Authen Name */
+#define L2TP_AVP_PROXY_AUTH_CHAL 31 /* Proxy Authen Challenge */
+#define L2TP_AVP_PROXY_AUTH_ID 32 /* Proxy Authen ID */
+#define L2TP_AVP_PROXY_AUTH_RESP 33 /* Proxy Authen Response */
+#define L2TP_AVP_CALL_ERRORS 34 /* Call Errors */
+#define L2TP_AVP_ACCM 35 /* ACCM */
+#define L2TP_AVP_RANDOM_VECTOR 36 /* Random Vector */
+#define L2TP_AVP_PRIVATE_GRP_ID 37 /* Private Group ID */
+#define L2TP_AVP_RX_CONN_SPEED 38 /* (Rx) Connect Speed */
+#define L2TP_AVP_SEQ_REQUIRED 39 /* Sequencing Required */
+#define L2TP_AVP_PPP_DISCON_CC 46 /* PPP Disconnect Cause Code */
+
+static const struct tok l2tp_avp2str[] = {
+ { L2TP_AVP_MSGTYPE, "MSGTYPE" },
+ { L2TP_AVP_RESULT_CODE, "RESULT_CODE" },
+ { L2TP_AVP_PROTO_VER, "PROTO_VER" },
+ { L2TP_AVP_FRAMING_CAP, "FRAMING_CAP" },
+ { L2TP_AVP_BEARER_CAP, "BEARER_CAP" },
+ { L2TP_AVP_TIE_BREAKER, "TIE_BREAKER" },
+ { L2TP_AVP_FIRM_VER, "FIRM_VER" },
+ { L2TP_AVP_HOST_NAME, "HOST_NAME" },
+ { L2TP_AVP_VENDOR_NAME, "VENDOR_NAME" },
+ { L2TP_AVP_ASSND_TUN_ID, "ASSND_TUN_ID" },
+ { L2TP_AVP_RECV_WIN_SIZE, "RECV_WIN_SIZE" },
+ { L2TP_AVP_CHALLENGE, "CHALLENGE" },
+ { L2TP_AVP_Q931_CC, "Q931_CC", },
+ { L2TP_AVP_CHALLENGE_RESP, "CHALLENGE_RESP" },
+ { L2TP_AVP_ASSND_SESS_ID, "ASSND_SESS_ID" },
+ { L2TP_AVP_CALL_SER_NUM, "CALL_SER_NUM" },
+ { L2TP_AVP_MINIMUM_BPS, "MINIMUM_BPS" },
+ { L2TP_AVP_MAXIMUM_BPS, "MAXIMUM_BPS" },
+ { L2TP_AVP_BEARER_TYPE, "BEARER_TYPE" },
+ { L2TP_AVP_FRAMING_TYPE, "FRAMING_TYPE" },
+ { L2TP_AVP_PACKET_PROC_DELAY, "PACKET_PROC_DELAY" },
+ { L2TP_AVP_CALLED_NUMBER, "CALLED_NUMBER" },
+ { L2TP_AVP_CALLING_NUMBER, "CALLING_NUMBER" },
+ { L2TP_AVP_SUB_ADDRESS, "SUB_ADDRESS" },
+ { L2TP_AVP_TX_CONN_SPEED, "TX_CONN_SPEED" },
+ { L2TP_AVP_PHY_CHANNEL_ID, "PHY_CHANNEL_ID" },
+ { L2TP_AVP_INI_RECV_LCP, "INI_RECV_LCP" },
+ { L2TP_AVP_LAST_SENT_LCP, "LAST_SENT_LCP" },
+ { L2TP_AVP_LAST_RECV_LCP, "LAST_RECV_LCP" },
+ { L2TP_AVP_PROXY_AUTH_TYPE, "PROXY_AUTH_TYPE" },
+ { L2TP_AVP_PROXY_AUTH_NAME, "PROXY_AUTH_NAME" },
+ { L2TP_AVP_PROXY_AUTH_CHAL, "PROXY_AUTH_CHAL" },
+ { L2TP_AVP_PROXY_AUTH_ID, "PROXY_AUTH_ID" },
+ { L2TP_AVP_PROXY_AUTH_RESP, "PROXY_AUTH_RESP" },
+ { L2TP_AVP_CALL_ERRORS, "CALL_ERRORS" },
+ { L2TP_AVP_ACCM, "ACCM" },
+ { L2TP_AVP_RANDOM_VECTOR, "RANDOM_VECTOR" },
+ { L2TP_AVP_PRIVATE_GRP_ID, "PRIVATE_GRP_ID" },
+ { L2TP_AVP_RX_CONN_SPEED, "RX_CONN_SPEED" },
+ { L2TP_AVP_SEQ_REQUIRED, "SEQ_REQUIRED" },
+ { L2TP_AVP_PPP_DISCON_CC, "PPP_DISCON_CC" },
+ { 0, NULL }
+};
+
+static const struct tok l2tp_authentype2str[] = {
+ { L2TP_AUTHEN_TYPE_RESERVED, "Reserved" },
+ { L2TP_AUTHEN_TYPE_TEXTUAL, "Textual" },
+ { L2TP_AUTHEN_TYPE_CHAP, "CHAP" },
+ { L2TP_AUTHEN_TYPE_PAP, "PAP" },
+ { L2TP_AUTHEN_TYPE_NO_AUTH, "No Auth" },
+ { L2TP_AUTHEN_TYPE_MSCHAPv1, "MS-CHAPv1" },
+ { 0, NULL }
+};
+
+#define L2TP_PPP_DISCON_CC_DIRECTION_GLOBAL 0
+#define L2TP_PPP_DISCON_CC_DIRECTION_AT_PEER 1
+#define L2TP_PPP_DISCON_CC_DIRECTION_AT_LOCAL 2
+
+static const struct tok l2tp_cc_direction2str[] = {
+ { L2TP_PPP_DISCON_CC_DIRECTION_GLOBAL, "global error" },
+ { L2TP_PPP_DISCON_CC_DIRECTION_AT_PEER, "at peer" },
+ { L2TP_PPP_DISCON_CC_DIRECTION_AT_LOCAL,"at local" },
+ { 0, NULL }
+};
+
+#if 0
+static char *l2tp_result_code_StopCCN[] = {
+ "Reserved",
+ "General request to clear control connection",
+ "General error--Error Code indicates the problem",
+ "Control channel already exists",
+ "Requester is not authorized to establish a control channel",
+ "The protocol version of the requester is not supported",
+ "Requester is being shut down",
+ "Finite State Machine error"
+#define L2TP_MAX_RESULT_CODE_STOPCC_INDEX 8
+};
+#endif
+
+#if 0
+static char *l2tp_result_code_CDN[] = {
+ "Reserved",
+ "Call disconnected due to loss of carrier",
+ "Call disconnected for the reason indicated in error code",
+ "Call disconnected for administrative reasons",
+ "Call failed due to lack of appropriate facilities being " \
+ "available (temporary condition)",
+ "Call failed due to lack of appropriate facilities being " \
+ "available (permanent condition)",
+ "Invalid destination",
+ "Call failed due to no carrier detected",
+ "Call failed due to detection of a busy signal",
+ "Call failed due to lack of a dial tone",
+ "Call was not established within time allotted by LAC",
+ "Call was connected but no appropriate framing was detected"
+#define L2TP_MAX_RESULT_CODE_CDN_INDEX 12
+};
+#endif
+
+#if 0
+static char *l2tp_error_code_general[] = {
+ "No general error",
+ "No control connection exists yet for this LAC-LNS pair",
+ "Length is wrong",
+ "One of the field values was out of range or " \
+ "reserved field was non-zero"
+ "Insufficient resources to handle this operation now",
+ "The Session ID is invalid in this context",
+ "A generic vendor-specific error occurred in the LAC",
+ "Try another"
+#define L2TP_MAX_ERROR_CODE_GENERAL_INDEX 8
+};
+#endif
+
+/******************************/
+/* generic print out routines */
+/******************************/
+static void
+print_string(netdissect_options *ndo, const u_char *dat, u_int length)
+{
+ u_int i;
+ for (i=0; i<length; i++) {
+ ND_PRINT((ndo, "%c", *dat++));
+ }
+}
+
+static void
+print_octets(netdissect_options *ndo, const u_char *dat, u_int length)
+{
+ u_int i;
+ for (i=0; i<length; i++) {
+ ND_PRINT((ndo, "%02x", *dat++));
+ }
+}
+
+static void
+print_16bits_val(netdissect_options *ndo, const uint16_t *dat)
+{
+ ND_PRINT((ndo, "%u", EXTRACT_16BITS(dat)));
+}
+
+static void
+print_32bits_val(netdissect_options *ndo, const uint32_t *dat)
+{
+ ND_PRINT((ndo, "%lu", (u_long)EXTRACT_32BITS(dat)));
+}
+
+/***********************************/
+/* AVP-specific print out routines */
+/***********************************/
+static void
+l2tp_msgtype_print(netdissect_options *ndo, const u_char *dat)
+{
+ uint16_t *ptr = (uint16_t*)dat;
+
+ ND_PRINT((ndo, "%s", tok2str(l2tp_msgtype2str, "MSGTYPE-#%u",
+ EXTRACT_16BITS(ptr))));
+}
+
+static void
+l2tp_result_code_print(netdissect_options *ndo, const u_char *dat, u_int length)
+{
+ uint16_t *ptr = (uint16_t *)dat;
+
+ ND_PRINT((ndo, "%u", EXTRACT_16BITS(ptr))); ptr++; /* Result Code */
+ if (length > 2) { /* Error Code (opt) */
+ ND_PRINT((ndo, "/%u", EXTRACT_16BITS(ptr))); ptr++;
+ }
+ if (length > 4) { /* Error Message (opt) */
+ ND_PRINT((ndo, " "));
+ print_string(ndo, (u_char *)ptr, length - 4);
+ }
+}
+
+static void
+l2tp_proto_ver_print(netdissect_options *ndo, const uint16_t *dat)
+{
+ ND_PRINT((ndo, "%u.%u", (EXTRACT_16BITS(dat) >> 8),
+ (EXTRACT_16BITS(dat) & 0xff)));
+}
+
+static void
+l2tp_framing_cap_print(netdissect_options *ndo, const u_char *dat)
+{
+ uint32_t *ptr = (uint32_t *)dat;
+
+ if (EXTRACT_32BITS(ptr) & L2TP_FRAMING_CAP_ASYNC_MASK) {
+ ND_PRINT((ndo, "A"));
+ }
+ if (EXTRACT_32BITS(ptr) & L2TP_FRAMING_CAP_SYNC_MASK) {
+ ND_PRINT((ndo, "S"));
+ }
+}
+
+static void
+l2tp_bearer_cap_print(netdissect_options *ndo, const u_char *dat)
+{
+ uint32_t *ptr = (uint32_t *)dat;
+
+ if (EXTRACT_32BITS(ptr) & L2TP_BEARER_CAP_ANALOG_MASK) {
+ ND_PRINT((ndo, "A"));
+ }
+ if (EXTRACT_32BITS(ptr) & L2TP_BEARER_CAP_DIGITAL_MASK) {
+ ND_PRINT((ndo, "D"));
+ }
+}
+
+static void
+l2tp_q931_cc_print(netdissect_options *ndo, const u_char *dat, u_int length)
+{
+ print_16bits_val(ndo, (uint16_t *)dat);
+ ND_PRINT((ndo, ", %02x", dat[2]));
+ if (length > 3) {
+ ND_PRINT((ndo, " "));
+ print_string(ndo, dat+3, length-3);
+ }
+}
+
+static void
+l2tp_bearer_type_print(netdissect_options *ndo, const u_char *dat)
+{
+ uint32_t *ptr = (uint32_t *)dat;
+
+ if (EXTRACT_32BITS(ptr) & L2TP_BEARER_TYPE_ANALOG_MASK) {
+ ND_PRINT((ndo, "A"));
+ }
+ if (EXTRACT_32BITS(ptr) & L2TP_BEARER_TYPE_DIGITAL_MASK) {
+ ND_PRINT((ndo, "D"));
+ }
+}
+
+static void
+l2tp_framing_type_print(netdissect_options *ndo, const u_char *dat)
+{
+ uint32_t *ptr = (uint32_t *)dat;
+
+ if (EXTRACT_32BITS(ptr) & L2TP_FRAMING_TYPE_ASYNC_MASK) {
+ ND_PRINT((ndo, "A"));
+ }
+ if (EXTRACT_32BITS(ptr) & L2TP_FRAMING_TYPE_SYNC_MASK) {
+ ND_PRINT((ndo, "S"));
+ }
+}
+
+static void
+l2tp_packet_proc_delay_print(netdissect_options *ndo)
+{
+ ND_PRINT((ndo, "obsolete"));
+}
+
+static void
+l2tp_proxy_auth_type_print(netdissect_options *ndo, const u_char *dat)
+{
+ uint16_t *ptr = (uint16_t *)dat;
+
+ ND_PRINT((ndo, "%s", tok2str(l2tp_authentype2str,
+ "AuthType-#%u", EXTRACT_16BITS(ptr))));
+}
+
+static void
+l2tp_proxy_auth_id_print(netdissect_options *ndo, const u_char *dat)
+{
+ uint16_t *ptr = (uint16_t *)dat;
+
+ ND_PRINT((ndo, "%u", EXTRACT_16BITS(ptr) & L2TP_PROXY_AUTH_ID_MASK));
+}
+
+static void
+l2tp_call_errors_print(netdissect_options *ndo, const u_char *dat)
+{
+ uint16_t *ptr = (uint16_t *)dat;
+ uint16_t val_h, val_l;
+
+ ptr++; /* skip "Reserved" */
+
+ val_h = EXTRACT_16BITS(ptr); ptr++;
+ val_l = EXTRACT_16BITS(ptr); ptr++;
+ ND_PRINT((ndo, "CRCErr=%u ", (val_h<<16) + val_l));
+
+ val_h = EXTRACT_16BITS(ptr); ptr++;
+ val_l = EXTRACT_16BITS(ptr); ptr++;
+ ND_PRINT((ndo, "FrameErr=%u ", (val_h<<16) + val_l));
+
+ val_h = EXTRACT_16BITS(ptr); ptr++;
+ val_l = EXTRACT_16BITS(ptr); ptr++;
+ ND_PRINT((ndo, "HardOver=%u ", (val_h<<16) + val_l));
+
+ val_h = EXTRACT_16BITS(ptr); ptr++;
+ val_l = EXTRACT_16BITS(ptr); ptr++;
+ ND_PRINT((ndo, "BufOver=%u ", (val_h<<16) + val_l));
+
+ val_h = EXTRACT_16BITS(ptr); ptr++;
+ val_l = EXTRACT_16BITS(ptr); ptr++;
+ ND_PRINT((ndo, "Timeout=%u ", (val_h<<16) + val_l));
+
+ val_h = EXTRACT_16BITS(ptr); ptr++;
+ val_l = EXTRACT_16BITS(ptr); ptr++;
+ ND_PRINT((ndo, "AlignErr=%u ", (val_h<<16) + val_l));
+}
+
+static void
+l2tp_accm_print(netdissect_options *ndo, const u_char *dat)
+{
+ uint16_t *ptr = (uint16_t *)dat;
+ uint16_t val_h, val_l;
+
+ ptr++; /* skip "Reserved" */
+
+ val_h = EXTRACT_16BITS(ptr); ptr++;
+ val_l = EXTRACT_16BITS(ptr); ptr++;
+ ND_PRINT((ndo, "send=%08x ", (val_h<<16) + val_l));
+
+ val_h = EXTRACT_16BITS(ptr); ptr++;
+ val_l = EXTRACT_16BITS(ptr); ptr++;
+ ND_PRINT((ndo, "recv=%08x ", (val_h<<16) + val_l));
+}
+
+static void
+l2tp_ppp_discon_cc_print(netdissect_options *ndo, const u_char *dat, u_int length)
+{
+ uint16_t *ptr = (uint16_t *)dat;
+
+ ND_PRINT((ndo, "%04x, ", EXTRACT_16BITS(ptr))); ptr++; /* Disconnect Code */
+ ND_PRINT((ndo, "%04x ", EXTRACT_16BITS(ptr))); ptr++; /* Control Protocol Number */
+ ND_PRINT((ndo, "%s", tok2str(l2tp_cc_direction2str,
+ "Direction-#%u", *((u_char *)ptr++))));
+
+ if (length > 5) {
+ ND_PRINT((ndo, " "));
+ print_string(ndo, (const u_char *)ptr, length-5);
+ }
+}
+
+static void
+l2tp_avp_print(netdissect_options *ndo, const u_char *dat, int length)
+{
+ u_int len;
+ const uint16_t *ptr = (uint16_t *)dat;
+ uint16_t attr_type;
+ int hidden = FALSE;
+
+ if (length <= 0) {
+ return;
+ }
+
+ ND_PRINT((ndo, " "));
+
+ ND_TCHECK(*ptr); /* Flags & Length */
+ len = EXTRACT_16BITS(ptr) & L2TP_AVP_HDR_LEN_MASK;
+
+ /* If it is not long enough to contain the header, we'll give up. */
+ if (len < 6)
+ goto trunc;
+
+ /* If it goes past the end of the remaining length of the packet,
+ we'll give up. */
+ if (len > (u_int)length)
+ goto trunc;
+
+ /* If it goes past the end of the remaining length of the captured
+ data, we'll give up. */
+ ND_TCHECK2(*ptr, len);
+ /* After this point, no need to worry about truncation */
+
+ if (EXTRACT_16BITS(ptr) & L2TP_AVP_HDR_FLAG_MANDATORY) {
+ ND_PRINT((ndo, "*"));
+ }
+ if (EXTRACT_16BITS(ptr) & L2TP_AVP_HDR_FLAG_HIDDEN) {
+ hidden = TRUE;
+ ND_PRINT((ndo, "?"));
+ }
+ ptr++;
+
+ if (EXTRACT_16BITS(ptr)) {
+ /* Vendor Specific Attribute */
+ ND_PRINT((ndo, "VENDOR%04x:", EXTRACT_16BITS(ptr))); ptr++;
+ ND_PRINT((ndo, "ATTR%04x", EXTRACT_16BITS(ptr))); ptr++;
+ ND_PRINT((ndo, "("));
+ print_octets(ndo, (u_char *)ptr, len-6);
+ ND_PRINT((ndo, ")"));
+ } else {
+ /* IETF-defined Attributes */
+ ptr++;
+ attr_type = EXTRACT_16BITS(ptr); ptr++;
+ ND_PRINT((ndo, "%s", tok2str(l2tp_avp2str, "AVP-#%u", attr_type)));
+ ND_PRINT((ndo, "("));
+ if (hidden) {
+ ND_PRINT((ndo, "???"));
+ } else {
+ switch (attr_type) {
+ case L2TP_AVP_MSGTYPE:
+ l2tp_msgtype_print(ndo, (u_char *)ptr);
+ break;
+ case L2TP_AVP_RESULT_CODE:
+ l2tp_result_code_print(ndo, (u_char *)ptr, len-6);
+ break;
+ case L2TP_AVP_PROTO_VER:
+ l2tp_proto_ver_print(ndo, ptr);
+ break;
+ case L2TP_AVP_FRAMING_CAP:
+ l2tp_framing_cap_print(ndo, (u_char *)ptr);
+ break;
+ case L2TP_AVP_BEARER_CAP:
+ l2tp_bearer_cap_print(ndo, (u_char *)ptr);
+ break;
+ case L2TP_AVP_TIE_BREAKER:
+ print_octets(ndo, (u_char *)ptr, 8);
+ break;
+ case L2TP_AVP_FIRM_VER:
+ case L2TP_AVP_ASSND_TUN_ID:
+ case L2TP_AVP_RECV_WIN_SIZE:
+ case L2TP_AVP_ASSND_SESS_ID:
+ print_16bits_val(ndo, ptr);
+ break;
+ case L2TP_AVP_HOST_NAME:
+ case L2TP_AVP_VENDOR_NAME:
+ case L2TP_AVP_CALLING_NUMBER:
+ case L2TP_AVP_CALLED_NUMBER:
+ case L2TP_AVP_SUB_ADDRESS:
+ case L2TP_AVP_PROXY_AUTH_NAME:
+ case L2TP_AVP_PRIVATE_GRP_ID:
+ print_string(ndo, (u_char *)ptr, len-6);
+ break;
+ case L2TP_AVP_CHALLENGE:
+ case L2TP_AVP_INI_RECV_LCP:
+ case L2TP_AVP_LAST_SENT_LCP:
+ case L2TP_AVP_LAST_RECV_LCP:
+ case L2TP_AVP_PROXY_AUTH_CHAL:
+ case L2TP_AVP_PROXY_AUTH_RESP:
+ case L2TP_AVP_RANDOM_VECTOR:
+ print_octets(ndo, (u_char *)ptr, len-6);
+ break;
+ case L2TP_AVP_Q931_CC:
+ l2tp_q931_cc_print(ndo, (u_char *)ptr, len-6);
+ break;
+ case L2TP_AVP_CHALLENGE_RESP:
+ print_octets(ndo, (u_char *)ptr, 16);
+ break;
+ case L2TP_AVP_CALL_SER_NUM:
+ case L2TP_AVP_MINIMUM_BPS:
+ case L2TP_AVP_MAXIMUM_BPS:
+ case L2TP_AVP_TX_CONN_SPEED:
+ case L2TP_AVP_PHY_CHANNEL_ID:
+ case L2TP_AVP_RX_CONN_SPEED:
+ print_32bits_val(ndo, (uint32_t *)ptr);
+ break;
+ case L2TP_AVP_BEARER_TYPE:
+ l2tp_bearer_type_print(ndo, (u_char *)ptr);
+ break;
+ case L2TP_AVP_FRAMING_TYPE:
+ l2tp_framing_type_print(ndo, (u_char *)ptr);
+ break;
+ case L2TP_AVP_PACKET_PROC_DELAY:
+ l2tp_packet_proc_delay_print(ndo);
+ break;
+ case L2TP_AVP_PROXY_AUTH_TYPE:
+ l2tp_proxy_auth_type_print(ndo, (u_char *)ptr);
+ break;
+ case L2TP_AVP_PROXY_AUTH_ID:
+ l2tp_proxy_auth_id_print(ndo, (u_char *)ptr);
+ break;
+ case L2TP_AVP_CALL_ERRORS:
+ l2tp_call_errors_print(ndo, (u_char *)ptr);
+ break;
+ case L2TP_AVP_ACCM:
+ l2tp_accm_print(ndo, (u_char *)ptr);
+ break;
+ case L2TP_AVP_SEQ_REQUIRED:
+ break; /* No Attribute Value */
+ case L2TP_AVP_PPP_DISCON_CC:
+ l2tp_ppp_discon_cc_print(ndo, (u_char *)ptr, len-6);
+ break;
+ default:
+ break;
+ }
+ }
+ ND_PRINT((ndo, ")"));
+ }
+
+ l2tp_avp_print(ndo, dat+len, length-len);
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "|..."));
+}
+
+
+void
+l2tp_print(netdissect_options *ndo, const u_char *dat, u_int length)
+{
+ const u_char *ptr = dat;
+ u_int cnt = 0; /* total octets consumed */
+ uint16_t pad;
+ int flag_t, flag_l, flag_s, flag_o;
+ uint16_t l2tp_len;
+
+ flag_t = flag_l = flag_s = flag_o = FALSE;
+
+ ND_TCHECK2(*ptr, 2); /* Flags & Version */
+ if ((EXTRACT_16BITS(ptr) & L2TP_VERSION_MASK) == L2TP_VERSION_L2TP) {
+ ND_PRINT((ndo, " l2tp:"));
+ } else if ((EXTRACT_16BITS(ptr) & L2TP_VERSION_MASK) == L2TP_VERSION_L2F) {
+ ND_PRINT((ndo, " l2f:"));
+ return; /* nothing to do */
+ } else {
+ ND_PRINT((ndo, " Unknown Version, neither L2F(1) nor L2TP(2)"));
+ return; /* nothing we can do */
+ }
+
+ ND_PRINT((ndo, "["));
+ if (EXTRACT_16BITS(ptr) & L2TP_FLAG_TYPE) {
+ flag_t = TRUE;
+ ND_PRINT((ndo, "T"));
+ }
+ if (EXTRACT_16BITS(ptr) & L2TP_FLAG_LENGTH) {
+ flag_l = TRUE;
+ ND_PRINT((ndo, "L"));
+ }
+ if (EXTRACT_16BITS(ptr) & L2TP_FLAG_SEQUENCE) {
+ flag_s = TRUE;
+ ND_PRINT((ndo, "S"));
+ }
+ if (EXTRACT_16BITS(ptr) & L2TP_FLAG_OFFSET) {
+ flag_o = TRUE;
+ ND_PRINT((ndo, "O"));
+ }
+ if (EXTRACT_16BITS(ptr) & L2TP_FLAG_PRIORITY)
+ ND_PRINT((ndo, "P"));
+ ND_PRINT((ndo, "]"));
+
+ ptr += 2;
+ cnt += 2;
+
+ if (flag_l) {
+ ND_TCHECK2(*ptr, 2); /* Length */
+ l2tp_len = EXTRACT_16BITS(ptr);
+ ptr += 2;
+ cnt += 2;
+ } else {
+ l2tp_len = 0;
+ }
+
+ ND_TCHECK2(*ptr, 2); /* Tunnel ID */
+ ND_PRINT((ndo, "(%u/", EXTRACT_16BITS(ptr)));
+ ptr += 2;
+ cnt += 2;
+ ND_TCHECK2(*ptr, 2); /* Session ID */
+ ND_PRINT((ndo, "%u)", EXTRACT_16BITS(ptr)));
+ ptr += 2;
+ cnt += 2;
+
+ if (flag_s) {
+ ND_TCHECK2(*ptr, 2); /* Ns */
+ ND_PRINT((ndo, "Ns=%u,", EXTRACT_16BITS(ptr)));
+ ptr += 2;
+ cnt += 2;
+ ND_TCHECK2(*ptr, 2); /* Nr */
+ ND_PRINT((ndo, "Nr=%u", EXTRACT_16BITS(ptr)));
+ ptr += 2;
+ cnt += 2;
+ }
+
+ if (flag_o) {
+ ND_TCHECK2(*ptr, 2); /* Offset Size */
+ pad = EXTRACT_16BITS(ptr);
+ ptr += (2 + pad);
+ cnt += (2 + pad);
+ }
+
+ if (flag_l) {
+ if (length < l2tp_len) {
+ ND_PRINT((ndo, " Length %u larger than packet", l2tp_len));
+ return;
+ }
+ length = l2tp_len;
+ }
+ if (length < cnt) {
+ ND_PRINT((ndo, " Length %u smaller than header length", length));
+ return;
+ }
+ if (flag_t) {
+ if (!flag_l) {
+ ND_PRINT((ndo, " No length"));
+ return;
+ }
+ if (length - cnt == 0) {
+ ND_PRINT((ndo, " ZLB"));
+ } else {
+ l2tp_avp_print(ndo, ptr, length - cnt);
+ }
+ } else {
+ ND_PRINT((ndo, " {"));
+ ppp_print(ndo, ptr, length - cnt);
+ ND_PRINT((ndo, "}"));
+ }
+
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
--- /dev/null
+/*
+ * Marko Kiiskila carnil@cs.tut.fi
+ *
+ * Tampere University of Technology - Telecommunications Laboratory
+ *
+ * Permission to use, copy, modify and distribute this
+ * software and its documentation is hereby granted,
+ * provided that both the copyright notice and this
+ * permission notice appear in all copies of the software,
+ * derivative works or modified versions, and any portions
+ * thereof, that both notices appear in supporting
+ * documentation, and that the use of this software is
+ * acknowledged in any publications resulting from using
+ * the software.
+ *
+ * TUT ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION AND DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS
+ * SOFTWARE.
+ *
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-lane.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "ether.h"
+
+struct lecdatahdr_8023 {
+ uint16_t le_header;
+ uint8_t h_dest[ETHER_ADDR_LEN];
+ uint8_t h_source[ETHER_ADDR_LEN];
+ uint16_t h_type;
+};
+
+struct lane_controlhdr {
+ uint16_t lec_header;
+ uint8_t lec_proto;
+ uint8_t lec_vers;
+ uint16_t lec_opcode;
+};
+
+static const struct tok lecop2str[] = {
+ { 0x0001, "configure request" },
+ { 0x0101, "configure response" },
+ { 0x0002, "join request" },
+ { 0x0102, "join response" },
+ { 0x0003, "ready query" },
+ { 0x0103, "ready indication" },
+ { 0x0004, "register request" },
+ { 0x0104, "register response" },
+ { 0x0005, "unregister request" },
+ { 0x0105, "unregister response" },
+ { 0x0006, "ARP request" },
+ { 0x0106, "ARP response" },
+ { 0x0007, "flush request" },
+ { 0x0107, "flush response" },
+ { 0x0008, "NARP request" },
+ { 0x0009, "topology request" },
+ { 0, NULL }
+};
+
+static void
+lane_hdr_print(netdissect_options *ndo, const u_char *bp)
+{
+ ND_PRINT((ndo, "lecid:%x ", EXTRACT_16BITS(bp)));
+}
+
+/*
+ * This is the top level routine of the printer. 'p' points
+ * to the LANE 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 assumes 802.3, not 802.5, LAN emulation.
+ */
+void
+lane_print(netdissect_options *ndo, const u_char *p, u_int length, u_int caplen)
+{
+ struct lane_controlhdr *lec;
+
+ if (caplen < sizeof(struct lane_controlhdr)) {
+ ND_PRINT((ndo, "[|lane]"));
+ return;
+ }
+
+ lec = (struct lane_controlhdr *)p;
+ if (EXTRACT_16BITS(&lec->lec_header) == 0xff00) {
+ /*
+ * LE Control.
+ */
+ ND_PRINT((ndo, "lec: proto %x vers %x %s",
+ lec->lec_proto, lec->lec_vers,
+ tok2str(lecop2str, "opcode-#%u", EXTRACT_16BITS(&lec->lec_opcode))));
+ return;
+ }
+
+ /*
+ * Go past the LE header.
+ */
+ length -= 2;
+ caplen -= 2;
+ p += 2;
+
+ /*
+ * Now print the encapsulated frame, under the assumption
+ * that it's an Ethernet frame.
+ */
+ ether_print(ndo, p, length, caplen, lane_hdr_print, p - 2);
+}
+
+u_int
+lane_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
+{
+ lane_print(ndo, p, h->len, h->caplen);
+
+ return (sizeof(struct lecdatahdr_8023));
+}
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ * and Steinar Haug (sthaug@nethelp.no)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ldp.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+#include "l2vpn.h"
+#include "af.h"
+
+/*
+ * ldp common header
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Version | PDU Length |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | LDP Identifier |
+ * + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ */
+
+struct ldp_common_header {
+ uint8_t version[2];
+ uint8_t pdu_length[2];
+ uint8_t lsr_id[4];
+ uint8_t label_space[2];
+};
+
+#define LDP_VERSION 1
+
+/*
+ * ldp message header
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |U| Message Type | Message Length |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Message ID |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * + +
+ * | Mandatory Parameters |
+ * + +
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * + +
+ * | Optional Parameters |
+ * + +
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+struct ldp_msg_header {
+ uint8_t type[2];
+ uint8_t length[2];
+ uint8_t id[4];
+};
+
+#define LDP_MASK_MSG_TYPE(x) ((x)&0x7fff)
+#define LDP_MASK_U_BIT(x) ((x)&0x8000)
+
+#define LDP_MSG_NOTIF 0x0001
+#define LDP_MSG_HELLO 0x0100
+#define LDP_MSG_INIT 0x0200
+#define LDP_MSG_KEEPALIVE 0x0201
+#define LDP_MSG_ADDRESS 0x0300
+#define LDP_MSG_ADDRESS_WITHDRAW 0x0301
+#define LDP_MSG_LABEL_MAPPING 0x0400
+#define LDP_MSG_LABEL_REQUEST 0x0401
+#define LDP_MSG_LABEL_WITHDRAW 0x0402
+#define LDP_MSG_LABEL_RELEASE 0x0403
+#define LDP_MSG_LABEL_ABORT_REQUEST 0x0404
+
+#define LDP_VENDOR_PRIVATE_MIN 0x3e00
+#define LDP_VENDOR_PRIVATE_MAX 0x3eff
+#define LDP_EXPERIMENTAL_MIN 0x3f00
+#define LDP_EXPERIMENTAL_MAX 0x3fff
+
+static const struct tok ldp_msg_values[] = {
+ { LDP_MSG_NOTIF, "Notification" },
+ { LDP_MSG_HELLO, "Hello" },
+ { LDP_MSG_INIT, "Initialization" },
+ { LDP_MSG_KEEPALIVE, "Keepalive" },
+ { LDP_MSG_ADDRESS, "Address" },
+ { LDP_MSG_ADDRESS_WITHDRAW, "Address Withdraw" },
+ { LDP_MSG_LABEL_MAPPING, "Label Mapping" },
+ { LDP_MSG_LABEL_REQUEST, "Label Request" },
+ { LDP_MSG_LABEL_WITHDRAW, "Label Withdraw" },
+ { LDP_MSG_LABEL_RELEASE, "Label Release" },
+ { LDP_MSG_LABEL_ABORT_REQUEST, "Label Abort Request" },
+ { 0, NULL}
+};
+
+#define LDP_MASK_TLV_TYPE(x) ((x)&0x3fff)
+#define LDP_MASK_F_BIT(x) ((x)&0x4000)
+
+#define LDP_TLV_FEC 0x0100
+#define LDP_TLV_ADDRESS_LIST 0x0101
+#define LDP_TLV_ADDRESS_LIST_AFNUM_LEN 2
+#define LDP_TLV_HOP_COUNT 0x0103
+#define LDP_TLV_PATH_VECTOR 0x0104
+#define LDP_TLV_GENERIC_LABEL 0x0200
+#define LDP_TLV_ATM_LABEL 0x0201
+#define LDP_TLV_FR_LABEL 0x0202
+#define LDP_TLV_STATUS 0x0300
+#define LDP_TLV_EXTD_STATUS 0x0301
+#define LDP_TLV_RETURNED_PDU 0x0302
+#define LDP_TLV_RETURNED_MSG 0x0303
+#define LDP_TLV_COMMON_HELLO 0x0400
+#define LDP_TLV_IPV4_TRANSPORT_ADDR 0x0401
+#define LDP_TLV_CONFIG_SEQ_NUMBER 0x0402
+#define LDP_TLV_IPV6_TRANSPORT_ADDR 0x0403
+#define LDP_TLV_COMMON_SESSION 0x0500
+#define LDP_TLV_ATM_SESSION_PARM 0x0501
+#define LDP_TLV_FR_SESSION_PARM 0x0502
+#define LDP_TLV_FT_SESSION 0x0503
+#define LDP_TLV_LABEL_REQUEST_MSG_ID 0x0600
+#define LDP_TLV_MTU 0x0601 /* rfc 3988 */
+
+static const struct tok ldp_tlv_values[] = {
+ { LDP_TLV_FEC, "FEC" },
+ { LDP_TLV_ADDRESS_LIST, "Address List" },
+ { LDP_TLV_HOP_COUNT, "Hop Count" },
+ { LDP_TLV_PATH_VECTOR, "Path Vector" },
+ { LDP_TLV_GENERIC_LABEL, "Generic Label" },
+ { LDP_TLV_ATM_LABEL, "ATM Label" },
+ { LDP_TLV_FR_LABEL, "Frame-Relay Label" },
+ { LDP_TLV_STATUS, "Status" },
+ { LDP_TLV_EXTD_STATUS, "Extended Status" },
+ { LDP_TLV_RETURNED_PDU, "Returned PDU" },
+ { LDP_TLV_RETURNED_MSG, "Returned Message" },
+ { LDP_TLV_COMMON_HELLO, "Common Hello Parameters" },
+ { LDP_TLV_IPV4_TRANSPORT_ADDR, "IPv4 Transport Address" },
+ { LDP_TLV_CONFIG_SEQ_NUMBER, "Configuration Sequence Number" },
+ { LDP_TLV_IPV6_TRANSPORT_ADDR, "IPv6 Transport Address" },
+ { LDP_TLV_COMMON_SESSION, "Common Session Parameters" },
+ { LDP_TLV_ATM_SESSION_PARM, "ATM Session Parameters" },
+ { LDP_TLV_FR_SESSION_PARM, "Frame-Relay Session Parameters" },
+ { LDP_TLV_FT_SESSION, "Fault-Tolerant Session Parameters" },
+ { LDP_TLV_LABEL_REQUEST_MSG_ID, "Label Request Message ID" },
+ { LDP_TLV_MTU, "MTU" },
+ { 0, NULL}
+};
+
+#define LDP_FEC_WILDCARD 0x01
+#define LDP_FEC_PREFIX 0x02
+#define LDP_FEC_HOSTADDRESS 0x03
+/* From RFC 4906; should probably be updated to RFC 4447 (e.g., VC -> PW) */
+#define LDP_FEC_MARTINI_VC 0x80
+
+static const struct tok ldp_fec_values[] = {
+ { LDP_FEC_WILDCARD, "Wildcard" },
+ { LDP_FEC_PREFIX, "Prefix" },
+ { LDP_FEC_HOSTADDRESS, "Host address" },
+ { LDP_FEC_MARTINI_VC, "Martini VC" },
+ { 0, NULL}
+};
+
+#define LDP_FEC_MARTINI_IFPARM_MTU 0x01
+#define LDP_FEC_MARTINI_IFPARM_DESC 0x03
+#define LDP_FEC_MARTINI_IFPARM_VCCV 0x0c
+
+static const struct tok ldp_fec_martini_ifparm_values[] = {
+ { LDP_FEC_MARTINI_IFPARM_MTU, "MTU" },
+ { LDP_FEC_MARTINI_IFPARM_DESC, "Description" },
+ { LDP_FEC_MARTINI_IFPARM_VCCV, "VCCV" },
+ { 0, NULL}
+};
+
+/* draft-ietf-pwe3-vccv-04.txt */
+static const struct tok ldp_fec_martini_ifparm_vccv_cc_values[] = {
+ { 0x01, "PWE3 control word" },
+ { 0x02, "MPLS Router Alert Label" },
+ { 0x04, "MPLS inner label TTL = 1" },
+ { 0, NULL}
+};
+
+/* draft-ietf-pwe3-vccv-04.txt */
+static const struct tok ldp_fec_martini_ifparm_vccv_cv_values[] = {
+ { 0x01, "ICMP Ping" },
+ { 0x02, "LSP Ping" },
+ { 0x04, "BFD" },
+ { 0, NULL}
+};
+
+static int ldp_pdu_print(netdissect_options *, register const u_char *);
+
+/*
+ * ldp tlv header
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |U|F| Type | Length |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * | Value |
+ * ~ ~
+ * | |
+ * | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define TLV_TCHECK(minlen) \
+ ND_TCHECK2(*tptr, minlen); if (tlv_tlen < minlen) goto badtlv;
+
+static int
+ldp_tlv_print(netdissect_options *ndo,
+ register const u_char *tptr,
+ u_short msg_tlen)
+{
+ struct ldp_tlv_header {
+ uint8_t type[2];
+ uint8_t length[2];
+ };
+
+ const struct ldp_tlv_header *ldp_tlv_header;
+ u_short tlv_type,tlv_len,tlv_tlen,af,ft_flags;
+ u_char fec_type;
+ u_int ui,vc_info_len, vc_info_tlv_type, vc_info_tlv_len,idx;
+ char buf[100];
+ int i;
+
+ ldp_tlv_header = (const struct ldp_tlv_header *)tptr;
+ ND_TCHECK(*ldp_tlv_header);
+ tlv_len=EXTRACT_16BITS(ldp_tlv_header->length);
+ if (tlv_len + 4 > msg_tlen) {
+ ND_PRINT((ndo, "\n\t\t TLV contents go past end of message"));
+ return 0;
+ }
+ tlv_tlen=tlv_len;
+ tlv_type=LDP_MASK_TLV_TYPE(EXTRACT_16BITS(ldp_tlv_header->type));
+
+ /* FIXME vendor private / experimental check */
+ ND_PRINT((ndo, "\n\t %s TLV (0x%04x), length: %u, Flags: [%s and %s forward if unknown]",
+ tok2str(ldp_tlv_values,
+ "Unknown",
+ tlv_type),
+ tlv_type,
+ tlv_len,
+ LDP_MASK_U_BIT(EXTRACT_16BITS(&ldp_tlv_header->type)) ? "continue processing" : "ignore",
+ LDP_MASK_F_BIT(EXTRACT_16BITS(&ldp_tlv_header->type)) ? "do" : "don't"));
+
+ tptr+=sizeof(struct ldp_tlv_header);
+
+ switch(tlv_type) {
+
+ case LDP_TLV_COMMON_HELLO:
+ TLV_TCHECK(4);
+ ND_PRINT((ndo, "\n\t Hold Time: %us, Flags: [%s Hello%s]",
+ EXTRACT_16BITS(tptr),
+ (EXTRACT_16BITS(tptr+2)&0x8000) ? "Targeted" : "Link",
+ (EXTRACT_16BITS(tptr+2)&0x4000) ? ", Request for targeted Hellos" : ""));
+ break;
+
+ case LDP_TLV_IPV4_TRANSPORT_ADDR:
+ TLV_TCHECK(4);
+ ND_PRINT((ndo, "\n\t IPv4 Transport Address: %s", ipaddr_string(ndo, tptr)));
+ break;
+#ifdef INET6
+ case LDP_TLV_IPV6_TRANSPORT_ADDR:
+ TLV_TCHECK(16);
+ ND_PRINT((ndo, "\n\t IPv6 Transport Address: %s", ip6addr_string(ndo, tptr)));
+ break;
+#endif
+ case LDP_TLV_CONFIG_SEQ_NUMBER:
+ TLV_TCHECK(4);
+ ND_PRINT((ndo, "\n\t Sequence Number: %u", EXTRACT_32BITS(tptr)));
+ break;
+
+ case LDP_TLV_ADDRESS_LIST:
+ TLV_TCHECK(LDP_TLV_ADDRESS_LIST_AFNUM_LEN);
+ af = EXTRACT_16BITS(tptr);
+ tptr+=LDP_TLV_ADDRESS_LIST_AFNUM_LEN;
+ tlv_tlen -= LDP_TLV_ADDRESS_LIST_AFNUM_LEN;
+ ND_PRINT((ndo, "\n\t Address Family: %s, addresses",
+ tok2str(af_values, "Unknown (%u)", af)));
+ switch (af) {
+ case AFNUM_INET:
+ while(tlv_tlen >= sizeof(struct in_addr)) {
+ ND_TCHECK2(*tptr, sizeof(struct in_addr));
+ ND_PRINT((ndo, " %s", ipaddr_string(ndo, tptr)));
+ tlv_tlen-=sizeof(struct in_addr);
+ tptr+=sizeof(struct in_addr);
+ }
+ break;
+#ifdef INET6
+ case AFNUM_INET6:
+ while(tlv_tlen >= sizeof(struct in6_addr)) {
+ ND_TCHECK2(*tptr, sizeof(struct in6_addr));
+ ND_PRINT((ndo, " %s", ip6addr_string(ndo, tptr)));
+ tlv_tlen-=sizeof(struct in6_addr);
+ tptr+=sizeof(struct in6_addr);
+ }
+ break;
+#endif
+ default:
+ /* unknown AF */
+ break;
+ }
+ break;
+
+ case LDP_TLV_COMMON_SESSION:
+ TLV_TCHECK(8);
+ ND_PRINT((ndo, "\n\t Version: %u, Keepalive: %us, Flags: [Downstream %s, Loop Detection %s]",
+ EXTRACT_16BITS(tptr), EXTRACT_16BITS(tptr+2),
+ (EXTRACT_16BITS(tptr+6)&0x8000) ? "On Demand" : "Unsolicited",
+ (EXTRACT_16BITS(tptr+6)&0x4000) ? "Enabled" : "Disabled"
+ ));
+ break;
+
+ case LDP_TLV_FEC:
+ TLV_TCHECK(1);
+ fec_type = *tptr;
+ ND_PRINT((ndo, "\n\t %s FEC (0x%02x)",
+ tok2str(ldp_fec_values, "Unknown", fec_type),
+ fec_type));
+
+ tptr+=1;
+ tlv_tlen-=1;
+ switch(fec_type) {
+
+ case LDP_FEC_WILDCARD:
+ break;
+ case LDP_FEC_PREFIX:
+ TLV_TCHECK(2);
+ af = EXTRACT_16BITS(tptr);
+ tptr+=LDP_TLV_ADDRESS_LIST_AFNUM_LEN;
+ tlv_tlen-=LDP_TLV_ADDRESS_LIST_AFNUM_LEN;
+ if (af == AFNUM_INET) {
+ i=decode_prefix4(ndo, tptr, tlv_tlen, buf, sizeof(buf));
+ if (i == -2)
+ goto trunc;
+ if (i == -3)
+ ND_PRINT((ndo, ": IPv4 prefix (goes past end of TLV)"));
+ else if (i == -1)
+ ND_PRINT((ndo, ": IPv4 prefix (invalid length)"));
+ else
+ ND_PRINT((ndo, ": IPv4 prefix %s", buf));
+ }
+#ifdef INET6
+ else if (af == AFNUM_INET6) {
+ i=decode_prefix6(ndo, tptr, tlv_tlen, buf, sizeof(buf));
+ if (i == -2)
+ goto trunc;
+ if (i == -3)
+ ND_PRINT((ndo, ": IPv4 prefix (goes past end of TLV)"));
+ else if (i == -1)
+ ND_PRINT((ndo, ": IPv6 prefix (invalid length)"));
+ else
+ ND_PRINT((ndo, ": IPv6 prefix %s", buf));
+ }
+#endif
+ else
+ ND_PRINT((ndo, ": Address family %u prefix", af));
+ break;
+ case LDP_FEC_HOSTADDRESS:
+ break;
+ case LDP_FEC_MARTINI_VC:
+ /*
+ * According to RFC 4908, the VC info Length field can be zero,
+ * in which case not only are there no interface parameters,
+ * there's no VC ID.
+ */
+ TLV_TCHECK(7);
+ vc_info_len = *(tptr+2);
+
+ if (vc_info_len == 0) {
+ ND_PRINT((ndo, ": %s, %scontrol word, group-ID %u, VC-info-length: %u",
+ tok2str(l2vpn_encaps_values, "Unknown", EXTRACT_16BITS(tptr)&0x7fff),
+ EXTRACT_16BITS(tptr)&0x8000 ? "" : "no ",
+ EXTRACT_32BITS(tptr+3),
+ vc_info_len));
+ break;
+ }
+
+ /* Make sure we have the VC ID as well */
+ TLV_TCHECK(11);
+ ND_PRINT((ndo, ": %s, %scontrol word, group-ID %u, VC-ID %u, VC-info-length: %u",
+ tok2str(l2vpn_encaps_values, "Unknown", EXTRACT_16BITS(tptr)&0x7fff),
+ EXTRACT_16BITS(tptr)&0x8000 ? "" : "no ",
+ EXTRACT_32BITS(tptr+3),
+ EXTRACT_32BITS(tptr+7),
+ vc_info_len));
+ if (vc_info_len < 4) {
+ /* minimum 4, for the VC ID */
+ ND_PRINT((ndo, " (invalid, < 4"));
+ return(tlv_len+4); /* Type & Length fields not included */
+ }
+ vc_info_len -= 4; /* subtract out the VC ID, giving the length of the interface parameters */
+
+ /* Skip past the fixed information and the VC ID */
+ tptr+=11;
+ tlv_tlen-=11;
+ TLV_TCHECK(vc_info_len);
+
+ while (vc_info_len > 2) {
+ vc_info_tlv_type = *tptr;
+ vc_info_tlv_len = *(tptr+1);
+ if (vc_info_tlv_len < 2)
+ break;
+ if (vc_info_len < vc_info_tlv_len)
+ break;
+
+ ND_PRINT((ndo, "\n\t\tInterface Parameter: %s (0x%02x), len %u",
+ tok2str(ldp_fec_martini_ifparm_values,"Unknown",vc_info_tlv_type),
+ vc_info_tlv_type,
+ vc_info_tlv_len));
+
+ switch(vc_info_tlv_type) {
+ case LDP_FEC_MARTINI_IFPARM_MTU:
+ ND_PRINT((ndo, ": %u", EXTRACT_16BITS(tptr+2)));
+ break;
+
+ case LDP_FEC_MARTINI_IFPARM_DESC:
+ ND_PRINT((ndo, ": "));
+ for (idx = 2; idx < vc_info_tlv_len; idx++)
+ safeputchar(ndo, *(tptr + idx));
+ break;
+
+ case LDP_FEC_MARTINI_IFPARM_VCCV:
+ ND_PRINT((ndo, "\n\t\t Control Channels (0x%02x) = [%s]",
+ *(tptr+2),
+ bittok2str(ldp_fec_martini_ifparm_vccv_cc_values, "none", *(tptr+2))));
+ ND_PRINT((ndo, "\n\t\t CV Types (0x%02x) = [%s]",
+ *(tptr+3),
+ bittok2str(ldp_fec_martini_ifparm_vccv_cv_values, "none", *(tptr+3))));
+ break;
+
+ default:
+ print_unknown_data(ndo, tptr+2, "\n\t\t ", vc_info_tlv_len-2);
+ break;
+ }
+
+ vc_info_len -= vc_info_tlv_len;
+ tptr += vc_info_tlv_len;
+ }
+ break;
+ }
+
+ break;
+
+ case LDP_TLV_GENERIC_LABEL:
+ TLV_TCHECK(4);
+ ND_PRINT((ndo, "\n\t Label: %u", EXTRACT_32BITS(tptr) & 0xfffff));
+ break;
+
+ case LDP_TLV_STATUS:
+ TLV_TCHECK(8);
+ ui = EXTRACT_32BITS(tptr);
+ tptr+=4;
+ ND_PRINT((ndo, "\n\t Status: 0x%02x, Flags: [%s and %s forward]",
+ ui&0x3fffffff,
+ ui&0x80000000 ? "Fatal error" : "Advisory Notification",
+ ui&0x40000000 ? "do" : "don't"));
+ ui = EXTRACT_32BITS(tptr);
+ tptr+=4;
+ if (ui)
+ ND_PRINT((ndo, ", causing Message ID: 0x%08x", ui));
+ break;
+
+ case LDP_TLV_FT_SESSION:
+ TLV_TCHECK(8);
+ ft_flags = EXTRACT_16BITS(tptr);
+ ND_PRINT((ndo, "\n\t Flags: [%sReconnect, %sSave State, %sAll-Label Protection, %s Checkpoint, %sRe-Learn State]",
+ ft_flags&0x8000 ? "" : "No ",
+ ft_flags&0x8 ? "" : "Don't ",
+ ft_flags&0x4 ? "" : "No ",
+ ft_flags&0x2 ? "Sequence Numbered Label" : "All Labels",
+ ft_flags&0x1 ? "" : "Don't "));
+ tptr+=4;
+ ui = EXTRACT_32BITS(tptr);
+ if (ui)
+ ND_PRINT((ndo, ", Reconnect Timeout: %ums", ui));
+ tptr+=4;
+ ui = EXTRACT_32BITS(tptr);
+ if (ui)
+ ND_PRINT((ndo, ", Recovery Time: %ums", ui));
+ break;
+
+ case LDP_TLV_MTU:
+ TLV_TCHECK(2);
+ ND_PRINT((ndo, "\n\t MTU: %u", EXTRACT_16BITS(tptr)));
+ break;
+
+
+ /*
+ * FIXME those are the defined TLVs that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+
+ case LDP_TLV_HOP_COUNT:
+ case LDP_TLV_PATH_VECTOR:
+ case LDP_TLV_ATM_LABEL:
+ case LDP_TLV_FR_LABEL:
+ case LDP_TLV_EXTD_STATUS:
+ case LDP_TLV_RETURNED_PDU:
+ case LDP_TLV_RETURNED_MSG:
+ case LDP_TLV_ATM_SESSION_PARM:
+ case LDP_TLV_FR_SESSION_PARM:
+ case LDP_TLV_LABEL_REQUEST_MSG_ID:
+
+ default:
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, tptr, "\n\t ", tlv_tlen);
+ break;
+ }
+ return(tlv_len+4); /* Type & Length fields not included */
+
+trunc:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+ return 0;
+
+badtlv:
+ ND_PRINT((ndo, "\n\t\t TLV contents go past end of TLV"));
+ return(tlv_len+4); /* Type & Length fields not included */
+}
+
+void
+ldp_print(netdissect_options *ndo,
+ register const u_char *pptr, register u_int len)
+{
+ int processed;
+ while (len > (sizeof(struct ldp_common_header) + sizeof(struct ldp_msg_header))) {
+ processed = ldp_pdu_print(ndo, pptr);
+ if (processed == 0)
+ return;
+ len -= processed;
+ pptr += processed;
+ }
+}
+
+static int
+ldp_pdu_print(netdissect_options *ndo,
+ register const u_char *pptr)
+{
+ const struct ldp_common_header *ldp_com_header;
+ const struct ldp_msg_header *ldp_msg_header;
+ const u_char *tptr,*msg_tptr;
+ u_short tlen;
+ u_short pdu_len,msg_len,msg_type,msg_tlen;
+ int hexdump,processed;
+
+ ldp_com_header = (const struct ldp_common_header *)pptr;
+ ND_TCHECK(*ldp_com_header);
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (EXTRACT_16BITS(&ldp_com_header->version) != LDP_VERSION) {
+ ND_PRINT((ndo, "%sLDP version %u packet not supported",
+ (ndo->ndo_vflag < 1) ? "" : "\n\t",
+ EXTRACT_16BITS(&ldp_com_header->version)));
+ return 0;
+ }
+
+ pdu_len = EXTRACT_16BITS(&ldp_com_header->pdu_length);
+ if (pdu_len < sizeof(const struct ldp_common_header)-4) {
+ /* length too short */
+ ND_PRINT((ndo, "%sLDP, pdu-length: %u (too short, < %u)",
+ (ndo->ndo_vflag < 1) ? "" : "\n\t",
+ pdu_len,
+ (u_int)(sizeof(const struct ldp_common_header)-4)));
+ return 0;
+ }
+
+ /* print the LSR-ID, label-space & length */
+ ND_PRINT((ndo, "%sLDP, Label-Space-ID: %s:%u, pdu-length: %u",
+ (ndo->ndo_vflag < 1) ? "" : "\n\t",
+ ipaddr_string(ndo, &ldp_com_header->lsr_id),
+ EXTRACT_16BITS(&ldp_com_header->label_space),
+ pdu_len));
+
+ /* bail out if non-verbose */
+ if (ndo->ndo_vflag < 1)
+ return 0;
+
+ /* ok they seem to want to know everything - lets fully decode it */
+ tptr = pptr + sizeof(const struct ldp_common_header);
+ tlen = pdu_len - (sizeof(const struct ldp_common_header)-4); /* Type & Length fields not included */
+
+ while(tlen>0) {
+ /* did we capture enough for fully decoding the msg header ? */
+ ND_TCHECK2(*tptr, sizeof(struct ldp_msg_header));
+
+ ldp_msg_header = (const struct ldp_msg_header *)tptr;
+ msg_len=EXTRACT_16BITS(ldp_msg_header->length);
+ msg_type=LDP_MASK_MSG_TYPE(EXTRACT_16BITS(ldp_msg_header->type));
+
+ if (msg_len < sizeof(struct ldp_msg_header)-4) {
+ /* length too short */
+ /* FIXME vendor private / experimental check */
+ ND_PRINT((ndo, "\n\t %s Message (0x%04x), length: %u (too short, < %u)",
+ tok2str(ldp_msg_values,
+ "Unknown",
+ msg_type),
+ msg_type,
+ msg_len,
+ (u_int)(sizeof(struct ldp_msg_header)-4)));
+ return 0;
+ }
+
+ /* FIXME vendor private / experimental check */
+ ND_PRINT((ndo, "\n\t %s Message (0x%04x), length: %u, Message ID: 0x%08x, Flags: [%s if unknown]",
+ tok2str(ldp_msg_values,
+ "Unknown",
+ msg_type),
+ msg_type,
+ msg_len,
+ EXTRACT_32BITS(&ldp_msg_header->id),
+ LDP_MASK_U_BIT(EXTRACT_16BITS(&ldp_msg_header->type)) ? "continue processing" : "ignore"));
+
+ msg_tptr=tptr+sizeof(struct ldp_msg_header);
+ msg_tlen=msg_len-(sizeof(struct ldp_msg_header)-4); /* Type & Length fields not included */
+
+ /* did we capture enough for fully decoding the message ? */
+ ND_TCHECK2(*tptr, msg_len);
+ hexdump=FALSE;
+
+ switch(msg_type) {
+
+ case LDP_MSG_NOTIF:
+ case LDP_MSG_HELLO:
+ case LDP_MSG_INIT:
+ case LDP_MSG_KEEPALIVE:
+ case LDP_MSG_ADDRESS:
+ case LDP_MSG_LABEL_MAPPING:
+ case LDP_MSG_ADDRESS_WITHDRAW:
+ case LDP_MSG_LABEL_WITHDRAW:
+ while(msg_tlen >= 4) {
+ processed = ldp_tlv_print(ndo, msg_tptr, msg_tlen);
+ if (processed == 0)
+ break;
+ msg_tlen-=processed;
+ msg_tptr+=processed;
+ }
+ break;
+
+ /*
+ * FIXME those are the defined messages that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+
+ case LDP_MSG_LABEL_REQUEST:
+ case LDP_MSG_LABEL_RELEASE:
+ case LDP_MSG_LABEL_ABORT_REQUEST:
+
+ default:
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, msg_tptr, "\n\t ", msg_tlen);
+ break;
+ }
+ /* do we want to see an additionally hexdump ? */
+ if (ndo->ndo_vflag > 1 || hexdump==TRUE)
+ print_unknown_data(ndo, tptr+sizeof(struct ldp_msg_header), "\n\t ",
+ msg_len);
+
+ tptr += msg_len+4;
+ tlen -= msg_len+4;
+ }
+ return pdu_len+4;
+trunc:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+ return 0;
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * Code by Matt Thomas, Digital Equipment Corporation
+ * with an awful lot of hacking by Jeffrey Mogul, DECWRL
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-llc.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+
+#include "llc.h"
+#include "ethertype.h"
+#include "oui.h"
+
+static const struct tok llc_values[] = {
+ { LLCSAP_NULL, "Null" },
+ { LLCSAP_GLOBAL, "Global" },
+ { LLCSAP_8021B_I, "802.1B I" },
+ { LLCSAP_8021B_G, "802.1B G" },
+ { LLCSAP_IP, "IP" },
+ { LLCSAP_SNA, "SNA" },
+ { LLCSAP_PROWAYNM, "ProWay NM" },
+ { LLCSAP_8021D, "STP" },
+ { LLCSAP_RS511, "RS511" },
+ { LLCSAP_ISO8208, "ISO8208" },
+ { LLCSAP_PROWAY, "ProWay" },
+ { LLCSAP_SNAP, "SNAP" },
+ { LLCSAP_IPX, "IPX" },
+ { LLCSAP_NETBEUI, "NetBeui" },
+ { LLCSAP_ISONS, "OSI" },
+ { 0, NULL },
+};
+
+static const struct tok llc_cmd_values[] = {
+ { LLC_UI, "ui" },
+ { LLC_TEST, "test" },
+ { LLC_XID, "xid" },
+ { LLC_UA, "ua" },
+ { LLC_DISC, "disc" },
+ { LLC_DM, "dm" },
+ { LLC_SABME, "sabme" },
+ { LLC_FRMR, "frmr" },
+ { 0, NULL }
+};
+
+static const struct tok llc_flag_values[] = {
+ { 0, "Command" },
+ { LLC_GSAP, "Response" },
+ { LLC_U_POLL, "Poll" },
+ { LLC_GSAP|LLC_U_POLL, "Final" },
+ { LLC_IS_POLL, "Poll" },
+ { LLC_GSAP|LLC_IS_POLL, "Final" },
+ { 0, NULL }
+};
+
+
+static const struct tok llc_ig_flag_values[] = {
+ { 0, "Individual" },
+ { LLC_IG, "Group" },
+ { 0, NULL }
+};
+
+
+static const struct tok llc_supervisory_values[] = {
+ { 0, "Receiver Ready" },
+ { 1, "Receiver not Ready" },
+ { 2, "Reject" },
+ { 0, NULL }
+};
+
+
+static const struct tok cisco_values[] = {
+ { PID_CISCO_CDP, "CDP" },
+ { PID_CISCO_VTP, "VTP" },
+ { PID_CISCO_DTP, "DTP" },
+ { PID_CISCO_UDLD, "UDLD" },
+ { PID_CISCO_PVST, "PVST" },
+ { PID_CISCO_VLANBRIDGE, "VLAN Bridge" },
+ { 0, NULL }
+};
+
+static const struct tok bridged_values[] = {
+ { PID_RFC2684_ETH_FCS, "Ethernet + FCS" },
+ { PID_RFC2684_ETH_NOFCS, "Ethernet w/o FCS" },
+ { PID_RFC2684_802_4_FCS, "802.4 + FCS" },
+ { PID_RFC2684_802_4_NOFCS, "802.4 w/o FCS" },
+ { PID_RFC2684_802_5_FCS, "Token Ring + FCS" },
+ { PID_RFC2684_802_5_NOFCS, "Token Ring w/o FCS" },
+ { PID_RFC2684_FDDI_FCS, "FDDI + FCS" },
+ { PID_RFC2684_FDDI_NOFCS, "FDDI w/o FCS" },
+ { PID_RFC2684_802_6_FCS, "802.6 + FCS" },
+ { PID_RFC2684_802_6_NOFCS, "802.6 w/o FCS" },
+ { PID_RFC2684_BPDU, "BPDU" },
+ { 0, NULL },
+};
+
+static const struct tok null_values[] = {
+ { 0, NULL }
+};
+
+struct oui_tok {
+ uint32_t oui;
+ const struct tok *tok;
+};
+
+static const struct oui_tok oui_to_tok[] = {
+ { OUI_ENCAP_ETHER, ethertype_values },
+ { OUI_CISCO_90, ethertype_values }, /* uses some Ethertype values */
+ { OUI_APPLETALK, ethertype_values }, /* uses some Ethertype values */
+ { OUI_CISCO, cisco_values },
+ { OUI_RFC2684, bridged_values }, /* bridged, RFC 2427 FR or RFC 2864 ATM */
+ { 0, NULL }
+};
+
+/*
+ * Returns non-zero IFF it succeeds in printing the header
+ */
+int
+llc_print(netdissect_options *ndo, const u_char *p, u_int length, u_int caplen,
+ const u_char *esrc, const u_char *edst, u_short *extracted_ethertype)
+{
+ uint8_t dsap_field, dsap, ssap_field, ssap;
+ uint16_t control;
+ int is_u;
+ register int ret;
+
+ *extracted_ethertype = 0;
+
+ if (caplen < 3 || length < 3) {
+ ND_PRINT((ndo, "[|llc]"));
+ ND_DEFAULTPRINT((u_char *)p, caplen);
+ return (1);
+ }
+
+ dsap_field = *p;
+ ssap_field = *(p + 1);
+
+ /*
+ * OK, what type of LLC frame is this? The length
+ * of the control field depends on that - I frames
+ * have a two-byte control field, and U frames have
+ * a one-byte control field.
+ */
+ control = *(p + 2);
+ if ((control & LLC_U_FMT) == LLC_U_FMT) {
+ /*
+ * U frame.
+ */
+ is_u = 1;
+ } else {
+ /*
+ * The control field in I and S frames is
+ * 2 bytes...
+ */
+ if (caplen < 4 || length < 4) {
+ ND_PRINT((ndo, "[|llc]"));
+ ND_DEFAULTPRINT((u_char *)p, caplen);
+ return (1);
+ }
+
+ /*
+ * ...and is little-endian.
+ */
+ control = EXTRACT_LE_16BITS(p + 2);
+ is_u = 0;
+ }
+
+ if (ssap_field == LLCSAP_GLOBAL && dsap_field == LLCSAP_GLOBAL) {
+ /*
+ * This is an Ethernet_802.3 IPX frame; it has an
+ * 802.3 header (i.e., an Ethernet header where the
+ * type/length field is <= ETHERMTU, i.e. it's a length
+ * field, not a type field), but has no 802.2 header -
+ * the IPX packet starts right after the Ethernet header,
+ * with a signature of two bytes of 0xFF (which is
+ * LLCSAP_GLOBAL).
+ *
+ * (It might also have been an Ethernet_802.3 IPX at
+ * one time, but got bridged onto another network,
+ * such as an 802.11 network; this has appeared in at
+ * least one capture file.)
+ */
+
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "IPX 802.3: "));
+
+ ipx_print(ndo, p, length);
+ return (1);
+ }
+
+ dsap = dsap_field & ~LLC_IG;
+ ssap = ssap_field & ~LLC_GSAP;
+
+ if (ndo->ndo_eflag) {
+ ND_PRINT((ndo, "LLC, dsap %s (0x%02x) %s, ssap %s (0x%02x) %s",
+ tok2str(llc_values, "Unknown", dsap),
+ dsap,
+ tok2str(llc_ig_flag_values, "Unknown", dsap_field & LLC_IG),
+ tok2str(llc_values, "Unknown", ssap),
+ ssap,
+ tok2str(llc_flag_values, "Unknown", ssap_field & LLC_GSAP)));
+
+ if (is_u) {
+ ND_PRINT((ndo, ", ctrl 0x%02x: ", control));
+ } else {
+ ND_PRINT((ndo, ", ctrl 0x%04x: ", control));
+ }
+ }
+
+ if (ssap == LLCSAP_8021D && dsap == LLCSAP_8021D &&
+ control == LLC_UI) {
+ stp_print(ndo, p+3, length-3);
+ return (1);
+ }
+
+ if (ssap == LLCSAP_IP && dsap == LLCSAP_IP &&
+ control == LLC_UI) {
+ if (caplen < 4 || length < 4) {
+ ND_PRINT((ndo, "[|llc]"));
+ ND_DEFAULTPRINT((u_char *)p, caplen);
+ return (1);
+ }
+ ip_print(ndo, p+4, length-4);
+ return (1);
+ }
+
+ if (ssap == LLCSAP_IPX && dsap == LLCSAP_IPX &&
+ control == LLC_UI) {
+ /*
+ * This is an Ethernet_802.2 IPX frame, with an 802.3
+ * header and an 802.2 LLC header with the source and
+ * destination SAPs being the IPX SAP.
+ *
+ * Skip DSAP, LSAP, and control field.
+ */
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "IPX 802.2: "));
+
+ ipx_print(ndo, p+3, length-3);
+ return (1);
+ }
+
+#ifdef TCPDUMP_DO_SMB
+ if (ssap == LLCSAP_NETBEUI && dsap == LLCSAP_NETBEUI
+ && (!(control & LLC_S_FMT) || control == LLC_U_FMT)) {
+ /*
+ * we don't actually have a full netbeui parser yet, but the
+ * smb parser can handle many smb-in-netbeui packets, which
+ * is very useful, so we call that
+ *
+ * We don't call it for S frames, however, just I frames
+ * (which are frames that don't have the low-order bit,
+ * LLC_S_FMT, set in the first byte of the control field)
+ * and UI frames (whose control field is just 3, LLC_U_FMT).
+ */
+
+ /*
+ * Skip the LLC header.
+ */
+ if (is_u) {
+ p += 3;
+ length -= 3;
+ } else {
+ p += 4;
+ length -= 4;
+ }
+ netbeui_print(ndo, control, p, length);
+ return (1);
+ }
+#endif
+ if (ssap == LLCSAP_ISONS && dsap == LLCSAP_ISONS
+ && control == LLC_UI) {
+ isoclns_print(ndo, p + 3, length - 3, caplen - 3);
+ return (1);
+ }
+
+ if (ssap == LLCSAP_SNAP && dsap == LLCSAP_SNAP
+ && control == LLC_UI) {
+ /*
+ * XXX - what *is* the right bridge pad value here?
+ * Does anybody ever bridge one form of LAN traffic
+ * over a networking type that uses 802.2 LLC?
+ */
+ ret = snap_print(ndo, p+3, length-3, caplen-3, 2);
+ if (ret)
+ return (ret);
+ }
+
+ if (!ndo->ndo_eflag) {
+ if (ssap == dsap) {
+ if (esrc == NULL || edst == NULL)
+ ND_PRINT((ndo, "%s ", tok2str(llc_values, "Unknown DSAP 0x%02x", dsap)));
+ else
+ ND_PRINT((ndo, "%s > %s %s ",
+ etheraddr_string(ndo, esrc),
+ etheraddr_string(ndo, edst),
+ tok2str(llc_values, "Unknown DSAP 0x%02x", dsap)));
+ } else {
+ if (esrc == NULL || edst == NULL)
+ ND_PRINT((ndo, "%s > %s ",
+ tok2str(llc_values, "Unknown SSAP 0x%02x", ssap),
+ tok2str(llc_values, "Unknown DSAP 0x%02x", dsap)));
+ else
+ ND_PRINT((ndo, "%s %s > %s %s ",
+ etheraddr_string(ndo, esrc),
+ tok2str(llc_values, "Unknown SSAP 0x%02x", ssap),
+ etheraddr_string(ndo, edst),
+ tok2str(llc_values, "Unknown DSAP 0x%02x", dsap)));
+ }
+ }
+
+ if (is_u) {
+ ND_PRINT((ndo, "Unnumbered, %s, Flags [%s], length %u",
+ tok2str(llc_cmd_values, "%02x", LLC_U_CMD(control)),
+ tok2str(llc_flag_values,"?",(ssap_field & LLC_GSAP) | (control & LLC_U_POLL)),
+ length));
+
+ p += 3;
+
+ if ((control & ~LLC_U_POLL) == LLC_XID) {
+ if (*p == LLC_XID_FI) {
+ ND_PRINT((ndo, ": %02x %02x", p[1], p[2]));
+ }
+ }
+ } else {
+ if ((control & LLC_S_FMT) == LLC_S_FMT) {
+ ND_PRINT((ndo, "Supervisory, %s, rcv seq %u, Flags [%s], length %u",
+ tok2str(llc_supervisory_values,"?",LLC_S_CMD(control)),
+ LLC_IS_NR(control),
+ tok2str(llc_flag_values,"?",(ssap_field & LLC_GSAP) | (control & LLC_IS_POLL)),
+ length));
+ } else {
+ ND_PRINT((ndo, "Information, send seq %u, rcv seq %u, Flags [%s], length %u",
+ LLC_I_NS(control),
+ LLC_IS_NR(control),
+ tok2str(llc_flag_values,"?",(ssap_field & LLC_GSAP) | (control & LLC_IS_POLL)),
+ length));
+ }
+ }
+ return(1);
+}
+
+int
+snap_print(netdissect_options *ndo, const u_char *p, u_int length, u_int caplen, u_int bridge_pad)
+{
+ uint32_t orgcode;
+ register u_short et;
+ register int ret;
+
+ ND_TCHECK2(*p, 5);
+ if (caplen < 5 || length < 5)
+ goto trunc;
+ orgcode = EXTRACT_24BITS(p);
+ et = EXTRACT_16BITS(p + 3);
+
+ if (ndo->ndo_eflag) {
+ const struct tok *tok = null_values;
+ const struct oui_tok *otp;
+
+ for (otp = &oui_to_tok[0]; otp->tok != NULL; otp++) {
+ if (otp->oui == orgcode) {
+ tok = otp->tok;
+ break;
+ }
+ }
+ ND_PRINT((ndo, "oui %s (0x%06x), %s %s (0x%04x): ",
+ tok2str(oui_values, "Unknown", orgcode),
+ orgcode,
+ (orgcode == 0x000000 ? "ethertype" : "pid"),
+ tok2str(tok, "Unknown", et),
+ et));
+ }
+ p += 5;
+ length -= 5;
+ caplen -= 5;
+
+ switch (orgcode) {
+ case OUI_ENCAP_ETHER:
+ case OUI_CISCO_90:
+ /*
+ * This is an encapsulated Ethernet packet,
+ * or a packet bridged by some piece of
+ * Cisco hardware; the protocol ID is
+ * an Ethernet protocol type.
+ */
+ ret = ethertype_print(ndo, et, p, length, caplen);
+ if (ret)
+ return (ret);
+ break;
+
+ case OUI_APPLETALK:
+ if (et == ETHERTYPE_ATALK) {
+ /*
+ * No, I have no idea why Apple used one
+ * of their own OUIs, rather than
+ * 0x000000, and an Ethernet packet
+ * type, for Appletalk data packets,
+ * but used 0x000000 and an Ethernet
+ * packet type for AARP packets.
+ */
+ ret = ethertype_print(ndo, et, p, length, caplen);
+ if (ret)
+ return (ret);
+ }
+ break;
+
+ case OUI_CISCO:
+ switch (et) {
+ case PID_CISCO_CDP:
+ cdp_print(ndo, p, length, caplen);
+ return (1);
+ case PID_CISCO_DTP:
+ dtp_print(ndo, p, length);
+ return (1);
+ case PID_CISCO_UDLD:
+ udld_print(ndo, p, length);
+ return (1);
+ case PID_CISCO_VTP:
+ vtp_print(ndo, p, length);
+ return (1);
+ case PID_CISCO_PVST:
+ case PID_CISCO_VLANBRIDGE:
+ stp_print(ndo, p, length);
+ return (1);
+ default:
+ break;
+ }
+ break;
+
+ case OUI_RFC2684:
+ switch (et) {
+
+ case PID_RFC2684_ETH_FCS:
+ case PID_RFC2684_ETH_NOFCS:
+ /*
+ * XXX - remove the last two bytes for
+ * PID_RFC2684_ETH_FCS?
+ */
+ /*
+ * Skip the padding.
+ */
+ ND_TCHECK2(*p, bridge_pad);
+ caplen -= bridge_pad;
+ length -= bridge_pad;
+ p += bridge_pad;
+
+ /*
+ * What remains is an Ethernet packet.
+ */
+ ether_print(ndo, p, length, caplen, NULL, NULL);
+ return (1);
+
+ case PID_RFC2684_802_5_FCS:
+ case PID_RFC2684_802_5_NOFCS:
+ /*
+ * XXX - remove the last two bytes for
+ * PID_RFC2684_ETH_FCS?
+ */
+ /*
+ * Skip the padding, but not the Access
+ * Control field.
+ */
+ ND_TCHECK2(*p, bridge_pad);
+ caplen -= bridge_pad;
+ length -= bridge_pad;
+ p += bridge_pad;
+
+ /*
+ * What remains is an 802.5 Token Ring
+ * packet.
+ */
+ token_print(ndo, p, length, caplen);
+ return (1);
+
+ case PID_RFC2684_FDDI_FCS:
+ case PID_RFC2684_FDDI_NOFCS:
+ /*
+ * XXX - remove the last two bytes for
+ * PID_RFC2684_ETH_FCS?
+ */
+ /*
+ * Skip the padding.
+ */
+ ND_TCHECK2(*p, bridge_pad + 1);
+ caplen -= bridge_pad + 1;
+ length -= bridge_pad + 1;
+ p += bridge_pad + 1;
+
+ /*
+ * What remains is an FDDI packet.
+ */
+ fddi_print(ndo, p, length, caplen);
+ return (1);
+
+ case PID_RFC2684_BPDU:
+ stp_print(ndo, p, length);
+ return (1);
+ }
+ }
+ return (0);
+
+trunc:
+ ND_PRINT((ndo, "[|snap]"));
+ return (1);
+}
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1998-2007 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 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>
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-lldp.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+#include "af.h"
+#include "oui.h"
+
+#define LLDP_EXTRACT_TYPE(x) (((x)&0xfe00)>>9)
+#define LLDP_EXTRACT_LEN(x) ((x)&0x01ff)
+
+/*
+ * TLV type codes
+ */
+#define LLDP_END_TLV 0
+#define LLDP_CHASSIS_ID_TLV 1
+#define LLDP_PORT_ID_TLV 2
+#define LLDP_TTL_TLV 3
+#define LLDP_PORT_DESCR_TLV 4
+#define LLDP_SYSTEM_NAME_TLV 5
+#define LLDP_SYSTEM_DESCR_TLV 6
+#define LLDP_SYSTEM_CAP_TLV 7
+#define LLDP_MGMT_ADDR_TLV 8
+#define LLDP_PRIVATE_TLV 127
+
+static const struct tok lldp_tlv_values[] = {
+ { LLDP_END_TLV, "End" },
+ { LLDP_CHASSIS_ID_TLV, "Chassis ID" },
+ { LLDP_PORT_ID_TLV, "Port ID" },
+ { LLDP_TTL_TLV, "Time to Live" },
+ { LLDP_PORT_DESCR_TLV, "Port Description" },
+ { LLDP_SYSTEM_NAME_TLV, "System Name" },
+ { LLDP_SYSTEM_DESCR_TLV, "System Description" },
+ { LLDP_SYSTEM_CAP_TLV, "System Capabilities" },
+ { LLDP_MGMT_ADDR_TLV, "Management Address" },
+ { LLDP_PRIVATE_TLV, "Organization specific" },
+ { 0, NULL}
+};
+
+/*
+ * Chassis ID subtypes
+ */
+#define LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE 1
+#define LLDP_CHASSIS_INTF_ALIAS_SUBTYPE 2
+#define LLDP_CHASSIS_PORT_COMP_SUBTYPE 3
+#define LLDP_CHASSIS_MAC_ADDR_SUBTYPE 4
+#define LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE 5
+#define LLDP_CHASSIS_INTF_NAME_SUBTYPE 6
+#define LLDP_CHASSIS_LOCAL_SUBTYPE 7
+
+static const struct tok lldp_chassis_subtype_values[] = {
+ { LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE, "Chassis component"},
+ { LLDP_CHASSIS_INTF_ALIAS_SUBTYPE, "Interface alias"},
+ { LLDP_CHASSIS_PORT_COMP_SUBTYPE, "Port component"},
+ { LLDP_CHASSIS_MAC_ADDR_SUBTYPE, "MAC address"},
+ { LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE, "Network address"},
+ { LLDP_CHASSIS_INTF_NAME_SUBTYPE, "Interface name"},
+ { LLDP_CHASSIS_LOCAL_SUBTYPE, "Local"},
+ { 0, NULL}
+};
+
+/*
+ * Port ID subtypes
+ */
+#define LLDP_PORT_INTF_ALIAS_SUBTYPE 1
+#define LLDP_PORT_PORT_COMP_SUBTYPE 2
+#define LLDP_PORT_MAC_ADDR_SUBTYPE 3
+#define LLDP_PORT_NETWORK_ADDR_SUBTYPE 4
+#define LLDP_PORT_INTF_NAME_SUBTYPE 5
+#define LLDP_PORT_AGENT_CIRC_ID_SUBTYPE 6
+#define LLDP_PORT_LOCAL_SUBTYPE 7
+
+static const struct tok lldp_port_subtype_values[] = {
+ { LLDP_PORT_INTF_ALIAS_SUBTYPE, "Interface alias"},
+ { LLDP_PORT_PORT_COMP_SUBTYPE, "Port component"},
+ { LLDP_PORT_MAC_ADDR_SUBTYPE, "MAC address"},
+ { LLDP_PORT_NETWORK_ADDR_SUBTYPE, "Network Address"},
+ { LLDP_PORT_INTF_NAME_SUBTYPE, "Interface Name"},
+ { LLDP_PORT_AGENT_CIRC_ID_SUBTYPE, "Agent circuit ID"},
+ { LLDP_PORT_LOCAL_SUBTYPE, "Local"},
+ { 0, NULL}
+};
+
+/*
+ * System Capabilities
+ */
+#define LLDP_CAP_OTHER (1 << 0)
+#define LLDP_CAP_REPEATER (1 << 1)
+#define LLDP_CAP_BRIDGE (1 << 2)
+#define LLDP_CAP_WLAN_AP (1 << 3)
+#define LLDP_CAP_ROUTER (1 << 4)
+#define LLDP_CAP_PHONE (1 << 5)
+#define LLDP_CAP_DOCSIS (1 << 6)
+#define LLDP_CAP_STATION_ONLY (1 << 7)
+
+static const struct tok lldp_cap_values[] = {
+ { LLDP_CAP_OTHER, "Other"},
+ { LLDP_CAP_REPEATER, "Repeater"},
+ { LLDP_CAP_BRIDGE, "Bridge"},
+ { LLDP_CAP_WLAN_AP, "WLAN AP"},
+ { LLDP_CAP_ROUTER, "Router"},
+ { LLDP_CAP_PHONE, "Telephone"},
+ { LLDP_CAP_DOCSIS, "Docsis"},
+ { LLDP_CAP_STATION_ONLY, "Station Only"},
+ { 0, NULL}
+};
+
+#define LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID 1
+#define LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID 2
+#define LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME 3
+#define LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY 4
+#define LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION 8
+#define LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION 9
+#define LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION 10
+#define LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION 11
+#define LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY 12
+#define LLDP_PRIVATE_8021_SUBTYPE_EVB 13
+#define LLDP_PRIVATE_8021_SUBTYPE_CDCP 14
+
+static const struct tok lldp_8021_subtype_values[] = {
+ { LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID, "Port VLAN Id"},
+ { LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID, "Port and Protocol VLAN ID"},
+ { LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME, "VLAN name"},
+ { LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY, "Protocol Identity"},
+ { LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION, "Congestion Notification"},
+ { LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION, "ETS Configuration"},
+ { LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION, "ETS Recommendation"},
+ { LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION, "Priority Flow Control Configuration"},
+ { LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY, "Application Priority"},
+ { LLDP_PRIVATE_8021_SUBTYPE_EVB, "EVB"},
+ { LLDP_PRIVATE_8021_SUBTYPE_CDCP,"CDCP"},
+ { 0, NULL}
+};
+
+#define LLDP_8021_PORT_PROTOCOL_VLAN_SUPPORT (1 << 1)
+#define LLDP_8021_PORT_PROTOCOL_VLAN_STATUS (1 << 2)
+
+static const struct tok lldp_8021_port_protocol_id_values[] = {
+ { LLDP_8021_PORT_PROTOCOL_VLAN_SUPPORT, "supported"},
+ { LLDP_8021_PORT_PROTOCOL_VLAN_STATUS, "enabled"},
+ { 0, NULL}
+};
+
+#define LLDP_PRIVATE_8023_SUBTYPE_MACPHY 1
+#define LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER 2
+#define LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR 3
+#define LLDP_PRIVATE_8023_SUBTYPE_MTU 4
+
+static const struct tok lldp_8023_subtype_values[] = {
+ { LLDP_PRIVATE_8023_SUBTYPE_MACPHY, "MAC/PHY configuration/status"},
+ { LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER, "Power via MDI"},
+ { LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR, "Link aggregation"},
+ { LLDP_PRIVATE_8023_SUBTYPE_MTU, "Max frame size"},
+ { 0, NULL}
+};
+
+#define LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES 1
+#define LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY 2
+#define LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID 3
+#define LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI 4
+#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV 5
+#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV 6
+#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV 7
+#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER 8
+#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME 9
+#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME 10
+#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID 11
+
+static const struct tok lldp_tia_subtype_values[] = {
+ { LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES, "LLDP-MED Capabilities" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY, "Network policy" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID, "Location identification" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI, "Extended power-via-MDI" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV, "Inventory - hardware revision" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV, "Inventory - firmware revision" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV, "Inventory - software revision" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER, "Inventory - serial number" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME, "Inventory - manufacturer name" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME, "Inventory - model name" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID, "Inventory - asset ID" },
+ { 0, NULL}
+};
+
+#define LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_METERS 1
+#define LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_FLOORS 2
+
+static const struct tok lldp_tia_location_altitude_type_values[] = {
+ { LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_METERS, "meters"},
+ { LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_FLOORS, "floors"},
+ { 0, NULL}
+};
+
+/* ANSI/TIA-1057 - Annex B */
+#define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A1 1
+#define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A2 2
+#define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A3 3
+#define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A4 4
+#define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A5 5
+#define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A6 6
+
+static const struct tok lldp_tia_location_lci_catype_values[] = {
+ { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A1, "national subdivisions (state,canton,region,province,prefecture)"},
+ { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A2, "county, parish, gun, district"},
+ { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A3, "city, township, shi"},
+ { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A4, "city division, borough, city district, ward chou"},
+ { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A5, "neighborhood, block"},
+ { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A6, "street"},
+ { 0, NULL}
+};
+
+static const struct tok lldp_tia_location_lci_what_values[] = {
+ { 0, "location of DHCP server"},
+ { 1, "location of the network element believed to be closest to the client"},
+ { 2, "location of the client"},
+ { 0, NULL}
+};
+
+/*
+ * From RFC 3636 - dot3MauType
+ */
+#define LLDP_MAU_TYPE_UNKNOWN 0
+#define LLDP_MAU_TYPE_AUI 1
+#define LLDP_MAU_TYPE_10BASE_5 2
+#define LLDP_MAU_TYPE_FOIRL 3
+#define LLDP_MAU_TYPE_10BASE_2 4
+#define LLDP_MAU_TYPE_10BASE_T 5
+#define LLDP_MAU_TYPE_10BASE_FP 6
+#define LLDP_MAU_TYPE_10BASE_FB 7
+#define LLDP_MAU_TYPE_10BASE_FL 8
+#define LLDP_MAU_TYPE_10BROAD36 9
+#define LLDP_MAU_TYPE_10BASE_T_HD 10
+#define LLDP_MAU_TYPE_10BASE_T_FD 11
+#define LLDP_MAU_TYPE_10BASE_FL_HD 12
+#define LLDP_MAU_TYPE_10BASE_FL_FD 13
+#define LLDP_MAU_TYPE_100BASE_T4 14
+#define LLDP_MAU_TYPE_100BASE_TX_HD 15
+#define LLDP_MAU_TYPE_100BASE_TX_FD 16
+#define LLDP_MAU_TYPE_100BASE_FX_HD 17
+#define LLDP_MAU_TYPE_100BASE_FX_FD 18
+#define LLDP_MAU_TYPE_100BASE_T2_HD 19
+#define LLDP_MAU_TYPE_100BASE_T2_FD 20
+#define LLDP_MAU_TYPE_1000BASE_X_HD 21
+#define LLDP_MAU_TYPE_1000BASE_X_FD 22
+#define LLDP_MAU_TYPE_1000BASE_LX_HD 23
+#define LLDP_MAU_TYPE_1000BASE_LX_FD 24
+#define LLDP_MAU_TYPE_1000BASE_SX_HD 25
+#define LLDP_MAU_TYPE_1000BASE_SX_FD 26
+#define LLDP_MAU_TYPE_1000BASE_CX_HD 27
+#define LLDP_MAU_TYPE_1000BASE_CX_FD 28
+#define LLDP_MAU_TYPE_1000BASE_T_HD 29
+#define LLDP_MAU_TYPE_1000BASE_T_FD 30
+#define LLDP_MAU_TYPE_10GBASE_X 31
+#define LLDP_MAU_TYPE_10GBASE_LX4 32
+#define LLDP_MAU_TYPE_10GBASE_R 33
+#define LLDP_MAU_TYPE_10GBASE_ER 34
+#define LLDP_MAU_TYPE_10GBASE_LR 35
+#define LLDP_MAU_TYPE_10GBASE_SR 36
+#define LLDP_MAU_TYPE_10GBASE_W 37
+#define LLDP_MAU_TYPE_10GBASE_EW 38
+#define LLDP_MAU_TYPE_10GBASE_LW 39
+#define LLDP_MAU_TYPE_10GBASE_SW 40
+
+static const struct tok lldp_mau_types_values[] = {
+ { LLDP_MAU_TYPE_UNKNOWN, "Unknown"},
+ { LLDP_MAU_TYPE_AUI, "AUI"},
+ { LLDP_MAU_TYPE_10BASE_5, "10BASE_5"},
+ { LLDP_MAU_TYPE_FOIRL, "FOIRL"},
+ { LLDP_MAU_TYPE_10BASE_2, "10BASE2"},
+ { LLDP_MAU_TYPE_10BASE_T, "10BASET duplex mode unknown"},
+ { LLDP_MAU_TYPE_10BASE_FP, "10BASEFP"},
+ { LLDP_MAU_TYPE_10BASE_FB, "10BASEFB"},
+ { LLDP_MAU_TYPE_10BASE_FL, "10BASEFL duplex mode unknown"},
+ { LLDP_MAU_TYPE_10BROAD36, "10BROAD36"},
+ { LLDP_MAU_TYPE_10BASE_T_HD, "10BASET hdx"},
+ { LLDP_MAU_TYPE_10BASE_T_FD, "10BASET fdx"},
+ { LLDP_MAU_TYPE_10BASE_FL_HD, "10BASEFL hdx"},
+ { LLDP_MAU_TYPE_10BASE_FL_FD, "10BASEFL fdx"},
+ { LLDP_MAU_TYPE_100BASE_T4, "100BASET4"},
+ { LLDP_MAU_TYPE_100BASE_TX_HD, "100BASETX hdx"},
+ { LLDP_MAU_TYPE_100BASE_TX_FD, "100BASETX fdx"},
+ { LLDP_MAU_TYPE_100BASE_FX_HD, "100BASEFX hdx"},
+ { LLDP_MAU_TYPE_100BASE_FX_FD, "100BASEFX fdx"},
+ { LLDP_MAU_TYPE_100BASE_T2_HD, "100BASET2 hdx"},
+ { LLDP_MAU_TYPE_100BASE_T2_FD, "100BASET2 fdx"},
+ { LLDP_MAU_TYPE_1000BASE_X_HD, "1000BASEX hdx"},
+ { LLDP_MAU_TYPE_1000BASE_X_FD, "1000BASEX fdx"},
+ { LLDP_MAU_TYPE_1000BASE_LX_HD, "1000BASELX hdx"},
+ { LLDP_MAU_TYPE_1000BASE_LX_FD, "1000BASELX fdx"},
+ { LLDP_MAU_TYPE_1000BASE_SX_HD, "1000BASESX hdx"},
+ { LLDP_MAU_TYPE_1000BASE_SX_FD, "1000BASESX fdx"},
+ { LLDP_MAU_TYPE_1000BASE_CX_HD, "1000BASECX hdx"},
+ { LLDP_MAU_TYPE_1000BASE_CX_FD, "1000BASECX fdx"},
+ { LLDP_MAU_TYPE_1000BASE_T_HD, "1000BASET hdx"},
+ { LLDP_MAU_TYPE_1000BASE_T_FD, "1000BASET fdx"},
+ { LLDP_MAU_TYPE_10GBASE_X, "10GBASEX"},
+ { LLDP_MAU_TYPE_10GBASE_LX4, "10GBASELX4"},
+ { LLDP_MAU_TYPE_10GBASE_R, "10GBASER"},
+ { LLDP_MAU_TYPE_10GBASE_ER, "10GBASEER"},
+ { LLDP_MAU_TYPE_10GBASE_LR, "10GBASELR"},
+ { LLDP_MAU_TYPE_10GBASE_SR, "10GBASESR"},
+ { LLDP_MAU_TYPE_10GBASE_W, "10GBASEW"},
+ { LLDP_MAU_TYPE_10GBASE_EW, "10GBASEEW"},
+ { LLDP_MAU_TYPE_10GBASE_LW, "10GBASELW"},
+ { LLDP_MAU_TYPE_10GBASE_SW, "10GBASESW"},
+ { 0, NULL}
+};
+
+#define LLDP_8023_AUTONEGOTIATION_SUPPORT (1 << 0)
+#define LLDP_8023_AUTONEGOTIATION_STATUS (1 << 1)
+
+static const struct tok lldp_8023_autonegotiation_values[] = {
+ { LLDP_8023_AUTONEGOTIATION_SUPPORT, "supported"},
+ { LLDP_8023_AUTONEGOTIATION_STATUS, "enabled"},
+ { 0, NULL}
+};
+
+#define LLDP_TIA_CAPABILITY_MED (1 << 0)
+#define LLDP_TIA_CAPABILITY_NETWORK_POLICY (1 << 1)
+#define LLDP_TIA_CAPABILITY_LOCATION_IDENTIFICATION (1 << 2)
+#define LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PSE (1 << 3)
+#define LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PD (1 << 4)
+#define LLDP_TIA_CAPABILITY_INVENTORY (1 << 5)
+
+static const struct tok lldp_tia_capabilities_values[] = {
+ { LLDP_TIA_CAPABILITY_MED, "LLDP-MED capabilities"},
+ { LLDP_TIA_CAPABILITY_NETWORK_POLICY, "network policy"},
+ { LLDP_TIA_CAPABILITY_LOCATION_IDENTIFICATION, "location identification"},
+ { LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PSE, "extended power via MDI-PSE"},
+ { LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PD, "extended power via MDI-PD"},
+ { LLDP_TIA_CAPABILITY_INVENTORY, "Inventory"},
+ { 0, NULL}
+};
+
+#define LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_1 1
+#define LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_2 2
+#define LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_3 3
+#define LLDP_TIA_DEVICE_TYPE_NETWORK_CONNECTIVITY 4
+
+static const struct tok lldp_tia_device_type_values[] = {
+ { LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_1, "endpoint class 1"},
+ { LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_2, "endpoint class 2"},
+ { LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_3, "endpoint class 3"},
+ { LLDP_TIA_DEVICE_TYPE_NETWORK_CONNECTIVITY, "network connectivity"},
+ { 0, NULL}
+};
+
+#define LLDP_TIA_APPLICATION_TYPE_VOICE 1
+#define LLDP_TIA_APPLICATION_TYPE_VOICE_SIGNALING 2
+#define LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE 3
+#define LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE_SIGNALING 4
+#define LLDP_TIA_APPLICATION_TYPE_SOFTPHONE_VOICE 5
+#define LLDP_TIA_APPLICATION_TYPE_VIDEO_CONFERENCING 6
+#define LLDP_TIA_APPLICATION_TYPE_STREAMING_VIDEO 7
+#define LLDP_TIA_APPLICATION_TYPE_VIDEO_SIGNALING 8
+
+static const struct tok lldp_tia_application_type_values[] = {
+ { LLDP_TIA_APPLICATION_TYPE_VOICE, "voice"},
+ { LLDP_TIA_APPLICATION_TYPE_VOICE_SIGNALING, "voice signaling"},
+ { LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE, "guest voice"},
+ { LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE_SIGNALING, "guest voice signaling"},
+ { LLDP_TIA_APPLICATION_TYPE_SOFTPHONE_VOICE, "softphone voice"},
+ { LLDP_TIA_APPLICATION_TYPE_VIDEO_CONFERENCING, "video conferencing"},
+ { LLDP_TIA_APPLICATION_TYPE_STREAMING_VIDEO, "streaming video"},
+ { LLDP_TIA_APPLICATION_TYPE_VIDEO_SIGNALING, "video signaling"},
+ { 0, NULL}
+};
+
+#define LLDP_TIA_NETWORK_POLICY_X_BIT (1 << 5)
+#define LLDP_TIA_NETWORK_POLICY_T_BIT (1 << 6)
+#define LLDP_TIA_NETWORK_POLICY_U_BIT (1 << 7)
+
+static const struct tok lldp_tia_network_policy_bits_values[] = {
+ { LLDP_TIA_NETWORK_POLICY_U_BIT, "Unknown"},
+ { LLDP_TIA_NETWORK_POLICY_T_BIT, "Tagged"},
+ { LLDP_TIA_NETWORK_POLICY_X_BIT, "reserved"},
+ { 0, NULL}
+};
+
+#define LLDP_EXTRACT_NETWORK_POLICY_VLAN(x) (((x)&0x1ffe)>>1)
+#define LLDP_EXTRACT_NETWORK_POLICY_L2_PRIORITY(x) (((x)&0x01ff)>>6)
+#define LLDP_EXTRACT_NETWORK_POLICY_DSCP(x) ((x)&0x003f)
+
+#define LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED 1
+#define LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS 2
+#define LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN 3
+
+static const struct tok lldp_tia_location_data_format_values[] = {
+ { LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED, "coordinate-based LCI"},
+ { LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS, "civic address LCI"},
+ { LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN, "ECS ELIN"},
+ { 0, NULL}
+};
+
+#define LLDP_TIA_LOCATION_DATUM_WGS_84 1
+#define LLDP_TIA_LOCATION_DATUM_NAD_83_NAVD_88 2
+#define LLDP_TIA_LOCATION_DATUM_NAD_83_MLLW 3
+
+static const struct tok lldp_tia_location_datum_type_values[] = {
+ { LLDP_TIA_LOCATION_DATUM_WGS_84, "World Geodesic System 1984"},
+ { LLDP_TIA_LOCATION_DATUM_NAD_83_NAVD_88, "North American Datum 1983 (NAVD88)"},
+ { LLDP_TIA_LOCATION_DATUM_NAD_83_MLLW, "North American Datum 1983 (MLLW)"},
+ { 0, NULL}
+};
+
+#define LLDP_TIA_POWER_SOURCE_PSE 1
+#define LLDP_TIA_POWER_SOURCE_LOCAL 2
+#define LLDP_TIA_POWER_SOURCE_PSE_AND_LOCAL 3
+
+static const struct tok lldp_tia_power_source_values[] = {
+ { LLDP_TIA_POWER_SOURCE_PSE, "PSE - primary power source"},
+ { LLDP_TIA_POWER_SOURCE_LOCAL, "local - backup power source"},
+ { LLDP_TIA_POWER_SOURCE_PSE_AND_LOCAL, "PSE+local - reserved"},
+ { 0, NULL}
+};
+
+#define LLDP_TIA_POWER_PRIORITY_CRITICAL 1
+#define LLDP_TIA_POWER_PRIORITY_HIGH 2
+#define LLDP_TIA_POWER_PRIORITY_LOW 3
+
+static const struct tok lldp_tia_power_priority_values[] = {
+ { LLDP_TIA_POWER_PRIORITY_CRITICAL, "critical"},
+ { LLDP_TIA_POWER_PRIORITY_HIGH, "high"},
+ { LLDP_TIA_POWER_PRIORITY_LOW, "low"},
+ { 0, NULL}
+};
+
+#define LLDP_TIA_POWER_VAL_MAX 1024
+
+static const struct tok lldp_tia_inventory_values[] = {
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV, "Hardware revision" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV, "Firmware revision" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV, "Software revision" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER, "Serial number" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME, "Manufacturer name" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME, "Model name" },
+ { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID, "Asset ID" },
+ { 0, NULL}
+};
+
+/*
+ * From RFC 3636 - ifMauAutoNegCapAdvertisedBits
+ */
+#define LLDP_MAU_PMD_OTHER (1 << 15)
+#define LLDP_MAU_PMD_10BASE_T (1 << 14)
+#define LLDP_MAU_PMD_10BASE_T_FD (1 << 13)
+#define LLDP_MAU_PMD_100BASE_T4 (1 << 12)
+#define LLDP_MAU_PMD_100BASE_TX (1 << 11)
+#define LLDP_MAU_PMD_100BASE_TX_FD (1 << 10)
+#define LLDP_MAU_PMD_100BASE_T2 (1 << 9)
+#define LLDP_MAU_PMD_100BASE_T2_FD (1 << 8)
+#define LLDP_MAU_PMD_FDXPAUSE (1 << 7)
+#define LLDP_MAU_PMD_FDXAPAUSE (1 << 6)
+#define LLDP_MAU_PMD_FDXSPAUSE (1 << 5)
+#define LLDP_MAU_PMD_FDXBPAUSE (1 << 4)
+#define LLDP_MAU_PMD_1000BASE_X (1 << 3)
+#define LLDP_MAU_PMD_1000BASE_X_FD (1 << 2)
+#define LLDP_MAU_PMD_1000BASE_T (1 << 1)
+#define LLDP_MAU_PMD_1000BASE_T_FD (1 << 0)
+
+static const struct tok lldp_pmd_capability_values[] = {
+ { LLDP_MAU_PMD_10BASE_T, "10BASE-T hdx"},
+ { LLDP_MAU_PMD_10BASE_T_FD, "10BASE-T fdx"},
+ { LLDP_MAU_PMD_100BASE_T4, "100BASE-T4"},
+ { LLDP_MAU_PMD_100BASE_TX, "100BASE-TX hdx"},
+ { LLDP_MAU_PMD_100BASE_TX_FD, "100BASE-TX fdx"},
+ { LLDP_MAU_PMD_100BASE_T2, "100BASE-T2 hdx"},
+ { LLDP_MAU_PMD_100BASE_T2_FD, "100BASE-T2 fdx"},
+ { LLDP_MAU_PMD_FDXPAUSE, "Pause for fdx links"},
+ { LLDP_MAU_PMD_FDXAPAUSE, "Asym PAUSE for fdx"},
+ { LLDP_MAU_PMD_FDXSPAUSE, "Sym PAUSE for fdx"},
+ { LLDP_MAU_PMD_FDXBPAUSE, "Asym and Sym PAUSE for fdx"},
+ { LLDP_MAU_PMD_1000BASE_X, "1000BASE-{X LX SX CX} hdx"},
+ { LLDP_MAU_PMD_1000BASE_X_FD, "1000BASE-{X LX SX CX} fdx"},
+ { LLDP_MAU_PMD_1000BASE_T, "1000BASE-T hdx"},
+ { LLDP_MAU_PMD_1000BASE_T_FD, "1000BASE-T fdx"},
+ { 0, NULL}
+};
+
+#define LLDP_MDI_PORT_CLASS (1 << 0)
+#define LLDP_MDI_POWER_SUPPORT (1 << 1)
+#define LLDP_MDI_POWER_STATE (1 << 2)
+#define LLDP_MDI_PAIR_CONTROL_ABILITY (1 << 3)
+
+static const struct tok lldp_mdi_values[] = {
+ { LLDP_MDI_PORT_CLASS, "PSE"},
+ { LLDP_MDI_POWER_SUPPORT, "supported"},
+ { LLDP_MDI_POWER_STATE, "enabled"},
+ { LLDP_MDI_PAIR_CONTROL_ABILITY, "can be controlled"},
+ { 0, NULL}
+};
+
+#define LLDP_MDI_PSE_PORT_POWER_PAIRS_SIGNAL 1
+#define LLDP_MDI_PSE_PORT_POWER_PAIRS_SPARE 2
+
+static const struct tok lldp_mdi_power_pairs_values[] = {
+ { LLDP_MDI_PSE_PORT_POWER_PAIRS_SIGNAL, "signal"},
+ { LLDP_MDI_PSE_PORT_POWER_PAIRS_SPARE, "spare"},
+ { 0, NULL}
+};
+
+#define LLDP_MDI_POWER_CLASS0 1
+#define LLDP_MDI_POWER_CLASS1 2
+#define LLDP_MDI_POWER_CLASS2 3
+#define LLDP_MDI_POWER_CLASS3 4
+#define LLDP_MDI_POWER_CLASS4 5
+
+static const struct tok lldp_mdi_power_class_values[] = {
+ { LLDP_MDI_POWER_CLASS0, "class0"},
+ { LLDP_MDI_POWER_CLASS1, "class1"},
+ { LLDP_MDI_POWER_CLASS2, "class2"},
+ { LLDP_MDI_POWER_CLASS3, "class3"},
+ { LLDP_MDI_POWER_CLASS4, "class4"},
+ { 0, NULL}
+};
+
+#define LLDP_AGGREGATION_CAPABILTIY (1 << 0)
+#define LLDP_AGGREGATION_STATUS (1 << 1)
+
+static const struct tok lldp_aggregation_values[] = {
+ { LLDP_AGGREGATION_CAPABILTIY, "supported"},
+ { LLDP_AGGREGATION_STATUS, "enabled"},
+ { 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.
+ */
+#define LLDP_INTF_NUMB_IFX_SUBTYPE 2
+#define LLDP_INTF_NUMB_SYSPORT_SUBTYPE 3
+
+static const struct tok lldp_intf_numb_subtype_values[] = {
+ { LLDP_INTF_NUMB_IFX_SUBTYPE, "Interface Index" },
+ { LLDP_INTF_NUMB_SYSPORT_SUBTYPE, "System Port Number" },
+ { 0, NULL}
+};
+
+#define LLDP_INTF_NUM_LEN 5
+
+#define LLDP_EVB_MODE_NOT_SUPPORTED 0
+#define LLDP_EVB_MODE_EVB_BRIDGE 1
+#define LLDP_EVB_MODE_EVB_STATION 2
+#define LLDP_EVB_MODE_RESERVED 3
+
+static const struct tok lldp_evb_mode_values[]={
+ { LLDP_EVB_MODE_NOT_SUPPORTED, "Not Supported"},
+ { LLDP_EVB_MODE_EVB_BRIDGE, "EVB Bridge"},
+ { LLDP_EVB_MODE_EVB_STATION, "EVB Staion"},
+ { LLDP_EVB_MODE_RESERVED, "Reserved for future Standardization"},
+};
+
+#define NO_OF_BITS 8
+#define LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION_LENGTH 6
+#define LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION_LENGTH 25
+#define LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION_LENGTH 25
+#define LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION_LENGTH 6
+#define LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY_MIN_LENGTH 5
+#define LLDP_PRIVATE_8021_SUBTYPE_EVB_LENGTH 9
+#define LLDP_PRIVATE_8021_SUBTYPE_CDCP_MIN_LENGTH 8
+
+static void
+print_ets_priority_assignment_table(netdissect_options *ndo,
+ const u_char *ptr)
+{
+ ND_PRINT((ndo, "\n\t Priority Assignment Table"));
+ ND_PRINT((ndo, "\n\t Priority : 0 1 2 3 4 5 6 7"));
+ ND_PRINT((ndo, "\n\t Value : %-3d %-3d %-3d %-3d %-3d %-3d %-3d %-3d",
+ ptr[0]>>4,ptr[0]&0x0f,ptr[1]>>4,ptr[1]&0x0f,ptr[2]>>4,
+ ptr[2] & 0x0f, ptr[3] >> 4, ptr[3] & 0x0f));
+}
+
+static void
+print_tc_bandwidth_table(netdissect_options *ndo,
+ const u_char *ptr)
+{
+ ND_PRINT((ndo, "\n\t TC Bandwidth Table"));
+ ND_PRINT((ndo, "\n\t TC%% : 0 1 2 3 4 5 6 7"));
+ ND_PRINT((ndo, "\n\t Value : %-3d %-3d %-3d %-3d %-3d %-3d %-3d %-3d",
+ ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7]));
+}
+
+static void
+print_tsa_assignment_table(netdissect_options *ndo,
+ const u_char *ptr)
+{
+ ND_PRINT((ndo, "\n\t TSA Assignment Table"));
+ ND_PRINT((ndo, "\n\t Traffic Class: 0 1 2 3 4 5 6 7"));
+ ND_PRINT((ndo, "\n\t Value : %-3d %-3d %-3d %-3d %-3d %-3d %-3d %-3d",
+ ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7]));
+}
+
+/*
+ * Print IEEE 802.1 private extensions. (802.1AB annex E)
+ */
+static int
+lldp_private_8021_print(netdissect_options *ndo,
+ const u_char *tptr, u_int tlv_len)
+{
+ int subtype, hexdump = FALSE;
+ u_int sublen;
+ u_int tval;
+ uint8_t i;
+
+ if (tlv_len < 4) {
+ return hexdump;
+ }
+ subtype = *(tptr+3);
+
+ ND_PRINT((ndo, "\n\t %s Subtype (%u)",
+ tok2str(lldp_8021_subtype_values, "unknown", subtype),
+ subtype));
+
+ switch (subtype) {
+ case LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID:
+ if (tlv_len < 6) {
+ return hexdump;
+ }
+ ND_PRINT((ndo, "\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;
+ }
+ ND_PRINT((ndo, "\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;
+ }
+ ND_PRINT((ndo, "\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;
+ }
+ ND_PRINT((ndo, "\n\t vlan name: "));
+ safeputs(ndo, 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;
+ }
+ ND_PRINT((ndo, "\n\t protocol identity: "));
+ safeputs(ndo, tptr + 5, sublen);
+ break;
+ case LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION:
+ if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION_LENGTH){
+ return hexdump;
+ }
+ tval=*(tptr+4);
+ ND_PRINT((ndo, "\n\t Pre-Priority CNPV Indicator"));
+ ND_PRINT((ndo, "\n\t Priority : 0 1 2 3 4 5 6 7"));
+ ND_PRINT((ndo, "\n\t Value : "));
+ for(i=0;i<NO_OF_BITS;i++)
+ ND_PRINT((ndo, "%-2d ", (tval >> i) & 0x01));
+ tval=*(tptr+5);
+ ND_PRINT((ndo, "\n\t Pre-Priority Ready Indicator"));
+ ND_PRINT((ndo, "\n\t Priority : 0 1 2 3 4 5 6 7"));
+ ND_PRINT((ndo, "\n\t Value : "));
+ for(i=0;i<NO_OF_BITS;i++)
+ ND_PRINT((ndo, "%-2d ", (tval >> i) & 0x01));
+ break;
+
+ case LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION:
+ if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION_LENGTH) {
+ return hexdump;
+ }
+ tval=*(tptr+4);
+ ND_PRINT((ndo, "\n\t Willing:%d, CBS:%d, RES:%d, Max TCs:%d",
+ tval >> 7, (tval >> 6) & 0x02, (tval >> 3) & 0x07, tval & 0x07));
+
+ /*Print Priority Assignment Table*/
+ print_ets_priority_assignment_table(ndo, tptr + 5);
+
+ /*Print TC Bandwidth Table*/
+ print_tc_bandwidth_table(ndo, tptr + 9);
+
+ /* Print TSA Assignment Table */
+ print_tsa_assignment_table(ndo, tptr + 17);
+
+ break;
+
+ case LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION:
+ if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION_LENGTH) {
+ return hexdump;
+ }
+ ND_PRINT((ndo, "\n\t RES: %d", *(tptr + 4)));
+ /*Print Priority Assignment Table */
+ print_ets_priority_assignment_table(ndo, tptr + 5);
+ /*Print TC Bandwidth Table */
+ print_tc_bandwidth_table(ndo, tptr + 9);
+ /* Print TSA Assignment Table */
+ print_tsa_assignment_table(ndo, tptr + 17);
+ break;
+
+ case LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION:
+ if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION_LENGTH) {
+ return hexdump;
+ }
+ tval=*(tptr+4);
+ ND_PRINT((ndo, "\n\t Willing: %d, MBC: %d, RES: %d, PFC cap:%d ",
+ tval >> 7, (tval >> 6) & 0x01, (tval >> 4) & 0x03, (tval & 0x0f)));
+ ND_PRINT((ndo, "\n\t PFC Enable"));
+ tval=*(tptr+5);
+ ND_PRINT((ndo, "\n\t Priority : 0 1 2 3 4 5 6 7"));
+ ND_PRINT((ndo, "\n\t Value : "));
+ for(i=0;i<NO_OF_BITS;i++)
+ ND_PRINT((ndo, "%-2d ", (tval >> i) & 0x01));
+ break;
+
+ case LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY:
+ if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY_MIN_LENGTH) {
+ return hexdump;
+ }
+ ND_PRINT((ndo, "\n\t RES: %d", *(tptr + 4)));
+ if(tlv_len<=LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY_MIN_LENGTH){
+ return hexdump;
+ }
+ /* Length of Application Priority Table */
+ sublen=tlv_len-5;
+ if(sublen%3!=0){
+ return hexdump;
+ }
+ i=0;
+ ND_PRINT((ndo, "\n\t Application Priority Table"));
+ while(i<sublen) {
+ tval=*(tptr+i+5);
+ ND_PRINT((ndo, "\n\t Priority: %d, RES: %d, Sel: %d",
+ tval >> 5, (tval >> 3) & 0x03, (tval & 0x07)));
+ ND_PRINT((ndo, "Protocol ID: %d", EXTRACT_16BITS(tptr + i + 5)));
+ i=i+3;
+ }
+ break;
+ case LLDP_PRIVATE_8021_SUBTYPE_EVB:
+ if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_EVB_LENGTH){
+ return hexdump;
+ }
+ ND_PRINT((ndo, "\n\t EVB Bridge Status"));
+ tval=*(tptr+4);
+ ND_PRINT((ndo, "\n\t RES: %d, BGID: %d, RRCAP: %d, RRCTR: %d",
+ tval >> 3, (tval >> 2) & 0x01, (tval >> 1) & 0x01, tval & 0x01));
+ ND_PRINT((ndo, "\n\t EVB Station Status"));
+ tval=*(tptr+5);
+ ND_PRINT((ndo, "\n\t RES: %d, SGID: %d, RRREQ: %d,RRSTAT: %d",
+ tval >> 4, (tval >> 3) & 0x01, (tval >> 2) & 0x01, tval & 0x03));
+ tval=*(tptr+6);
+ ND_PRINT((ndo, "\n\t R: %d, RTE: %d, ",tval >> 5, tval & 0x1f));
+ tval=*(tptr+7);
+ ND_PRINT((ndo, "EVB Mode: %s [%d]",
+ tok2str(lldp_evb_mode_values, "unknown", tval >> 6), tval >> 6));
+ ND_PRINT((ndo, "\n\t ROL: %d, RWD: %d, ", (tval >> 5) & 0x01, tval & 0x1f));
+ tval=*(tptr+8);
+ ND_PRINT((ndo, "RES: %d, ROL: %d, RKA: %d", tval >> 6, (tval >> 5) & 0x01, tval & 0x1f));
+ break;
+
+ case LLDP_PRIVATE_8021_SUBTYPE_CDCP:
+ if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_CDCP_MIN_LENGTH){
+ return hexdump;
+ }
+ tval=*(tptr+4);
+ ND_PRINT((ndo, "\n\t Role: %d, RES: %d, Scomp: %d ",
+ tval >> 7, (tval >> 4) & 0x07, (tval >> 3) & 0x01));
+ ND_PRINT((ndo, "ChnCap: %d", EXTRACT_16BITS(tptr + 6) & 0x0fff));
+ sublen=tlv_len-8;
+ if(sublen%3!=0) {
+ return hexdump;
+ }
+ i=0;
+ while(i<sublen) {
+ tval=EXTRACT_24BITS(tptr+i+8);
+ ND_PRINT((ndo, "\n\t SCID: %d, SVID: %d",
+ tval >> 12, tval & 0x000fff));
+ i=i+3;
+ }
+ break;
+
+ default:
+ hexdump = TRUE;
+ break;
+ }
+
+ return hexdump;
+}
+
+/*
+ * Print IEEE 802.3 private extensions. (802.3bc)
+ */
+static int
+lldp_private_8023_print(netdissect_options *ndo,
+ const u_char *tptr, u_int tlv_len)
+{
+ int subtype, hexdump = FALSE;
+
+ if (tlv_len < 4) {
+ return hexdump;
+ }
+ subtype = *(tptr+3);
+
+ ND_PRINT((ndo, "\n\t %s Subtype (%u)",
+ tok2str(lldp_8023_subtype_values, "unknown", subtype),
+ subtype));
+
+ switch (subtype) {
+ case LLDP_PRIVATE_8023_SUBTYPE_MACPHY:
+ if (tlv_len < 9) {
+ return hexdump;
+ }
+ ND_PRINT((ndo, "\n\t autonegotiation [%s] (0x%02x)",
+ bittok2str(lldp_8023_autonegotiation_values, "none", *(tptr+4)),
+ *(tptr + 4)));
+ ND_PRINT((ndo, "\n\t PMD autoneg capability [%s] (0x%04x)",
+ bittok2str(lldp_pmd_capability_values,"unknown", EXTRACT_16BITS(tptr+5)),
+ EXTRACT_16BITS(tptr + 5)));
+ ND_PRINT((ndo, "\n\t MAU type %s (0x%04x)",
+ tok2str(lldp_mau_types_values, "unknown", EXTRACT_16BITS(tptr+7)),
+ EXTRACT_16BITS(tptr + 7)));
+ break;
+
+ case LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER:
+ if (tlv_len < 7) {
+ return hexdump;
+ }
+ ND_PRINT((ndo, "\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)),
+ tok2str(lldp_mdi_power_class_values, "unknown", *(tptr + 6))));
+ break;
+
+ case LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR:
+ if (tlv_len < 9) {
+ return hexdump;
+ }
+ ND_PRINT((ndo, "\n\t aggregation status [%s], aggregation port ID %u",
+ bittok2str(lldp_aggregation_values, "none", *(tptr+4)),
+ EXTRACT_32BITS(tptr + 5)));
+ break;
+
+ case LLDP_PRIVATE_8023_SUBTYPE_MTU:
+ ND_PRINT((ndo, "\n\t MTU size %u", EXTRACT_16BITS(tptr + 4)));
+ break;
+
+ default:
+ hexdump = TRUE;
+ break;
+ }
+
+ return hexdump;
+}
+
+/*
+ * Extract 34bits of latitude/longitude coordinates.
+ */
+static uint64_t
+lldp_extract_latlon(const u_char *tptr)
+{
+ uint64_t latlon;
+
+ latlon = *tptr & 0x3;
+ latlon = (latlon << 32) | EXTRACT_32BITS(tptr+1);
+
+ return latlon;
+}
+
+/*
+ * Print private TIA extensions.
+ */
+static int
+lldp_private_tia_print(netdissect_options *ndo,
+ const u_char *tptr, u_int tlv_len)
+{
+ int subtype, hexdump = FALSE;
+ uint8_t location_format;
+ uint16_t power_val;
+ u_int lci_len;
+ uint8_t ca_type, ca_len;
+
+ if (tlv_len < 4) {
+ return hexdump;
+ }
+ subtype = *(tptr+3);
+
+ ND_PRINT((ndo, "\n\t %s Subtype (%u)",
+ tok2str(lldp_tia_subtype_values, "unknown", subtype),
+ subtype));
+
+ switch (subtype) {
+ case LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES:
+ if (tlv_len < 7) {
+ return hexdump;
+ }
+ ND_PRINT((ndo, "\n\t Media capabilities [%s] (0x%04x)",
+ bittok2str(lldp_tia_capabilities_values, "none",
+ EXTRACT_16BITS(tptr + 4)), EXTRACT_16BITS(tptr + 4)));
+ ND_PRINT((ndo, "\n\t Device type [%s] (0x%02x)",
+ tok2str(lldp_tia_device_type_values, "unknown", *(tptr+6)),
+ *(tptr + 6)));
+ break;
+
+ case LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY:
+ if (tlv_len < 8) {
+ return hexdump;
+ }
+ ND_PRINT((ndo, "\n\t Application type [%s] (0x%02x)",
+ tok2str(lldp_tia_application_type_values, "none", *(tptr+4)),
+ *(tptr + 4)));
+ ND_PRINT((ndo, ", Flags [%s]", bittok2str(
+ lldp_tia_network_policy_bits_values, "none", *(tptr + 5))));
+ ND_PRINT((ndo, "\n\t Vlan id %u",
+ LLDP_EXTRACT_NETWORK_POLICY_VLAN(EXTRACT_16BITS(tptr + 5))));
+ ND_PRINT((ndo, ", L2 priority %u",
+ LLDP_EXTRACT_NETWORK_POLICY_L2_PRIORITY(EXTRACT_16BITS(tptr + 6))));
+ ND_PRINT((ndo, ", DSCP value %u",
+ LLDP_EXTRACT_NETWORK_POLICY_DSCP(EXTRACT_16BITS(tptr + 6))));
+ break;
+
+ case LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID:
+ if (tlv_len < 5) {
+ return hexdump;
+ }
+ location_format = *(tptr+4);
+ ND_PRINT((ndo, "\n\t Location data format %s (0x%02x)",
+ tok2str(lldp_tia_location_data_format_values, "unknown", location_format),
+ location_format));
+
+ switch (location_format) {
+ case LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED:
+ if (tlv_len < 21) {
+ return hexdump;
+ }
+ ND_PRINT((ndo, "\n\t Latitude resolution %u, latitude value %" PRIu64,
+ (*(tptr + 5) >> 2), lldp_extract_latlon(tptr + 5)));
+ ND_PRINT((ndo, "\n\t Longitude resolution %u, longitude value %" PRIu64,
+ (*(tptr + 10) >> 2), lldp_extract_latlon(tptr + 10)));
+ ND_PRINT((ndo, "\n\t Altitude type %s (%u)",
+ tok2str(lldp_tia_location_altitude_type_values, "unknown",(*(tptr+15)>>4)),
+ (*(tptr + 15) >> 4)));
+ ND_PRINT((ndo, "\n\t Altitude resolution %u, altitude value 0x%x",
+ (EXTRACT_16BITS(tptr+15)>>6)&0x3f,
+ ((EXTRACT_32BITS(tptr + 16) & 0x3fffffff))));
+ ND_PRINT((ndo, "\n\t Datum %s (0x%02x)",
+ tok2str(lldp_tia_location_datum_type_values, "unknown", *(tptr+20)),
+ *(tptr + 20)));
+ 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;
+ }
+ ND_PRINT((ndo, "\n\t LCI length %u, LCI what %s (0x%02x), Country-code ",
+ lci_len,
+ tok2str(lldp_tia_location_lci_what_values, "unknown", *(tptr+6)),
+ *(tptr + 6)));
+
+ /* Country code */
+ safeputs(ndo, tptr + 7, 2);
+
+ lci_len = lci_len-3;
+ tptr = tptr + 9;
+
+ /* Decode each civic address element */
+ while (lci_len > 0) {
+ if (lci_len < 2) {
+ return hexdump;
+ }
+ ca_type = *(tptr);
+ ca_len = *(tptr+1);
+
+ tptr += 2;
+ lci_len -= 2;
+
+ ND_PRINT((ndo, "\n\t CA type \'%s\' (%u), length %u: ",
+ tok2str(lldp_tia_location_lci_catype_values, "unknown", ca_type),
+ ca_type, ca_len));
+
+ /* basic sanity check */
+ if ( ca_type == 0 || ca_len == 0) {
+ return hexdump;
+ }
+ if (lci_len < ca_len) {
+ return hexdump;
+ }
+
+ safeputs(ndo, tptr, ca_len);
+ tptr += ca_len;
+ lci_len -= ca_len;
+ }
+ break;
+
+ case LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN:
+ ND_PRINT((ndo, "\n\t ECS ELIN id "));
+ safeputs(ndo, tptr + 5, tlv_len - 5);
+ break;
+
+ default:
+ ND_PRINT((ndo, "\n\t Location ID "));
+ print_unknown_data(ndo, tptr + 5, "\n\t ", tlv_len - 5);
+ }
+ break;
+
+ case LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI:
+ if (tlv_len < 7) {
+ return hexdump;
+ }
+ ND_PRINT((ndo, "\n\t Power type [%s]",
+ (*(tptr + 4) & 0xC0 >> 6) ? "PD device" : "PSE device"));
+ ND_PRINT((ndo, ", Power source [%s]",
+ tok2str(lldp_tia_power_source_values, "none", (*(tptr + 4) & 0x30) >> 4)));
+ ND_PRINT((ndo, "\n\t Power priority [%s] (0x%02x)",
+ tok2str(lldp_tia_power_priority_values, "none", *(tptr+4)&0x0f),
+ *(tptr + 4) & 0x0f));
+ power_val = EXTRACT_16BITS(tptr+5);
+ if (power_val < LLDP_TIA_POWER_VAL_MAX) {
+ ND_PRINT((ndo, ", Power %.1f Watts", ((float)power_val) / 10));
+ } else {
+ ND_PRINT((ndo, ", Power %u (Reserved)", power_val));
+ }
+ break;
+
+ case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV:
+ case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV:
+ case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV:
+ case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER:
+ case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME:
+ case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME:
+ case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID:
+ ND_PRINT((ndo, "\n\t %s ",
+ tok2str(lldp_tia_inventory_values, "unknown", subtype)));
+ safeputs(ndo, tptr + 4, tlv_len - 4);
+ break;
+
+ default:
+ hexdump = TRUE;
+ break;
+ }
+
+ return hexdump;
+}
+
+/*
+ * Print DCBX Protocol fields (V 1.01).
+ */
+static int
+lldp_private_dcbx_print(netdissect_options *ndo,
+ const u_char *pptr, u_int len)
+{
+ int subtype, hexdump = FALSE;
+ uint8_t tval;
+ uint16_t tlv;
+ uint32_t i, pgval, uval;
+ u_int tlen, tlv_type, tlv_len;
+ const u_char *tptr, *mptr;
+
+ if (len < 4) {
+ return hexdump;
+ }
+ subtype = *(pptr+3);
+
+ ND_PRINT((ndo, "\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)) {
+
+ ND_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;
+ }
+
+ ND_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;
+ }
+ ND_PRINT((ndo, "\n\t Control - Protocol Control (type 0x%x, length %d)",
+ LLDP_DCBX_CONTROL_TLV, tlv_len));
+ ND_PRINT((ndo, "\n\t Oper_Version: %d", *tptr));
+ ND_PRINT((ndo, "\n\t Max_Version: %d", *(tptr + 1)));
+ ND_PRINT((ndo, "\n\t Sequence Number: %d", EXTRACT_32BITS(tptr + 2)));
+ ND_PRINT((ndo, "\n\t Acknowledgement Number: %d",
+ EXTRACT_32BITS(tptr + 6)));
+ break;
+ case LLDP_DCBX_PRIORITY_GROUPS_TLV:
+ if (tlv_len < 17) {
+ goto trunc;
+ }
+ ND_PRINT((ndo, "\n\t Feature - Priority Group (type 0x%x, length %d)",
+ LLDP_DCBX_PRIORITY_GROUPS_TLV, tlv_len));
+ ND_PRINT((ndo, "\n\t Oper_Version: %d", *tptr));
+ ND_PRINT((ndo, "\n\t Max_Version: %d", *(tptr + 1)));
+ ND_PRINT((ndo, "\n\t Info block(0x%02X): ", *(tptr + 2)));
+ tval = *(tptr+2);
+ ND_PRINT((ndo, "Enable bit: %d, Willing bit: %d, Error Bit: %d",
+ (tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0,
+ (tval & 0x20) ? 1 : 0));
+ ND_PRINT((ndo, "\n\t SubType: %d", *(tptr + 3)));
+ ND_PRINT((ndo, "\n\t Priority Allocation"));
+
+ /*
+ * Array of 8 4-bit priority group ID values; we fetch all
+ * 32 bits and extract each nibble.
+ */
+ pgval = EXTRACT_32BITS(tptr+4);
+ for (i = 0; i <= 7; i++) {
+ ND_PRINT((ndo, "\n\t PgId_%d: %d",
+ i, (pgval >> (28 - 4 * i)) & 0xF));
+ }
+ ND_PRINT((ndo, "\n\t Priority Group Allocation"));
+ for (i = 0; i <= 7; i++)
+ ND_PRINT((ndo, "\n\t Pg percentage[%d]: %d", i, *(tptr + 8 + i)));
+ ND_PRINT((ndo, "\n\t NumTCsSupported: %d", *(tptr + 8 + 8)));
+ break;
+ case LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV:
+ if (tlv_len < 6) {
+ goto trunc;
+ }
+ ND_PRINT((ndo, "\n\t Feature - Priority Flow Control"));
+ ND_PRINT((ndo, " (type 0x%x, length %d)",
+ LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV, tlv_len));
+ ND_PRINT((ndo, "\n\t Oper_Version: %d", *tptr));
+ ND_PRINT((ndo, "\n\t Max_Version: %d", *(tptr + 1)));
+ ND_PRINT((ndo, "\n\t Info block(0x%02X): ", *(tptr + 2)));
+ tval = *(tptr+2);
+ ND_PRINT((ndo, "Enable bit: %d, Willing bit: %d, Error Bit: %d",
+ (tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0,
+ (tval & 0x20) ? 1 : 0));
+ ND_PRINT((ndo, "\n\t SubType: %d", *(tptr + 3)));
+ tval = *(tptr+4);
+ ND_PRINT((ndo, "\n\t PFC Config (0x%02X)", *(tptr + 4)));
+ for (i = 0; i <= 7; i++)
+ ND_PRINT((ndo, "\n\t Priority Bit %d: %s",
+ i, (tval & (1 << i)) ? "Enabled" : "Disabled"));
+ ND_PRINT((ndo, "\n\t NumTCPFCSupported: %d", *(tptr + 5)));
+ break;
+ case LLDP_DCBX_APPLICATION_TLV:
+ if (tlv_len < 4) {
+ goto trunc;
+ }
+ ND_PRINT((ndo, "\n\t Feature - Application (type 0x%x, length %d)",
+ LLDP_DCBX_APPLICATION_TLV, tlv_len));
+ ND_PRINT((ndo, "\n\t Oper_Version: %d", *tptr));
+ ND_PRINT((ndo, "\n\t Max_Version: %d", *(tptr + 1)));
+ ND_PRINT((ndo, "\n\t Info block(0x%02X): ", *(tptr + 2)));
+ tval = *(tptr+2);
+ ND_PRINT((ndo, "Enable bit: %d, Willing bit: %d, Error Bit: %d",
+ (tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0,
+ (tval & 0x20) ? 1 : 0));
+ ND_PRINT((ndo, "\n\t SubType: %d", *(tptr + 3)));
+ tval = tlv_len - 4;
+ mptr = tptr + 4;
+ while (tval >= 6) {
+ ND_PRINT((ndo, "\n\t Application Value"));
+ ND_PRINT((ndo, "\n\t Application Protocol ID: 0x%04x",
+ EXTRACT_16BITS(mptr)));
+ uval = EXTRACT_24BITS(mptr+2);
+ ND_PRINT((ndo, "\n\t SF (0x%x) Application Protocol ID is %s",
+ (uval >> 22),
+ (uval >> 22) ? "Socket Number" : "L2 EtherType"));
+ ND_PRINT((ndo, "\n\t OUI: 0x%06x", uval & 0x3fffff));
+ ND_PRINT((ndo, "\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 (ndo->ndo_vflag > 1 || (ndo->ndo_vflag && hexdump)) {
+ print_unknown_data(ndo, tptr, "\n\t ", tlv_len);
+ }
+
+ tlen -= tlv_len;
+ tptr += tlv_len;
+ }
+
+ trunc:
+ return hexdump;
+}
+
+static char *
+lldp_network_addr_print(netdissect_options *ndo, const u_char *tptr, u_int len)
+{
+ uint8_t af;
+ static char buf[BUFSIZE];
+ const char * (*pfunc)(netdissect_options *, 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:
+ pfunc = NULL;
+ break;
+ }
+
+ if (!pfunc) {
+ snprintf(buf, sizeof(buf), "AFI %s (%u), no AF printer !",
+ tok2str(af_values, "Unknown", af), af);
+ } else {
+ snprintf(buf, sizeof(buf), "AFI %s (%u): %s",
+ tok2str(af_values, "Unknown", af), af, (*pfunc)(ndo, tptr+1));
+ }
+
+ return buf;
+}
+
+static int
+lldp_mgmt_addr_tlv_print(netdissect_options *ndo,
+ const u_char *pptr, u_int len)
+{
+ uint8_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--;
+
+ if (tlen < mgmt_addr_len) {
+ return 0;
+ }
+
+ mgmt_addr = lldp_network_addr_print(ndo, tptr, mgmt_addr_len);
+ if (mgmt_addr == NULL) {
+ return 0;
+ }
+ ND_PRINT((ndo, "\n\t Management Address length %u, %s",
+ mgmt_addr_len, mgmt_addr));
+ tptr += mgmt_addr_len;
+ tlen -= mgmt_addr_len;
+
+ if (tlen < LLDP_INTF_NUM_LEN) {
+ return 0;
+ }
+
+ intf_num_subtype = *tptr;
+ ND_PRINT((ndo, "\n\t %s Interface Numbering (%u): %u",
+ tok2str(lldp_intf_numb_subtype_values, "Unknown", intf_num_subtype),
+ intf_num_subtype,
+ EXTRACT_32BITS(tptr + 1)));
+
+ tptr += LLDP_INTF_NUM_LEN;
+ tlen -= LLDP_INTF_NUM_LEN;
+
+ /*
+ * The OID is optional.
+ */
+ if (tlen) {
+ oid_len = *tptr;
+
+ if (tlen < oid_len) {
+ return 0;
+ }
+ if (oid_len) {
+ ND_PRINT((ndo, "\n\t OID length %u", oid_len));
+ safeputs(ndo, tptr + 1, oid_len);
+ }
+ }
+
+ return 1;
+}
+
+void
+lldp_print(netdissect_options *ndo,
+ register const u_char *pptr, register u_int len)
+{
+ uint8_t subtype;
+ uint16_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;
+
+ ND_PRINT((ndo, "LLDP, length %u", len));
+
+ while (tlen >= sizeof(tlv)) {
+
+ ND_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);
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "\n\t%s TLV (%u), length %u",
+ tok2str(lldp_tlv_values, "Unknown", tlv_type),
+ tlv_type, tlv_len));
+ }
+
+ /* infinite loop check */
+ if (!tlv_type || !tlv_len) {
+ break;
+ }
+
+ ND_TCHECK2(*tptr, tlv_len);
+ if (tlen < tlv_len) {
+ goto trunc;
+ }
+
+ switch (tlv_type) {
+
+ case LLDP_CHASSIS_ID_TLV:
+ if (ndo->ndo_vflag) {
+ if (tlv_len < 2) {
+ goto trunc;
+ }
+ subtype = *tptr;
+ ND_PRINT((ndo, "\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;
+ }
+ ND_PRINT((ndo, "%s", etheraddr_string(ndo, 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(ndo, tptr + 1, tlv_len - 1);
+ break;
+
+ case LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE:
+ network_addr = lldp_network_addr_print(ndo, tptr+1, tlv_len-1);
+ if (network_addr == NULL) {
+ goto trunc;
+ }
+ ND_PRINT((ndo, "%s", network_addr));
+ break;
+
+ default:
+ hexdump = TRUE;
+ break;
+ }
+ }
+ break;
+
+ case LLDP_PORT_ID_TLV:
+ if (ndo->ndo_vflag) {
+ if (tlv_len < 2) {
+ goto trunc;
+ }
+ subtype = *tptr;
+ ND_PRINT((ndo, "\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;
+ }
+ ND_PRINT((ndo, "%s", etheraddr_string(ndo, 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(ndo, tptr + 1, tlv_len - 1);
+ break;
+
+ case LLDP_PORT_NETWORK_ADDR_SUBTYPE:
+ network_addr = lldp_network_addr_print(ndo, tptr+1, tlv_len-1);
+ if (network_addr == NULL) {
+ goto trunc;
+ }
+ ND_PRINT((ndo, "%s", network_addr));
+ break;
+
+ default:
+ hexdump = TRUE;
+ break;
+ }
+ }
+ break;
+
+ case LLDP_TTL_TLV:
+ if (ndo->ndo_vflag) {
+ if (tlv_len < 2) {
+ goto trunc;
+ }
+ ND_PRINT((ndo, ": TTL %us", EXTRACT_16BITS(tptr)));
+ }
+ break;
+
+ case LLDP_PORT_DESCR_TLV:
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, ": "));
+ safeputs(ndo, tptr, tlv_len);
+ }
+ break;
+
+ case LLDP_SYSTEM_NAME_TLV:
+ /*
+ * The system name is also print in non-verbose mode
+ * similar to the CDP printer.
+ */
+ ND_PRINT((ndo, ": "));
+ safeputs(ndo, tptr, tlv_len);
+ break;
+
+ case LLDP_SYSTEM_DESCR_TLV:
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "\n\t "));
+ safeputs(ndo, tptr, tlv_len);
+ }
+ break;
+
+ case LLDP_SYSTEM_CAP_TLV:
+ if (ndo->ndo_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);
+ ND_PRINT((ndo, "\n\t System Capabilities [%s] (0x%04x)",
+ bittok2str(lldp_cap_values, "none", cap), cap));
+ ND_PRINT((ndo, "\n\t Enabled Capabilities [%s] (0x%04x)",
+ bittok2str(lldp_cap_values, "none", ena_cap), ena_cap));
+ }
+ break;
+
+ case LLDP_MGMT_ADDR_TLV:
+ if (ndo->ndo_vflag) {
+ if (!lldp_mgmt_addr_tlv_print(ndo, tptr, tlv_len)) {
+ goto trunc;
+ }
+ }
+ break;
+
+ case LLDP_PRIVATE_TLV:
+ if (ndo->ndo_vflag) {
+ if (tlv_len < 3) {
+ goto trunc;
+ }
+ oui = EXTRACT_24BITS(tptr);
+ ND_PRINT((ndo, ": OUI %s (0x%06x)", tok2str(oui_values, "Unknown", oui), oui));
+
+ switch (oui) {
+ case OUI_IEEE_8021_PRIVATE:
+ hexdump = lldp_private_8021_print(ndo, tptr, tlv_len);
+ break;
+ case OUI_IEEE_8023_PRIVATE:
+ hexdump = lldp_private_8023_print(ndo, tptr, tlv_len);
+ break;
+ case OUI_TIA:
+ hexdump = lldp_private_tia_print(ndo, tptr, tlv_len);
+ break;
+ case OUI_DCBX:
+ hexdump = lldp_private_dcbx_print(ndo, tptr, tlv_len);
+ break;
+ default:
+ hexdump = TRUE;
+ break;
+ }
+ }
+ break;
+
+ default:
+ hexdump = TRUE;
+ break;
+ }
+
+ /* do we also want to see a hex dump ? */
+ if (ndo->ndo_vflag > 1 || (ndo->ndo_vflag && hexdump)) {
+ print_unknown_data(ndo, tptr, "\n\t ", tlv_len);
+ }
+
+ tlen -= tlv_len;
+ tptr += tlv_len;
+ }
+ return;
+ trunc:
+ ND_PRINT((ndo, "\n\t[|LLDP]"));
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ * 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 Link Management Protocol as per rfc 4204.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ * Support for LMP service discovery extensions (defined by UNI 1.0) added
+ * by Manu Pathak (mapathak@cisco.com), May 2005
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-lmp.c,v 1.7 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+#include "gmpls.h"
+
+/*
+ * LMP common header
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Vers | (Reserved) | Flags | Msg Type |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | LMP Length | (Reserved) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+struct lmp_common_header {
+ uint8_t version_res[2];
+ uint8_t flags;
+ uint8_t msg_type;
+ uint8_t length[2];
+ uint8_t reserved[2];
+};
+
+#define LMP_VERSION 1
+#define LMP_EXTRACT_VERSION(x) (((x)&0xf0)>>4)
+
+static const struct tok lmp_header_flag_values[] = {
+ { 0x01, "Control Channel Down"},
+ { 0x02, "LMP restart"},
+ { 0, NULL}
+};
+
+static const struct tok lmp_obj_te_link_flag_values[] = {
+ { 0x01, "Fault Management Supported"},
+ { 0x02, "Link Verification Supported"},
+ { 0, NULL}
+};
+
+static const struct tok lmp_obj_data_link_flag_values[] = {
+ { 0x01, "Data Link Port"},
+ { 0x02, "Allocated for user traffic"},
+ { 0x04, "Failed link"},
+ { 0, NULL}
+};
+
+static const struct tok lmp_obj_channel_status_values[] = {
+ { 1, "Signal Okay"},
+ { 2, "Signal Degraded"},
+ { 3, "Signal Fail"},
+ { 0, NULL}
+};
+
+static const struct tok lmp_obj_begin_verify_flag_values[] = {
+ { 0x0001, "Verify all links"},
+ { 0x0002, "Data link type"},
+ { 0, NULL}
+};
+
+static const struct tok lmp_obj_begin_verify_error_values[] = {
+ { 0x01, "Link Verification Procedure Not supported"},
+ { 0x02, "Unwilling to verify"},
+ { 0x04, "Unsupported verification transport mechanism"},
+ { 0x08, "Link-Id configuration error"},
+ { 0x10, "Unknown object c-type"},
+ { 0, NULL}
+};
+
+static const struct tok lmp_obj_link_summary_error_values[] = {
+ { 0x01, "Unacceptable non-negotiable LINK-SUMMARY parameters"},
+ { 0x02, "Renegotiate LINK-SUMMARY parameters"},
+ { 0x04, "Invalid TE-LINK Object"},
+ { 0x08, "Invalid DATA-LINK Object"},
+ { 0x10, "Unknown TE-LINK Object c-type"},
+ { 0x20, "Unknown DATA-LINK Object c-type"},
+ { 0, NULL}
+};
+
+/* Service Config Supported Protocols Flags */
+static const struct tok lmp_obj_service_config_sp_flag_values[] = {
+ { 0x01, "RSVP Supported"},
+ { 0x02, "LDP Supported"},
+ { 0, NULL}
+};
+
+/* Service Config Client Port Service Attribute Transparency Flags */
+static const struct tok lmp_obj_service_config_cpsa_tp_flag_values[] = {
+ { 0x01, "Path/VC Overhead Transparency Supported"},
+ { 0x02, "Line/MS Overhead Transparency Supported"},
+ { 0x04, "Section/RS Overhead Transparency Supported"},
+ { 0, NULL}
+};
+
+/* Service Config Client Port Service Attribute Contiguous Concatenation Types Flags */
+static const struct tok lmp_obj_service_config_cpsa_cct_flag_values[] = {
+ { 0x01, "Contiguous Concatenation Types Supported"},
+ { 0, NULL}
+};
+
+/* Service Config Network Service Attributes Transparency Flags */
+static const struct tok lmp_obj_service_config_nsa_transparency_flag_values[] = {
+ { 0x01, "Standard SOH/RSOH Transparency Supported"},
+ { 0x02, "Standard LOH/MSOH Transparency Supported"},
+ { 0, NULL}
+};
+
+/* Service Config Network Service Attributes TCM Monitoring Flags */
+static const struct tok lmp_obj_service_config_nsa_tcm_flag_values[] = {
+ { 0x01, "Transparent Tandem Connection Monitoring Supported"},
+ { 0, NULL}
+};
+
+/* Network Service Attributes Network Diversity Flags */
+static const struct tok lmp_obj_service_config_nsa_network_diversity_flag_values[] = {
+ { 0x01, "Node Diversity Supported"},
+ { 0x02, "Link Diversity Supported"},
+ { 0x04, "SRLG Diversity Supported"},
+ { 0, NULL}
+};
+
+#define LMP_MSGTYPE_CONFIG 1
+#define LMP_MSGTYPE_CONFIG_ACK 2
+#define LMP_MSGTYPE_CONFIG_NACK 3
+#define LMP_MSGTYPE_HELLO 4
+#define LMP_MSGTYPE_VERIFY_BEGIN 5
+#define LMP_MSGTYPE_VERIFY_BEGIN_ACK 6
+#define LMP_MSGTYPE_VERIFY_BEGIN_NACK 7
+#define LMP_MSGTYPE_VERIFY_END 8
+#define LMP_MSGTYPE_VERIFY_END_ACK 9
+#define LMP_MSGTYPE_TEST 10
+#define LMP_MSGTYPE_TEST_STATUS_SUCCESS 11
+#define LMP_MSGTYPE_TEST_STATUS_FAILURE 12
+#define LMP_MSGTYPE_TEST_STATUS_ACK 13
+#define LMP_MSGTYPE_LINK_SUMMARY 14
+#define LMP_MSGTYPE_LINK_SUMMARY_ACK 15
+#define LMP_MSGTYPE_LINK_SUMMARY_NACK 16
+#define LMP_MSGTYPE_CHANNEL_STATUS 17
+#define LMP_MSGTYPE_CHANNEL_STATUS_ACK 18
+#define LMP_MSGTYPE_CHANNEL_STATUS_REQ 19
+#define LMP_MSGTYPE_CHANNEL_STATUS_RESP 20
+/* LMP Service Discovery message types defined by UNI 1.0 */
+#define LMP_MSGTYPE_SERVICE_CONFIG 50
+#define LMP_MSGTYPE_SERVICE_CONFIG_ACK 51
+#define LMP_MSGTYPE_SERVICE_CONFIG_NACK 52
+
+static const struct tok lmp_msg_type_values[] = {
+ { LMP_MSGTYPE_CONFIG, "Config"},
+ { LMP_MSGTYPE_CONFIG_ACK, "Config ACK"},
+ { LMP_MSGTYPE_CONFIG_NACK, "Config NACK"},
+ { LMP_MSGTYPE_HELLO, "Hello"},
+ { LMP_MSGTYPE_VERIFY_BEGIN, "Begin Verify"},
+ { LMP_MSGTYPE_VERIFY_BEGIN_ACK, "Begin Verify ACK"},
+ { LMP_MSGTYPE_VERIFY_BEGIN_NACK, "Begin Verify NACK"},
+ { LMP_MSGTYPE_VERIFY_END, "End Verify"},
+ { LMP_MSGTYPE_VERIFY_END_ACK, "End Verify ACK"},
+ { LMP_MSGTYPE_TEST, "Test"},
+ { LMP_MSGTYPE_TEST_STATUS_SUCCESS, "Test Status Success"},
+ { LMP_MSGTYPE_TEST_STATUS_FAILURE, "Test Status Failure"},
+ { LMP_MSGTYPE_TEST_STATUS_ACK, "Test Status ACK"},
+ { LMP_MSGTYPE_LINK_SUMMARY, "Link Summary"},
+ { LMP_MSGTYPE_LINK_SUMMARY_ACK, "Link Summary ACK"},
+ { LMP_MSGTYPE_LINK_SUMMARY_NACK, "Link Summary NACK"},
+ { LMP_MSGTYPE_CHANNEL_STATUS, "Channel Status"},
+ { LMP_MSGTYPE_CHANNEL_STATUS_ACK, "Channel Status ACK"},
+ { LMP_MSGTYPE_CHANNEL_STATUS_REQ, "Channel Status Request"},
+ { LMP_MSGTYPE_CHANNEL_STATUS_RESP, "Channel Status Response"},
+ { LMP_MSGTYPE_SERVICE_CONFIG, "Service Config"},
+ { LMP_MSGTYPE_SERVICE_CONFIG_ACK, "Service Config ACK"},
+ { LMP_MSGTYPE_SERVICE_CONFIG_NACK, "Service Config NACK"},
+ { 0, NULL}
+};
+
+/*
+ * LMP object header
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |N| C-Type | Class | Length |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * // (object contents) //
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+struct lmp_object_header {
+ uint8_t ctype;
+ uint8_t class_num;
+ uint8_t length[2];
+};
+
+#define LMP_OBJ_CC_ID 1
+#define LMP_OBJ_NODE_ID 2
+#define LMP_OBJ_LINK_ID 3
+#define LMP_OBJ_INTERFACE_ID 4
+#define LMP_OBJ_MESSAGE_ID 5
+#define LMP_OBJ_CONFIG 6
+#define LMP_OBJ_HELLO 7
+#define LMP_OBJ_VERIFY_BEGIN 8
+#define LMP_OBJ_VERIFY_BEGIN_ACK 9
+#define LMP_OBJ_VERIFY_ID 10
+#define LMP_OBJ_TE_LINK 11
+#define LMP_OBJ_DATA_LINK 12
+#define LMP_OBJ_CHANNEL_STATUS 13
+#define LMP_OBJ_CHANNEL_STATUS_REQ 14
+#define LMP_OBJ_ERROR_CODE 20
+
+#define LMP_OBJ_SERVICE_CONFIG 51 /* defined in UNI 1.0 */
+
+static const struct tok lmp_obj_values[] = {
+ { LMP_OBJ_CC_ID, "Control Channel ID" },
+ { LMP_OBJ_NODE_ID, "Node ID" },
+ { LMP_OBJ_LINK_ID, "Link ID" },
+ { LMP_OBJ_INTERFACE_ID, "Interface ID" },
+ { LMP_OBJ_MESSAGE_ID, "Message ID" },
+ { LMP_OBJ_CONFIG, "Configuration" },
+ { LMP_OBJ_HELLO, "Hello" },
+ { LMP_OBJ_VERIFY_BEGIN, "Verify Begin" },
+ { LMP_OBJ_VERIFY_BEGIN_ACK, "Verify Begin ACK" },
+ { LMP_OBJ_VERIFY_ID, "Verify ID" },
+ { LMP_OBJ_TE_LINK, "TE Link" },
+ { LMP_OBJ_DATA_LINK, "Data Link" },
+ { LMP_OBJ_CHANNEL_STATUS, "Channel Status" },
+ { LMP_OBJ_CHANNEL_STATUS_REQ, "Channel Status Request" },
+ { LMP_OBJ_ERROR_CODE, "Error Code" },
+ { LMP_OBJ_SERVICE_CONFIG, "Service Config" },
+
+ { 0, NULL}
+};
+
+#define INT_SWITCHING_TYPE_SUBOBJ 1
+#define WAVELENGTH_SUBOBJ 2
+
+static const struct tok lmp_data_link_subobj[] = {
+ { INT_SWITCHING_TYPE_SUBOBJ, "Interface Switching Type" },
+ { WAVELENGTH_SUBOBJ , "Wavelength" },
+ { 0, NULL}
+};
+
+#define LMP_CTYPE_IPV4 1
+#define LMP_CTYPE_IPV6 2
+
+#define LMP_CTYPE_LOC 1
+#define LMP_CTYPE_RMT 2
+#define LMP_CTYPE_UNMD 3
+
+#define LMP_CTYPE_IPV4_LOC 1
+#define LMP_CTYPE_IPV4_RMT 2
+#define LMP_CTYPE_IPV6_LOC 3
+#define LMP_CTYPE_IPV6_RMT 4
+#define LMP_CTYPE_UNMD_LOC 5
+#define LMP_CTYPE_UNMD_RMT 6
+
+#define LMP_CTYPE_1 1
+#define LMP_CTYPE_2 2
+
+#define LMP_CTYPE_HELLO_CONFIG 1
+#define LMP_CTYPE_HELLO 1
+
+#define LMP_CTYPE_BEGIN_VERIFY_ERROR 1
+#define LMP_CTYPE_LINK_SUMMARY_ERROR 2
+
+/* C-Types for Service Config Object */
+#define LMP_CTYPE_SERVICE_CONFIG_SP 1
+#define LMP_CTYPE_SERVICE_CONFIG_CPSA 2
+#define LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM 3
+#define LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY 4
+
+/*
+ * Different link types allowed in the Client Port Service Attributes
+ * subobject defined for LMP Service Discovery in the UNI 1.0 spec
+ */
+#define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH 5 /* UNI 1.0 Sec 9.4.2 */
+#define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET 6 /* UNI 1.0 Sec 9.4.2 */
+
+/*
+ * the ctypes are not globally unique so for
+ * translating it to strings we build a table based
+ * on objects offsetted by the ctype
+ */
+
+static const struct tok lmp_ctype_values[] = {
+ { 256*LMP_OBJ_CC_ID+LMP_CTYPE_LOC, "Local" },
+ { 256*LMP_OBJ_CC_ID+LMP_CTYPE_RMT, "Remote" },
+ { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_LOC, "Local" },
+ { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_RMT, "Remote" },
+ { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" },
+ { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" },
+ { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" },
+ { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" },
+ { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" },
+ { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" },
+ { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" },
+ { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" },
+ { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" },
+ { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" },
+ { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" },
+ { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" },
+ { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_1, "1" },
+ { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_2, "2" },
+ { 256*LMP_OBJ_CONFIG+LMP_CTYPE_1, "1" },
+ { 256*LMP_OBJ_HELLO+LMP_CTYPE_1, "1" },
+ { 256*LMP_OBJ_VERIFY_BEGIN+LMP_CTYPE_1, "1" },
+ { 256*LMP_OBJ_VERIFY_BEGIN_ACK+LMP_CTYPE_1, "1" },
+ { 256*LMP_OBJ_VERIFY_ID+LMP_CTYPE_1, "1" },
+ { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV4, "IPv4" },
+ { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV6, "IPv6" },
+ { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_UNMD, "Unnumbered" },
+ { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV4, "IPv4" },
+ { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV6, "IPv6" },
+ { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_UNMD, "Unnumbered" },
+ { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV4, "IPv4" },
+ { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV6, "IPv6" },
+ { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_UNMD, "Unnumbered" },
+ { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV4, "IPv4" },
+ { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV6, "IPv6" },
+ { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_UNMD, "Unnumbered" },
+ { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_1, "1" },
+ { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_2, "2" },
+ { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_SP, "1" },
+ { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_CPSA, "2" },
+ { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM, "3" },
+ { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY, "4" },
+ { 0, NULL}
+};
+
+void
+lmp_print(netdissect_options *ndo,
+ register const u_char *pptr, register u_int len)
+{
+ const struct lmp_common_header *lmp_com_header;
+ const struct lmp_object_header *lmp_obj_header;
+ const u_char *tptr,*obj_tptr;
+ int tlen,lmp_obj_len,lmp_obj_ctype,obj_tlen;
+ int hexdump;
+ int offset,subobj_type,subobj_len,total_subobj_len;
+ int link_type;
+
+ union { /* int to float conversion buffer */
+ float f;
+ uint32_t i;
+ } bw;
+
+ tptr=pptr;
+ lmp_com_header = (const struct lmp_common_header *)pptr;
+ ND_TCHECK(*lmp_com_header);
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]) != LMP_VERSION) {
+ ND_PRINT((ndo, "LMP version %u packet not supported",
+ LMP_EXTRACT_VERSION(lmp_com_header->version_res[0])));
+ return;
+ }
+
+ /* in non-verbose mode just lets print the basic Message Type*/
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "LMPv%u %s Message, length: %u",
+ LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]),
+ tok2str(lmp_msg_type_values, "unknown (%u)",lmp_com_header->msg_type),
+ len));
+ return;
+ }
+
+ /* ok they seem to want to know everything - lets fully decode it */
+
+ tlen=EXTRACT_16BITS(lmp_com_header->length);
+
+ ND_PRINT((ndo, "\n\tLMPv%u, msg-type: %s, Flags: [%s], length: %u",
+ LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]),
+ tok2str(lmp_msg_type_values, "unknown, type: %u",lmp_com_header->msg_type),
+ bittok2str(lmp_header_flag_values,"none",lmp_com_header->flags),
+ tlen));
+
+ tptr+=sizeof(const struct lmp_common_header);
+ tlen-=sizeof(const struct lmp_common_header);
+
+ while(tlen>0) {
+ /* did we capture enough for fully decoding the object header ? */
+ ND_TCHECK2(*tptr, sizeof(struct lmp_object_header));
+
+ lmp_obj_header = (const struct lmp_object_header *)tptr;
+ lmp_obj_len=EXTRACT_16BITS(lmp_obj_header->length);
+ lmp_obj_ctype=(lmp_obj_header->ctype)&0x7f;
+
+ if(lmp_obj_len % 4 || lmp_obj_len < 4)
+ return;
+
+ ND_PRINT((ndo, "\n\t %s Object (%u), Class-Type: %s (%u) Flags: [%snegotiable], length: %u",
+ tok2str(lmp_obj_values,
+ "Unknown",
+ lmp_obj_header->class_num),
+ lmp_obj_header->class_num,
+ tok2str(lmp_ctype_values,
+ "Unknown",
+ ((lmp_obj_header->class_num)<<8)+lmp_obj_ctype),
+ lmp_obj_ctype,
+ (lmp_obj_header->ctype)&0x80 ? "" : "non-",
+ lmp_obj_len));
+
+ obj_tptr=tptr+sizeof(struct lmp_object_header);
+ obj_tlen=lmp_obj_len-sizeof(struct lmp_object_header);
+
+ /* did we capture enough for fully decoding the object ? */
+ ND_TCHECK2(*tptr, lmp_obj_len);
+ hexdump=FALSE;
+
+ switch(lmp_obj_header->class_num) {
+
+ case LMP_OBJ_CC_ID:
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_LOC:
+ case LMP_CTYPE_RMT:
+ ND_PRINT((ndo, "\n\t Control Channel ID: %u (0x%08x)",
+ EXTRACT_32BITS(obj_tptr),
+ EXTRACT_32BITS(obj_tptr)));
+ break;
+
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_LINK_ID:
+ case LMP_OBJ_INTERFACE_ID:
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_IPV4_LOC:
+ case LMP_CTYPE_IPV4_RMT:
+ ND_PRINT((ndo, "\n\t IPv4 Link ID: %s (0x%08x)",
+ ipaddr_string(ndo, obj_tptr),
+ EXTRACT_32BITS(obj_tptr)));
+ break;
+#ifdef INET6
+ case LMP_CTYPE_IPV6_LOC:
+ case LMP_CTYPE_IPV6_RMT:
+ ND_PRINT((ndo, "\n\t IPv6 Link ID: %s (0x%08x)",
+ ip6addr_string(ndo, obj_tptr),
+ EXTRACT_32BITS(obj_tptr)));
+ break;
+#endif
+ case LMP_CTYPE_UNMD_LOC:
+ case LMP_CTYPE_UNMD_RMT:
+ ND_PRINT((ndo, "\n\t Link ID: %u (0x%08x)",
+ EXTRACT_32BITS(obj_tptr),
+ EXTRACT_32BITS(obj_tptr)));
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_MESSAGE_ID:
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_1:
+ ND_PRINT((ndo, "\n\t Message ID: %u (0x%08x)",
+ EXTRACT_32BITS(obj_tptr),
+ EXTRACT_32BITS(obj_tptr)));
+ break;
+ case LMP_CTYPE_2:
+ ND_PRINT((ndo, "\n\t Message ID Ack: %u (0x%08x)",
+ EXTRACT_32BITS(obj_tptr),
+ EXTRACT_32BITS(obj_tptr)));
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_NODE_ID:
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_LOC:
+ case LMP_CTYPE_RMT:
+ ND_PRINT((ndo, "\n\t Node ID: %s (0x%08x)",
+ ipaddr_string(ndo, obj_tptr),
+ EXTRACT_32BITS(obj_tptr)));
+ break;
+
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_CONFIG:
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_HELLO_CONFIG:
+ ND_PRINT((ndo, "\n\t Hello Interval: %u\n\t Hello Dead Interval: %u",
+ EXTRACT_16BITS(obj_tptr),
+ EXTRACT_16BITS(obj_tptr+2)));
+ break;
+
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_HELLO:
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_HELLO:
+ ND_PRINT((ndo, "\n\t Tx Seq: %u, Rx Seq: %u",
+ EXTRACT_32BITS(obj_tptr),
+ EXTRACT_32BITS(obj_tptr+4)));
+ break;
+
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_TE_LINK:
+ ND_PRINT((ndo, "\n\t Flags: [%s]",
+ bittok2str(lmp_obj_te_link_flag_values,
+ "none",
+ EXTRACT_16BITS(obj_tptr)>>8)));
+
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_IPV4:
+ ND_PRINT((ndo, "\n\t Local Link-ID: %s (0x%08x)"
+ "\n\t Remote Link-ID: %s (0x%08x)",
+ ipaddr_string(ndo, obj_tptr+4),
+ EXTRACT_32BITS(obj_tptr+4),
+ ipaddr_string(ndo, obj_tptr+8),
+ EXTRACT_32BITS(obj_tptr+8)));
+ break;
+
+#ifdef INET6
+ case LMP_CTYPE_IPV6:
+#endif
+ case LMP_CTYPE_UNMD:
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_DATA_LINK:
+ ND_PRINT((ndo, "\n\t Flags: [%s]",
+ bittok2str(lmp_obj_data_link_flag_values,
+ "none",
+ EXTRACT_16BITS(obj_tptr)>>8)));
+
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_IPV4:
+ case LMP_CTYPE_UNMD:
+ ND_PRINT((ndo, "\n\t Local Interface ID: %s (0x%08x)"
+ "\n\t Remote Interface ID: %s (0x%08x)",
+ ipaddr_string(ndo, obj_tptr+4),
+ EXTRACT_32BITS(obj_tptr+4),
+ ipaddr_string(ndo, obj_tptr+8),
+ EXTRACT_32BITS(obj_tptr+8)));
+
+ total_subobj_len = lmp_obj_len - 16;
+ offset = 12;
+ while (total_subobj_len > 0 && hexdump == FALSE ) {
+ subobj_type = EXTRACT_16BITS(obj_tptr+offset)>>8;
+ subobj_len = EXTRACT_16BITS(obj_tptr+offset)&0x00FF;
+ ND_PRINT((ndo, "\n\t Subobject, Type: %s (%u), Length: %u",
+ tok2str(lmp_data_link_subobj,
+ "Unknown",
+ subobj_type),
+ subobj_type,
+ subobj_len));
+ switch(subobj_type) {
+ case INT_SWITCHING_TYPE_SUBOBJ:
+ ND_PRINT((ndo, "\n\t Switching Type: %s (%u)",
+ tok2str(gmpls_switch_cap_values,
+ "Unknown",
+ EXTRACT_16BITS(obj_tptr+offset+2)>>8),
+ EXTRACT_16BITS(obj_tptr+offset+2)>>8));
+ ND_PRINT((ndo, "\n\t Encoding Type: %s (%u)",
+ tok2str(gmpls_encoding_values,
+ "Unknown",
+ EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF),
+ EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF));
+ bw.i = EXTRACT_32BITS(obj_tptr+offset+4);
+ ND_PRINT((ndo, "\n\t Min Reservable Bandwidth: %.3f Mbps",
+ bw.f*8/1000000));
+ bw.i = EXTRACT_32BITS(obj_tptr+offset+8);
+ ND_PRINT((ndo, "\n\t Max Reservable Bandwidth: %.3f Mbps",
+ bw.f*8/1000000));
+ break;
+ case WAVELENGTH_SUBOBJ:
+ ND_PRINT((ndo, "\n\t Wavelength: %u",
+ EXTRACT_32BITS(obj_tptr+offset+4)));
+ break;
+ default:
+ /* Any Unknown Subobject ==> Exit loop */
+ hexdump=TRUE;
+ break;
+ }
+ total_subobj_len-=subobj_len;
+ offset+=subobj_len;
+ }
+
+ break;
+#ifdef INET6
+ case LMP_CTYPE_IPV6:
+#endif
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_VERIFY_BEGIN:
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_1:
+ ND_PRINT((ndo, "\n\t Flags: %s",
+ bittok2str(lmp_obj_begin_verify_flag_values,
+ "none",
+ EXTRACT_16BITS(obj_tptr))));
+ ND_PRINT((ndo, "\n\t Verify Interval: %u",
+ EXTRACT_16BITS(obj_tptr+2)));
+ ND_PRINT((ndo, "\n\t Data links: %u",
+ EXTRACT_32BITS(obj_tptr+4)));
+ ND_PRINT((ndo, "\n\t Encoding type: %s",
+ tok2str(gmpls_encoding_values, "Unknown", *(obj_tptr+8))));
+ ND_PRINT((ndo, "\n\t Verify Transport Mechanism: %u (0x%x)%s",
+ EXTRACT_16BITS(obj_tptr+10),
+ EXTRACT_16BITS(obj_tptr+10),
+ EXTRACT_16BITS(obj_tptr+10)&8000 ? " (Payload test messages capable)" : ""));
+ bw.i = EXTRACT_32BITS(obj_tptr+12);
+ ND_PRINT((ndo, "\n\t Transmission Rate: %.3f Mbps",bw.f*8/1000000));
+ ND_PRINT((ndo, "\n\t Wavelength: %u",
+ EXTRACT_32BITS(obj_tptr+16)));
+ break;
+
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_VERIFY_BEGIN_ACK:
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_1:
+ ND_PRINT((ndo, "\n\t Verify Dead Interval: %u"
+ "\n\t Verify Transport Response: %u",
+ EXTRACT_16BITS(obj_tptr),
+ EXTRACT_16BITS(obj_tptr+2)));
+ break;
+
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_VERIFY_ID:
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_1:
+ ND_PRINT((ndo, "\n\t Verify ID: %u",
+ EXTRACT_32BITS(obj_tptr)));
+ break;
+
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_CHANNEL_STATUS:
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_IPV4:
+ case LMP_CTYPE_UNMD:
+ offset = 0;
+ /* Decode pairs: <Interface_ID (4 bytes), Channel_status (4 bytes)> */
+ while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) {
+ ND_PRINT((ndo, "\n\t Interface ID: %s (0x%08x)",
+ ipaddr_string(ndo, obj_tptr+offset),
+ EXTRACT_32BITS(obj_tptr+offset)));
+
+ ND_PRINT((ndo, "\n\t\t Active: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>31) ?
+ "Allocated" : "Non-allocated",
+ (EXTRACT_32BITS(obj_tptr+offset+4)>>31)));
+
+ ND_PRINT((ndo, "\n\t\t Direction: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1 ?
+ "Transmit" : "Receive",
+ (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1));
+
+ ND_PRINT((ndo, "\n\t\t Channel Status: %s (%u)",
+ tok2str(lmp_obj_channel_status_values,
+ "Unknown",
+ EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF),
+ EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF));
+ offset+=8;
+ }
+ break;
+#ifdef INET6
+ case LMP_CTYPE_IPV6:
+#endif
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_CHANNEL_STATUS_REQ:
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_IPV4:
+ case LMP_CTYPE_UNMD:
+ offset = 0;
+ while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) {
+ ND_PRINT((ndo, "\n\t Interface ID: %s (0x%08x)",
+ ipaddr_string(ndo, obj_tptr+offset),
+ EXTRACT_32BITS(obj_tptr+offset)));
+ offset+=4;
+ }
+ break;
+#ifdef INET6
+ case LMP_CTYPE_IPV6:
+#endif
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_ERROR_CODE:
+ switch(lmp_obj_ctype) {
+ case LMP_CTYPE_BEGIN_VERIFY_ERROR:
+ ND_PRINT((ndo, "\n\t Error Code: %s",
+ bittok2str(lmp_obj_begin_verify_error_values,
+ "none",
+ EXTRACT_32BITS(obj_tptr))));
+ break;
+
+ case LMP_CTYPE_LINK_SUMMARY_ERROR:
+ ND_PRINT((ndo, "\n\t Error Code: %s",
+ bittok2str(lmp_obj_link_summary_error_values,
+ "none",
+ EXTRACT_32BITS(obj_tptr))));
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case LMP_OBJ_SERVICE_CONFIG:
+ switch (lmp_obj_ctype) {
+ case LMP_CTYPE_SERVICE_CONFIG_SP:
+
+ ND_PRINT((ndo, "\n\t Flags: %s",
+ bittok2str(lmp_obj_service_config_sp_flag_values,
+ "none",
+ EXTRACT_16BITS(obj_tptr)>>8)));
+
+ ND_PRINT((ndo, "\n\t UNI Version: %u",
+ EXTRACT_16BITS(obj_tptr) & 0x00FF));
+
+ break;
+
+ case LMP_CTYPE_SERVICE_CONFIG_CPSA:
+
+ link_type = EXTRACT_16BITS(obj_tptr)>>8;
+
+ ND_PRINT((ndo, "\n\t Link Type: %s (%u)",
+ tok2str(lmp_sd_service_config_cpsa_link_type_values,
+ "Unknown", link_type),
+ link_type));
+
+ if (link_type == LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH) {
+ ND_PRINT((ndo, "\n\t Signal Type: %s (%u)",
+ tok2str(lmp_sd_service_config_cpsa_signal_type_sdh_values,
+ "Unknown",
+ EXTRACT_16BITS(obj_tptr) & 0x00FF),
+ EXTRACT_16BITS(obj_tptr) & 0x00FF));
+ }
+
+ if (link_type == LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET) {
+ ND_PRINT((ndo, "\n\t Signal Type: %s (%u)",
+ tok2str(lmp_sd_service_config_cpsa_signal_type_sonet_values,
+ "Unknown",
+ EXTRACT_16BITS(obj_tptr) & 0x00FF),
+ EXTRACT_16BITS(obj_tptr) & 0x00FF));
+ }
+
+ ND_PRINT((ndo, "\n\t Transparency: %s",
+ bittok2str(lmp_obj_service_config_cpsa_tp_flag_values,
+ "none",
+ EXTRACT_16BITS(obj_tptr+2)>>8)));
+
+ ND_PRINT((ndo, "\n\t Contiguous Concatenation Types: %s",
+ bittok2str(lmp_obj_service_config_cpsa_cct_flag_values,
+ "none",
+ EXTRACT_16BITS(obj_tptr+2)>>8 & 0x00FF)));
+
+ ND_PRINT((ndo, "\n\t Minimum NCC: %u",
+ EXTRACT_16BITS(obj_tptr+4)));
+
+ ND_PRINT((ndo, "\n\t Maximum NCC: %u",
+ EXTRACT_16BITS(obj_tptr+6)));
+
+ ND_PRINT((ndo, "\n\t Minimum NVC:%u",
+ EXTRACT_16BITS(obj_tptr+8)));
+
+ ND_PRINT((ndo, "\n\t Maximum NVC:%u",
+ EXTRACT_16BITS(obj_tptr+10)));
+
+ ND_PRINT((ndo, "\n\t Local Interface ID: %s (0x%08x)",
+ ipaddr_string(ndo, obj_tptr+12),
+ EXTRACT_32BITS(obj_tptr+12)));
+
+ break;
+
+ case LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM:
+
+ ND_PRINT((ndo, "\n\t Transparency Flags: %s",
+ bittok2str(
+ lmp_obj_service_config_nsa_transparency_flag_values,
+ "none",
+ EXTRACT_32BITS(obj_tptr))));
+
+ ND_PRINT((ndo, "\n\t TCM Monitoring Flags: %s",
+ bittok2str(
+ lmp_obj_service_config_nsa_tcm_flag_values,
+ "none",
+ EXTRACT_16BITS(obj_tptr+6) & 0x00FF)));
+
+ break;
+
+ case LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY:
+
+ ND_PRINT((ndo, "\n\t Diversity: Flags: %s",
+ bittok2str(
+ lmp_obj_service_config_nsa_network_diversity_flag_values,
+ "none",
+ EXTRACT_16BITS(obj_tptr+2) & 0x00FF)));
+ break;
+
+ default:
+ hexdump = TRUE;
+ };
+
+ break;
+
+ default:
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo,obj_tptr,"\n\t ",obj_tlen);
+ break;
+ }
+ /* do we want to see an additionally hexdump ? */
+ if (ndo->ndo_vflag > 1 || hexdump==TRUE)
+ print_unknown_data(ndo,tptr+sizeof(struct lmp_object_header),"\n\t ",
+ lmp_obj_len-sizeof(struct lmp_object_header));
+
+ tptr+=lmp_obj_len;
+ tlen-=lmp_obj_len;
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+}
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * This module implements decoding of the Loopback Protocol, originally
+ * defined as the Configuration Testing Protocol. It is based on the following
+ * specification:
+ * http://www.mit.edu/people/jhawk/ctp.pdf
+ *
+ * Copyright (c) 2014 The TCPDUMP 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
+ * COPYRIGHT HOLDER 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-loopback.c,v 1.2 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "ether.h"
+#include "addrtoname.h"
+
+static const char tstr[] = " [|loopback]";
+static const char cstr[] = " (corrupt)";
+
+#define LOOPBACK_REPLY 1
+#define LOOPBACK_FWDDATA 2
+
+static const struct tok fcode_str[] = {
+ { LOOPBACK_REPLY, "Reply" },
+ { LOOPBACK_FWDDATA, "Forward Data" },
+ { 0, NULL }
+};
+
+static void
+loopback_message_print(netdissect_options *ndo, const u_char *cp, const u_int len)
+{
+ const u_char *ep = cp + len;
+ uint16_t function;
+
+ if (len < 2)
+ goto corrupt;
+ /* function */
+ ND_TCHECK2(*cp, 2);
+ function = EXTRACT_LE_16BITS(cp);
+ cp += 2;
+ ND_PRINT((ndo, ", %s", tok2str(fcode_str, " invalid (%u)", function)));
+
+ switch (function) {
+ case LOOPBACK_REPLY:
+ if (len < 4)
+ goto corrupt;
+ /* receipt number */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", receipt number %u", EXTRACT_LE_16BITS(cp)));
+ cp += 2;
+ /* data */
+ ND_PRINT((ndo, ", data (%u octets)", len - 4));
+ ND_TCHECK2(*cp, len - 4);
+ break;
+ case LOOPBACK_FWDDATA:
+ if (len < 8)
+ goto corrupt;
+ /* forwarding address */
+ ND_TCHECK2(*cp, ETHER_ADDR_LEN);
+ ND_PRINT((ndo, ", forwarding address %s", etheraddr_string(ndo, cp)));
+ cp += ETHER_ADDR_LEN;
+ /* data */
+ ND_PRINT((ndo, ", data (%u octets)", len - 8));
+ ND_TCHECK2(*cp, len - 8);
+ break;
+ default:
+ ND_TCHECK2(*cp, len - 2);
+ break;
+ }
+ return;
+
+corrupt:
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+void
+loopback_print(netdissect_options *ndo, const u_char *cp, const u_int len)
+{
+ const u_char *ep = cp + len;
+ uint16_t skipCount;
+
+ ND_PRINT((ndo, "Loopback"));
+ if (len < 2)
+ goto corrupt;
+ /* skipCount */
+ ND_TCHECK2(*cp, 2);
+ skipCount = EXTRACT_LE_16BITS(cp);
+ cp += 2;
+ ND_PRINT((ndo, ", skipCount %u", skipCount));
+ if (skipCount % 8)
+ ND_PRINT((ndo, " (bogus)"));
+ if (skipCount > len - 2)
+ goto corrupt;
+ loopback_message_print(ndo, cp + skipCount, len - 2 - skipCount);
+ return;
+
+corrupt:
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-lspping.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+#include "l2vpn.h"
+#include "oui.h"
+
+/*
+ * LSPPING common header
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Version Number | Must Be Zero |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Message Type | Reply mode | Return Code | Return Subcode|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Sender's Handle |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Sequence Number |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | TimeStamp Sent (seconds) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | TimeStamp Sent (microseconds) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | TimeStamp Received (seconds) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | TimeStamp Received (microseconds) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | TLVs ... |
+ * . .
+ * . .
+ * . .
+ */
+
+struct lspping_common_header {
+ uint8_t version[2];
+ uint8_t reserved[2];
+ uint8_t msg_type;
+ uint8_t reply_mode;
+ uint8_t return_code;
+ uint8_t return_subcode;
+ uint8_t sender_handle[4];
+ uint8_t seq_number[4];
+ uint8_t ts_sent_sec[4];
+ uint8_t ts_sent_usec[4];
+ uint8_t ts_rcvd_sec[4];
+ uint8_t ts_rcvd_usec[4];
+};
+
+#define LSPPING_VERSION 1
+
+static const struct tok lspping_msg_type_values[] = {
+ { 1, "MPLS Echo Request"},
+ { 2, "MPLS Echo Reply"},
+ { 0, NULL}
+};
+
+static const struct tok lspping_reply_mode_values[] = {
+ { 1, "Do not reply"},
+ { 2, "Reply via an IPv4/IPv6 UDP packet"},
+ { 3, "Reply via an IPv4/IPv6 UDP packet with Router Alert"},
+ { 4, "Reply via application level control channel"},
+ { 0, NULL}
+};
+
+static const struct tok lspping_return_code_values[] = {
+ { 0, "No return code or return code contained in the Error Code TLV"},
+ { 1, "Malformed echo request received"},
+ { 2, "One or more of the TLVs was not understood"},
+ { 3, "Replying router is an egress for the FEC at stack depth"},
+ { 4, "Replying router has no mapping for the FEC at stack depth"},
+ { 5, "Reserved"},
+ { 6, "Reserved"},
+ { 7, "Reserved"},
+ { 8, "Label switched at stack-depth"},
+ { 9, "Label switched but no MPLS forwarding at stack-depth"},
+ { 10, "Mapping for this FEC is not the given label at stack depth"},
+ { 11, "No label entry at stack-depth"},
+ { 12, "Protocol not associated with interface at FEC stack depth"},
+};
+
+
+/*
+ * LSPPING TLV header
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Type | Length |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Value |
+ * . .
+ * . .
+ * . .
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+struct lspping_tlv_header {
+ uint8_t type[2];
+ uint8_t length[2];
+};
+
+#define LSPPING_TLV_TARGET_FEC_STACK 1
+#define LSPPING_TLV_DOWNSTREAM_MAPPING 2
+#define LSPPING_TLV_PAD 3
+#define LSPPING_TLV_VENDOR_ENTERPRISE 5
+#define LSPPING_TLV_VENDOR_ENTERPRISE_LEN 4
+#define LSPPING_TLV_INTERFACE_LABEL_STACK 7
+#define LSPPING_TLV_ERROR_CODE 9
+#define LSPPING_TLV_REPLY_TOS_BYTE 10
+#define LSPPING_TLV_BFD_DISCRIMINATOR 15 /* draft-ietf-bfd-mpls-02 */
+#define LSPPING_TLV_BFD_DISCRIMINATOR_LEN 4
+#define LSPPING_TLV_VENDOR_PRIVATE 0xfc00
+
+static const struct tok lspping_tlv_values[] = {
+ { LSPPING_TLV_TARGET_FEC_STACK, "Target FEC Stack" },
+ { LSPPING_TLV_DOWNSTREAM_MAPPING, "Downstream Mapping" },
+ { LSPPING_TLV_PAD, "Pad" },
+ { LSPPING_TLV_ERROR_CODE, "Error Code" },
+ { LSPPING_TLV_VENDOR_ENTERPRISE, "Vendor Enterprise Code" },
+ { LSPPING_TLV_INTERFACE_LABEL_STACK, "Interface Label Stack" },
+ { LSPPING_TLV_REPLY_TOS_BYTE, "Reply TOS Byte" },
+ { LSPPING_TLV_BFD_DISCRIMINATOR, "BFD Discriminator" },
+ { LSPPING_TLV_VENDOR_PRIVATE, "Vendor Private Code" },
+ { 0, NULL}
+};
+
+#define LSPPING_TLV_TARGETFEC_SUBTLV_LDP_IPV4 1
+#define LSPPING_TLV_TARGETFEC_SUBTLV_LDP_IPV6 2
+#define LSPPING_TLV_TARGETFEC_SUBTLV_RSVP_IPV4 3
+#define LSPPING_TLV_TARGETFEC_SUBTLV_RSVP_IPV6 4
+#define LSPPING_TLV_TARGETFEC_SUBTLV_L3VPN_IPV4 6
+#define LSPPING_TLV_TARGETFEC_SUBTLV_L3VPN_IPV6 7
+#define LSPPING_TLV_TARGETFEC_SUBTLV_L2VPN_ENDPT 8
+#define LSPPING_TLV_TARGETFEC_SUBTLV_L2VPN_VCID_OLD 9
+#define LSPPING_TLV_TARGETFEC_SUBTLV_L2VPN_VCID 10
+#define LSPPING_TLV_TARGETFEC_SUBTLV_BGP_IPV4 11
+#define LSPPING_TLV_TARGETFEC_SUBTLV_BGP_IPV6 12
+
+static const struct tok lspping_tlvtargetfec_subtlv_values[] = {
+ { LSPPING_TLV_TARGETFEC_SUBTLV_LDP_IPV4, "LDP IPv4 prefix"},
+ { LSPPING_TLV_TARGETFEC_SUBTLV_LDP_IPV6, "LDP IPv6 prefix"},
+ { LSPPING_TLV_TARGETFEC_SUBTLV_RSVP_IPV4, "RSVP IPv4 Session Query"},
+ { LSPPING_TLV_TARGETFEC_SUBTLV_RSVP_IPV6, "RSVP IPv6 Session Query"},
+ { 5, "Reserved"},
+ { LSPPING_TLV_TARGETFEC_SUBTLV_L3VPN_IPV4, "VPN IPv4 prefix"},
+ { LSPPING_TLV_TARGETFEC_SUBTLV_L3VPN_IPV6, "VPN IPv6 prefix"},
+ { LSPPING_TLV_TARGETFEC_SUBTLV_L2VPN_ENDPT, "L2 VPN endpoint"},
+ { LSPPING_TLV_TARGETFEC_SUBTLV_L2VPN_VCID_OLD, "L2 circuit ID (old)"},
+ { LSPPING_TLV_TARGETFEC_SUBTLV_L2VPN_VCID, "L2 circuit ID"},
+ { LSPPING_TLV_TARGETFEC_SUBTLV_BGP_IPV4, "BGP labeled IPv4 prefix"},
+ { LSPPING_TLV_TARGETFEC_SUBTLV_BGP_IPV6, "BGP labeled IPv6 prefix"},
+ { 0, NULL}
+};
+
+/*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IPv4 prefix |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Prefix Length | Must Be Zero |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct lspping_tlv_targetfec_subtlv_ldp_ipv4_t {
+ uint8_t prefix [4];
+ uint8_t prefix_len;
+};
+
+/*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IPv6 prefix |
+ * | (16 octets) |
+ * | |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Prefix Length | Must Be Zero |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct lspping_tlv_targetfec_subtlv_ldp_ipv6_t {
+ uint8_t prefix [16];
+ uint8_t prefix_len;
+};
+
+/*
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Sender identifier |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IPv4 prefix |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Prefix Length | Must Be Zero |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct lspping_tlv_targetfec_subtlv_bgp_ipv4_t {
+ uint8_t sender_id [4];
+ uint8_t prefix [4];
+ uint8_t prefix_len;
+};
+
+/*
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Sender identifier |
+ * | (16 octets) |
+ * | |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IPv6 prefix |
+ * | (16 octets) |
+ * | |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Prefix Length | Must Be Zero |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct lspping_tlv_targetfec_subtlv_bgp_ipv6_t {
+ uint8_t sender_id [16];
+ uint8_t prefix [16];
+ uint8_t prefix_len;
+};
+
+/*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IPv4 tunnel end point address |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Must Be Zero | Tunnel ID |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Extended Tunnel ID |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IPv4 tunnel sender address |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Must Be Zero | LSP ID |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct lspping_tlv_targetfec_subtlv_rsvp_ipv4_t {
+ uint8_t tunnel_endpoint [4];
+ uint8_t res[2];
+ uint8_t tunnel_id[2];
+ uint8_t extended_tunnel_id[4];
+ uint8_t tunnel_sender [4];
+ uint8_t res2[2];
+ uint8_t lsp_id [2];
+};
+
+/*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IPv6 tunnel end point address |
+ * | |
+ * | |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Must Be Zero | Tunnel ID |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Extended Tunnel ID |
+ * | |
+ * | |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IPv6 tunnel sender address |
+ * | |
+ * | |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Must Be Zero | LSP ID |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct lspping_tlv_targetfec_subtlv_rsvp_ipv6_t {
+ uint8_t tunnel_endpoint [16];
+ uint8_t res[2];
+ uint8_t tunnel_id[2];
+ uint8_t extended_tunnel_id[16];
+ uint8_t tunnel_sender [16];
+ uint8_t res2[2];
+ uint8_t lsp_id [2];
+};
+
+/*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Route Distinguisher |
+ * | (8 octets) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IPv4 prefix |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Prefix Length | Must Be Zero |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct lspping_tlv_targetfec_subtlv_l3vpn_ipv4_t {
+ uint8_t rd [8];
+ uint8_t prefix [4];
+ uint8_t prefix_len;
+};
+
+/*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Route Distinguisher |
+ * | (8 octets) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IPv6 prefix |
+ * | (16 octets) |
+ * | |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Prefix Length | Must Be Zero |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct lspping_tlv_targetfec_subtlv_l3vpn_ipv6_t {
+ uint8_t rd [8];
+ uint8_t prefix [16];
+ uint8_t prefix_len;
+};
+
+/*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Route Distinguisher |
+ * | (8 octets) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Sender's CE ID | Receiver's CE ID |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Encapsulation Type | Must Be Zero |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * 0 1 2 3
+ */
+struct lspping_tlv_targetfec_subtlv_l2vpn_endpt_t {
+ uint8_t rd [8];
+ uint8_t sender_ce_id [2];
+ uint8_t receiver_ce_id [2];
+ uint8_t encapsulation[2];
+};
+
+/*
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Remote PE Address |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | VC ID |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Encapsulation Type | Must Be Zero |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct lspping_tlv_targetfec_subtlv_l2vpn_vcid_old_t {
+ uint8_t remote_pe_address [4];
+ uint8_t vc_id [4];
+ uint8_t encapsulation[2];
+};
+
+/*
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Sender's PE Address |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Remote PE Address |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | VC ID |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Encapsulation Type | Must Be Zero |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct lspping_tlv_targetfec_subtlv_l2vpn_vcid_t {
+ uint8_t sender_pe_address [4];
+ uint8_t remote_pe_address [4];
+ uint8_t vc_id [4];
+ uint8_t encapsulation[2];
+};
+
+/*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | MTU | Address Type | Resvd (SBZ) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Downstream IP Address (4 or 16 octets) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Downstream Interface Address (4 or 16 octets) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Hash Key Type | Depth Limit | Multipath Length |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * . .
+ * . (Multipath Information) .
+ * . .
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Downstream Label | Protocol |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * . .
+ * . .
+ * . .
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Downstream Label | Protocol |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct lspping_tlv_downstream_map_ipv4_t {
+ uint8_t mtu [2];
+ uint8_t address_type;
+ uint8_t res;
+ uint8_t downstream_ip[4];
+ uint8_t downstream_interface[4];
+};
+
+struct lspping_tlv_downstream_map_ipv6_t {
+ uint8_t mtu [2];
+ uint8_t address_type;
+ uint8_t res;
+ uint8_t downstream_ip[16];
+ uint8_t downstream_interface[16];
+};
+
+struct lspping_tlv_downstream_map_info_t {
+ uint8_t hash_key_type;
+ uint8_t depth_limit;
+ uint8_t multipath_length [2];
+};
+
+#define LSPPING_AFI_IPV4 1
+#define LSPPING_AFI_UNMB 2
+#define LSPPING_AFI_IPV6 3
+
+static const struct tok lspping_tlv_downstream_addr_values[] = {
+ { LSPPING_AFI_IPV4, "IPv4"},
+ { LSPPING_AFI_IPV6, "IPv6"},
+ { LSPPING_AFI_UNMB, "Unnumbered"},
+ { 0, NULL}
+};
+
+void
+lspping_print(netdissect_options *ndo,
+ register const u_char *pptr, register u_int len)
+{
+ const struct lspping_common_header *lspping_com_header;
+ const struct lspping_tlv_header *lspping_tlv_header;
+ const struct lspping_tlv_header *lspping_subtlv_header;
+ const u_char *tptr,*tlv_tptr,*subtlv_tptr;
+ int tlen,lspping_tlv_len,lspping_tlv_type,tlv_tlen;
+ int tlv_hexdump,subtlv_hexdump;
+ int lspping_subtlv_len,lspping_subtlv_type;
+ struct timeval timestamp;
+
+ union {
+ const struct lspping_tlv_downstream_map_ipv4_t *lspping_tlv_downstream_map_ipv4;
+ const struct lspping_tlv_downstream_map_ipv6_t *lspping_tlv_downstream_map_ipv6;
+ const struct lspping_tlv_downstream_map_info_t *lspping_tlv_downstream_map_info;
+ } tlv_ptr;
+
+ union {
+ const struct lspping_tlv_targetfec_subtlv_ldp_ipv4_t *lspping_tlv_targetfec_subtlv_ldp_ipv4;
+ const struct lspping_tlv_targetfec_subtlv_ldp_ipv6_t *lspping_tlv_targetfec_subtlv_ldp_ipv6;
+ const struct lspping_tlv_targetfec_subtlv_rsvp_ipv4_t *lspping_tlv_targetfec_subtlv_rsvp_ipv4;
+ const struct lspping_tlv_targetfec_subtlv_rsvp_ipv6_t *lspping_tlv_targetfec_subtlv_rsvp_ipv6;
+ const struct lspping_tlv_targetfec_subtlv_l3vpn_ipv4_t *lspping_tlv_targetfec_subtlv_l3vpn_ipv4;
+ const struct lspping_tlv_targetfec_subtlv_l3vpn_ipv6_t *lspping_tlv_targetfec_subtlv_l3vpn_ipv6;
+ const struct lspping_tlv_targetfec_subtlv_l2vpn_endpt_t *lspping_tlv_targetfec_subtlv_l2vpn_endpt;
+ const struct lspping_tlv_targetfec_subtlv_l2vpn_vcid_old_t *lspping_tlv_targetfec_subtlv_l2vpn_vcid_old;
+ const struct lspping_tlv_targetfec_subtlv_l2vpn_vcid_t *lspping_tlv_targetfec_subtlv_l2vpn_vcid;
+ const struct lspping_tlv_targetfec_subtlv_bgp_ipv4_t *lspping_tlv_targetfec_subtlv_bgp_ipv4;
+ const struct lspping_tlv_targetfec_subtlv_bgp_ipv6_t *lspping_tlv_targetfec_subtlv_bgp_ipv6;
+ } subtlv_ptr;
+
+ tptr=pptr;
+ lspping_com_header = (const struct lspping_common_header *)pptr;
+ ND_TCHECK(*lspping_com_header);
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (EXTRACT_16BITS(&lspping_com_header->version[0]) != LSPPING_VERSION) {
+ ND_PRINT((ndo, "LSP-PING version %u packet not supported",
+ EXTRACT_16BITS(&lspping_com_header->version[0])));
+ return;
+ }
+
+ /* in non-verbose mode just lets print the basic Message Type*/
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "LSP-PINGv%u, %s, seq %u, length: %u",
+ EXTRACT_16BITS(&lspping_com_header->version[0]),
+ tok2str(lspping_msg_type_values, "unknown (%u)",lspping_com_header->msg_type),
+ EXTRACT_32BITS(lspping_com_header->seq_number),
+ len));
+ return;
+ }
+
+ /* ok they seem to want to know everything - lets fully decode it */
+
+ tlen=len;
+
+ ND_PRINT((ndo, "\n\tLSP-PINGv%u, msg-type: %s (%u), length: %u\n\t reply-mode: %s (%u)",
+ EXTRACT_16BITS(&lspping_com_header->version[0]),
+ tok2str(lspping_msg_type_values, "unknown",lspping_com_header->msg_type),
+ lspping_com_header->msg_type,
+ len,
+ tok2str(lspping_reply_mode_values, "unknown",lspping_com_header->reply_mode),
+ lspping_com_header->reply_mode));
+
+ /*
+ * the following return codes require that the subcode is attached
+ * at the end of the translated token output
+ */
+ if (lspping_com_header->return_code == 3 ||
+ lspping_com_header->return_code == 4 ||
+ lspping_com_header->return_code == 8 ||
+ lspping_com_header->return_code == 10 ||
+ lspping_com_header->return_code == 11 ||
+ lspping_com_header->return_code == 12 )
+ ND_PRINT((ndo, "\n\t Return Code: %s %u (%u)\n\t Return Subcode: (%u)",
+ tok2str(lspping_return_code_values, "unknown",lspping_com_header->return_code),
+ lspping_com_header->return_subcode,
+ lspping_com_header->return_code,
+ lspping_com_header->return_subcode));
+ else
+ ND_PRINT((ndo, "\n\t Return Code: %s (%u)\n\t Return Subcode: (%u)",
+ tok2str(lspping_return_code_values, "unknown",lspping_com_header->return_code),
+ lspping_com_header->return_code,
+ lspping_com_header->return_subcode));
+
+ ND_PRINT((ndo, "\n\t Sender Handle: 0x%08x, Sequence: %u",
+ EXTRACT_32BITS(lspping_com_header->sender_handle),
+ EXTRACT_32BITS(lspping_com_header->seq_number)));
+
+ timestamp.tv_sec=EXTRACT_32BITS(lspping_com_header->ts_sent_sec);
+ timestamp.tv_usec=EXTRACT_32BITS(lspping_com_header->ts_sent_usec);
+ ND_PRINT((ndo, "\n\t Sender Timestamp: "));
+ ts_print(ndo, ×tamp);
+
+ timestamp.tv_sec=EXTRACT_32BITS(lspping_com_header->ts_rcvd_sec);
+ timestamp.tv_usec=EXTRACT_32BITS(lspping_com_header->ts_rcvd_usec);
+ ND_PRINT((ndo, "Receiver Timestamp: "));
+ if ((timestamp.tv_sec != 0) && (timestamp.tv_usec != 0))
+ ts_print(ndo, ×tamp);
+ else
+ ND_PRINT((ndo, "no timestamp"));
+
+ tptr+=sizeof(const struct lspping_common_header);
+ tlen-=sizeof(const struct lspping_common_header);
+
+ while(tlen>(int)sizeof(struct lspping_tlv_header)) {
+
+ /* did we capture enough for fully decoding the tlv header ? */
+ ND_TCHECK2(*tptr, sizeof(struct lspping_tlv_header));
+
+ lspping_tlv_header = (const struct lspping_tlv_header *)tptr;
+ lspping_tlv_type=EXTRACT_16BITS(lspping_tlv_header->type);
+ lspping_tlv_len=EXTRACT_16BITS(lspping_tlv_header->length);
+
+ /* some little sanity checking */
+ if (lspping_tlv_type == 0 || lspping_tlv_len == 0)
+ return;
+
+ if(lspping_tlv_len < 4) {
+ ND_PRINT((ndo, "\n\t ERROR: TLV %u bogus size %u",lspping_tlv_type,lspping_tlv_len));
+ return;
+ }
+
+ ND_PRINT((ndo, "\n\t %s TLV (%u), length: %u",
+ tok2str(lspping_tlv_values,
+ "Unknown",
+ lspping_tlv_type),
+ lspping_tlv_type,
+ lspping_tlv_len));
+
+ tlv_tptr=tptr+sizeof(struct lspping_tlv_header);
+ tlv_tlen=lspping_tlv_len; /* header not included -> no adjustment */
+
+ /* did we capture enough for fully decoding the tlv ? */
+ ND_TCHECK2(*tptr, lspping_tlv_len);
+ tlv_hexdump=FALSE;
+
+ switch(lspping_tlv_type) {
+ case LSPPING_TLV_TARGET_FEC_STACK:
+ while(tlv_tlen>(int)sizeof(struct lspping_tlv_header)) {
+
+ /* did we capture enough for fully decoding the subtlv header ? */
+ ND_TCHECK2(*tptr, sizeof(struct lspping_tlv_header));
+ subtlv_hexdump=FALSE;
+
+ lspping_subtlv_header = (const struct lspping_tlv_header *)tlv_tptr;
+ lspping_subtlv_type=EXTRACT_16BITS(lspping_subtlv_header->type);
+ lspping_subtlv_len=EXTRACT_16BITS(lspping_subtlv_header->length);
+ subtlv_tptr=tlv_tptr+sizeof(struct lspping_tlv_header);
+
+ if (lspping_subtlv_len == 0)
+ break;
+
+ ND_PRINT((ndo, "\n\t %s subTLV (%u), length: %u",
+ tok2str(lspping_tlvtargetfec_subtlv_values,
+ "Unknown",
+ lspping_subtlv_type),
+ lspping_subtlv_type,
+ lspping_subtlv_len));
+
+ switch(lspping_subtlv_type) {
+
+ case LSPPING_TLV_TARGETFEC_SUBTLV_LDP_IPV4:
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv4 = \
+ (const struct lspping_tlv_targetfec_subtlv_ldp_ipv4_t *)subtlv_tptr;
+ ND_PRINT((ndo, "\n\t %s/%u",
+ ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv4->prefix),
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv4->prefix_len));
+ break;
+
+#ifdef INET6
+ case LSPPING_TLV_TARGETFEC_SUBTLV_LDP_IPV6:
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv6 = \
+ (const struct lspping_tlv_targetfec_subtlv_ldp_ipv6_t *)subtlv_tptr;
+ ND_PRINT((ndo, "\n\t %s/%u",
+ ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv6->prefix),
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv6->prefix_len));
+ break;
+#endif
+
+ case LSPPING_TLV_TARGETFEC_SUBTLV_BGP_IPV4:
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4 = \
+ (const struct lspping_tlv_targetfec_subtlv_bgp_ipv4_t *)subtlv_tptr;
+ ND_PRINT((ndo, "\n\t %s/%u, sender-id %s",
+ ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4->prefix),
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4->prefix_len,
+ ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4->sender_id)));
+ break;
+
+#ifdef INET6
+ case LSPPING_TLV_TARGETFEC_SUBTLV_BGP_IPV6:
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6 = \
+ (const struct lspping_tlv_targetfec_subtlv_bgp_ipv6_t *)subtlv_tptr;
+ ND_PRINT((ndo, "\n\t %s/%u, sender-id %s",
+ ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6->prefix),
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6->prefix_len,
+ ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6->sender_id)));
+ break;
+#endif
+
+ case LSPPING_TLV_TARGETFEC_SUBTLV_RSVP_IPV4:
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4 = \
+ (const struct lspping_tlv_targetfec_subtlv_rsvp_ipv4_t *)subtlv_tptr;
+ ND_PRINT((ndo, "\n\t tunnel end-point %s, tunnel sender %s, lsp-id 0x%04x" \
+ "\n\t tunnel-id 0x%04x, extended tunnel-id %s",
+ ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->tunnel_endpoint),
+ ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->tunnel_sender),
+ EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->lsp_id),
+ EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->tunnel_id),
+ ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->extended_tunnel_id)));
+ break;
+
+#ifdef INET6
+ case LSPPING_TLV_TARGETFEC_SUBTLV_RSVP_IPV6:
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6 = \
+ (const struct lspping_tlv_targetfec_subtlv_rsvp_ipv6_t *)subtlv_tptr;
+ ND_PRINT((ndo, "\n\t tunnel end-point %s, tunnel sender %s, lsp-id 0x%04x" \
+ "\n\t tunnel-id 0x%04x, extended tunnel-id %s",
+ ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->tunnel_endpoint),
+ ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->tunnel_sender),
+ EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->lsp_id),
+ EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->tunnel_id),
+ ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->extended_tunnel_id)));
+ break;
+#endif
+
+ case LSPPING_TLV_TARGETFEC_SUBTLV_L3VPN_IPV4:
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4 = \
+ (const struct lspping_tlv_targetfec_subtlv_l3vpn_ipv4_t *)subtlv_tptr;
+ ND_PRINT((ndo, "\n\t RD: %s, %s/%u",
+ bgp_vpn_rd_print(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4->rd),
+ ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4->prefix),
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4->prefix_len));
+ break;
+
+#ifdef INET6
+ case LSPPING_TLV_TARGETFEC_SUBTLV_L3VPN_IPV6:
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6 = \
+ (const struct lspping_tlv_targetfec_subtlv_l3vpn_ipv6_t *)subtlv_tptr;
+ ND_PRINT((ndo, "\n\t RD: %s, %s/%u",
+ bgp_vpn_rd_print(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6->rd),
+ ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6->prefix),
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6->prefix_len));
+ break;
+#endif
+
+ case LSPPING_TLV_TARGETFEC_SUBTLV_L2VPN_ENDPT:
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_endpt = \
+ (const struct lspping_tlv_targetfec_subtlv_l2vpn_endpt_t *)subtlv_tptr;
+ ND_PRINT((ndo, "\n\t RD: %s, Sender CE-ID: %u, Receiver CE-ID: %u" \
+ "\n\t Encapsulation Type: %s (%u)",
+ bgp_vpn_rd_print(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_endpt->rd),
+ EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_endpt->sender_ce_id),
+ EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_endpt->receiver_ce_id),
+ tok2str(l2vpn_encaps_values,
+ "unknown",
+ EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_endpt->encapsulation)),
+ EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_endpt->encapsulation)));
+
+ break;
+
+ /* the old L2VPN VCID subTLV does not have support for the sender field */
+ case LSPPING_TLV_TARGETFEC_SUBTLV_L2VPN_VCID_OLD:
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid_old = \
+ (const struct lspping_tlv_targetfec_subtlv_l2vpn_vcid_old_t *)subtlv_tptr;
+ ND_PRINT((ndo, "\n\t Remote PE: %s" \
+ "\n\t VC-ID: 0x%08x, Encapsulation Type: %s (%u)",
+ ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid_old->remote_pe_address),
+ EXTRACT_32BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid_old->vc_id),
+ tok2str(l2vpn_encaps_values,
+ "unknown",
+ EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid_old->encapsulation)),
+ EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid_old->encapsulation)));
+
+ break;
+
+ case LSPPING_TLV_TARGETFEC_SUBTLV_L2VPN_VCID:
+ subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid = \
+ (const struct lspping_tlv_targetfec_subtlv_l2vpn_vcid_t *)subtlv_tptr;
+ ND_PRINT((ndo, "\n\t Sender PE: %s, Remote PE: %s" \
+ "\n\t VC-ID: 0x%08x, Encapsulation Type: %s (%u)",
+ ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->sender_pe_address),
+ ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->remote_pe_address),
+ EXTRACT_32BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->vc_id),
+ tok2str(l2vpn_encaps_values,
+ "unknown",
+ EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->encapsulation)),
+ EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->encapsulation)));
+
+ break;
+
+ default:
+ subtlv_hexdump=TRUE; /* unknown subTLV just hexdump it */
+ break;
+ }
+ /* do we want to see an additionally subtlv hexdump ? */
+ if (ndo->ndo_vflag > 1 || subtlv_hexdump==TRUE)
+ print_unknown_data(ndo, tlv_tptr+sizeof(struct lspping_tlv_header), \
+ "\n\t ",
+ lspping_subtlv_len);
+
+ tlv_tptr+=lspping_subtlv_len;
+ tlv_tlen-=lspping_subtlv_len+sizeof(struct lspping_tlv_header);
+ }
+ break;
+
+ case LSPPING_TLV_DOWNSTREAM_MAPPING:
+ /* that strange thing with the downstream map TLV is that until now
+ * we do not know if its IPv4 or IPv6 , after we found the address-type
+ * lets recast the tlv_tptr and move on */
+
+ tlv_ptr.lspping_tlv_downstream_map_ipv4= \
+ (const struct lspping_tlv_downstream_map_ipv4_t *)tlv_tptr;
+ tlv_ptr.lspping_tlv_downstream_map_ipv6= \
+ (const struct lspping_tlv_downstream_map_ipv6_t *)tlv_tptr;
+ ND_PRINT((ndo, "\n\t MTU: %u, Address-Type: %s (%u)",
+ EXTRACT_16BITS(tlv_ptr.lspping_tlv_downstream_map_ipv4->mtu),
+ tok2str(lspping_tlv_downstream_addr_values,
+ "unknown",
+ tlv_ptr.lspping_tlv_downstream_map_ipv4->address_type),
+ tlv_ptr.lspping_tlv_downstream_map_ipv4->address_type));
+
+ switch(tlv_ptr.lspping_tlv_downstream_map_ipv4->address_type) {
+
+ case LSPPING_AFI_IPV4:
+ ND_PRINT((ndo, "\n\t Downstream IP: %s" \
+ "\n\t Downstream Interface IP: %s",
+ ipaddr_string(ndo, tlv_ptr.lspping_tlv_downstream_map_ipv4->downstream_ip),
+ ipaddr_string(ndo, tlv_ptr.lspping_tlv_downstream_map_ipv4->downstream_interface)));
+ tlv_tptr+=sizeof(struct lspping_tlv_downstream_map_ipv4_t);
+ tlv_tlen-=sizeof(struct lspping_tlv_downstream_map_ipv4_t);
+ break;
+#ifdef INET6
+ case LSPPING_AFI_IPV6:
+ ND_PRINT((ndo, "\n\t Downstream IP: %s" \
+ "\n\t Downstream Interface IP: %s",
+ ip6addr_string(ndo, tlv_ptr.lspping_tlv_downstream_map_ipv6->downstream_ip),
+ ip6addr_string(ndo, tlv_ptr.lspping_tlv_downstream_map_ipv6->downstream_interface)));
+ tlv_tptr+=sizeof(struct lspping_tlv_downstream_map_ipv6_t);
+ tlv_tlen-=sizeof(struct lspping_tlv_downstream_map_ipv6_t);
+ break;
+#endif
+ case LSPPING_AFI_UNMB:
+ ND_PRINT((ndo, "\n\t Downstream IP: %s" \
+ "\n\t Downstream Interface Index: 0x%08x",
+ ipaddr_string(ndo, tlv_ptr.lspping_tlv_downstream_map_ipv4->downstream_ip),
+ EXTRACT_32BITS(tlv_ptr.lspping_tlv_downstream_map_ipv4->downstream_interface)));
+ tlv_tptr+=sizeof(struct lspping_tlv_downstream_map_ipv4_t);
+ tlv_tlen-=sizeof(struct lspping_tlv_downstream_map_ipv4_t);
+ break;
+
+ default:
+ /* should not happen ! - no error message - tok2str() has barked already */
+ break;
+ }
+
+ tlv_ptr.lspping_tlv_downstream_map_info= \
+ (const struct lspping_tlv_downstream_map_info_t *)tlv_tptr;
+
+ /* FIXME add hash-key type, depth limit, multipath processing */
+
+
+ tlv_tptr+=sizeof(struct lspping_tlv_downstream_map_info_t);
+ tlv_tlen-=sizeof(struct lspping_tlv_downstream_map_info_t);
+
+ /* FIXME print downstream labels */
+
+
+ tlv_hexdump=TRUE; /* dump the TLV until code complete */
+
+ break;
+
+ case LSPPING_TLV_BFD_DISCRIMINATOR:
+ tptr += sizeof(struct lspping_tlv_header);
+ ND_TCHECK2(*tptr, LSPPING_TLV_BFD_DISCRIMINATOR_LEN);
+ ND_PRINT((ndo, "\n\t BFD Discriminator 0x%08x", EXTRACT_32BITS(tptr)));
+ break;
+
+ case LSPPING_TLV_VENDOR_ENTERPRISE:
+ {
+ uint32_t vendor_id;
+
+ ND_TCHECK2(*tptr, LSPPING_TLV_VENDOR_ENTERPRISE_LEN);
+ vendor_id = EXTRACT_32BITS(tlv_tptr);
+ ND_PRINT((ndo, "\n\t Vendor: %s (0x%04x)",
+ tok2str(smi_values, "Unknown", vendor_id),
+ vendor_id));
+ }
+ break;
+
+ /*
+ * FIXME those are the defined TLVs that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+ case LSPPING_TLV_PAD:
+ case LSPPING_TLV_ERROR_CODE:
+ case LSPPING_TLV_VENDOR_PRIVATE:
+
+ default:
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, tlv_tptr, "\n\t ", tlv_tlen);
+ break;
+ }
+ /* do we want to see an additionally tlv hexdump ? */
+ if (ndo->ndo_vflag > 1 || tlv_hexdump==TRUE)
+ print_unknown_data(ndo, tptr+sizeof(struct lspping_tlv_header), "\n\t ",
+ lspping_tlv_len);
+
+
+ /* All TLVs are aligned to four octet boundary */
+ if (lspping_tlv_len % 4) {
+ lspping_tlv_len += (4 - lspping_tlv_len % 4);
+ }
+
+ tptr+=lspping_tlv_len+sizeof(struct lspping_tlv_header);
+ tlen-=lspping_tlv_len+sizeof(struct lspping_tlv_header);
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+}
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1998-2007 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 Light Weight Access Point Protocol as per RFC 5412
+ *
+ * Original code by Carles Kishimoto <carles.kishimoto@gmail.com>
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-lwapp.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+/*
+ * LWAPP transport (common) header
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |VER| RID |C|F|L| Frag ID | Length |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Status/WLANs | Payload... |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ */
+
+struct lwapp_transport_header {
+ uint8_t version;
+ uint8_t frag_id;
+ uint8_t length[2];
+ uint16_t status;
+};
+
+/*
+ * LWAPP control header
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Message Type | Seq Num | Msg Element Length |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Session ID |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Msg Element [0..N] |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+struct lwapp_control_header {
+ uint8_t msg_type;
+ uint8_t seq_num;
+ uint8_t len[2];
+ uint8_t session_id[4];
+};
+
+#define LWAPP_VERSION 0
+#define LWAPP_EXTRACT_VERSION(x) (((x)&0xC0)>>6)
+#define LWAPP_EXTRACT_RID(x) (((x)&0x38)>>3)
+#define LWAPP_EXTRACT_CONTROL_BIT(x) (((x)&0x04)>>2)
+
+static const struct tok lwapp_header_bits_values[] = {
+ { 0x01, "Last Fragment Bit"},
+ { 0x02, "Fragment Bit"},
+ { 0x04, "Control Bit"},
+ { 0, NULL}
+};
+
+#define LWAPP_MSGTYPE_DISCOVERY_REQUEST 1
+#define LWAPP_MSGTYPE_DISCOVERY_RESPONSE 2
+#define LWAPP_MSGTYPE_JOIN_REQUEST 3
+#define LWAPP_MSGTYPE_JOIN_RESPONSE 4
+#define LWAPP_MSGTYPE_JOIN_ACK 5
+#define LWAPP_MSGTYPE_JOIN_CONFIRM 6
+#define LWAPP_MSGTYPE_CONFIGURE_REQUEST 10
+#define LWAPP_MSGTYPE_CONFIGURE_RESPONSE 11
+#define LWAPP_MSGTYPE_CONF_UPDATE_REQUEST 12
+#define LWAPP_MSGTYPE_CONF_UPDATE_RESPONSE 13
+#define LWAPP_MSGTYPE_WTP_EVENT_REQUEST 14
+#define LWAPP_MSGTYPE_WTP_EVENT_RESPONSE 15
+#define LWAPP_MSGTYPE_CHANGE_STATE_EVENT_REQUEST 16
+#define LWAPP_MSGTYPE_CHANGE_STATE_EVENT_RESPONSE 17
+#define LWAPP_MSGTYPE_ECHO_REQUEST 22
+#define LWAPP_MSGTYPE_ECHO_RESPONSE 23
+#define LWAPP_MSGTYPE_IMAGE_DATA_REQUEST 24
+#define LWAPP_MSGTYPE_IMAGE_DATA_RESPONSE 25
+#define LWAPP_MSGTYPE_RESET_REQUEST 26
+#define LWAPP_MSGTYPE_RESET_RESPONSE 27
+#define LWAPP_MSGTYPE_KEY_UPDATE_REQUEST 30
+#define LWAPP_MSGTYPE_KEY_UPDATE_RESPONSE 31
+#define LWAPP_MSGTYPE_PRIMARY_DISCOVERY_REQUEST 32
+#define LWAPP_MSGTYPE_PRIMARY_DISCOVERY_RESPONSE 33
+#define LWAPP_MSGTYPE_DATA_TRANSFER_REQUEST 34
+#define LWAPP_MSGTYPE_DATA_TRANSFER_RESPONSE 35
+#define LWAPP_MSGTYPE_CLEAR_CONFIG_INDICATION 36
+#define LWAPP_MSGTYPE_WLAN_CONFIG_REQUEST 37
+#define LWAPP_MSGTYPE_WLAN_CONFIG_RESPONSE 38
+#define LWAPP_MSGTYPE_MOBILE_CONFIG_REQUEST 39
+#define LWAPP_MSGTYPE_MOBILE_CONFIG_RESPONSE 40
+
+static const struct tok lwapp_msg_type_values[] = {
+ { LWAPP_MSGTYPE_DISCOVERY_REQUEST, "Discovery req"},
+ { LWAPP_MSGTYPE_DISCOVERY_RESPONSE, "Discovery resp"},
+ { LWAPP_MSGTYPE_JOIN_REQUEST, "Join req"},
+ { LWAPP_MSGTYPE_JOIN_RESPONSE, "Join resp"},
+ { LWAPP_MSGTYPE_JOIN_ACK, "Join ack"},
+ { LWAPP_MSGTYPE_JOIN_CONFIRM, "Join confirm"},
+ { LWAPP_MSGTYPE_CONFIGURE_REQUEST, "Configure req"},
+ { LWAPP_MSGTYPE_CONFIGURE_RESPONSE, "Configure resp"},
+ { LWAPP_MSGTYPE_CONF_UPDATE_REQUEST, "Update req"},
+ { LWAPP_MSGTYPE_CONF_UPDATE_RESPONSE, "Update resp"},
+ { LWAPP_MSGTYPE_WTP_EVENT_REQUEST, "WTP event req"},
+ { LWAPP_MSGTYPE_WTP_EVENT_RESPONSE, "WTP event resp"},
+ { LWAPP_MSGTYPE_CHANGE_STATE_EVENT_REQUEST, "Change state event req"},
+ { LWAPP_MSGTYPE_CHANGE_STATE_EVENT_RESPONSE, "Change state event resp"},
+ { LWAPP_MSGTYPE_ECHO_REQUEST, "Echo req"},
+ { LWAPP_MSGTYPE_ECHO_RESPONSE, "Echo resp"},
+ { LWAPP_MSGTYPE_IMAGE_DATA_REQUEST, "Image data req"},
+ { LWAPP_MSGTYPE_IMAGE_DATA_RESPONSE, "Image data resp"},
+ { LWAPP_MSGTYPE_RESET_REQUEST, "Channel status req"},
+ { LWAPP_MSGTYPE_RESET_RESPONSE, "Channel status resp"},
+ { LWAPP_MSGTYPE_KEY_UPDATE_REQUEST, "Key update req"},
+ { LWAPP_MSGTYPE_KEY_UPDATE_RESPONSE, "Key update resp"},
+ { LWAPP_MSGTYPE_PRIMARY_DISCOVERY_REQUEST, "Primary discovery req"},
+ { LWAPP_MSGTYPE_PRIMARY_DISCOVERY_RESPONSE, "Primary discovery resp"},
+ { LWAPP_MSGTYPE_DATA_TRANSFER_REQUEST, "Data transfer req"},
+ { LWAPP_MSGTYPE_DATA_TRANSFER_RESPONSE, "Data transfer resp"},
+ { LWAPP_MSGTYPE_CLEAR_CONFIG_INDICATION, "Clear config ind"},
+ { LWAPP_MSGTYPE_WLAN_CONFIG_REQUEST, "Wlan config req"},
+ { LWAPP_MSGTYPE_WLAN_CONFIG_RESPONSE, "Wlan config resp"},
+ { LWAPP_MSGTYPE_MOBILE_CONFIG_REQUEST, "Mobile config req"},
+ { LWAPP_MSGTYPE_MOBILE_CONFIG_RESPONSE, "Mobile config resp"},
+ { 0, NULL}
+};
+
+/*
+ * LWAPP message elements
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Type | Length | Value ... |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct lwapp_message_header {
+ uint8_t type;
+ uint8_t length[2];
+};
+
+void
+lwapp_control_print(netdissect_options *ndo,
+ const u_char *pptr, u_int len, int has_ap_ident)
+{
+ const struct lwapp_transport_header *lwapp_trans_header;
+ const struct lwapp_control_header *lwapp_control_header;
+ const u_char *tptr;
+ int tlen;
+ int msg_tlen;
+
+ tptr=pptr;
+
+ if (has_ap_ident) {
+ /* check if enough bytes for AP identity */
+ ND_TCHECK2(*tptr, 6);
+ lwapp_trans_header = (const struct lwapp_transport_header *)(pptr+6);
+ } else {
+ lwapp_trans_header = (const struct lwapp_transport_header *)pptr;
+ }
+ ND_TCHECK(*lwapp_trans_header);
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (LWAPP_EXTRACT_VERSION(lwapp_trans_header->version) != LWAPP_VERSION) {
+ ND_PRINT((ndo, "LWAPP version %u packet not supported",
+ LWAPP_EXTRACT_VERSION(lwapp_trans_header->version)));
+ return;
+ }
+
+ /* non-verbose */
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "LWAPPv%u, %s frame, Flags [%s], length %u",
+ LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
+ LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
+ bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
+ len));
+ return;
+ }
+
+ /* ok they seem to want to know everything - lets fully decode it */
+ tlen=EXTRACT_16BITS(lwapp_trans_header->length);
+
+ ND_PRINT((ndo, "LWAPPv%u, %s frame, Radio-id %u, Flags [%s], Frag-id %u, length %u",
+ LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
+ LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
+ LWAPP_EXTRACT_RID(lwapp_trans_header->version),
+ bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
+ lwapp_trans_header->frag_id,
+ tlen));
+
+ if (has_ap_ident) {
+ ND_PRINT((ndo, "\n\tAP identity: %s", etheraddr_string(ndo, tptr)));
+ tptr+=sizeof(const struct lwapp_transport_header)+6;
+ } else {
+ tptr+=sizeof(const struct lwapp_transport_header);
+ }
+
+ while(tlen>0) {
+
+ /* did we capture enough for fully decoding the object header ? */
+ ND_TCHECK2(*tptr, sizeof(struct lwapp_control_header));
+
+ lwapp_control_header = (const struct lwapp_control_header *)tptr;
+ msg_tlen = EXTRACT_16BITS(lwapp_control_header->len);
+
+ /* print message header */
+ ND_PRINT((ndo, "\n\t Msg type: %s (%u), Seqnum: %u, Msg len: %d, Session: 0x%08x",
+ tok2str(lwapp_msg_type_values,"Unknown",lwapp_control_header->msg_type),
+ lwapp_control_header->msg_type,
+ lwapp_control_header->seq_num,
+ msg_tlen,
+ EXTRACT_32BITS(lwapp_control_header->session_id)));
+
+ /* did we capture enough for fully decoding the message */
+ ND_TCHECK2(*tptr, msg_tlen);
+
+ /* XXX - Decode sub messages for each message */
+ switch(lwapp_control_header->msg_type) {
+ case LWAPP_MSGTYPE_DISCOVERY_REQUEST:
+ case LWAPP_MSGTYPE_DISCOVERY_RESPONSE:
+ case LWAPP_MSGTYPE_JOIN_REQUEST:
+ case LWAPP_MSGTYPE_JOIN_RESPONSE:
+ case LWAPP_MSGTYPE_JOIN_ACK:
+ case LWAPP_MSGTYPE_JOIN_CONFIRM:
+ case LWAPP_MSGTYPE_CONFIGURE_REQUEST:
+ case LWAPP_MSGTYPE_CONFIGURE_RESPONSE:
+ case LWAPP_MSGTYPE_CONF_UPDATE_REQUEST:
+ case LWAPP_MSGTYPE_CONF_UPDATE_RESPONSE:
+ case LWAPP_MSGTYPE_WTP_EVENT_REQUEST:
+ case LWAPP_MSGTYPE_WTP_EVENT_RESPONSE:
+ case LWAPP_MSGTYPE_CHANGE_STATE_EVENT_REQUEST:
+ case LWAPP_MSGTYPE_CHANGE_STATE_EVENT_RESPONSE:
+ case LWAPP_MSGTYPE_ECHO_REQUEST:
+ case LWAPP_MSGTYPE_ECHO_RESPONSE:
+ case LWAPP_MSGTYPE_IMAGE_DATA_REQUEST:
+ case LWAPP_MSGTYPE_IMAGE_DATA_RESPONSE:
+ case LWAPP_MSGTYPE_RESET_REQUEST:
+ case LWAPP_MSGTYPE_RESET_RESPONSE:
+ case LWAPP_MSGTYPE_KEY_UPDATE_REQUEST:
+ case LWAPP_MSGTYPE_KEY_UPDATE_RESPONSE:
+ case LWAPP_MSGTYPE_PRIMARY_DISCOVERY_REQUEST:
+ case LWAPP_MSGTYPE_PRIMARY_DISCOVERY_RESPONSE:
+ case LWAPP_MSGTYPE_DATA_TRANSFER_REQUEST:
+ case LWAPP_MSGTYPE_DATA_TRANSFER_RESPONSE:
+ case LWAPP_MSGTYPE_CLEAR_CONFIG_INDICATION:
+ case LWAPP_MSGTYPE_WLAN_CONFIG_REQUEST:
+ case LWAPP_MSGTYPE_WLAN_CONFIG_RESPONSE:
+ case LWAPP_MSGTYPE_MOBILE_CONFIG_REQUEST:
+ case LWAPP_MSGTYPE_MOBILE_CONFIG_RESPONSE:
+ default:
+ break;
+ }
+
+ tptr += sizeof(struct lwapp_control_header) + msg_tlen;
+ tlen -= sizeof(struct lwapp_control_header) + msg_tlen;
+ }
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+}
+
+void
+lwapp_data_print(netdissect_options *ndo,
+ const u_char *pptr, u_int len)
+{
+ const struct lwapp_transport_header *lwapp_trans_header;
+ const u_char *tptr;
+ int tlen;
+
+ tptr=pptr;
+
+ /* check if enough bytes for AP identity */
+ ND_TCHECK2(*tptr, 6);
+ lwapp_trans_header = (const struct lwapp_transport_header *)pptr;
+ ND_TCHECK(*lwapp_trans_header);
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (LWAPP_EXTRACT_VERSION(lwapp_trans_header->version) != LWAPP_VERSION) {
+ ND_PRINT((ndo, "LWAPP version %u packet not supported",
+ LWAPP_EXTRACT_VERSION(lwapp_trans_header->version)));
+ return;
+ }
+
+ /* non-verbose */
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "LWAPPv%u, %s frame, Flags [%s], length %u",
+ LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
+ LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
+ bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
+ len));
+ return;
+ }
+
+ /* ok they seem to want to know everything - lets fully decode it */
+ tlen=EXTRACT_16BITS(lwapp_trans_header->length);
+
+ ND_PRINT((ndo, "LWAPPv%u, %s frame, Radio-id %u, Flags [%s], Frag-id %u, length %u",
+ LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
+ LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
+ LWAPP_EXTRACT_RID(lwapp_trans_header->version),
+ bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
+ lwapp_trans_header->frag_id,
+ tlen));
+
+ tptr+=sizeof(const struct lwapp_transport_header);
+ tlen-=sizeof(const struct lwapp_transport_header);
+
+ /* FIX - An IEEE 802.11 frame follows - hexdump for now */
+ print_unknown_data(ndo, tptr, "\n\t", tlen);
+
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (C) 2001 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-lwres.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "nameser.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+
+/* BIND9 lib/lwres/include/lwres */
+typedef uint32_t lwres_uint32_t;
+typedef uint16_t lwres_uint16_t;
+typedef uint8_t lwres_uint8_t;
+
+struct lwres_lwpacket {
+ lwres_uint32_t length;
+ lwres_uint16_t version;
+ lwres_uint16_t pktflags;
+ lwres_uint32_t serial;
+ lwres_uint32_t opcode;
+ lwres_uint32_t result;
+ lwres_uint32_t recvlength;
+ lwres_uint16_t authtype;
+ lwres_uint16_t authlength;
+};
+
+#define LWRES_LWPACKETFLAG_RESPONSE 0x0001U /* if set, pkt is a response */
+
+#define LWRES_LWPACKETVERSION_0 0
+
+#define LWRES_FLAG_TRUSTNOTREQUIRED 0x00000001U
+#define LWRES_FLAG_SECUREDATA 0x00000002U
+
+/*
+ * no-op
+ */
+#define LWRES_OPCODE_NOOP 0x00000000U
+
+typedef struct {
+ /* public */
+ lwres_uint16_t datalength;
+ /* data follows */
+} lwres_nooprequest_t;
+
+typedef struct {
+ /* public */
+ lwres_uint16_t datalength;
+ /* data follows */
+} lwres_noopresponse_t;
+
+/*
+ * get addresses by name
+ */
+#define LWRES_OPCODE_GETADDRSBYNAME 0x00010001U
+
+typedef struct lwres_addr lwres_addr_t;
+
+struct lwres_addr {
+ lwres_uint32_t family;
+ lwres_uint16_t length;
+ /* address folows */
+};
+
+typedef struct {
+ /* public */
+ lwres_uint32_t flags;
+ lwres_uint32_t addrtypes;
+ lwres_uint16_t namelen;
+ /* name follows */
+} lwres_gabnrequest_t;
+
+typedef struct {
+ /* public */
+ lwres_uint32_t flags;
+ lwres_uint16_t naliases;
+ lwres_uint16_t naddrs;
+ lwres_uint16_t realnamelen;
+ /* aliases follows */
+ /* addrs follows */
+ /* realname follows */
+} lwres_gabnresponse_t;
+
+/*
+ * get name by address
+ */
+#define LWRES_OPCODE_GETNAMEBYADDR 0x00010002U
+typedef struct {
+ /* public */
+ lwres_uint32_t flags;
+ lwres_addr_t addr;
+ /* addr body follows */
+} lwres_gnbarequest_t;
+
+typedef struct {
+ /* public */
+ lwres_uint32_t flags;
+ lwres_uint16_t naliases;
+ lwres_uint16_t realnamelen;
+ /* aliases follows */
+ /* realname follows */
+} lwres_gnbaresponse_t;
+
+/*
+ * get rdata by name
+ */
+#define LWRES_OPCODE_GETRDATABYNAME 0x00010003U
+
+typedef struct {
+ /* public */
+ lwres_uint32_t flags;
+ lwres_uint16_t rdclass;
+ lwres_uint16_t rdtype;
+ lwres_uint16_t namelen;
+ /* name follows */
+} lwres_grbnrequest_t;
+
+typedef struct {
+ /* public */
+ lwres_uint32_t flags;
+ lwres_uint16_t rdclass;
+ lwres_uint16_t rdtype;
+ lwres_uint32_t ttl;
+ lwres_uint16_t nrdatas;
+ lwres_uint16_t nsigs;
+ /* realname here (len + name) */
+ /* rdata here (len + name) */
+ /* signatures here (len + name) */
+} lwres_grbnresponse_t;
+
+#define LWRDATA_VALIDATED 0x00000001
+
+#define LWRES_ADDRTYPE_V4 0x00000001U /* ipv4 */
+#define LWRES_ADDRTYPE_V6 0x00000002U /* ipv6 */
+
+#define LWRES_MAX_ALIASES 16 /* max # of aliases */
+#define LWRES_MAX_ADDRS 64 /* max # of addrs */
+
+static const struct tok opcode[] = {
+ { LWRES_OPCODE_NOOP, "noop", },
+ { LWRES_OPCODE_GETADDRSBYNAME, "getaddrsbyname", },
+ { LWRES_OPCODE_GETNAMEBYADDR, "getnamebyaddr", },
+ { LWRES_OPCODE_GETRDATABYNAME, "getrdatabyname", },
+ { 0, NULL, },
+};
+
+/* print-domain.c */
+extern const struct tok ns_type2str[];
+extern const struct tok ns_class2str[];
+
+static int
+lwres_printname(netdissect_options *ndo,
+ size_t l, const char *p0)
+{
+ const char *p;
+ size_t i;
+
+ p = p0;
+ /* + 1 for terminating \0 */
+ if (p + l + 1 > (const char *)ndo->ndo_snapend)
+ goto trunc;
+
+ ND_PRINT((ndo, " "));
+ for (i = 0; i < l; i++)
+ safeputchar(ndo, *p++);
+ p++; /* skip terminating \0 */
+
+ return p - p0;
+
+ trunc:
+ return -1;
+}
+
+static int
+lwres_printnamelen(netdissect_options *ndo,
+ const char *p)
+{
+ uint16_t l;
+ int advance;
+
+ if (p + 2 > (const char *)ndo->ndo_snapend)
+ goto trunc;
+ l = EXTRACT_16BITS(p);
+ advance = lwres_printname(ndo, l, p + 2);
+ if (advance < 0)
+ goto trunc;
+ return 2 + advance;
+
+ trunc:
+ return -1;
+}
+
+static int
+lwres_printbinlen(netdissect_options *ndo,
+ const char *p0)
+{
+ const char *p;
+ uint16_t l;
+ int i;
+
+ p = p0;
+ if (p + 2 > (const char *)ndo->ndo_snapend)
+ goto trunc;
+ l = EXTRACT_16BITS(p);
+ if (p + 2 + l > (const char *)ndo->ndo_snapend)
+ goto trunc;
+ p += 2;
+ for (i = 0; i < l; i++)
+ ND_PRINT((ndo, "%02x", *p++));
+ return p - p0;
+
+ trunc:
+ return -1;
+}
+
+static int
+lwres_printaddr(netdissect_options *ndo,
+ lwres_addr_t *ap)
+{
+ uint16_t l;
+ const char *p;
+ int i;
+
+ ND_TCHECK(ap->length);
+ l = EXTRACT_16BITS(&ap->length);
+ /* XXX ap points to packed struct */
+ p = (const char *)&ap->length + sizeof(ap->length);
+ ND_TCHECK2(*p, l);
+
+ switch (EXTRACT_32BITS(&ap->family)) {
+ case 1: /* IPv4 */
+ if (l < 4)
+ return -1;
+ ND_PRINT((ndo, " %s", ipaddr_string(ndo, p)));
+ p += sizeof(struct in_addr);
+ break;
+#ifdef INET6
+ case 2: /* IPv6 */
+ if (l < 16)
+ return -1;
+ ND_PRINT((ndo, " %s", ip6addr_string(ndo, p)));
+ p += sizeof(struct in6_addr);
+ break;
+#endif
+ default:
+ ND_PRINT((ndo, " %u/", EXTRACT_32BITS(&ap->family)));
+ for (i = 0; i < l; i++)
+ ND_PRINT((ndo, "%02x", *p++));
+ }
+
+ return p - (const char *)ap;
+
+ trunc:
+ return -1;
+}
+
+void
+lwres_print(netdissect_options *ndo,
+ register const u_char *bp, u_int length)
+{
+ const struct lwres_lwpacket *np;
+ uint32_t v;
+ const char *s;
+ int response;
+ int advance;
+ int unsupported = 0;
+
+ np = (const struct lwres_lwpacket *)bp;
+ ND_TCHECK(np->authlength);
+
+ ND_PRINT((ndo, " lwres"));
+ v = EXTRACT_16BITS(&np->version);
+ if (ndo->ndo_vflag || v != LWRES_LWPACKETVERSION_0)
+ ND_PRINT((ndo, " v%u", v));
+ if (v != LWRES_LWPACKETVERSION_0) {
+ s = (const char *)np + EXTRACT_32BITS(&np->length);
+ goto tail;
+ }
+
+ response = EXTRACT_16BITS(&np->pktflags) & LWRES_LWPACKETFLAG_RESPONSE;
+
+ /* opcode and pktflags */
+ v = EXTRACT_32BITS(&np->opcode);
+ s = tok2str(opcode, "#0x%x", v);
+ ND_PRINT((ndo, " %s%s", s, response ? "" : "?"));
+
+ /* pktflags */
+ v = EXTRACT_16BITS(&np->pktflags);
+ if (v & ~LWRES_LWPACKETFLAG_RESPONSE)
+ ND_PRINT((ndo, "[0x%x]", v));
+
+ if (ndo->ndo_vflag > 1) {
+ ND_PRINT((ndo, " (")); /*)*/
+ ND_PRINT((ndo, "serial:0x%x", EXTRACT_32BITS(&np->serial)));
+ ND_PRINT((ndo, " result:0x%x", EXTRACT_32BITS(&np->result)));
+ ND_PRINT((ndo, " recvlen:%u", EXTRACT_32BITS(&np->recvlength)));
+ /* BIND910: not used */
+ if (ndo->ndo_vflag > 2) {
+ ND_PRINT((ndo, " authtype:0x%x", EXTRACT_16BITS(&np->authtype)));
+ ND_PRINT((ndo, " authlen:%u", EXTRACT_16BITS(&np->authlength)));
+ }
+ /*(*/
+ ND_PRINT((ndo, ")"));
+ }
+
+ /* per-opcode content */
+ if (!response) {
+ /*
+ * queries
+ */
+ lwres_gabnrequest_t *gabn;
+ lwres_gnbarequest_t *gnba;
+ lwres_grbnrequest_t *grbn;
+ uint32_t l;
+
+ gabn = NULL;
+ gnba = NULL;
+ grbn = NULL;
+
+ switch (EXTRACT_32BITS(&np->opcode)) {
+ case LWRES_OPCODE_NOOP:
+ break;
+ case LWRES_OPCODE_GETADDRSBYNAME:
+ gabn = (lwres_gabnrequest_t *)(np + 1);
+ ND_TCHECK(gabn->namelen);
+ /* XXX gabn points to packed struct */
+ s = (const char *)&gabn->namelen +
+ sizeof(gabn->namelen);
+ l = EXTRACT_16BITS(&gabn->namelen);
+
+ /* BIND910: not used */
+ if (ndo->ndo_vflag > 2) {
+ ND_PRINT((ndo, " flags:0x%x",
+ EXTRACT_32BITS(&gabn->flags)));
+ }
+
+ v = EXTRACT_32BITS(&gabn->addrtypes);
+ switch (v & (LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6)) {
+ case LWRES_ADDRTYPE_V4:
+ ND_PRINT((ndo, " IPv4"));
+ break;
+ case LWRES_ADDRTYPE_V6:
+ ND_PRINT((ndo, " IPv6"));
+ break;
+ case LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6:
+ ND_PRINT((ndo, " IPv4/6"));
+ break;
+ }
+ if (v & ~(LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6))
+ ND_PRINT((ndo, "[0x%x]", v));
+
+ advance = lwres_printname(ndo, l, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ break;
+ case LWRES_OPCODE_GETNAMEBYADDR:
+ gnba = (lwres_gnbarequest_t *)(np + 1);
+ ND_TCHECK(gnba->addr);
+
+ /* BIND910: not used */
+ if (ndo->ndo_vflag > 2) {
+ ND_PRINT((ndo, " flags:0x%x",
+ EXTRACT_32BITS(&gnba->flags)));
+ }
+
+ s = (const char *)&gnba->addr;
+
+ advance = lwres_printaddr(ndo, &gnba->addr);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ break;
+ case LWRES_OPCODE_GETRDATABYNAME:
+ /* XXX no trace, not tested */
+ grbn = (lwres_grbnrequest_t *)(np + 1);
+ ND_TCHECK(grbn->namelen);
+
+ /* BIND910: not used */
+ if (ndo->ndo_vflag > 2) {
+ ND_PRINT((ndo, " flags:0x%x",
+ EXTRACT_32BITS(&grbn->flags)));
+ }
+
+ ND_PRINT((ndo, " %s", tok2str(ns_type2str, "Type%d",
+ EXTRACT_16BITS(&grbn->rdtype))));
+ if (EXTRACT_16BITS(&grbn->rdclass) != C_IN) {
+ ND_PRINT((ndo, " %s", tok2str(ns_class2str, "Class%d",
+ EXTRACT_16BITS(&grbn->rdclass))));
+ }
+
+ /* XXX grbn points to packed struct */
+ s = (const char *)&grbn->namelen +
+ sizeof(grbn->namelen);
+ l = EXTRACT_16BITS(&grbn->namelen);
+
+ advance = lwres_printname(ndo, l, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ break;
+ default:
+ unsupported++;
+ break;
+ }
+ } else {
+ /*
+ * responses
+ */
+ lwres_gabnresponse_t *gabn;
+ lwres_gnbaresponse_t *gnba;
+ lwres_grbnresponse_t *grbn;
+ uint32_t l, na;
+ uint32_t i;
+
+ gabn = NULL;
+ gnba = NULL;
+ grbn = NULL;
+
+ switch (EXTRACT_32BITS(&np->opcode)) {
+ case LWRES_OPCODE_NOOP:
+ break;
+ case LWRES_OPCODE_GETADDRSBYNAME:
+ gabn = (lwres_gabnresponse_t *)(np + 1);
+ ND_TCHECK(gabn->realnamelen);
+ /* XXX gabn points to packed struct */
+ s = (const char *)&gabn->realnamelen +
+ sizeof(gabn->realnamelen);
+ l = EXTRACT_16BITS(&gabn->realnamelen);
+
+ /* BIND910: not used */
+ if (ndo->ndo_vflag > 2) {
+ ND_PRINT((ndo, " flags:0x%x",
+ EXTRACT_32BITS(&gabn->flags)));
+ }
+
+ ND_PRINT((ndo, " %u/%u", EXTRACT_16BITS(&gabn->naliases),
+ EXTRACT_16BITS(&gabn->naddrs)));
+
+ advance = lwres_printname(ndo, l, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+
+ /* aliases */
+ na = EXTRACT_16BITS(&gabn->naliases);
+ for (i = 0; i < na; i++) {
+ advance = lwres_printnamelen(ndo, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ }
+
+ /* addrs */
+ na = EXTRACT_16BITS(&gabn->naddrs);
+ for (i = 0; i < na; i++) {
+ advance = lwres_printaddr(ndo, (lwres_addr_t *)s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ }
+ break;
+ case LWRES_OPCODE_GETNAMEBYADDR:
+ gnba = (lwres_gnbaresponse_t *)(np + 1);
+ ND_TCHECK(gnba->realnamelen);
+ /* XXX gnba points to packed struct */
+ s = (const char *)&gnba->realnamelen +
+ sizeof(gnba->realnamelen);
+ l = EXTRACT_16BITS(&gnba->realnamelen);
+
+ /* BIND910: not used */
+ if (ndo->ndo_vflag > 2) {
+ ND_PRINT((ndo, " flags:0x%x",
+ EXTRACT_32BITS(&gnba->flags)));
+ }
+
+ ND_PRINT((ndo, " %u", EXTRACT_16BITS(&gnba->naliases)));
+
+ advance = lwres_printname(ndo, l, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+
+ /* aliases */
+ na = EXTRACT_16BITS(&gnba->naliases);
+ for (i = 0; i < na; i++) {
+ advance = lwres_printnamelen(ndo, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ }
+ break;
+ case LWRES_OPCODE_GETRDATABYNAME:
+ /* XXX no trace, not tested */
+ grbn = (lwres_grbnresponse_t *)(np + 1);
+ ND_TCHECK(grbn->nsigs);
+
+ /* BIND910: not used */
+ if (ndo->ndo_vflag > 2) {
+ ND_PRINT((ndo, " flags:0x%x",
+ EXTRACT_32BITS(&grbn->flags)));
+ }
+
+ ND_PRINT((ndo, " %s", tok2str(ns_type2str, "Type%d",
+ EXTRACT_16BITS(&grbn->rdtype))));
+ if (EXTRACT_16BITS(&grbn->rdclass) != C_IN) {
+ ND_PRINT((ndo, " %s", tok2str(ns_class2str, "Class%d",
+ EXTRACT_16BITS(&grbn->rdclass))));
+ }
+ ND_PRINT((ndo, " TTL "));
+ relts_print(ndo, EXTRACT_32BITS(&grbn->ttl));
+ ND_PRINT((ndo, " %u/%u", EXTRACT_16BITS(&grbn->nrdatas),
+ EXTRACT_16BITS(&grbn->nsigs)));
+
+ /* XXX grbn points to packed struct */
+ s = (const char *)&grbn->nsigs+ sizeof(grbn->nsigs);
+
+ advance = lwres_printnamelen(ndo, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+
+ /* rdatas */
+ na = EXTRACT_16BITS(&grbn->nrdatas);
+ for (i = 0; i < na; i++) {
+ /* XXX should decode resource data */
+ advance = lwres_printbinlen(ndo, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ }
+
+ /* sigs */
+ na = EXTRACT_16BITS(&grbn->nsigs);
+ for (i = 0; i < na; i++) {
+ /* XXX how should we print it? */
+ advance = lwres_printbinlen(ndo, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ }
+ break;
+ default:
+ unsupported++;
+ break;
+ }
+ }
+
+ tail:
+ /* length mismatch */
+ if (EXTRACT_32BITS(&np->length) != length) {
+ ND_PRINT((ndo, " [len: %u != %u]", EXTRACT_32BITS(&np->length),
+ length));
+ }
+ if (!unsupported && s < (const char *)np + EXTRACT_32BITS(&np->length))
+ ND_PRINT((ndo, "[extra]"));
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "[|lwres]"));
+}
--- /dev/null
+/* Copyright (c) 2013, The TCPDUMP 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-m3ua.c,v 1.2 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+static const char tstr[] = " [|m3ua]";
+static const char cstr[] = " (corrupt)";
+
+/* RFC 4666 */
+
+#define M3UA_REL_1_0 1
+
+struct m3ua_common_header {
+ uint8_t v;
+ uint8_t reserved;
+ uint8_t msg_class;
+ uint8_t msg_type;
+ uint32_t len;
+};
+
+struct m3ua_param_header {
+ uint16_t tag;
+ uint16_t len;
+};
+
+/* message classes */
+#define M3UA_MSGC_MGMT 0
+#define M3UA_MSGC_TRANSFER 1
+#define M3UA_MSGC_SSNM 2
+#define M3UA_MSGC_ASPSM 3
+#define M3UA_MSGC_ASPTM 4
+/* reserved values */
+#define M3UA_MSGC_RKM 9
+
+static const struct tok MessageClasses[] = {
+ { M3UA_MSGC_MGMT, "Management" },
+ { M3UA_MSGC_TRANSFER, "Transfer" },
+ { M3UA_MSGC_SSNM, "SS7" },
+ { M3UA_MSGC_ASPSM, "ASP" },
+ { M3UA_MSGC_ASPTM, "ASP" },
+ { M3UA_MSGC_RKM, "Routing Key Managment" },
+ { 0, NULL }
+};
+
+/* management messages */
+#define M3UA_MGMT_ERROR 0
+#define M3UA_MGMT_NOTIFY 1
+
+static const struct tok MgmtMessages[] = {
+ { M3UA_MGMT_ERROR, "Error" },
+ { M3UA_MGMT_NOTIFY, "Notify" },
+ { 0, NULL }
+};
+
+/* transfer messages */
+#define M3UA_TRANSFER_DATA 1
+
+static const struct tok TransferMessages[] = {
+ { M3UA_TRANSFER_DATA, "Data" },
+ { 0, NULL }
+};
+
+/* SS7 Signaling Network Management messages */
+#define M3UA_SSNM_DUNA 1
+#define M3UA_SSNM_DAVA 2
+#define M3UA_SSNM_DAUD 3
+#define M3UA_SSNM_SCON 4
+#define M3UA_SSNM_DUPU 5
+#define M3UA_SSNM_DRST 6
+
+static const struct tok SS7Messages[] = {
+ { M3UA_SSNM_DUNA, "Destination Unavailable" },
+ { M3UA_SSNM_DAVA, "Destination Available" },
+ { M3UA_SSNM_DAUD, "Destination State Audit" },
+ { M3UA_SSNM_SCON, "Signalling Congestion" },
+ { M3UA_SSNM_DUPU, "Destination User Part Unavailable" },
+ { M3UA_SSNM_DRST, "Destination Restricted" },
+ { 0, NULL }
+};
+
+/* ASP State Maintenance messages */
+#define M3UA_ASP_UP 1
+#define M3UA_ASP_DN 2
+#define M3UA_ASP_BEAT 3
+#define M3UA_ASP_UP_ACK 4
+#define M3UA_ASP_DN_ACK 5
+#define M3UA_ASP_BEAT_ACK 6
+
+static const struct tok ASPStateMessages[] = {
+ { M3UA_ASP_UP, "Up" },
+ { M3UA_ASP_DN, "Down" },
+ { M3UA_ASP_BEAT, "Heartbeat" },
+ { M3UA_ASP_UP_ACK, "Up Acknowledgement" },
+ { M3UA_ASP_DN_ACK, "Down Acknowledgement" },
+ { M3UA_ASP_BEAT_ACK, "Heartbeat Acknowledgement" },
+ { 0, NULL }
+};
+
+/* ASP Traffic Maintenance messages */
+#define M3UA_ASP_AC 1
+#define M3UA_ASP_IA 2
+#define M3UA_ASP_AC_ACK 3
+#define M3UA_ASP_IA_ACK 4
+
+static const struct tok ASPTrafficMessages[] = {
+ { M3UA_ASP_AC, "Active" },
+ { M3UA_ASP_IA, "Inactive" },
+ { M3UA_ASP_AC_ACK, "Active Acknowledgement" },
+ { M3UA_ASP_IA_ACK, "Inactive Acknowledgement" },
+ { 0, NULL }
+};
+
+/* Routing Key Management messages */
+#define M3UA_RKM_REQ 1
+#define M3UA_RKM_RSP 2
+#define M3UA_RKM_DEREQ 3
+#define M3UA_RKM_DERSP 4
+
+static const struct tok RoutingKeyMgmtMessages[] = {
+ { M3UA_RKM_REQ, "Registration Request" },
+ { M3UA_RKM_RSP, "Registration Response" },
+ { M3UA_RKM_DEREQ, "Deregistration Request" },
+ { M3UA_RKM_DERSP, "Deregistration Response" },
+ { 0, NULL }
+};
+
+/* M3UA Parameters */
+#define M3UA_PARAM_INFO 0x0004
+#define M3UA_PARAM_ROUTING_CTX 0x0006
+#define M3UA_PARAM_DIAGNOSTIC 0x0007
+#define M3UA_PARAM_HB_DATA 0x0009
+#define M3UA_PARAM_TRAFFIC_MODE_TYPE 0x000b
+#define M3UA_PARAM_ERROR_CODE 0x000c
+#define M3UA_PARAM_STATUS 0x000d
+#define M3UA_PARAM_ASP_ID 0x0011
+#define M3UA_PARAM_AFFECTED_POINT_CODE 0x0012
+#define M3UA_PARAM_CORR_ID 0x0013
+
+#define M3UA_PARAM_NETWORK_APPEARANCE 0x0200
+#define M3UA_PARAM_USER 0x0204
+#define M3UA_PARAM_CONGESTION_INDICATION 0x0205
+#define M3UA_PARAM_CONCERNED_DST 0x0206
+#define M3UA_PARAM_ROUTING_KEY 0x0207
+#define M3UA_PARAM_REG_RESULT 0x0208
+#define M3UA_PARAM_DEREG_RESULT 0x0209
+#define M3UA_PARAM_LOCAL_ROUTING_KEY_ID 0x020a
+#define M3UA_PARAM_DST_POINT_CODE 0x020b
+#define M3UA_PARAM_SI 0x020c
+#define M3UA_PARAM_ORIGIN_POINT_CODE_LIST 0x020e
+#define M3UA_PARAM_PROTO_DATA 0x0210
+#define M3UA_PARAM_REG_STATUS 0x0212
+#define M3UA_PARAM_DEREG_STATUS 0x0213
+
+static const struct tok ParamName[] = {
+ { M3UA_PARAM_INFO, "INFO String" },
+ { M3UA_PARAM_ROUTING_CTX, "Routing Context" },
+ { M3UA_PARAM_DIAGNOSTIC, "Diagnostic Info" },
+ { M3UA_PARAM_HB_DATA, "Heartbeat Data" },
+ { M3UA_PARAM_TRAFFIC_MODE_TYPE, "Traffic Mode Type" },
+ { M3UA_PARAM_ERROR_CODE, "Error Code" },
+ { M3UA_PARAM_STATUS, "Status" },
+ { M3UA_PARAM_ASP_ID, "ASP Identifier" },
+ { M3UA_PARAM_AFFECTED_POINT_CODE, "Affected Point Code" },
+ { M3UA_PARAM_CORR_ID, "Correlation ID" },
+ { M3UA_PARAM_NETWORK_APPEARANCE, "Network Appearance" },
+ { M3UA_PARAM_USER, "User/Cause" },
+ { M3UA_PARAM_CONGESTION_INDICATION, "Congestion Indications" },
+ { M3UA_PARAM_CONCERNED_DST, "Concerned Destination" },
+ { M3UA_PARAM_ROUTING_KEY, "Routing Key" },
+ { M3UA_PARAM_REG_RESULT, "Registration Result" },
+ { M3UA_PARAM_DEREG_RESULT, "Deregistration Result" },
+ { M3UA_PARAM_LOCAL_ROUTING_KEY_ID, "Local Routing Key Identifier" },
+ { M3UA_PARAM_DST_POINT_CODE, "Destination Point Code" },
+ { M3UA_PARAM_SI, "Service Indicators" },
+ { M3UA_PARAM_ORIGIN_POINT_CODE_LIST, "Originating Point Code List" },
+ { M3UA_PARAM_PROTO_DATA, "Protocol Data" },
+ { M3UA_PARAM_REG_STATUS, "Registration Status" },
+ { M3UA_PARAM_DEREG_STATUS, "Deregistration Status" },
+ { 0, NULL }
+};
+
+static void
+tag_value_print(netdissect_options *ndo,
+ const u_char *buf, const uint16_t tag, const uint16_t size)
+{
+ switch (tag) {
+ case M3UA_PARAM_NETWORK_APPEARANCE:
+ case M3UA_PARAM_ROUTING_CTX:
+ case M3UA_PARAM_CORR_ID:
+ /* buf and size don't include the header */
+ if (size < 4)
+ goto corrupt;
+ ND_TCHECK2(*buf, size);
+ ND_PRINT((ndo, "0x%08x", EXTRACT_32BITS(buf)));
+ break;
+ /* ... */
+ default:
+ ND_PRINT((ndo, "(length %u)", size + (u_int)sizeof(struct m3ua_param_header)));
+ ND_TCHECK2(*buf, size);
+ }
+ return;
+
+corrupt:
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*buf, size);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Parameter Tag | Parameter Length |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * \ \
+ * / Parameter Value /
+ * \ \
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+static void
+m3ua_tags_print(netdissect_options *ndo,
+ const u_char *buf, const u_int size)
+{
+ const u_char *p = buf;
+ int align;
+ uint16_t hdr_tag;
+ uint16_t hdr_len;
+
+ while (p < buf + size) {
+ if (p + sizeof(struct m3ua_param_header) > buf + size)
+ goto corrupt;
+ ND_TCHECK2(*p, sizeof(struct m3ua_param_header));
+ /* Parameter Tag */
+ hdr_tag = EXTRACT_16BITS(p);
+ ND_PRINT((ndo, "\n\t\t\t%s: ", tok2str(ParamName, "Unknown Parameter (0x%04x)", hdr_tag)));
+ /* Parameter Length */
+ hdr_len = EXTRACT_16BITS(p + 2);
+ if (hdr_len < sizeof(struct m3ua_param_header))
+ goto corrupt;
+ /* Parameter Value */
+ align = (p + hdr_len - buf) % 4;
+ align = align ? 4 - align : 0;
+ ND_TCHECK2(*p, hdr_len + align);
+ tag_value_print(ndo, p, hdr_tag, hdr_len - sizeof(struct m3ua_param_header));
+ p += hdr_len + align;
+ }
+ return;
+
+corrupt:
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*buf, size);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Version | Reserved | Message Class | Message Type |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Message Length |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * \ \
+ * / /
+ */
+void
+m3ua_print(netdissect_options *ndo,
+ const u_char *buf, const u_int size)
+{
+ const struct m3ua_common_header *hdr = (const struct m3ua_common_header *) buf;
+ const struct tok *dict;
+
+ /* size includes the header */
+ if (size < sizeof(struct m3ua_common_header))
+ goto corrupt;
+ ND_TCHECK(*hdr);
+ if (hdr->v != M3UA_REL_1_0)
+ return;
+
+ dict =
+ hdr->msg_class == M3UA_MSGC_MGMT ? MgmtMessages :
+ hdr->msg_class == M3UA_MSGC_TRANSFER ? TransferMessages :
+ hdr->msg_class == M3UA_MSGC_SSNM ? SS7Messages :
+ hdr->msg_class == M3UA_MSGC_ASPSM ? ASPStateMessages :
+ hdr->msg_class == M3UA_MSGC_ASPTM ? ASPTrafficMessages :
+ hdr->msg_class == M3UA_MSGC_RKM ? RoutingKeyMgmtMessages :
+ NULL;
+
+ ND_PRINT((ndo, "\n\t\t%s", tok2str(MessageClasses, "Unknown message class %i", hdr->msg_class)));
+ if (dict != NULL)
+ ND_PRINT((ndo, " %s Message", tok2str(dict, "Unknown (0x%02x)", hdr->msg_type)));
+
+ if (size != EXTRACT_32BITS(&hdr->len))
+ ND_PRINT((ndo, "\n\t\t\t@@@@@@ Corrupted length %u of message @@@@@@", EXTRACT_32BITS(&hdr->len)));
+ else
+ m3ua_tags_print(ndo, buf + sizeof(struct m3ua_common_header), EXTRACT_32BITS(&hdr->len) - sizeof(struct m3ua_common_header));
+ return;
+
+corrupt:
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*buf, size);
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
--- /dev/null
+/* NetBSD: print-mobile.c,v 1.2 1998/09/30 08:57:01 hwr Exp */
+
+/*
+ * (c) 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Heiko W.Rupp <hwr@pilhuhn.de>
+ *
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-mobile.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+
+#define MOBILE_SIZE (8)
+
+struct mobile_ip {
+ uint16_t proto;
+ uint16_t hcheck;
+ uint32_t odst;
+ uint32_t osrc;
+};
+
+#define OSRC_PRES 0x0080 /* old source is present */
+
+/*
+ * Deencapsulate and print a mobile-tunneled IP datagram
+ */
+void
+mobile_print(netdissect_options *ndo, const u_char *bp, u_int length)
+{
+ const struct mobile_ip *mob;
+ struct cksum_vec vec[1];
+ u_short proto,crc;
+ u_char osp =0; /* old source address present */
+
+ mob = (const struct mobile_ip *)bp;
+
+ if (length < MOBILE_SIZE || !ND_TTEST(*mob)) {
+ ND_PRINT((ndo, "[|mobile]"));
+ return;
+ }
+ ND_PRINT((ndo, "mobile: "));
+
+ proto = EXTRACT_16BITS(&mob->proto);
+ crc = EXTRACT_16BITS(&mob->hcheck);
+ if (proto & OSRC_PRES) {
+ osp=1;
+ }
+
+ if (osp) {
+ ND_PRINT((ndo, "[S] "));
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "%s ", ipaddr_string(ndo, &mob->osrc)));
+ } else {
+ ND_PRINT((ndo, "[] "));
+ }
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "> %s ", ipaddr_string(ndo, &mob->odst)));
+ ND_PRINT((ndo, "(oproto=%d)", proto>>8));
+ }
+ vec[0].ptr = (const uint8_t *)(void *)mob;
+ vec[0].len = osp ? 12 : 8;
+ if (in_cksum(vec, 1)!=0) {
+ ND_PRINT((ndo, " (bad checksum %d)", crc));
+ }
+}
--- /dev/null
+/*
+ * Copyright (C) 2002 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-mobility.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef INET6
+#include <tcpdump-stdinc.h>
+
+#include "ip6.h"
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+
+/* Mobility header */
+struct ip6_mobility {
+ uint8_t ip6m_pproto; /* following payload protocol (for PG) */
+ uint8_t ip6m_len; /* length in units of 8 octets */
+ uint8_t ip6m_type; /* message type */
+ uint8_t reserved; /* reserved */
+ uint16_t ip6m_cksum; /* sum of IPv6 pseudo-header and MH */
+ union {
+ uint16_t ip6m_un_data16[1]; /* type-specific field */
+ uint8_t ip6m_un_data8[2]; /* type-specific field */
+ } ip6m_dataun;
+};
+
+#define ip6m_data16 ip6m_dataun.ip6m_un_data16
+#define ip6m_data8 ip6m_dataun.ip6m_un_data8
+
+#define IP6M_MINLEN 8
+
+/* http://www.iana.org/assignments/mobility-parameters/mobility-parameters.xhtml */
+
+/* message type */
+#define IP6M_BINDING_REQUEST 0 /* Binding Refresh Request */
+#define IP6M_HOME_TEST_INIT 1 /* Home Test Init */
+#define IP6M_CAREOF_TEST_INIT 2 /* Care-of Test Init */
+#define IP6M_HOME_TEST 3 /* Home Test */
+#define IP6M_CAREOF_TEST 4 /* Care-of Test */
+#define IP6M_BINDING_UPDATE 5 /* Binding Update */
+#define IP6M_BINDING_ACK 6 /* Binding Acknowledgement */
+#define IP6M_BINDING_ERROR 7 /* Binding Error */
+#define IP6M_MAX 7
+
+static const unsigned ip6m_hdrlen[IP6M_MAX + 1] = {
+ IP6M_MINLEN, /* IP6M_BINDING_REQUEST */
+ IP6M_MINLEN + 8, /* IP6M_HOME_TEST_INIT */
+ IP6M_MINLEN + 8, /* IP6M_CAREOF_TEST_INIT */
+ IP6M_MINLEN + 16, /* IP6M_HOME_TEST */
+ IP6M_MINLEN + 16, /* IP6M_CAREOF_TEST */
+ IP6M_MINLEN + 4, /* IP6M_BINDING_UPDATE */
+ IP6M_MINLEN + 4, /* IP6M_BINDING_ACK */
+ IP6M_MINLEN + 16, /* IP6M_BINDING_ERROR */
+};
+
+/* XXX: unused */
+#define IP6MOPT_BU_MINLEN 10
+#define IP6MOPT_BA_MINLEN 13
+#define IP6MOPT_BR_MINLEN 2
+
+/* Mobility Header Options */
+#define IP6MOPT_MINLEN 2
+#define IP6MOPT_PAD1 0x0 /* Pad1 */
+#define IP6MOPT_PADN 0x1 /* PadN */
+#define IP6MOPT_REFRESH 0x2 /* Binding Refresh Advice */
+#define IP6MOPT_REFRESH_MINLEN 4
+#define IP6MOPT_ALTCOA 0x3 /* Alternate Care-of Address */
+#define IP6MOPT_ALTCOA_MINLEN 18
+#define IP6MOPT_NONCEID 0x4 /* Nonce Indices */
+#define IP6MOPT_NONCEID_MINLEN 6
+#define IP6MOPT_AUTH 0x5 /* Binding Authorization Data */
+#define IP6MOPT_AUTH_MINLEN 12
+
+static void
+mobility_opt_print(netdissect_options *ndo,
+ const u_char *bp, const unsigned len)
+{
+ unsigned i, optlen;
+
+ for (i = 0; i < len; i += optlen) {
+ ND_TCHECK(bp[i]);
+ if (bp[i] == IP6MOPT_PAD1)
+ optlen = 1;
+ else {
+ if (i + 1 < len) {
+ ND_TCHECK(bp[i + 1]);
+ optlen = bp[i + 1] + 2;
+ }
+ else
+ goto trunc;
+ }
+ if (i + optlen > len)
+ goto trunc;
+ ND_TCHECK(bp[i + optlen]);
+
+ switch (bp[i]) {
+ case IP6MOPT_PAD1:
+ ND_PRINT((ndo, "(pad1)"));
+ break;
+ case IP6MOPT_PADN:
+ if (len - i < IP6MOPT_MINLEN) {
+ ND_PRINT((ndo, "(padn: trunc)"));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "(padn)"));
+ break;
+ case IP6MOPT_REFRESH:
+ if (len - i < IP6MOPT_REFRESH_MINLEN) {
+ ND_PRINT((ndo, "(refresh: trunc)"));
+ goto trunc;
+ }
+ /* units of 4 secs */
+ ND_PRINT((ndo, "(refresh: %u)",
+ EXTRACT_16BITS(&bp[i+2]) << 2));
+ break;
+ case IP6MOPT_ALTCOA:
+ if (len - i < IP6MOPT_ALTCOA_MINLEN) {
+ ND_PRINT((ndo, "(altcoa: trunc)"));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "(alt-CoA: %s)", ip6addr_string(ndo, &bp[i+2])));
+ break;
+ case IP6MOPT_NONCEID:
+ if (len - i < IP6MOPT_NONCEID_MINLEN) {
+ ND_PRINT((ndo, "(ni: trunc)"));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "(ni: ho=0x%04x co=0x%04x)",
+ EXTRACT_16BITS(&bp[i+2]),
+ EXTRACT_16BITS(&bp[i+4])));
+ break;
+ case IP6MOPT_AUTH:
+ if (len - i < IP6MOPT_AUTH_MINLEN) {
+ ND_PRINT((ndo, "(auth: trunc)"));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "(auth)"));
+ break;
+ default:
+ if (len - i < IP6MOPT_MINLEN) {
+ ND_PRINT((ndo, "(sopt_type %u: trunc)", bp[i]));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "(type-0x%02x: len=%u)", bp[i], bp[i + 1]));
+ break;
+ }
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[trunc] "));
+}
+
+/*
+ * Mobility Header
+ */
+int
+mobility_print(netdissect_options *ndo,
+ const u_char *bp, const u_char *bp2 _U_)
+{
+ const struct ip6_mobility *mh;
+ const u_char *ep;
+ unsigned mhlen, hlen;
+ uint8_t type;
+
+ mh = (struct ip6_mobility *)bp;
+
+ /* 'ep' points to the end of available data. */
+ ep = ndo->ndo_snapend;
+
+ if (!ND_TTEST(mh->ip6m_len)) {
+ /*
+ * There's not enough captured data to include the
+ * mobility header length.
+ *
+ * Our caller expects us to return the length, however,
+ * so return a value that will run to the end of the
+ * captured data.
+ *
+ * XXX - "ip6_print()" doesn't do anything with the
+ * returned length, however, as it breaks out of the
+ * header-processing loop.
+ */
+ mhlen = ep - bp;
+ goto trunc;
+ }
+ mhlen = (mh->ip6m_len + 1) << 3;
+
+ /* XXX ip6m_cksum */
+
+ ND_TCHECK(mh->ip6m_type);
+ type = mh->ip6m_type;
+ if (type <= IP6M_MAX && mhlen < ip6m_hdrlen[type]) {
+ ND_PRINT((ndo, "(header length %u is too small for type %u)", mhlen, type));
+ goto trunc;
+ }
+ switch (type) {
+ case IP6M_BINDING_REQUEST:
+ ND_PRINT((ndo, "mobility: BRR"));
+ hlen = IP6M_MINLEN;
+ break;
+ case IP6M_HOME_TEST_INIT:
+ case IP6M_CAREOF_TEST_INIT:
+ ND_PRINT((ndo, "mobility: %soTI",
+ type == IP6M_HOME_TEST_INIT ? "H" : "C"));
+ hlen = IP6M_MINLEN;
+ if (ndo->ndo_vflag) {
+ ND_TCHECK2(*mh, hlen + 8);
+ ND_PRINT((ndo, " %s Init Cookie=%08x:%08x",
+ type == IP6M_HOME_TEST_INIT ? "Home" : "Care-of",
+ EXTRACT_32BITS(&bp[hlen]),
+ EXTRACT_32BITS(&bp[hlen + 4])));
+ }
+ hlen += 8;
+ break;
+ case IP6M_HOME_TEST:
+ case IP6M_CAREOF_TEST:
+ ND_PRINT((ndo, "mobility: %soT",
+ type == IP6M_HOME_TEST ? "H" : "C"));
+ ND_TCHECK(mh->ip6m_data16[0]);
+ ND_PRINT((ndo, " nonce id=0x%x", EXTRACT_16BITS(&mh->ip6m_data16[0])));
+ hlen = IP6M_MINLEN;
+ if (ndo->ndo_vflag) {
+ ND_TCHECK2(*mh, hlen + 8);
+ ND_PRINT((ndo, " %s Init Cookie=%08x:%08x",
+ type == IP6M_HOME_TEST ? "Home" : "Care-of",
+ EXTRACT_32BITS(&bp[hlen]),
+ EXTRACT_32BITS(&bp[hlen + 4])));
+ }
+ hlen += 8;
+ if (ndo->ndo_vflag) {
+ ND_TCHECK2(*mh, hlen + 8);
+ ND_PRINT((ndo, " %s Keygen Token=%08x:%08x",
+ type == IP6M_HOME_TEST ? "Home" : "Care-of",
+ EXTRACT_32BITS(&bp[hlen]),
+ EXTRACT_32BITS(&bp[hlen + 4])));
+ }
+ hlen += 8;
+ break;
+ case IP6M_BINDING_UPDATE:
+ ND_PRINT((ndo, "mobility: BU"));
+ ND_TCHECK(mh->ip6m_data16[0]);
+ ND_PRINT((ndo, " seq#=%u", EXTRACT_16BITS(&mh->ip6m_data16[0])));
+ hlen = IP6M_MINLEN;
+ ND_TCHECK2(*mh, hlen + 1);
+ if (bp[hlen] & 0xf0)
+ ND_PRINT((ndo, " "));
+ if (bp[hlen] & 0x80)
+ ND_PRINT((ndo, "A"));
+ if (bp[hlen] & 0x40)
+ ND_PRINT((ndo, "H"));
+ if (bp[hlen] & 0x20)
+ ND_PRINT((ndo, "L"));
+ if (bp[hlen] & 0x10)
+ ND_PRINT((ndo, "K"));
+ /* Reserved (4bits) */
+ hlen += 1;
+ /* Reserved (8bits) */
+ hlen += 1;
+ ND_TCHECK2(*mh, hlen + 2);
+ /* units of 4 secs */
+ ND_PRINT((ndo, " lifetime=%u", EXTRACT_16BITS(&bp[hlen]) << 2));
+ hlen += 2;
+ break;
+ case IP6M_BINDING_ACK:
+ ND_PRINT((ndo, "mobility: BA"));
+ ND_TCHECK(mh->ip6m_data8[0]);
+ ND_PRINT((ndo, " status=%u", mh->ip6m_data8[0]));
+ if (mh->ip6m_data8[1] & 0x80)
+ ND_PRINT((ndo, " K"));
+ /* Reserved (7bits) */
+ hlen = IP6M_MINLEN;
+ ND_TCHECK2(*mh, hlen + 2);
+ ND_PRINT((ndo, " seq#=%u", EXTRACT_16BITS(&bp[hlen])));
+ hlen += 2;
+ ND_TCHECK2(*mh, hlen + 2);
+ /* units of 4 secs */
+ ND_PRINT((ndo, " lifetime=%u", EXTRACT_16BITS(&bp[hlen]) << 2));
+ hlen += 2;
+ break;
+ case IP6M_BINDING_ERROR:
+ ND_PRINT((ndo, "mobility: BE"));
+ ND_TCHECK(mh->ip6m_data8[0]);
+ ND_PRINT((ndo, " status=%u", mh->ip6m_data8[0]));
+ /* Reserved */
+ hlen = IP6M_MINLEN;
+ ND_TCHECK2(*mh, hlen + 16);
+ ND_PRINT((ndo, " homeaddr %s", ip6addr_string(ndo, &bp[hlen])));
+ hlen += 16;
+ break;
+ default:
+ ND_PRINT((ndo, "mobility: type-#%u len=%u", type, mh->ip6m_len));
+ return(mhlen);
+ break;
+ }
+ if (ndo->ndo_vflag)
+ mobility_opt_print(ndo, &bp[hlen], mhlen - hlen);
+
+ return(mhlen);
+
+ trunc:
+ ND_PRINT((ndo, "[|MOBILITY]"));
+ return(mhlen);
+}
+#endif /* INET6 */
--- /dev/null
+/*
+ * Copyright (c) 1998-2006 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 IEEE MPCP protocol as per 802.3ah
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-mpcp.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+#define MPCP_TIMESTAMP_LEN 4
+#define MPCP_TIMESTAMP_DURATION_LEN 2
+
+struct mpcp_common_header_t {
+ uint8_t opcode[2];
+ uint8_t timestamp[MPCP_TIMESTAMP_LEN];
+};
+
+#define MPCP_OPCODE_PAUSE 0x0001
+#define MPCP_OPCODE_GATE 0x0002
+#define MPCP_OPCODE_REPORT 0x0003
+#define MPCP_OPCODE_REG_REQ 0x0004
+#define MPCP_OPCODE_REG 0x0005
+#define MPCP_OPCODE_REG_ACK 0x0006
+
+static const struct tok mpcp_opcode_values[] = {
+ { MPCP_OPCODE_PAUSE, "Pause" },
+ { MPCP_OPCODE_GATE, "Gate" },
+ { MPCP_OPCODE_REPORT, "Report" },
+ { MPCP_OPCODE_REG_REQ, "Register Request" },
+ { MPCP_OPCODE_REG, "Register" },
+ { MPCP_OPCODE_REG_ACK, "Register ACK" },
+ { 0, NULL}
+};
+
+#define MPCP_GRANT_NUMBER_LEN 1
+#define MPCP_GRANT_NUMBER_MASK 0x7
+static const struct tok mpcp_grant_flag_values[] = {
+ { 0x08, "Discovery" },
+ { 0x10, "Force Grant #1" },
+ { 0x20, "Force Grant #2" },
+ { 0x40, "Force Grant #3" },
+ { 0x80, "Force Grant #4" },
+ { 0, NULL}
+};
+
+struct mpcp_grant_t {
+ uint8_t starttime[MPCP_TIMESTAMP_LEN];
+ uint8_t duration[MPCP_TIMESTAMP_DURATION_LEN];
+};
+
+struct mpcp_reg_req_t {
+ uint8_t flags;
+ uint8_t pending_grants;
+};
+
+
+static const struct tok mpcp_reg_req_flag_values[] = {
+ { 1, "Register" },
+ { 3, "De-Register" },
+ { 0, NULL}
+};
+
+struct mpcp_reg_t {
+ uint8_t assigned_port[2];
+ uint8_t flags;
+ uint8_t sync_time[MPCP_TIMESTAMP_DURATION_LEN];
+ uint8_t echoed_pending_grants;
+};
+
+static const struct tok mpcp_reg_flag_values[] = {
+ { 1, "Re-Register" },
+ { 2, "De-Register" },
+ { 3, "ACK" },
+ { 4, "NACK" },
+ { 0, NULL}
+};
+
+#define MPCP_REPORT_QUEUESETS_LEN 1
+#define MPCP_REPORT_REPORTBITMAP_LEN 1
+static const struct tok mpcp_report_bitmap_values[] = {
+ { 0x01, "Q0" },
+ { 0x02, "Q1" },
+ { 0x04, "Q2" },
+ { 0x08, "Q3" },
+ { 0x10, "Q4" },
+ { 0x20, "Q5" },
+ { 0x40, "Q6" },
+ { 0x80, "Q7" },
+ { 0, NULL}
+};
+
+struct mpcp_reg_ack_t {
+ uint8_t flags;
+ uint8_t echoed_assigned_port[2];
+ uint8_t echoed_sync_time[MPCP_TIMESTAMP_DURATION_LEN];
+};
+
+static const struct tok mpcp_reg_ack_flag_values[] = {
+ { 0, "NACK" },
+ { 1, "ACK" },
+ { 0, NULL}
+};
+
+void
+mpcp_print(netdissect_options *ndo, register const u_char *pptr, register u_int length)
+{
+ union {
+ const struct mpcp_common_header_t *common_header;
+ const struct mpcp_grant_t *grant;
+ const struct mpcp_reg_req_t *reg_req;
+ const struct mpcp_reg_t *reg;
+ const struct mpcp_reg_ack_t *reg_ack;
+ } mpcp;
+
+
+ const u_char *tptr;
+ uint16_t opcode;
+ uint8_t grant_numbers, grant;
+ uint8_t queue_sets, queue_set, report_bitmap, report;
+
+ tptr=pptr;
+ mpcp.common_header = (const struct mpcp_common_header_t *)pptr;
+
+ ND_TCHECK2(*tptr, sizeof(const struct mpcp_common_header_t));
+ opcode = EXTRACT_16BITS(mpcp.common_header->opcode);
+ ND_PRINT((ndo, "MPCP, Opcode %s", tok2str(mpcp_opcode_values, "Unknown (%u)", opcode)));
+ if (opcode != MPCP_OPCODE_PAUSE) {
+ ND_PRINT((ndo, ", Timestamp %u ticks", EXTRACT_32BITS(mpcp.common_header->timestamp)));
+ }
+ ND_PRINT((ndo, ", length %u", length));
+
+ if (!ndo->ndo_vflag)
+ return;
+
+ tptr += sizeof(const struct mpcp_common_header_t);
+
+ switch (opcode) {
+ case MPCP_OPCODE_PAUSE:
+ break;
+
+ case MPCP_OPCODE_GATE:
+ ND_TCHECK2(*tptr, MPCP_GRANT_NUMBER_LEN);
+ grant_numbers = *tptr & MPCP_GRANT_NUMBER_MASK;
+ ND_PRINT((ndo, "\n\tGrant Numbers %u, Flags [ %s ]",
+ grant_numbers,
+ bittok2str(mpcp_grant_flag_values,
+ "?",
+ *tptr &~ MPCP_GRANT_NUMBER_MASK)));
+ tptr++;
+
+ for (grant = 1; grant <= grant_numbers; grant++) {
+ ND_TCHECK2(*tptr, sizeof(const struct mpcp_grant_t));
+ mpcp.grant = (const struct mpcp_grant_t *)tptr;
+ ND_PRINT((ndo, "\n\tGrant #%u, Start-Time %u ticks, duration %u ticks",
+ grant,
+ EXTRACT_32BITS(mpcp.grant->starttime),
+ EXTRACT_16BITS(mpcp.grant->duration)));
+ tptr += sizeof(const struct mpcp_grant_t);
+ }
+
+ ND_TCHECK2(*tptr, MPCP_TIMESTAMP_DURATION_LEN);
+ ND_PRINT((ndo, "\n\tSync-Time %u ticks", EXTRACT_16BITS(tptr)));
+ break;
+
+
+ case MPCP_OPCODE_REPORT:
+ ND_TCHECK2(*tptr, MPCP_REPORT_QUEUESETS_LEN);
+ queue_sets = *tptr;
+ tptr+=MPCP_REPORT_QUEUESETS_LEN;
+ ND_PRINT((ndo, "\n\tTotal Queue-Sets %u", queue_sets));
+
+ for (queue_set = 1; queue_set < queue_sets; queue_set++) {
+ ND_TCHECK2(*tptr, MPCP_REPORT_REPORTBITMAP_LEN);
+ report_bitmap = *(tptr);
+ ND_PRINT((ndo, "\n\t Queue-Set #%u, Report-Bitmap [ %s ]",
+ queue_sets,
+ bittok2str(mpcp_report_bitmap_values, "Unknown", report_bitmap)));
+ tptr++;
+
+ report=1;
+ while (report_bitmap != 0) {
+ if (report_bitmap & 1) {
+ ND_TCHECK2(*tptr, MPCP_TIMESTAMP_DURATION_LEN);
+ ND_PRINT((ndo, "\n\t Q%u Report, Duration %u ticks",
+ report,
+ EXTRACT_16BITS(tptr)));
+ tptr+=MPCP_TIMESTAMP_DURATION_LEN;
+ }
+ report++;
+ report_bitmap = report_bitmap >> 1;
+ }
+ }
+ break;
+
+ case MPCP_OPCODE_REG_REQ:
+ ND_TCHECK2(*tptr, sizeof(const struct mpcp_reg_req_t));
+ mpcp.reg_req = (const struct mpcp_reg_req_t *)tptr;
+ ND_PRINT((ndo, "\n\tFlags [ %s ], Pending-Grants %u",
+ bittok2str(mpcp_reg_req_flag_values, "Reserved", mpcp.reg_req->flags),
+ mpcp.reg_req->pending_grants));
+ break;
+
+ case MPCP_OPCODE_REG:
+ ND_TCHECK2(*tptr, sizeof(const struct mpcp_reg_t));
+ mpcp.reg = (const struct mpcp_reg_t *)tptr;
+ ND_PRINT((ndo, "\n\tAssigned-Port %u, Flags [ %s ]" \
+ "\n\tSync-Time %u ticks, Echoed-Pending-Grants %u",
+ EXTRACT_16BITS(mpcp.reg->assigned_port),
+ bittok2str(mpcp_reg_flag_values, "Reserved", mpcp.reg->flags),
+ EXTRACT_16BITS(mpcp.reg->sync_time),
+ mpcp.reg->echoed_pending_grants));
+ break;
+
+ case MPCP_OPCODE_REG_ACK:
+ ND_TCHECK2(*tptr, sizeof(const struct mpcp_reg_ack_t));
+ mpcp.reg_ack = (const struct mpcp_reg_ack_t *)tptr;
+ ND_PRINT((ndo, "\n\tEchoed-Assigned-Port %u, Flags [ %s ]" \
+ "\n\tEchoed-Sync-Time %u ticks",
+ EXTRACT_16BITS(mpcp.reg_ack->echoed_assigned_port),
+ bittok2str(mpcp_reg_ack_flag_values, "Reserved", mpcp.reg_ack->flags),
+ EXTRACT_16BITS(mpcp.reg_ack->echoed_sync_time)));
+ break;
+
+ default:
+ /* unknown opcode - hexdump for now */
+ print_unknown_data(ndo,pptr, "\n\t", length);
+ break;
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "\n\t[|MPCP]"));
+}
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (C) 2001 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-mpls.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h" /* must come after interface.h */
+#include "mpls.h"
+
+static const char *mpls_labelname[] = {
+/*0*/ "IPv4 explicit NULL", "router alert", "IPv6 explicit NULL",
+ "implicit NULL", "rsvd",
+/*5*/ "rsvd", "rsvd", "rsvd", "rsvd", "rsvd",
+/*10*/ "rsvd", "rsvd", "rsvd", "rsvd", "rsvd",
+/*15*/ "rsvd",
+};
+
+enum mpls_packet_type {
+ PT_UNKNOWN,
+ PT_IPV4,
+ PT_IPV6,
+ PT_OSI
+};
+
+/*
+ * RFC3032: MPLS label stack encoding
+ */
+void
+mpls_print(netdissect_options *ndo, const u_char *bp, u_int length)
+{
+ const u_char *p;
+ uint32_t label_entry;
+ uint16_t label_stack_depth = 0;
+ enum mpls_packet_type pt = PT_UNKNOWN;
+
+ p = bp;
+ ND_PRINT((ndo, "MPLS"));
+ do {
+ ND_TCHECK2(*p, sizeof(label_entry));
+ label_entry = EXTRACT_32BITS(p);
+ ND_PRINT((ndo, "%s(label %u",
+ (label_stack_depth && ndo->ndo_vflag) ? "\n\t" : " ",
+ MPLS_LABEL(label_entry)));
+ label_stack_depth++;
+ if (ndo->ndo_vflag &&
+ MPLS_LABEL(label_entry) < sizeof(mpls_labelname) / sizeof(mpls_labelname[0]))
+ ND_PRINT((ndo, " (%s)", mpls_labelname[MPLS_LABEL(label_entry)]));
+ ND_PRINT((ndo, ", exp %u", MPLS_EXP(label_entry)));
+ if (MPLS_STACK(label_entry))
+ ND_PRINT((ndo, ", [S]"));
+ ND_PRINT((ndo, ", ttl %u)", MPLS_TTL(label_entry)));
+
+ 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 */
+ pt = PT_IPV4;
+ break;
+
+ case 2: /* IPv6 explicit NULL label */
+ pt = PT_IPV6;
+ break;
+
+ default:
+ /*
+ * Generally there's no indication of protocol in MPLS label
+ * 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.
+ */
+ switch(*p) {
+
+ case 0x45:
+ case 0x46:
+ case 0x47:
+ case 0x48:
+ case 0x49:
+ case 0x4a:
+ case 0x4b:
+ case 0x4c:
+ case 0x4d:
+ case 0x4e:
+ case 0x4f:
+ pt = PT_IPV4;
+ break;
+
+ case 0x60:
+ case 0x61:
+ case 0x62:
+ case 0x63:
+ case 0x64:
+ case 0x65:
+ case 0x66:
+ case 0x67:
+ case 0x68:
+ case 0x69:
+ case 0x6a:
+ case 0x6b:
+ case 0x6c:
+ case 0x6d:
+ case 0x6e:
+ case 0x6f:
+ pt = PT_IPV6;
+ break;
+
+ case 0x81:
+ case 0x82:
+ case 0x83:
+ 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 (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, length - (p - bp));
+ return;
+ }
+ ND_PRINT((ndo, ndo->ndo_vflag ? "\n\t" : " "));
+ switch (pt) {
+
+ case PT_IPV4:
+ ip_print(ndo, p, length - (p - bp));
+ break;
+
+ case PT_IPV6:
+ ip6_print(ndo, p, length - (p - bp));
+ break;
+
+ case PT_OSI:
+ isoclns_print(ndo, p, length - (p - bp), length - (p - bp));
+ break;
+
+ default:
+ break;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|MPLS]"));
+}
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/**
+ * Copyright (c) 2012
+ *
+ * Gregory Detal <gregory.detal@uclouvain.be>
+ * Christoph Paasch <christoph.paasch@uclouvain.be>
+ *
+ * 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 of the Laboratory 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.
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+#include "tcp.h"
+
+#define MPTCP_SUB_CAPABLE 0x0
+#define MPTCP_SUB_JOIN 0x1
+#define MPTCP_SUB_DSS 0x2
+#define MPTCP_SUB_ADD_ADDR 0x3
+#define MPTCP_SUB_REMOVE_ADDR 0x4
+#define MPTCP_SUB_PRIO 0x5
+#define MPTCP_SUB_FAIL 0x6
+#define MPTCP_SUB_FCLOSE 0x7
+
+struct mptcp_option {
+ uint8_t kind;
+ uint8_t len;
+ uint8_t sub_etc; /* subtype upper 4 bits, other stuff lower 4 bits */
+};
+
+#define MPTCP_OPT_SUBTYPE(sub_etc) (((sub_etc) >> 4) & 0xF)
+
+struct mp_capable {
+ uint8_t kind;
+ uint8_t len;
+ uint8_t sub_ver;
+ uint8_t flags;
+ uint8_t sender_key[8];
+ uint8_t receiver_key[8];
+};
+
+#define MP_CAPABLE_OPT_VERSION(sub_ver) (((sub_ver) >> 0) & 0xF)
+#define MP_CAPABLE_C 0x80
+#define MP_CAPABLE_S 0x01
+
+struct mp_join {
+ uint8_t kind;
+ uint8_t len;
+ uint8_t sub_b;
+ uint8_t addr_id;
+ union {
+ struct {
+ uint8_t token[4];
+ uint8_t nonce[4];
+ } syn;
+ struct {
+ uint8_t mac[8];
+ uint8_t nonce[4];
+ } synack;
+ struct {
+ uint8_t mac[20];
+ } ack;
+ } u;
+};
+
+#define MP_JOIN_B 0x01
+
+struct mp_dss {
+ uint8_t kind;
+ uint8_t len;
+ uint8_t sub;
+ uint8_t flags;
+};
+
+#define MP_DSS_F 0x10
+#define MP_DSS_m 0x08
+#define MP_DSS_M 0x04
+#define MP_DSS_a 0x02
+#define MP_DSS_A 0x01
+
+struct mp_add_addr {
+ uint8_t kind;
+ uint8_t len;
+ uint8_t sub_ipver;
+ uint8_t addr_id;
+ union {
+ struct {
+ uint8_t addr[4];
+ uint8_t port[2];
+ } v4;
+ struct {
+ uint8_t addr[16];
+ uint8_t port[2];
+ } v6;
+ } u;
+};
+
+#define MP_ADD_ADDR_IPVER(sub_ipver) (((sub_ipver) >> 0) & 0xF)
+
+struct mp_remove_addr {
+ uint8_t kind;
+ uint8_t len;
+ uint8_t sub;
+ /* list of addr_id */
+ uint8_t addrs_id;
+};
+
+struct mp_fail {
+ uint8_t kind;
+ uint8_t len;
+ uint8_t sub;
+ uint8_t resv;
+ uint8_t data_seq[8];
+};
+
+struct mp_close {
+ uint8_t kind;
+ uint8_t len;
+ uint8_t sub;
+ uint8_t rsv;
+ uint8_t key[8];
+};
+
+struct mp_prio {
+ uint8_t kind;
+ uint8_t len;
+ uint8_t sub_b;
+ uint8_t addr_id;
+};
+
+#define MP_PRIO_B 0x01
+
+static int
+dummy_print(netdissect_options *ndo _U_,
+ const u_char *opt _U_, u_int opt_len _U_, u_char flags _U_)
+{
+ return 1;
+}
+
+static int
+mp_capable_print(netdissect_options *ndo,
+ const u_char *opt, u_int opt_len, u_char flags)
+{
+ struct mp_capable *mpc = (struct mp_capable *) opt;
+
+ if (!(opt_len == 12 && flags & TH_SYN) &&
+ !(opt_len == 20 && (flags & (TH_SYN | TH_ACK)) == TH_ACK))
+ return 0;
+
+ if (MP_CAPABLE_OPT_VERSION(mpc->sub_ver) != 0) {
+ ND_PRINT((ndo, " Unknown Version (%d)", MP_CAPABLE_OPT_VERSION(mpc->sub_ver)));
+ return 1;
+ }
+
+ if (mpc->flags & MP_CAPABLE_C)
+ ND_PRINT((ndo, " csum"));
+ ND_PRINT((ndo, " {0x%" PRIx64, EXTRACT_64BITS(mpc->sender_key)));
+ if (opt_len == 20) /* ACK */
+ ND_PRINT((ndo, ",0x%" PRIx64, EXTRACT_64BITS(mpc->receiver_key)));
+ ND_PRINT((ndo, "}"));
+ return 1;
+}
+
+static int
+mp_join_print(netdissect_options *ndo,
+ const u_char *opt, u_int opt_len, u_char flags)
+{
+ struct mp_join *mpj = (struct mp_join *) opt;
+
+ if (!(opt_len == 12 && flags & TH_SYN) &&
+ !(opt_len == 16 && (flags & (TH_SYN | TH_ACK)) == (TH_SYN | TH_ACK)) &&
+ !(opt_len == 24 && flags & TH_ACK))
+ return 0;
+
+ if (opt_len != 24) {
+ if (mpj->sub_b & MP_JOIN_B)
+ ND_PRINT((ndo, " backup"));
+ ND_PRINT((ndo, " id %u", mpj->addr_id));
+ }
+
+ switch (opt_len) {
+ case 12: /* SYN */
+ ND_PRINT((ndo, " token 0x%x" " nonce 0x%x",
+ EXTRACT_32BITS(mpj->u.syn.token),
+ EXTRACT_32BITS(mpj->u.syn.nonce)));
+ break;
+ case 16: /* SYN/ACK */
+ ND_PRINT((ndo, " hmac 0x%" PRIx64 " nonce 0x%x",
+ EXTRACT_64BITS(mpj->u.synack.mac),
+ EXTRACT_32BITS(mpj->u.synack.nonce)));
+ break;
+ case 24: {/* ACK */
+ size_t i;
+ ND_PRINT((ndo, " hmac 0x"));
+ for (i = 0; i < sizeof(mpj->u.ack.mac); ++i)
+ ND_PRINT((ndo, "%02x", mpj->u.ack.mac[i]));
+ }
+ default:
+ break;
+ }
+ return 1;
+}
+
+static u_int mp_dss_len(struct mp_dss *m, int csum)
+{
+ u_int len;
+
+ len = 4;
+ if (m->flags & MP_DSS_A) {
+ /* Ack present - 4 or 8 octets */
+ len += (m->flags & MP_DSS_a) ? 8 : 4;
+ }
+ if (m->flags & MP_DSS_M) {
+ /*
+ * Data Sequence Number (DSN), Subflow Sequence Number (SSN),
+ * Data-Level Length present, and Checksum possibly present.
+ * All but the Checksum are 10 bytes if the m flag is
+ * clear (4-byte DSN) and 14 bytes if the m flag is set
+ * (8-byte DSN).
+ */
+ len += (m->flags & MP_DSS_m) ? 14 : 10;
+
+ /*
+ * The Checksum is present only if negotiated.
+ */
+ if (csum)
+ len += 2;
+ }
+ return len;
+}
+
+static int
+mp_dss_print(netdissect_options *ndo,
+ const u_char *opt, u_int opt_len, u_char flags)
+{
+ struct mp_dss *mdss = (struct mp_dss *) opt;
+
+ if ((opt_len != mp_dss_len(mdss, 1) &&
+ opt_len != mp_dss_len(mdss, 0)) || flags & TH_SYN)
+ return 0;
+
+ if (mdss->flags & MP_DSS_F)
+ ND_PRINT((ndo, " fin"));
+
+ opt += 4;
+ if (mdss->flags & MP_DSS_A) {
+ ND_PRINT((ndo, " ack "));
+ if (mdss->flags & MP_DSS_a) {
+ ND_PRINT((ndo, "%" PRIu64, EXTRACT_64BITS(opt)));
+ opt += 8;
+ } else {
+ ND_PRINT((ndo, "%u", EXTRACT_32BITS(opt)));
+ opt += 4;
+ }
+ }
+
+ if (mdss->flags & MP_DSS_M) {
+ ND_PRINT((ndo, " seq "));
+ if (mdss->flags & MP_DSS_m) {
+ ND_PRINT((ndo, "%" PRIu64, EXTRACT_64BITS(opt)));
+ opt += 8;
+ } else {
+ ND_PRINT((ndo, "%u", EXTRACT_32BITS(opt)));
+ opt += 4;
+ }
+ ND_PRINT((ndo, " subseq %u", EXTRACT_32BITS(opt)));
+ opt += 4;
+ ND_PRINT((ndo, " len %u", EXTRACT_16BITS(opt)));
+ opt += 2;
+
+ if (opt_len == mp_dss_len(mdss, 1))
+ ND_PRINT((ndo, " csum 0x%x", EXTRACT_16BITS(opt)));
+ }
+ return 1;
+}
+
+static int
+add_addr_print(netdissect_options *ndo,
+ const u_char *opt, u_int opt_len, u_char flags _U_)
+{
+ struct mp_add_addr *add_addr = (struct mp_add_addr *) opt;
+ u_int ipver = MP_ADD_ADDR_IPVER(add_addr->sub_ipver);
+
+ if (!((opt_len == 8 || opt_len == 10) && ipver == 4) &&
+ !((opt_len == 20 || opt_len == 22) && ipver == 6))
+ return 0;
+
+ ND_PRINT((ndo, " id %u", add_addr->addr_id));
+ switch (ipver) {
+ case 4:
+ ND_PRINT((ndo, " %s", ipaddr_string(ndo, add_addr->u.v4.addr)));
+ if (opt_len == 10)
+ ND_PRINT((ndo, ":%u", EXTRACT_16BITS(add_addr->u.v4.port)));
+ break;
+ case 6:
+#ifdef INET6
+ ND_PRINT((ndo, " %s", ip6addr_string(ndo, add_addr->u.v6.addr)));
+#endif
+ if (opt_len == 22)
+ ND_PRINT((ndo, ":%u", EXTRACT_16BITS(add_addr->u.v6.port)));
+ break;
+ default:
+ return 0;
+ }
+
+ return 1;
+}
+
+static int
+remove_addr_print(netdissect_options *ndo,
+ const u_char *opt, u_int opt_len, u_char flags _U_)
+{
+ struct mp_remove_addr *remove_addr = (struct mp_remove_addr *) opt;
+ uint8_t *addr_id = &remove_addr->addrs_id;
+
+ if (opt_len < 4)
+ return 0;
+
+ opt_len -= 3;
+ ND_PRINT((ndo, " id"));
+ while (opt_len--)
+ ND_PRINT((ndo, " %u", *addr_id++));
+ return 1;
+}
+
+static int
+mp_prio_print(netdissect_options *ndo,
+ const u_char *opt, u_int opt_len, u_char flags _U_)
+{
+ struct mp_prio *mpp = (struct mp_prio *) opt;
+
+ if (opt_len != 3 && opt_len != 4)
+ return 0;
+
+ if (mpp->sub_b & MP_PRIO_B)
+ ND_PRINT((ndo, " backup"));
+ else
+ ND_PRINT((ndo, " non-backup"));
+ if (opt_len == 4)
+ ND_PRINT((ndo, " id %u", mpp->addr_id));
+
+ return 1;
+}
+
+static int
+mp_fail_print(netdissect_options *ndo,
+ const u_char *opt, u_int opt_len, u_char flags _U_)
+{
+ if (opt_len != 12)
+ return 0;
+
+ ND_PRINT((ndo, " seq %" PRIu64, EXTRACT_64BITS(opt + 4)));
+ return 1;
+}
+
+static int
+mp_fast_close_print(netdissect_options *ndo,
+ const u_char *opt, u_int opt_len, u_char flags _U_)
+{
+ if (opt_len != 12)
+ return 0;
+
+ ND_PRINT((ndo, " key 0x%" PRIx64, EXTRACT_64BITS(opt + 4)));
+ return 1;
+}
+
+static const struct {
+ const char *name;
+ int (*print)(netdissect_options *, const u_char *, u_int, u_char);
+} mptcp_options[] = {
+ { "capable", mp_capable_print},
+ { "join", mp_join_print },
+ { "dss", mp_dss_print },
+ { "add-addr", add_addr_print },
+ { "rem-addr", remove_addr_print },
+ { "prio", mp_prio_print },
+ { "fail", mp_fail_print },
+ { "fast-close", mp_fast_close_print },
+ { "unknown", dummy_print },
+};
+
+int
+mptcp_print(netdissect_options *ndo,
+ const u_char *cp, u_int len, u_char flags)
+{
+ struct mptcp_option *opt;
+ u_int subtype;
+
+ if (len < 3)
+ return 0;
+
+ opt = (struct mptcp_option *) cp;
+ subtype = min(MPTCP_OPT_SUBTYPE(opt->sub_etc), MPTCP_SUB_FCLOSE + 1);
+
+ ND_PRINT((ndo, " %s", mptcp_options[subtype].name));
+ return mptcp_options[subtype].print(ndo, cp, len, flags);
+}
--- /dev/null
+/*
+ * Copyright (c) 2001 William C. Fenner.
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-msdp.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#define MSDP_TYPE_MAX 7
+
+void
+msdp_print(netdissect_options *ndo, const u_char *sp, u_int length)
+{
+ unsigned int type, len;
+
+ ND_TCHECK2(*sp, 3);
+ /* See if we think we're at the beginning of a compound packet */
+ type = *sp;
+ len = EXTRACT_16BITS(sp + 1);
+ if (len > 1500 || len < 3 || type == 0 || type > MSDP_TYPE_MAX)
+ goto trunc; /* not really truncated, but still not decodable */
+ ND_PRINT((ndo, " msdp:"));
+ while (length > 0) {
+ ND_TCHECK2(*sp, 3);
+ type = *sp;
+ len = EXTRACT_16BITS(sp + 1);
+ if (len > 1400 || ndo->ndo_vflag)
+ ND_PRINT((ndo, " [len %u]", len));
+ if (len < 3)
+ goto trunc;
+ sp += 3;
+ length -= 3;
+ switch (type) {
+ case 1: /* IPv4 Source-Active */
+ case 3: /* IPv4 Source-Active Response */
+ if (type == 1)
+ ND_PRINT((ndo, " SA"));
+ else
+ ND_PRINT((ndo, " SA-Response"));
+ ND_TCHECK(*sp);
+ ND_PRINT((ndo, " %u entries", *sp));
+ if ((u_int)((*sp * 12) + 8) < len) {
+ ND_PRINT((ndo, " [w/data]"));
+ if (ndo->ndo_vflag > 1) {
+ ND_PRINT((ndo, " "));
+ ip_print(ndo, sp + *sp * 12 + 8 - 3,
+ len - (*sp * 12 + 8));
+ }
+ }
+ break;
+ case 2:
+ ND_PRINT((ndo, " SA-Request"));
+ ND_TCHECK2(*sp, 5);
+ ND_PRINT((ndo, " for %s", ipaddr_string(ndo, sp + 1)));
+ break;
+ case 4:
+ ND_PRINT((ndo, " Keepalive"));
+ if (len != 3)
+ ND_PRINT((ndo, "[len=%d] ", len));
+ break;
+ case 5:
+ ND_PRINT((ndo, " Notification"));
+ break;
+ default:
+ ND_PRINT((ndo, " [type=%d len=%d]", type, len));
+ break;
+ }
+ sp += (len - 3);
+ length -= (len - 3);
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, " [|msdp]"));
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Romain Francoise <romain@orebokech.com>
+ *
+ * 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.
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+struct msnlb_heartbeat_pkt {
+ uint32_t unknown1;
+ uint32_t unknown2;
+ uint32_t host_prio; /* little-endian */
+ uint32_t virtual_ip;
+ uint32_t host_ip;
+ /* the protocol is undocumented so we ignore the rest */
+};
+
+void
+msnlb_print(netdissect_options *ndo, const u_char *bp)
+{
+ const struct msnlb_heartbeat_pkt *hb;
+
+ hb = (struct msnlb_heartbeat_pkt *)bp;
+ ND_TCHECK(*hb);
+
+ ND_PRINT((ndo, "MS NLB heartbeat, host priority: %u,",
+ EXTRACT_LE_32BITS(&(hb->host_prio))));
+ ND_PRINT((ndo, " cluster IP: %s,", ipaddr_string(ndo, &(hb->virtual_ip))));
+ ND_PRINT((ndo, " host IP: %s", ipaddr_string(ndo, &(hb->host_ip))));
+ return;
+trunc:
+ ND_PRINT((ndo, "[|MS NLB]"));
+}
--- /dev/null
+/*
+ * Copyright (c) 2013, Petar Alilovic,
+ * Faculty of Electrical Engineering and Computing, University of Zagreb
+ * All rights reserved
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+
+#if defined(DLT_NFLOG) && defined(HAVE_PCAP_NFLOG_H)
+#include <pcap/nflog.h>
+
+static const struct tok nflog_values[] = {
+ { AF_INET, "IPv4" },
+#ifdef INET6
+ { AF_INET6, "IPv6" },
+#endif /*INET6*/
+ { 0, NULL }
+};
+
+static inline void
+nflog_hdr_print(netdissect_options *ndo, const nflog_hdr_t *hdr, u_int length)
+{
+ ND_PRINT((ndo, "version %d, resource ID %d", hdr->nflog_version, ntohs(hdr->nflog_rid)));
+
+ if (!ndo->ndo_qflag) {
+ ND_PRINT((ndo,", family %s (%d)",
+ tok2str(nflog_values, "Unknown",
+ hdr->nflog_family),
+ hdr->nflog_family));
+ } else {
+ ND_PRINT((ndo,", %s",
+ tok2str(nflog_values,
+ "Unknown NFLOG (0x%02x)",
+ hdr->nflog_family)));
+ }
+
+ ND_PRINT((ndo, ", length %u: ", length));
+}
+
+u_int
+nflog_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, const u_char *p)
+{
+ const nflog_hdr_t *hdr = (const nflog_hdr_t *)p;
+ const nflog_tlv_t *tlv;
+ uint16_t size;
+ uint16_t h_size = sizeof(nflog_hdr_t);
+ u_int caplen = h->caplen;
+ u_int length = h->len;
+
+ if (caplen < (int) sizeof(nflog_hdr_t) || length < (int) sizeof(nflog_hdr_t)) {
+ ND_PRINT((ndo, "[|nflog]"));
+ return h_size;
+ }
+
+ if (!(hdr->nflog_version) == 0) {
+ ND_PRINT((ndo, "version %u (unknown)", hdr->nflog_version));
+ return h_size;
+ }
+
+ if (ndo->ndo_eflag)
+ nflog_hdr_print(ndo, hdr, length);
+
+ p += sizeof(nflog_hdr_t);
+ length -= sizeof(nflog_hdr_t);
+ caplen -= sizeof(nflog_hdr_t);
+
+ while (length > 0) {
+ /* We have some data. Do we have enough for the TLV header? */
+ if (caplen < sizeof(nflog_tlv_t) || length < sizeof(nflog_tlv_t)) {
+ /* No. */
+ ND_PRINT((ndo, "[|nflog]"));
+ return h_size;
+ }
+
+ tlv = (const nflog_tlv_t *) p;
+ size = tlv->tlv_length;
+ if (size % 4 != 0)
+ size += 4 - size % 4;
+
+ /* Is the TLV's length less than the minimum? */
+ if (size < sizeof(nflog_tlv_t)) {
+ /* Yes. Give up now. */
+ ND_PRINT((ndo, "[|nflog]"));
+ return h_size;
+ }
+
+ /* Do we have enough data for the full TLV? */
+ if (caplen < size || length < size) {
+ /* No. */
+ ND_PRINT((ndo, "[|nflog]"));
+ return h_size;
+ }
+
+ if (tlv->tlv_type == NFULA_PAYLOAD) {
+ /*
+ * This TLV's data is the packet payload.
+ * Skip past the TLV header, and break out
+ * of the loop so we print the packet data.
+ */
+ p += sizeof(nflog_tlv_t);
+ h_size += sizeof(nflog_tlv_t);
+ length -= sizeof(nflog_tlv_t);
+ caplen -= sizeof(nflog_tlv_t);
+ break;
+ }
+
+ p += size;
+ h_size += size;
+ length -= size;
+ caplen -= size;
+ }
+
+ switch (hdr->nflog_family) {
+
+ case AF_INET:
+ ip_print(ndo, p, length);
+ break;
+
+#ifdef AF_INET6
+ case AF_INET6:
+ ip6_print(ndo, p, length);
+ break;
+#endif /* AF_INET6 */
+
+ default:
+ if (!ndo->ndo_eflag)
+ nflog_hdr_print(ndo, hdr,
+ length + sizeof(nflog_hdr_t));
+
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ break;
+ }
+
+ return h_size;
+}
+
+#endif /* defined(DLT_NFLOG) && defined(HAVE_PCAP_NFLOG_H) */
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-nfs.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#include "nfs.h"
+#include "nfsfh.h"
+
+#include "ip.h"
+#ifdef INET6
+#include "ip6.h"
+#endif
+#include "rpc_auth.h"
+#include "rpc_msg.h"
+
+static const char tstr[] = " [|nfs]";
+
+static void nfs_printfh(netdissect_options *, const uint32_t *, const u_int);
+static int xid_map_enter(netdissect_options *, const struct sunrpc_msg *, const u_char *);
+static int xid_map_find(const struct sunrpc_msg *, const u_char *,
+ uint32_t *, uint32_t *);
+static void interp_reply(netdissect_options *, const struct sunrpc_msg *, uint32_t, uint32_t, int);
+static const uint32_t *parse_post_op_attr(netdissect_options *, const uint32_t *, int);
+
+/*
+ * Mapping of old NFS Version 2 RPC numbers to generic numbers.
+ */
+uint32_t nfsv3_procid[NFS_NPROCS] = {
+ NFSPROC_NULL,
+ NFSPROC_GETATTR,
+ NFSPROC_SETATTR,
+ NFSPROC_NOOP,
+ NFSPROC_LOOKUP,
+ NFSPROC_READLINK,
+ NFSPROC_READ,
+ NFSPROC_NOOP,
+ NFSPROC_WRITE,
+ NFSPROC_CREATE,
+ NFSPROC_REMOVE,
+ NFSPROC_RENAME,
+ NFSPROC_LINK,
+ NFSPROC_SYMLINK,
+ NFSPROC_MKDIR,
+ NFSPROC_RMDIR,
+ NFSPROC_READDIR,
+ NFSPROC_FSSTAT,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP
+};
+
+static const struct tok nfsproc_str[] = {
+ { NFSPROC_NOOP, "nop" },
+ { NFSPROC_NULL, "null" },
+ { NFSPROC_GETATTR, "getattr" },
+ { NFSPROC_SETATTR, "setattr" },
+ { NFSPROC_LOOKUP, "lookup" },
+ { NFSPROC_ACCESS, "access" },
+ { NFSPROC_READLINK, "readlink" },
+ { NFSPROC_READ, "read" },
+ { NFSPROC_WRITE, "write" },
+ { NFSPROC_CREATE, "create" },
+ { NFSPROC_MKDIR, "mkdir" },
+ { NFSPROC_SYMLINK, "symlink" },
+ { NFSPROC_MKNOD, "mknod" },
+ { NFSPROC_REMOVE, "remove" },
+ { NFSPROC_RMDIR, "rmdir" },
+ { NFSPROC_RENAME, "rename" },
+ { NFSPROC_LINK, "link" },
+ { NFSPROC_READDIR, "readdir" },
+ { NFSPROC_READDIRPLUS, "readdirplus" },
+ { NFSPROC_FSSTAT, "fsstat" },
+ { NFSPROC_FSINFO, "fsinfo" },
+ { NFSPROC_PATHCONF, "pathconf" },
+ { NFSPROC_COMMIT, "commit" },
+ { 0, NULL }
+};
+
+/*
+ * NFS V2 and V3 status values.
+ *
+ * Some of these come from the RFCs for NFS V2 and V3, with the message
+ * strings taken from the FreeBSD C library "errlst.c".
+ *
+ * Others are errors that are not in the RFC but that I suspect some
+ * NFS servers could return; the values are FreeBSD errno values, as
+ * the first NFS server was the SunOS 2.0 one, and until 5.0 SunOS
+ * was primarily BSD-derived.
+ */
+static const struct tok status2str[] = {
+ { 1, "Operation not permitted" }, /* EPERM */
+ { 2, "No such file or directory" }, /* ENOENT */
+ { 5, "Input/output error" }, /* EIO */
+ { 6, "Device not configured" }, /* ENXIO */
+ { 11, "Resource deadlock avoided" }, /* EDEADLK */
+ { 12, "Cannot allocate memory" }, /* ENOMEM */
+ { 13, "Permission denied" }, /* EACCES */
+ { 17, "File exists" }, /* EEXIST */
+ { 18, "Cross-device link" }, /* EXDEV */
+ { 19, "Operation not supported by device" }, /* ENODEV */
+ { 20, "Not a directory" }, /* ENOTDIR */
+ { 21, "Is a directory" }, /* EISDIR */
+ { 22, "Invalid argument" }, /* EINVAL */
+ { 26, "Text file busy" }, /* ETXTBSY */
+ { 27, "File too large" }, /* EFBIG */
+ { 28, "No space left on device" }, /* ENOSPC */
+ { 30, "Read-only file system" }, /* EROFS */
+ { 31, "Too many links" }, /* EMLINK */
+ { 45, "Operation not supported" }, /* EOPNOTSUPP */
+ { 62, "Too many levels of symbolic links" }, /* ELOOP */
+ { 63, "File name too long" }, /* ENAMETOOLONG */
+ { 66, "Directory not empty" }, /* ENOTEMPTY */
+ { 69, "Disc quota exceeded" }, /* EDQUOT */
+ { 70, "Stale NFS file handle" }, /* ESTALE */
+ { 71, "Too many levels of remote in path" }, /* EREMOTE */
+ { 99, "Write cache flushed to disk" }, /* NFSERR_WFLUSH (not used) */
+ { 10001, "Illegal NFS file handle" }, /* NFS3ERR_BADHANDLE */
+ { 10002, "Update synchronization mismatch" }, /* NFS3ERR_NOT_SYNC */
+ { 10003, "READDIR/READDIRPLUS cookie is stale" }, /* NFS3ERR_BAD_COOKIE */
+ { 10004, "Operation not supported" }, /* NFS3ERR_NOTSUPP */
+ { 10005, "Buffer or request is too small" }, /* NFS3ERR_TOOSMALL */
+ { 10006, "Unspecified error on server" }, /* NFS3ERR_SERVERFAULT */
+ { 10007, "Object of that type not supported" }, /* NFS3ERR_BADTYPE */
+ { 10008, "Request couldn't be completed in time" }, /* NFS3ERR_JUKEBOX */
+ { 0, NULL }
+};
+
+static const struct tok nfsv3_writemodes[] = {
+ { 0, "unstable" },
+ { 1, "datasync" },
+ { 2, "filesync" },
+ { 0, NULL }
+};
+
+static const struct tok type2str[] = {
+ { NFNON, "NON" },
+ { NFREG, "REG" },
+ { NFDIR, "DIR" },
+ { NFBLK, "BLK" },
+ { NFCHR, "CHR" },
+ { NFLNK, "LNK" },
+ { NFFIFO, "FIFO" },
+ { 0, NULL }
+};
+
+static const struct tok sunrpc_auth_str[] = {
+ { SUNRPC_AUTH_OK, "OK" },
+ { SUNRPC_AUTH_BADCRED, "Bogus Credentials (seal broken)" },
+ { SUNRPC_AUTH_REJECTEDCRED, "Rejected Credentials (client should begin new session)" },
+ { SUNRPC_AUTH_BADVERF, "Bogus Verifier (seal broken)" },
+ { SUNRPC_AUTH_REJECTEDVERF, "Verifier expired or was replayed" },
+ { SUNRPC_AUTH_TOOWEAK, "Credentials are too weak" },
+ { SUNRPC_AUTH_INVALIDRESP, "Bogus response verifier" },
+ { SUNRPC_AUTH_FAILED, "Unknown failure" },
+ { 0, NULL }
+};
+
+static const struct tok sunrpc_str[] = {
+ { SUNRPC_PROG_UNAVAIL, "PROG_UNAVAIL" },
+ { SUNRPC_PROG_MISMATCH, "PROG_MISMATCH" },
+ { SUNRPC_PROC_UNAVAIL, "PROC_UNAVAIL" },
+ { SUNRPC_GARBAGE_ARGS, "GARBAGE_ARGS" },
+ { SUNRPC_SYSTEM_ERR, "SYSTEM_ERR" },
+ { 0, NULL }
+};
+
+static void
+print_nfsaddr(netdissect_options *ndo,
+ const u_char *bp, const char *s, const char *d)
+{
+ struct ip *ip;
+#ifdef INET6
+ struct ip6_hdr *ip6;
+ char srcaddr[INET6_ADDRSTRLEN], dstaddr[INET6_ADDRSTRLEN];
+#else
+#ifndef INET_ADDRSTRLEN
+#define INET_ADDRSTRLEN 16
+#endif
+ char srcaddr[INET_ADDRSTRLEN], dstaddr[INET_ADDRSTRLEN];
+#endif
+
+ srcaddr[0] = dstaddr[0] = '\0';
+ switch (IP_V((struct ip *)bp)) {
+ case 4:
+ ip = (struct ip *)bp;
+ strlcpy(srcaddr, ipaddr_string(ndo, &ip->ip_src), sizeof(srcaddr));
+ strlcpy(dstaddr, ipaddr_string(ndo, &ip->ip_dst), sizeof(dstaddr));
+ break;
+#ifdef INET6
+ case 6:
+ ip6 = (struct ip6_hdr *)bp;
+ strlcpy(srcaddr, ip6addr_string(ndo, &ip6->ip6_src),
+ sizeof(srcaddr));
+ strlcpy(dstaddr, ip6addr_string(ndo, &ip6->ip6_dst),
+ sizeof(dstaddr));
+ break;
+#endif
+ default:
+ strlcpy(srcaddr, "?", sizeof(srcaddr));
+ strlcpy(dstaddr, "?", sizeof(dstaddr));
+ break;
+ }
+
+ ND_PRINT((ndo, "%s.%s > %s.%s: ", srcaddr, s, dstaddr, d));
+}
+
+static const uint32_t *
+parse_sattr3(netdissect_options *ndo,
+ const uint32_t *dp, struct nfsv3_sattr *sa3)
+{
+ ND_TCHECK(dp[0]);
+ sa3->sa_modeset = EXTRACT_32BITS(dp);
+ dp++;
+ if (sa3->sa_modeset) {
+ ND_TCHECK(dp[0]);
+ sa3->sa_mode = EXTRACT_32BITS(dp);
+ dp++;
+ }
+
+ ND_TCHECK(dp[0]);
+ sa3->sa_uidset = EXTRACT_32BITS(dp);
+ dp++;
+ if (sa3->sa_uidset) {
+ ND_TCHECK(dp[0]);
+ sa3->sa_uid = EXTRACT_32BITS(dp);
+ dp++;
+ }
+
+ ND_TCHECK(dp[0]);
+ sa3->sa_gidset = EXTRACT_32BITS(dp);
+ dp++;
+ if (sa3->sa_gidset) {
+ ND_TCHECK(dp[0]);
+ sa3->sa_gid = EXTRACT_32BITS(dp);
+ dp++;
+ }
+
+ ND_TCHECK(dp[0]);
+ sa3->sa_sizeset = EXTRACT_32BITS(dp);
+ dp++;
+ if (sa3->sa_sizeset) {
+ ND_TCHECK(dp[0]);
+ sa3->sa_size = EXTRACT_32BITS(dp);
+ dp++;
+ }
+
+ ND_TCHECK(dp[0]);
+ sa3->sa_atimetype = EXTRACT_32BITS(dp);
+ dp++;
+ if (sa3->sa_atimetype == NFSV3SATTRTIME_TOCLIENT) {
+ ND_TCHECK(dp[1]);
+ sa3->sa_atime.nfsv3_sec = EXTRACT_32BITS(dp);
+ dp++;
+ sa3->sa_atime.nfsv3_nsec = EXTRACT_32BITS(dp);
+ dp++;
+ }
+
+ ND_TCHECK(dp[0]);
+ sa3->sa_mtimetype = EXTRACT_32BITS(dp);
+ dp++;
+ if (sa3->sa_mtimetype == NFSV3SATTRTIME_TOCLIENT) {
+ ND_TCHECK(dp[1]);
+ sa3->sa_mtime.nfsv3_sec = EXTRACT_32BITS(dp);
+ dp++;
+ sa3->sa_mtime.nfsv3_nsec = EXTRACT_32BITS(dp);
+ dp++;
+ }
+
+ return dp;
+trunc:
+ return NULL;
+}
+
+static int nfserr; /* true if we error rather than trunc */
+
+static void
+print_sattr3(netdissect_options *ndo,
+ const struct nfsv3_sattr *sa3, int verbose)
+{
+ if (sa3->sa_modeset)
+ ND_PRINT((ndo, " mode %o", sa3->sa_mode));
+ if (sa3->sa_uidset)
+ ND_PRINT((ndo, " uid %u", sa3->sa_uid));
+ if (sa3->sa_gidset)
+ ND_PRINT((ndo, " gid %u", sa3->sa_gid));
+ if (verbose > 1) {
+ if (sa3->sa_atimetype == NFSV3SATTRTIME_TOCLIENT)
+ ND_PRINT((ndo, " atime %u.%06u", sa3->sa_atime.nfsv3_sec,
+ sa3->sa_atime.nfsv3_nsec));
+ if (sa3->sa_mtimetype == NFSV3SATTRTIME_TOCLIENT)
+ ND_PRINT((ndo, " mtime %u.%06u", sa3->sa_mtime.nfsv3_sec,
+ sa3->sa_mtime.nfsv3_nsec));
+ }
+}
+
+void
+nfsreply_print(netdissect_options *ndo,
+ register const u_char *bp, u_int length,
+ register const u_char *bp2)
+{
+ register const struct sunrpc_msg *rp;
+ char srcid[20], dstid[20]; /*fits 32bit*/
+
+ nfserr = 0; /* assume no error */
+ rp = (const struct sunrpc_msg *)bp;
+
+ ND_TCHECK(rp->rm_xid);
+ if (!ndo->ndo_nflag) {
+ strlcpy(srcid, "nfs", sizeof(srcid));
+ snprintf(dstid, sizeof(dstid), "%u",
+ EXTRACT_32BITS(&rp->rm_xid));
+ } else {
+ snprintf(srcid, sizeof(srcid), "%u", NFS_PORT);
+ snprintf(dstid, sizeof(dstid), "%u",
+ EXTRACT_32BITS(&rp->rm_xid));
+ }
+ print_nfsaddr(ndo, bp2, srcid, dstid);
+
+ nfsreply_print_noaddr(ndo, bp, length, bp2);
+ return;
+
+trunc:
+ if (!nfserr)
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+void
+nfsreply_print_noaddr(netdissect_options *ndo,
+ register const u_char *bp, u_int length,
+ register const u_char *bp2)
+{
+ register const struct sunrpc_msg *rp;
+ uint32_t proc, vers, reply_stat;
+ enum sunrpc_reject_stat rstat;
+ uint32_t rlow;
+ uint32_t rhigh;
+ enum sunrpc_auth_stat rwhy;
+
+ nfserr = 0; /* assume no error */
+ rp = (const struct sunrpc_msg *)bp;
+
+ ND_TCHECK(rp->rm_reply.rp_stat);
+ reply_stat = EXTRACT_32BITS(&rp->rm_reply.rp_stat);
+ switch (reply_stat) {
+
+ case SUNRPC_MSG_ACCEPTED:
+ ND_PRINT((ndo, "reply ok %u", length));
+ if (xid_map_find(rp, bp2, &proc, &vers) >= 0)
+ interp_reply(ndo, rp, proc, vers, length);
+ break;
+
+ case SUNRPC_MSG_DENIED:
+ ND_PRINT((ndo, "reply ERR %u: ", length));
+ ND_TCHECK(rp->rm_reply.rp_reject.rj_stat);
+ rstat = EXTRACT_32BITS(&rp->rm_reply.rp_reject.rj_stat);
+ switch (rstat) {
+
+ case SUNRPC_RPC_MISMATCH:
+ ND_TCHECK(rp->rm_reply.rp_reject.rj_vers.high);
+ rlow = EXTRACT_32BITS(&rp->rm_reply.rp_reject.rj_vers.low);
+ rhigh = EXTRACT_32BITS(&rp->rm_reply.rp_reject.rj_vers.high);
+ ND_PRINT((ndo, "RPC Version mismatch (%u-%u)", rlow, rhigh));
+ break;
+
+ case SUNRPC_AUTH_ERROR:
+ ND_TCHECK(rp->rm_reply.rp_reject.rj_why);
+ rwhy = EXTRACT_32BITS(&rp->rm_reply.rp_reject.rj_why);
+ ND_PRINT((ndo, "Auth %s", tok2str(sunrpc_auth_str, "Invalid failure code %u", rwhy)));
+ break;
+
+ default:
+ ND_PRINT((ndo, "Unknown reason for rejecting rpc message %u", (unsigned int)rstat));
+ break;
+ }
+ break;
+
+ default:
+ ND_PRINT((ndo, "reply Unknown rpc response code=%u %u", reply_stat, length));
+ break;
+ }
+ return;
+
+trunc:
+ if (!nfserr)
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/*
+ * Return a pointer to the first file handle in the packet.
+ * If the packet was truncated, return 0.
+ */
+static const uint32_t *
+parsereq(netdissect_options *ndo,
+ register const struct sunrpc_msg *rp, register u_int length)
+{
+ register const uint32_t *dp;
+ register u_int len;
+
+ /*
+ * find the start of the req data (if we captured it)
+ */
+ dp = (uint32_t *)&rp->rm_call.cb_cred;
+ ND_TCHECK(dp[1]);
+ len = EXTRACT_32BITS(&dp[1]);
+ if (len < length) {
+ dp += (len + (2 * sizeof(*dp) + 3)) / sizeof(*dp);
+ ND_TCHECK(dp[1]);
+ len = EXTRACT_32BITS(&dp[1]);
+ if (len < length) {
+ dp += (len + (2 * sizeof(*dp) + 3)) / sizeof(*dp);
+ ND_TCHECK2(dp[0], 0);
+ return (dp);
+ }
+ }
+trunc:
+ return (NULL);
+}
+
+/*
+ * Print out an NFS file handle and return a pointer to following word.
+ * If packet was truncated, return 0.
+ */
+static const uint32_t *
+parsefh(netdissect_options *ndo,
+ register const uint32_t *dp, int v3)
+{
+ u_int len;
+
+ if (v3) {
+ ND_TCHECK(dp[0]);
+ len = EXTRACT_32BITS(dp) / 4;
+ dp++;
+ } else
+ len = NFSX_V2FH / 4;
+
+ if (ND_TTEST2(*dp, len * sizeof(*dp))) {
+ nfs_printfh(ndo, dp, len);
+ return (dp + len);
+ }
+trunc:
+ return (NULL);
+}
+
+/*
+ * Print out a file name and return pointer to 32-bit word past it.
+ * If packet was truncated, return 0.
+ */
+static const uint32_t *
+parsefn(netdissect_options *ndo,
+ register const uint32_t *dp)
+{
+ register uint32_t len;
+ register const u_char *cp;
+
+ /* Bail if we don't have the string length */
+ ND_TCHECK(*dp);
+
+ /* Fetch string length; convert to host order */
+ len = *dp++;
+ NTOHL(len);
+
+ ND_TCHECK2(*dp, ((len + 3) & ~3));
+
+ cp = (u_char *)dp;
+ /* Update 32-bit pointer (NFS filenames padded to 32-bit boundaries) */
+ dp += ((len + 3) & ~3) / sizeof(*dp);
+ ND_PRINT((ndo, "\""));
+ if (fn_printn(ndo, cp, len, ndo->ndo_snapend)) {
+ ND_PRINT((ndo, "\""));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "\""));
+
+ return (dp);
+trunc:
+ return NULL;
+}
+
+/*
+ * Print out file handle and file name.
+ * Return pointer to 32-bit word past file name.
+ * If packet was truncated (or there was some other error), return 0.
+ */
+static const uint32_t *
+parsefhn(netdissect_options *ndo,
+ register const uint32_t *dp, int v3)
+{
+ dp = parsefh(ndo, dp, v3);
+ if (dp == NULL)
+ return (NULL);
+ ND_PRINT((ndo, " "));
+ return (parsefn(ndo, dp));
+}
+
+void
+nfsreq_print_noaddr(netdissect_options *ndo,
+ register const u_char *bp, u_int length,
+ register const u_char *bp2)
+{
+ register const struct sunrpc_msg *rp;
+ register const uint32_t *dp;
+ nfs_type type;
+ int v3;
+ uint32_t proc;
+ uint32_t access_flags;
+ struct nfsv3_sattr sa3;
+
+ ND_PRINT((ndo, "%d", length));
+ nfserr = 0; /* assume no error */
+ rp = (const struct sunrpc_msg *)bp;
+
+ if (!xid_map_enter(ndo, rp, bp2)) /* record proc number for later on */
+ goto trunc;
+
+ v3 = (EXTRACT_32BITS(&rp->rm_call.cb_vers) == NFS_VER3);
+ proc = EXTRACT_32BITS(&rp->rm_call.cb_proc);
+
+ if (!v3 && proc < NFS_NPROCS)
+ proc = nfsv3_procid[proc];
+
+ ND_PRINT((ndo, " %s", tok2str(nfsproc_str, "proc-%u", proc)));
+ switch (proc) {
+
+ case NFSPROC_GETATTR:
+ case NFSPROC_SETATTR:
+ case NFSPROC_READLINK:
+ case NFSPROC_FSSTAT:
+ case NFSPROC_FSINFO:
+ case NFSPROC_PATHCONF:
+ if ((dp = parsereq(ndo, rp, length)) != NULL &&
+ parsefh(ndo, dp, v3) != NULL)
+ return;
+ break;
+
+ case NFSPROC_LOOKUP:
+ case NFSPROC_CREATE:
+ case NFSPROC_MKDIR:
+ case NFSPROC_REMOVE:
+ case NFSPROC_RMDIR:
+ if ((dp = parsereq(ndo, rp, length)) != NULL &&
+ parsefhn(ndo, dp, v3) != NULL)
+ return;
+ break;
+
+ case NFSPROC_ACCESS:
+ if ((dp = parsereq(ndo, rp, length)) != NULL &&
+ (dp = parsefh(ndo, dp, v3)) != NULL) {
+ ND_TCHECK(dp[0]);
+ access_flags = EXTRACT_32BITS(&dp[0]);
+ if (access_flags & ~NFSV3ACCESS_FULL) {
+ /* NFSV3ACCESS definitions aren't up to date */
+ ND_PRINT((ndo, " %04x", access_flags));
+ } else if ((access_flags & NFSV3ACCESS_FULL) == NFSV3ACCESS_FULL) {
+ ND_PRINT((ndo, " NFS_ACCESS_FULL"));
+ } else {
+ char separator = ' ';
+ if (access_flags & NFSV3ACCESS_READ) {
+ ND_PRINT((ndo, " NFS_ACCESS_READ"));
+ separator = '|';
+ }
+ if (access_flags & NFSV3ACCESS_LOOKUP) {
+ ND_PRINT((ndo, "%cNFS_ACCESS_LOOKUP", separator));
+ separator = '|';
+ }
+ if (access_flags & NFSV3ACCESS_MODIFY) {
+ ND_PRINT((ndo, "%cNFS_ACCESS_MODIFY", separator));
+ separator = '|';
+ }
+ if (access_flags & NFSV3ACCESS_EXTEND) {
+ ND_PRINT((ndo, "%cNFS_ACCESS_EXTEND", separator));
+ separator = '|';
+ }
+ if (access_flags & NFSV3ACCESS_DELETE) {
+ ND_PRINT((ndo, "%cNFS_ACCESS_DELETE", separator));
+ separator = '|';
+ }
+ if (access_flags & NFSV3ACCESS_EXECUTE)
+ ND_PRINT((ndo, "%cNFS_ACCESS_EXECUTE", separator));
+ }
+ return;
+ }
+ break;
+
+ case NFSPROC_READ:
+ if ((dp = parsereq(ndo, rp, length)) != NULL &&
+ (dp = parsefh(ndo, dp, v3)) != NULL) {
+ if (v3) {
+ ND_TCHECK(dp[2]);
+ ND_PRINT((ndo, " %u bytes @ %" PRIu64,
+ EXTRACT_32BITS(&dp[2]),
+ EXTRACT_64BITS(&dp[0])));
+ } else {
+ ND_TCHECK(dp[1]);
+ ND_PRINT((ndo, " %u bytes @ %u",
+ EXTRACT_32BITS(&dp[1]),
+ EXTRACT_32BITS(&dp[0])));
+ }
+ return;
+ }
+ break;
+
+ case NFSPROC_WRITE:
+ if ((dp = parsereq(ndo, rp, length)) != NULL &&
+ (dp = parsefh(ndo, dp, v3)) != NULL) {
+ if (v3) {
+ ND_TCHECK(dp[2]);
+ ND_PRINT((ndo, " %u (%u) bytes @ %" PRIu64,
+ EXTRACT_32BITS(&dp[4]),
+ EXTRACT_32BITS(&dp[2]),
+ EXTRACT_64BITS(&dp[0])));
+ if (ndo->ndo_vflag) {
+ dp += 3;
+ ND_TCHECK(dp[0]);
+ ND_PRINT((ndo, " <%s>",
+ tok2str(nfsv3_writemodes,
+ NULL, EXTRACT_32BITS(dp))));
+ }
+ } else {
+ ND_TCHECK(dp[3]);
+ ND_PRINT((ndo, " %u (%u) bytes @ %u (%u)",
+ EXTRACT_32BITS(&dp[3]),
+ EXTRACT_32BITS(&dp[2]),
+ EXTRACT_32BITS(&dp[1]),
+ EXTRACT_32BITS(&dp[0])));
+ }
+ return;
+ }
+ break;
+
+ case NFSPROC_SYMLINK:
+ if ((dp = parsereq(ndo, rp, length)) != 0 &&
+ (dp = parsefhn(ndo, dp, v3)) != 0) {
+ ND_PRINT((ndo, " ->"));
+ if (v3 && (dp = parse_sattr3(ndo, dp, &sa3)) == 0)
+ break;
+ if (parsefn(ndo, dp) == 0)
+ break;
+ if (v3 && ndo->ndo_vflag)
+ print_sattr3(ndo, &sa3, ndo->ndo_vflag);
+ return;
+ }
+ break;
+
+ case NFSPROC_MKNOD:
+ if ((dp = parsereq(ndo, rp, length)) != 0 &&
+ (dp = parsefhn(ndo, dp, v3)) != 0) {
+ ND_TCHECK(*dp);
+ type = (nfs_type)EXTRACT_32BITS(dp);
+ dp++;
+ if ((dp = parse_sattr3(ndo, dp, &sa3)) == 0)
+ break;
+ ND_PRINT((ndo, " %s", tok2str(type2str, "unk-ft %d", type)));
+ if (ndo->ndo_vflag && (type == NFCHR || type == NFBLK)) {
+ ND_TCHECK(dp[1]);
+ ND_PRINT((ndo, " %u/%u",
+ EXTRACT_32BITS(&dp[0]),
+ EXTRACT_32BITS(&dp[1])));
+ dp += 2;
+ }
+ if (ndo->ndo_vflag)
+ print_sattr3(ndo, &sa3, ndo->ndo_vflag);
+ return;
+ }
+ break;
+
+ case NFSPROC_RENAME:
+ if ((dp = parsereq(ndo, rp, length)) != NULL &&
+ (dp = parsefhn(ndo, dp, v3)) != NULL) {
+ ND_PRINT((ndo, " ->"));
+ if (parsefhn(ndo, dp, v3) != NULL)
+ return;
+ }
+ break;
+
+ case NFSPROC_LINK:
+ if ((dp = parsereq(ndo, rp, length)) != NULL &&
+ (dp = parsefh(ndo, dp, v3)) != NULL) {
+ ND_PRINT((ndo, " ->"));
+ if (parsefhn(ndo, dp, v3) != NULL)
+ return;
+ }
+ break;
+
+ case NFSPROC_READDIR:
+ if ((dp = parsereq(ndo, rp, length)) != NULL &&
+ (dp = parsefh(ndo, dp, v3)) != NULL) {
+ if (v3) {
+ ND_TCHECK(dp[4]);
+ /*
+ * We shouldn't really try to interpret the
+ * offset cookie here.
+ */
+ ND_PRINT((ndo, " %u bytes @ %" PRId64,
+ EXTRACT_32BITS(&dp[4]),
+ EXTRACT_64BITS(&dp[0])));
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, " verf %08x%08x", dp[2], dp[3]));
+ } else {
+ ND_TCHECK(dp[1]);
+ /*
+ * Print the offset as signed, since -1 is
+ * common, but offsets > 2^31 aren't.
+ */
+ ND_PRINT((ndo, " %u bytes @ %d",
+ EXTRACT_32BITS(&dp[1]),
+ EXTRACT_32BITS(&dp[0])));
+ }
+ return;
+ }
+ break;
+
+ case NFSPROC_READDIRPLUS:
+ if ((dp = parsereq(ndo, rp, length)) != NULL &&
+ (dp = parsefh(ndo, dp, v3)) != NULL) {
+ ND_TCHECK(dp[4]);
+ /*
+ * We don't try to interpret the offset
+ * cookie here.
+ */
+ ND_PRINT((ndo, " %u bytes @ %" PRId64,
+ EXTRACT_32BITS(&dp[4]),
+ EXTRACT_64BITS(&dp[0])));
+ if (ndo->ndo_vflag) {
+ ND_TCHECK(dp[5]);
+ ND_PRINT((ndo, " max %u verf %08x%08x",
+ EXTRACT_32BITS(&dp[5]), dp[2], dp[3]));
+ }
+ return;
+ }
+ break;
+
+ case NFSPROC_COMMIT:
+ if ((dp = parsereq(ndo, rp, length)) != NULL &&
+ (dp = parsefh(ndo, dp, v3)) != NULL) {
+ ND_TCHECK(dp[2]);
+ ND_PRINT((ndo, " %u bytes @ %" PRIu64,
+ EXTRACT_32BITS(&dp[2]),
+ EXTRACT_64BITS(&dp[0])));
+ return;
+ }
+ break;
+
+ default:
+ return;
+ }
+
+trunc:
+ if (!nfserr)
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/*
+ * Print out an NFS file handle.
+ * We assume packet was not truncated before the end of the
+ * file handle pointed to by dp.
+ *
+ * Note: new version (using portable file-handle parser) doesn't produce
+ * generation number. It probably could be made to do that, with some
+ * additional hacking on the parser code.
+ */
+static void
+nfs_printfh(netdissect_options *ndo,
+ register const uint32_t *dp, const u_int len)
+{
+ my_fsid fsid;
+ uint32_t ino;
+ const char *sfsname = NULL;
+ char *spacep;
+
+ if (ndo->ndo_uflag) {
+ u_int i;
+ char const *sep = "";
+
+ ND_PRINT((ndo, " fh["));
+ for (i=0; i<len; i++) {
+ ND_PRINT((ndo, "%s%x", sep, dp[i]));
+ sep = ":";
+ }
+ ND_PRINT((ndo, "]"));
+ return;
+ }
+
+ Parse_fh((const u_char *)dp, len, &fsid, &ino, NULL, &sfsname, 0);
+
+ if (sfsname) {
+ /* file system ID is ASCII, not numeric, for this server OS */
+ static char temp[NFSX_V3FHMAX+1];
+
+ /* Make sure string is null-terminated */
+ strncpy(temp, sfsname, NFSX_V3FHMAX);
+ temp[sizeof(temp) - 1] = '\0';
+ /* Remove trailing spaces */
+ spacep = strchr(temp, ' ');
+ if (spacep)
+ *spacep = '\0';
+
+ ND_PRINT((ndo, " fh %s/", temp));
+ } else {
+ ND_PRINT((ndo, " fh %d,%d/",
+ fsid.Fsid_dev.Major, fsid.Fsid_dev.Minor));
+ }
+
+ if(fsid.Fsid_dev.Minor == 257)
+ /* Print the undecoded handle */
+ ND_PRINT((ndo, "%s", fsid.Opaque_Handle));
+ else
+ ND_PRINT((ndo, "%ld", (long) ino));
+}
+
+/*
+ * Maintain a small cache of recent client.XID.server/proc pairs, to allow
+ * us to match up replies with requests and thus to know how to parse
+ * the reply.
+ */
+
+struct xid_map_entry {
+ uint32_t xid; /* transaction ID (net order) */
+ int ipver; /* IP version (4 or 6) */
+#ifdef INET6
+ struct in6_addr client; /* client IP address (net order) */
+ struct in6_addr server; /* server IP address (net order) */
+#else
+ struct in_addr client; /* client IP address (net order) */
+ struct in_addr server; /* server IP address (net order) */
+#endif
+ uint32_t proc; /* call proc number (host order) */
+ uint32_t vers; /* program version (host order) */
+};
+
+/*
+ * Map entries are kept in an array that we manage as a ring;
+ * new entries are always added at the tail of the ring. Initially,
+ * all the entries are zero and hence don't match anything.
+ */
+
+#define XIDMAPSIZE 64
+
+struct xid_map_entry xid_map[XIDMAPSIZE];
+
+int xid_map_next = 0;
+int xid_map_hint = 0;
+
+static int
+xid_map_enter(netdissect_options *ndo,
+ const struct sunrpc_msg *rp, const u_char *bp)
+{
+ struct ip *ip = NULL;
+#ifdef INET6
+ struct ip6_hdr *ip6 = NULL;
+#endif
+ struct xid_map_entry *xmep;
+
+ if (!ND_TTEST(rp->rm_call.cb_vers))
+ return (0);
+ switch (IP_V((struct ip *)bp)) {
+ case 4:
+ ip = (struct ip *)bp;
+ break;
+#ifdef INET6
+ case 6:
+ ip6 = (struct ip6_hdr *)bp;
+ break;
+#endif
+ default:
+ return (1);
+ }
+
+ xmep = &xid_map[xid_map_next];
+
+ if (++xid_map_next >= XIDMAPSIZE)
+ xid_map_next = 0;
+
+ UNALIGNED_MEMCPY(&xmep->xid, &rp->rm_xid, sizeof(xmep->xid));
+ if (ip) {
+ xmep->ipver = 4;
+ UNALIGNED_MEMCPY(&xmep->client, &ip->ip_src, sizeof(ip->ip_src));
+ UNALIGNED_MEMCPY(&xmep->server, &ip->ip_dst, sizeof(ip->ip_dst));
+ }
+#ifdef INET6
+ else if (ip6) {
+ xmep->ipver = 6;
+ UNALIGNED_MEMCPY(&xmep->client, &ip6->ip6_src, sizeof(ip6->ip6_src));
+ UNALIGNED_MEMCPY(&xmep->server, &ip6->ip6_dst, sizeof(ip6->ip6_dst));
+ }
+#endif
+ xmep->proc = EXTRACT_32BITS(&rp->rm_call.cb_proc);
+ xmep->vers = EXTRACT_32BITS(&rp->rm_call.cb_vers);
+ return (1);
+}
+
+/*
+ * Returns 0 and puts NFSPROC_xxx in proc return and
+ * version in vers return, or returns -1 on failure
+ */
+static int
+xid_map_find(const struct sunrpc_msg *rp, const u_char *bp, uint32_t *proc,
+ uint32_t *vers)
+{
+ int i;
+ struct xid_map_entry *xmep;
+ uint32_t xid = rp->rm_xid;
+ struct ip *ip = (struct ip *)bp;
+#ifdef INET6
+ struct ip6_hdr *ip6 = (struct ip6_hdr *)bp;
+#endif
+ int cmp;
+
+ /* Start searching from where we last left off */
+ i = xid_map_hint;
+ do {
+ xmep = &xid_map[i];
+ cmp = 1;
+ if (xmep->ipver != IP_V(ip) || xmep->xid != xid)
+ goto nextitem;
+ switch (xmep->ipver) {
+ case 4:
+ if (UNALIGNED_MEMCMP(&ip->ip_src, &xmep->server,
+ sizeof(ip->ip_src)) != 0 ||
+ UNALIGNED_MEMCMP(&ip->ip_dst, &xmep->client,
+ sizeof(ip->ip_dst)) != 0) {
+ cmp = 0;
+ }
+ break;
+#ifdef INET6
+ case 6:
+ if (UNALIGNED_MEMCMP(&ip6->ip6_src, &xmep->server,
+ sizeof(ip6->ip6_src)) != 0 ||
+ UNALIGNED_MEMCMP(&ip6->ip6_dst, &xmep->client,
+ sizeof(ip6->ip6_dst)) != 0) {
+ cmp = 0;
+ }
+ break;
+#endif
+ default:
+ cmp = 0;
+ break;
+ }
+ if (cmp) {
+ /* match */
+ xid_map_hint = i;
+ *proc = xmep->proc;
+ *vers = xmep->vers;
+ return 0;
+ }
+ nextitem:
+ if (++i >= XIDMAPSIZE)
+ i = 0;
+ } while (i != xid_map_hint);
+
+ /* search failed */
+ return (-1);
+}
+
+/*
+ * Routines for parsing reply packets
+ */
+
+/*
+ * Return a pointer to the beginning of the actual results.
+ * If the packet was truncated, return 0.
+ */
+static const uint32_t *
+parserep(netdissect_options *ndo,
+ register const struct sunrpc_msg *rp, register u_int length)
+{
+ register const uint32_t *dp;
+ u_int len;
+ enum sunrpc_accept_stat astat;
+
+ /*
+ * Portability note:
+ * Here we find the address of the ar_verf credentials.
+ * Originally, this calculation was
+ * dp = (uint32_t *)&rp->rm_reply.rp_acpt.ar_verf
+ * On the wire, the rp_acpt field starts immediately after
+ * the (32 bit) rp_stat field. However, rp_acpt (which is a
+ * "struct accepted_reply") contains a "struct opaque_auth",
+ * whose internal representation contains a pointer, so on a
+ * 64-bit machine the compiler inserts 32 bits of padding
+ * before rp->rm_reply.rp_acpt.ar_verf. So, we cannot use
+ * the internal representation to parse the on-the-wire
+ * representation. Instead, we skip past the rp_stat field,
+ * which is an "enum" and so occupies one 32-bit word.
+ */
+ dp = ((const uint32_t *)&rp->rm_reply) + 1;
+ ND_TCHECK(dp[1]);
+ len = EXTRACT_32BITS(&dp[1]);
+ if (len >= length)
+ return (NULL);
+ /*
+ * skip past the ar_verf credentials.
+ */
+ dp += (len + (2*sizeof(uint32_t) + 3)) / sizeof(uint32_t);
+ ND_TCHECK2(dp[0], 0);
+
+ /*
+ * now we can check the ar_stat field
+ */
+ astat = (enum sunrpc_accept_stat) EXTRACT_32BITS(dp);
+ if (astat != SUNRPC_SUCCESS) {
+ ND_PRINT((ndo, " %s", tok2str(sunrpc_str, "ar_stat %d", astat)));
+ nfserr = 1; /* suppress trunc string */
+ return (NULL);
+ }
+ /* successful return */
+ ND_TCHECK2(*dp, sizeof(astat));
+ return ((uint32_t *) (sizeof(astat) + ((char *)dp)));
+trunc:
+ return (0);
+}
+
+static const uint32_t *
+parsestatus(netdissect_options *ndo,
+ const uint32_t *dp, int *er)
+{
+ int errnum;
+
+ ND_TCHECK(dp[0]);
+
+ errnum = EXTRACT_32BITS(&dp[0]);
+ if (er)
+ *er = errnum;
+ if (errnum != 0) {
+ if (!ndo->ndo_qflag)
+ ND_PRINT((ndo, " ERROR: %s",
+ tok2str(status2str, "unk %d", errnum)));
+ nfserr = 1;
+ }
+ return (dp + 1);
+trunc:
+ return NULL;
+}
+
+static const uint32_t *
+parsefattr(netdissect_options *ndo,
+ const uint32_t *dp, int verbose, int v3)
+{
+ const struct nfs_fattr *fap;
+
+ fap = (const struct nfs_fattr *)dp;
+ ND_TCHECK(fap->fa_gid);
+ if (verbose) {
+ ND_PRINT((ndo, " %s %o ids %d/%d",
+ tok2str(type2str, "unk-ft %d ",
+ EXTRACT_32BITS(&fap->fa_type)),
+ EXTRACT_32BITS(&fap->fa_mode),
+ EXTRACT_32BITS(&fap->fa_uid),
+ EXTRACT_32BITS(&fap->fa_gid)));
+ if (v3) {
+ ND_TCHECK(fap->fa3_size);
+ ND_PRINT((ndo, " sz %" PRIu64,
+ EXTRACT_64BITS((uint32_t *)&fap->fa3_size)));
+ } else {
+ ND_TCHECK(fap->fa2_size);
+ ND_PRINT((ndo, " sz %d", EXTRACT_32BITS(&fap->fa2_size)));
+ }
+ }
+ /* print lots more stuff */
+ if (verbose > 1) {
+ if (v3) {
+ ND_TCHECK(fap->fa3_ctime);
+ ND_PRINT((ndo, " nlink %d rdev %d/%d",
+ EXTRACT_32BITS(&fap->fa_nlink),
+ EXTRACT_32BITS(&fap->fa3_rdev.specdata1),
+ EXTRACT_32BITS(&fap->fa3_rdev.specdata2)));
+ ND_PRINT((ndo, " fsid %" PRIx64,
+ EXTRACT_64BITS((uint32_t *)&fap->fa3_fsid)));
+ ND_PRINT((ndo, " fileid %" PRIx64,
+ EXTRACT_64BITS((uint32_t *)&fap->fa3_fileid)));
+ ND_PRINT((ndo, " a/m/ctime %u.%06u",
+ EXTRACT_32BITS(&fap->fa3_atime.nfsv3_sec),
+ EXTRACT_32BITS(&fap->fa3_atime.nfsv3_nsec)));
+ ND_PRINT((ndo, " %u.%06u",
+ EXTRACT_32BITS(&fap->fa3_mtime.nfsv3_sec),
+ EXTRACT_32BITS(&fap->fa3_mtime.nfsv3_nsec)));
+ ND_PRINT((ndo, " %u.%06u",
+ EXTRACT_32BITS(&fap->fa3_ctime.nfsv3_sec),
+ EXTRACT_32BITS(&fap->fa3_ctime.nfsv3_nsec)));
+ } else {
+ ND_TCHECK(fap->fa2_ctime);
+ ND_PRINT((ndo, " nlink %d rdev 0x%x fsid 0x%x nodeid 0x%x a/m/ctime",
+ EXTRACT_32BITS(&fap->fa_nlink),
+ EXTRACT_32BITS(&fap->fa2_rdev),
+ EXTRACT_32BITS(&fap->fa2_fsid),
+ EXTRACT_32BITS(&fap->fa2_fileid)));
+ ND_PRINT((ndo, " %u.%06u",
+ EXTRACT_32BITS(&fap->fa2_atime.nfsv2_sec),
+ EXTRACT_32BITS(&fap->fa2_atime.nfsv2_usec)));
+ ND_PRINT((ndo, " %u.%06u",
+ EXTRACT_32BITS(&fap->fa2_mtime.nfsv2_sec),
+ EXTRACT_32BITS(&fap->fa2_mtime.nfsv2_usec)));
+ ND_PRINT((ndo, " %u.%06u",
+ EXTRACT_32BITS(&fap->fa2_ctime.nfsv2_sec),
+ EXTRACT_32BITS(&fap->fa2_ctime.nfsv2_usec)));
+ }
+ }
+ return ((const uint32_t *)((unsigned char *)dp +
+ (v3 ? NFSX_V3FATTR : NFSX_V2FATTR)));
+trunc:
+ return (NULL);
+}
+
+static int
+parseattrstat(netdissect_options *ndo,
+ const uint32_t *dp, int verbose, int v3)
+{
+ int er;
+
+ dp = parsestatus(ndo, dp, &er);
+ if (dp == NULL)
+ return (0);
+ if (er)
+ return (1);
+
+ return (parsefattr(ndo, dp, verbose, v3) != NULL);
+}
+
+static int
+parsediropres(netdissect_options *ndo,
+ const uint32_t *dp)
+{
+ int er;
+
+ if (!(dp = parsestatus(ndo, dp, &er)))
+ return (0);
+ if (er)
+ return (1);
+
+ dp = parsefh(ndo, dp, 0);
+ if (dp == NULL)
+ return (0);
+
+ return (parsefattr(ndo, dp, ndo->ndo_vflag, 0) != NULL);
+}
+
+static int
+parselinkres(netdissect_options *ndo,
+ const uint32_t *dp, int v3)
+{
+ int er;
+
+ dp = parsestatus(ndo, dp, &er);
+ if (dp == NULL)
+ return(0);
+ if (er)
+ return(1);
+ if (v3 && !(dp = parse_post_op_attr(ndo, dp, ndo->ndo_vflag)))
+ return (0);
+ ND_PRINT((ndo, " "));
+ return (parsefn(ndo, dp) != NULL);
+}
+
+static int
+parsestatfs(netdissect_options *ndo,
+ const uint32_t *dp, int v3)
+{
+ const struct nfs_statfs *sfsp;
+ int er;
+
+ dp = parsestatus(ndo, dp, &er);
+ if (dp == NULL)
+ return (0);
+ if (!v3 && er)
+ return (1);
+
+ if (ndo->ndo_qflag)
+ return(1);
+
+ if (v3) {
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, " POST:"));
+ if (!(dp = parse_post_op_attr(ndo, dp, ndo->ndo_vflag)))
+ return (0);
+ }
+
+ ND_TCHECK2(*dp, (v3 ? NFSX_V3STATFS : NFSX_V2STATFS));
+
+ sfsp = (const struct nfs_statfs *)dp;
+
+ if (v3) {
+ ND_PRINT((ndo, " tbytes %" PRIu64 " fbytes %" PRIu64 " abytes %" PRIu64,
+ EXTRACT_64BITS((uint32_t *)&sfsp->sf_tbytes),
+ EXTRACT_64BITS((uint32_t *)&sfsp->sf_fbytes),
+ EXTRACT_64BITS((uint32_t *)&sfsp->sf_abytes)));
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, " tfiles %" PRIu64 " ffiles %" PRIu64 " afiles %" PRIu64 " invar %u",
+ EXTRACT_64BITS((uint32_t *)&sfsp->sf_tfiles),
+ EXTRACT_64BITS((uint32_t *)&sfsp->sf_ffiles),
+ EXTRACT_64BITS((uint32_t *)&sfsp->sf_afiles),
+ EXTRACT_32BITS(&sfsp->sf_invarsec)));
+ }
+ } else {
+ ND_PRINT((ndo, " tsize %d bsize %d blocks %d bfree %d bavail %d",
+ EXTRACT_32BITS(&sfsp->sf_tsize),
+ EXTRACT_32BITS(&sfsp->sf_bsize),
+ EXTRACT_32BITS(&sfsp->sf_blocks),
+ EXTRACT_32BITS(&sfsp->sf_bfree),
+ EXTRACT_32BITS(&sfsp->sf_bavail)));
+ }
+
+ return (1);
+trunc:
+ return (0);
+}
+
+static int
+parserddires(netdissect_options *ndo,
+ const uint32_t *dp)
+{
+ int er;
+
+ dp = parsestatus(ndo, dp, &er);
+ if (dp == NULL)
+ return (0);
+ if (er)
+ return (1);
+ if (ndo->ndo_qflag)
+ return (1);
+
+ ND_TCHECK(dp[2]);
+ ND_PRINT((ndo, " offset 0x%x size %d ",
+ EXTRACT_32BITS(&dp[0]), EXTRACT_32BITS(&dp[1])));
+ if (dp[2] != 0)
+ ND_PRINT((ndo, " eof"));
+
+ return (1);
+trunc:
+ return (0);
+}
+
+static const uint32_t *
+parse_wcc_attr(netdissect_options *ndo,
+ const uint32_t *dp)
+{
+ ND_PRINT((ndo, " sz %" PRIu64, EXTRACT_64BITS(&dp[0])));
+ ND_PRINT((ndo, " mtime %u.%06u ctime %u.%06u",
+ EXTRACT_32BITS(&dp[2]), EXTRACT_32BITS(&dp[3]),
+ EXTRACT_32BITS(&dp[4]), EXTRACT_32BITS(&dp[5])));
+ return (dp + 6);
+}
+
+/*
+ * Pre operation attributes. Print only if vflag > 1.
+ */
+static const uint32_t *
+parse_pre_op_attr(netdissect_options *ndo,
+ const uint32_t *dp, int verbose)
+{
+ ND_TCHECK(dp[0]);
+ if (!EXTRACT_32BITS(&dp[0]))
+ return (dp + 1);
+ dp++;
+ ND_TCHECK2(*dp, 24);
+ if (verbose > 1) {
+ return parse_wcc_attr(ndo, dp);
+ } else {
+ /* If not verbose enough, just skip over wcc_attr */
+ return (dp + 6);
+ }
+trunc:
+ return (NULL);
+}
+
+/*
+ * Post operation attributes are printed if vflag >= 1
+ */
+static const uint32_t *
+parse_post_op_attr(netdissect_options *ndo,
+ const uint32_t *dp, int verbose)
+{
+ ND_TCHECK(dp[0]);
+ if (!EXTRACT_32BITS(&dp[0]))
+ return (dp + 1);
+ dp++;
+ if (verbose) {
+ return parsefattr(ndo, dp, verbose, 1);
+ } else
+ return (dp + (NFSX_V3FATTR / sizeof (uint32_t)));
+trunc:
+ return (NULL);
+}
+
+static const uint32_t *
+parse_wcc_data(netdissect_options *ndo,
+ const uint32_t *dp, int verbose)
+{
+ if (verbose > 1)
+ ND_PRINT((ndo, " PRE:"));
+ if (!(dp = parse_pre_op_attr(ndo, dp, verbose)))
+ return (0);
+
+ if (verbose)
+ ND_PRINT((ndo, " POST:"));
+ return parse_post_op_attr(ndo, dp, verbose);
+}
+
+static const uint32_t *
+parsecreateopres(netdissect_options *ndo,
+ const uint32_t *dp, int verbose)
+{
+ int er;
+
+ if (!(dp = parsestatus(ndo, dp, &er)))
+ return (0);
+ if (er)
+ dp = parse_wcc_data(ndo, dp, verbose);
+ else {
+ ND_TCHECK(dp[0]);
+ if (!EXTRACT_32BITS(&dp[0]))
+ return (dp + 1);
+ dp++;
+ if (!(dp = parsefh(ndo, dp, 1)))
+ return (0);
+ if (verbose) {
+ if (!(dp = parse_post_op_attr(ndo, dp, verbose)))
+ return (0);
+ if (ndo->ndo_vflag > 1) {
+ ND_PRINT((ndo, " dir attr:"));
+ dp = parse_wcc_data(ndo, dp, verbose);
+ }
+ }
+ }
+ return (dp);
+trunc:
+ return (NULL);
+}
+
+static int
+parsewccres(netdissect_options *ndo,
+ const uint32_t *dp, int verbose)
+{
+ int er;
+
+ if (!(dp = parsestatus(ndo, dp, &er)))
+ return (0);
+ return parse_wcc_data(ndo, dp, verbose) != 0;
+}
+
+static const uint32_t *
+parsev3rddirres(netdissect_options *ndo,
+ const uint32_t *dp, int verbose)
+{
+ int er;
+
+ if (!(dp = parsestatus(ndo, dp, &er)))
+ return (0);
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, " POST:"));
+ if (!(dp = parse_post_op_attr(ndo, dp, verbose)))
+ return (0);
+ if (er)
+ return dp;
+ if (ndo->ndo_vflag) {
+ ND_TCHECK(dp[1]);
+ ND_PRINT((ndo, " verf %08x%08x", dp[0], dp[1]));
+ dp += 2;
+ }
+ return dp;
+trunc:
+ return (NULL);
+}
+
+static int
+parsefsinfo(netdissect_options *ndo,
+ const uint32_t *dp)
+{
+ struct nfsv3_fsinfo *sfp;
+ int er;
+
+ if (!(dp = parsestatus(ndo, dp, &er)))
+ return (0);
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, " POST:"));
+ if (!(dp = parse_post_op_attr(ndo, dp, ndo->ndo_vflag)))
+ return (0);
+ if (er)
+ return (1);
+
+ sfp = (struct nfsv3_fsinfo *)dp;
+ ND_TCHECK(*sfp);
+ ND_PRINT((ndo, " rtmax %u rtpref %u wtmax %u wtpref %u dtpref %u",
+ EXTRACT_32BITS(&sfp->fs_rtmax),
+ EXTRACT_32BITS(&sfp->fs_rtpref),
+ EXTRACT_32BITS(&sfp->fs_wtmax),
+ EXTRACT_32BITS(&sfp->fs_wtpref),
+ EXTRACT_32BITS(&sfp->fs_dtpref)));
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, " rtmult %u wtmult %u maxfsz %" PRIu64,
+ EXTRACT_32BITS(&sfp->fs_rtmult),
+ EXTRACT_32BITS(&sfp->fs_wtmult),
+ EXTRACT_64BITS((uint32_t *)&sfp->fs_maxfilesize)));
+ ND_PRINT((ndo, " delta %u.%06u ",
+ EXTRACT_32BITS(&sfp->fs_timedelta.nfsv3_sec),
+ EXTRACT_32BITS(&sfp->fs_timedelta.nfsv3_nsec)));
+ }
+ return (1);
+trunc:
+ return (0);
+}
+
+static int
+parsepathconf(netdissect_options *ndo,
+ const uint32_t *dp)
+{
+ int er;
+ struct nfsv3_pathconf *spp;
+
+ if (!(dp = parsestatus(ndo, dp, &er)))
+ return (0);
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, " POST:"));
+ if (!(dp = parse_post_op_attr(ndo, dp, ndo->ndo_vflag)))
+ return (0);
+ if (er)
+ return (1);
+
+ spp = (struct nfsv3_pathconf *)dp;
+ ND_TCHECK(*spp);
+
+ ND_PRINT((ndo, " linkmax %u namemax %u %s %s %s %s",
+ EXTRACT_32BITS(&spp->pc_linkmax),
+ EXTRACT_32BITS(&spp->pc_namemax),
+ EXTRACT_32BITS(&spp->pc_notrunc) ? "notrunc" : "",
+ EXTRACT_32BITS(&spp->pc_chownrestricted) ? "chownres" : "",
+ EXTRACT_32BITS(&spp->pc_caseinsensitive) ? "igncase" : "",
+ EXTRACT_32BITS(&spp->pc_casepreserving) ? "keepcase" : ""));
+ return (1);
+trunc:
+ return (0);
+}
+
+static void
+interp_reply(netdissect_options *ndo,
+ const struct sunrpc_msg *rp, uint32_t proc, uint32_t vers, int length)
+{
+ register const uint32_t *dp;
+ register int v3;
+ int er;
+
+ v3 = (vers == NFS_VER3);
+
+ if (!v3 && proc < NFS_NPROCS)
+ proc = nfsv3_procid[proc];
+
+ ND_PRINT((ndo, " %s", tok2str(nfsproc_str, "proc-%u", proc)));
+ switch (proc) {
+
+ case NFSPROC_GETATTR:
+ dp = parserep(ndo, rp, length);
+ if (dp != NULL && parseattrstat(ndo, dp, !ndo->ndo_qflag, v3) != 0)
+ return;
+ break;
+
+ case NFSPROC_SETATTR:
+ if (!(dp = parserep(ndo, rp, length)))
+ return;
+ if (v3) {
+ if (parsewccres(ndo, dp, ndo->ndo_vflag))
+ return;
+ } else {
+ if (parseattrstat(ndo, dp, !ndo->ndo_qflag, 0) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_LOOKUP:
+ if (!(dp = parserep(ndo, rp, length)))
+ break;
+ if (v3) {
+ if (!(dp = parsestatus(ndo, dp, &er)))
+ break;
+ if (er) {
+ if (ndo->ndo_vflag > 1) {
+ ND_PRINT((ndo, " post dattr:"));
+ dp = parse_post_op_attr(ndo, dp, ndo->ndo_vflag);
+ }
+ } else {
+ if (!(dp = parsefh(ndo, dp, v3)))
+ break;
+ if ((dp = parse_post_op_attr(ndo, dp, ndo->ndo_vflag)) &&
+ ndo->ndo_vflag > 1) {
+ ND_PRINT((ndo, " post dattr:"));
+ dp = parse_post_op_attr(ndo, dp, ndo->ndo_vflag);
+ }
+ }
+ if (dp)
+ return;
+ } else {
+ if (parsediropres(ndo, dp) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_ACCESS:
+ if (!(dp = parserep(ndo, rp, length)))
+ break;
+ if (!(dp = parsestatus(ndo, dp, &er)))
+ break;
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, " attr:"));
+ if (!(dp = parse_post_op_attr(ndo, dp, ndo->ndo_vflag)))
+ break;
+ if (!er)
+ ND_PRINT((ndo, " c %04x", EXTRACT_32BITS(&dp[0])));
+ return;
+
+ case NFSPROC_READLINK:
+ dp = parserep(ndo, rp, length);
+ if (dp != NULL && parselinkres(ndo, dp, v3) != 0)
+ return;
+ break;
+
+ case NFSPROC_READ:
+ if (!(dp = parserep(ndo, rp, length)))
+ break;
+ if (v3) {
+ if (!(dp = parsestatus(ndo, dp, &er)))
+ break;
+ if (!(dp = parse_post_op_attr(ndo, dp, ndo->ndo_vflag)))
+ break;
+ if (er)
+ return;
+ if (ndo->ndo_vflag) {
+ ND_TCHECK(dp[1]);
+ ND_PRINT((ndo, " %u bytes", EXTRACT_32BITS(&dp[0])));
+ if (EXTRACT_32BITS(&dp[1]))
+ ND_PRINT((ndo, " EOF"));
+ }
+ return;
+ } else {
+ if (parseattrstat(ndo, dp, ndo->ndo_vflag, 0) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_WRITE:
+ if (!(dp = parserep(ndo, rp, length)))
+ break;
+ if (v3) {
+ if (!(dp = parsestatus(ndo, dp, &er)))
+ break;
+ if (!(dp = parse_wcc_data(ndo, dp, ndo->ndo_vflag)))
+ break;
+ if (er)
+ return;
+ if (ndo->ndo_vflag) {
+ ND_TCHECK(dp[0]);
+ ND_PRINT((ndo, " %u bytes", EXTRACT_32BITS(&dp[0])));
+ if (ndo->ndo_vflag > 1) {
+ ND_TCHECK(dp[1]);
+ ND_PRINT((ndo, " <%s>",
+ tok2str(nfsv3_writemodes,
+ NULL, EXTRACT_32BITS(&dp[1]))));
+ }
+ return;
+ }
+ } else {
+ if (parseattrstat(ndo, dp, ndo->ndo_vflag, v3) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_CREATE:
+ case NFSPROC_MKDIR:
+ if (!(dp = parserep(ndo, rp, length)))
+ break;
+ if (v3) {
+ if (parsecreateopres(ndo, dp, ndo->ndo_vflag) != 0)
+ return;
+ } else {
+ if (parsediropres(ndo, dp) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_SYMLINK:
+ if (!(dp = parserep(ndo, rp, length)))
+ break;
+ if (v3) {
+ if (parsecreateopres(ndo, dp, ndo->ndo_vflag) != 0)
+ return;
+ } else {
+ if (parsestatus(ndo, dp, &er) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_MKNOD:
+ if (!(dp = parserep(ndo, rp, length)))
+ break;
+ if (parsecreateopres(ndo, dp, ndo->ndo_vflag) != 0)
+ return;
+ break;
+
+ case NFSPROC_REMOVE:
+ case NFSPROC_RMDIR:
+ if (!(dp = parserep(ndo, rp, length)))
+ break;
+ if (v3) {
+ if (parsewccres(ndo, dp, ndo->ndo_vflag))
+ return;
+ } else {
+ if (parsestatus(ndo, dp, &er) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_RENAME:
+ if (!(dp = parserep(ndo, rp, length)))
+ break;
+ if (v3) {
+ if (!(dp = parsestatus(ndo, dp, &er)))
+ break;
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, " from:"));
+ if (!(dp = parse_wcc_data(ndo, dp, ndo->ndo_vflag)))
+ break;
+ ND_PRINT((ndo, " to:"));
+ if (!(dp = parse_wcc_data(ndo, dp, ndo->ndo_vflag)))
+ break;
+ }
+ return;
+ } else {
+ if (parsestatus(ndo, dp, &er) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_LINK:
+ if (!(dp = parserep(ndo, rp, length)))
+ break;
+ if (v3) {
+ if (!(dp = parsestatus(ndo, dp, &er)))
+ break;
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, " file POST:"));
+ if (!(dp = parse_post_op_attr(ndo, dp, ndo->ndo_vflag)))
+ break;
+ ND_PRINT((ndo, " dir:"));
+ if (!(dp = parse_wcc_data(ndo, dp, ndo->ndo_vflag)))
+ break;
+ return;
+ }
+ } else {
+ if (parsestatus(ndo, dp, &er) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_READDIR:
+ if (!(dp = parserep(ndo, rp, length)))
+ break;
+ if (v3) {
+ if (parsev3rddirres(ndo, dp, ndo->ndo_vflag))
+ return;
+ } else {
+ if (parserddires(ndo, dp) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_READDIRPLUS:
+ if (!(dp = parserep(ndo, rp, length)))
+ break;
+ if (parsev3rddirres(ndo, dp, ndo->ndo_vflag))
+ return;
+ break;
+
+ case NFSPROC_FSSTAT:
+ dp = parserep(ndo, rp, length);
+ if (dp != NULL && parsestatfs(ndo, dp, v3) != 0)
+ return;
+ break;
+
+ case NFSPROC_FSINFO:
+ dp = parserep(ndo, rp, length);
+ if (dp != NULL && parsefsinfo(ndo, dp) != 0)
+ return;
+ break;
+
+ case NFSPROC_PATHCONF:
+ dp = parserep(ndo, rp, length);
+ if (dp != NULL && parsepathconf(ndo, dp) != 0)
+ return;
+ break;
+
+ case NFSPROC_COMMIT:
+ dp = parserep(ndo, rp, length);
+ if (dp != NULL && parsewccres(ndo, dp, ndo->ndo_vflag) != 0)
+ return;
+ break;
+
+ default:
+ return;
+ }
+trunc:
+ if (!nfserr)
+ ND_PRINT((ndo, "%s", tstr));
+}
--- /dev/null
+/*
+ * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * Format and print ntp packets.
+ * By Jeffrey Mogul/DECWRL
+ * loosely based on print-bootp.c
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ntp.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#ifdef HAVE_STRFTIME
+#include <time.h>
+#endif
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+/*
+ * Based on ntp.h from the U of MD implementation
+ * This file is based on Version 2 of the NTP spec (RFC1119).
+ */
+
+/*
+ * Definitions for the masses
+ */
+#define JAN_1970 2208988800U /* 1970 - 1900 in seconds */
+
+/*
+ * Structure definitions for NTP fixed point values
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Integer Part |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Fraction Part |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Integer Part | Fraction Part |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+*/
+struct l_fixedpt {
+ uint32_t int_part;
+ uint32_t fraction;
+};
+
+struct s_fixedpt {
+ uint16_t int_part;
+ uint16_t fraction;
+};
+
+/* rfc2030
+ * 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |LI | VN |Mode | Stratum | Poll | Precision |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Root Delay |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Root Dispersion |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Reference Identifier |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * | Reference Timestamp (64) |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * | Originate Timestamp (64) |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * | Receive Timestamp (64) |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * | Transmit Timestamp (64) |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Key Identifier (optional) (32) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * | |
+ * | Message Digest (optional) (128) |
+ * | |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+struct ntpdata {
+ u_char status; /* status of local clock and leap info */
+ u_char stratum; /* Stratum level */
+ u_char ppoll; /* poll value */
+ int precision:8;
+ struct s_fixedpt root_delay;
+ struct s_fixedpt root_dispersion;
+ uint32_t refid;
+ struct l_fixedpt ref_timestamp;
+ struct l_fixedpt org_timestamp;
+ struct l_fixedpt rec_timestamp;
+ struct l_fixedpt xmt_timestamp;
+ uint32_t key_id;
+ uint8_t message_digest[16];
+};
+/*
+ * Leap Second Codes (high order two bits)
+ */
+#define NO_WARNING 0x00 /* no warning */
+#define PLUS_SEC 0x40 /* add a second (61 seconds) */
+#define MINUS_SEC 0x80 /* minus a second (59 seconds) */
+#define ALARM 0xc0 /* alarm condition (clock unsynchronized) */
+
+/*
+ * Clock Status Bits that Encode Version
+ */
+#define NTPVERSION_1 0x08
+#define VERSIONMASK 0x38
+#define LEAPMASK 0xc0
+#ifdef MODEMASK
+#undef MODEMASK /* Solaris sucks */
+#endif
+#define MODEMASK 0x07
+
+/*
+ * Code values
+ */
+#define MODE_UNSPEC 0 /* unspecified */
+#define MODE_SYM_ACT 1 /* symmetric active */
+#define MODE_SYM_PAS 2 /* symmetric passive */
+#define MODE_CLIENT 3 /* client */
+#define MODE_SERVER 4 /* server */
+#define MODE_BROADCAST 5 /* broadcast */
+#define MODE_RES1 6 /* reserved */
+#define MODE_RES2 7 /* reserved */
+
+/*
+ * Stratum Definitions
+ */
+#define UNSPECIFIED 0
+#define PRIM_REF 1 /* radio clock */
+#define INFO_QUERY 62 /* **** THIS implementation dependent **** */
+#define INFO_REPLY 63 /* **** THIS implementation dependent **** */
+
+static void p_sfix(netdissect_options *ndo, const struct s_fixedpt *);
+static void p_ntp_time(netdissect_options *, const struct l_fixedpt *);
+static void p_ntp_delta(netdissect_options *, const struct l_fixedpt *, const struct l_fixedpt *);
+
+static const struct tok ntp_mode_values[] = {
+ { MODE_UNSPEC, "unspecified" },
+ { MODE_SYM_ACT, "symmetric active" },
+ { MODE_SYM_PAS, "symmetric passive" },
+ { MODE_CLIENT, "Client" },
+ { MODE_SERVER, "Server" },
+ { MODE_BROADCAST, "Broadcast" },
+ { MODE_RES1, "Reserved" },
+ { MODE_RES2, "Reserved" },
+ { 0, NULL }
+};
+
+static const struct tok ntp_leapind_values[] = {
+ { NO_WARNING, "" },
+ { PLUS_SEC, "+1s" },
+ { MINUS_SEC, "-1s" },
+ { ALARM, "clock unsynchronized" },
+ { 0, NULL }
+};
+
+static const struct tok ntp_stratum_values[] = {
+ { UNSPECIFIED, "unspecified" },
+ { PRIM_REF, "primary reference" },
+ { 0, NULL }
+};
+
+/*
+ * Print ntp requests
+ */
+void
+ntp_print(netdissect_options *ndo,
+ register const u_char *cp, u_int length)
+{
+ register const struct ntpdata *bp;
+ int mode, version, leapind;
+
+ bp = (struct ntpdata *)cp;
+
+ ND_TCHECK(bp->status);
+
+ version = (int)(bp->status & VERSIONMASK) >> 3;
+ ND_PRINT((ndo, "NTPv%d", version));
+
+ mode = bp->status & MODEMASK;
+ if (!ndo->ndo_vflag) {
+ ND_PRINT((ndo, ", %s, length %u",
+ tok2str(ntp_mode_values, "Unknown mode", mode),
+ length));
+ return;
+ }
+
+ ND_PRINT((ndo, ", length %u\n\t%s",
+ length,
+ tok2str(ntp_mode_values, "Unknown mode", mode)));
+
+ leapind = bp->status & LEAPMASK;
+ ND_PRINT((ndo, ", Leap indicator: %s (%u)",
+ tok2str(ntp_leapind_values, "Unknown", leapind),
+ leapind));
+
+ ND_TCHECK(bp->stratum);
+ ND_PRINT((ndo, ", Stratum %u (%s)",
+ bp->stratum,
+ tok2str(ntp_stratum_values, (bp->stratum >=2 && bp->stratum<=15) ? "secondary reference" : "reserved", bp->stratum)));
+
+ ND_TCHECK(bp->ppoll);
+ ND_PRINT((ndo, ", poll %u (%us)", bp->ppoll, 1 << bp->ppoll));
+
+ /* Can't ND_TCHECK bp->precision bitfield so bp->distance + 0 instead */
+ ND_TCHECK2(bp->root_delay, 0);
+ ND_PRINT((ndo, ", precision %d", bp->precision));
+
+ ND_TCHECK(bp->root_delay);
+ ND_PRINT((ndo, "\n\tRoot Delay: "));
+ p_sfix(ndo, &bp->root_delay);
+
+ ND_TCHECK(bp->root_dispersion);
+ ND_PRINT((ndo, ", Root dispersion: "));
+ p_sfix(ndo, &bp->root_dispersion);
+
+ ND_TCHECK(bp->refid);
+ ND_PRINT((ndo, ", Reference-ID: "));
+ /* Interpretation depends on stratum */
+ switch (bp->stratum) {
+
+ case UNSPECIFIED:
+ ND_PRINT((ndo, "(unspec)"));
+ break;
+
+ case PRIM_REF:
+ if (fn_printn(ndo, (u_char *)&(bp->refid), 4, ndo->ndo_snapend))
+ goto trunc;
+ break;
+
+ case INFO_QUERY:
+ ND_PRINT((ndo, "%s INFO_QUERY", ipaddr_string(ndo, &(bp->refid))));
+ /* this doesn't have more content */
+ return;
+
+ case INFO_REPLY:
+ ND_PRINT((ndo, "%s INFO_REPLY", ipaddr_string(ndo, &(bp->refid))));
+ /* this is too complex to be worth printing */
+ return;
+
+ default:
+ ND_PRINT((ndo, "%s", ipaddr_string(ndo, &(bp->refid))));
+ break;
+ }
+
+ ND_TCHECK(bp->ref_timestamp);
+ ND_PRINT((ndo, "\n\t Reference Timestamp: "));
+ p_ntp_time(ndo, &(bp->ref_timestamp));
+
+ ND_TCHECK(bp->org_timestamp);
+ ND_PRINT((ndo, "\n\t Originator Timestamp: "));
+ p_ntp_time(ndo, &(bp->org_timestamp));
+
+ ND_TCHECK(bp->rec_timestamp);
+ ND_PRINT((ndo, "\n\t Receive Timestamp: "));
+ p_ntp_time(ndo, &(bp->rec_timestamp));
+
+ ND_TCHECK(bp->xmt_timestamp);
+ ND_PRINT((ndo, "\n\t Transmit Timestamp: "));
+ p_ntp_time(ndo, &(bp->xmt_timestamp));
+
+ ND_PRINT((ndo, "\n\t Originator - Receive Timestamp: "));
+ p_ntp_delta(ndo, &(bp->org_timestamp), &(bp->rec_timestamp));
+
+ ND_PRINT((ndo, "\n\t Originator - Transmit Timestamp: "));
+ p_ntp_delta(ndo, &(bp->org_timestamp), &(bp->xmt_timestamp));
+
+ if ( (sizeof(struct ntpdata) - length) == 16) { /* Optional: key-id */
+ ND_TCHECK(bp->key_id);
+ ND_PRINT((ndo, "\n\tKey id: %u", bp->key_id));
+ } else if ( (sizeof(struct ntpdata) - length) == 0) { /* Optional: key-id + authentication */
+ ND_TCHECK(bp->key_id);
+ ND_PRINT((ndo, "\n\tKey id: %u", bp->key_id));
+ ND_TCHECK2(bp->message_digest, sizeof (bp->message_digest));
+ ND_PRINT((ndo, "\n\tAuthentication: %08x%08x%08x%08x",
+ EXTRACT_32BITS(bp->message_digest),
+ EXTRACT_32BITS(bp->message_digest + 4),
+ EXTRACT_32BITS(bp->message_digest + 8),
+ EXTRACT_32BITS(bp->message_digest + 12)));
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|ntp]"));
+}
+
+static void
+p_sfix(netdissect_options *ndo,
+ register const struct s_fixedpt *sfp)
+{
+ register int i;
+ register int f;
+ register float ff;
+
+ i = EXTRACT_16BITS(&sfp->int_part);
+ f = EXTRACT_16BITS(&sfp->fraction);
+ ff = f / 65536.0; /* shift radix point by 16 bits */
+ f = ff * 1000000.0; /* Treat fraction as parts per million */
+ ND_PRINT((ndo, "%d.%06d", i, f));
+}
+
+#define FMAXINT (4294967296.0) /* floating point rep. of MAXINT */
+
+static void
+p_ntp_time(netdissect_options *ndo,
+ register const struct l_fixedpt *lfp)
+{
+ register int32_t i;
+ register uint32_t uf;
+ register uint32_t f;
+ register float ff;
+
+ i = EXTRACT_32BITS(&lfp->int_part);
+ uf = EXTRACT_32BITS(&lfp->fraction);
+ ff = uf;
+ if (ff < 0.0) /* some compilers are buggy */
+ ff += FMAXINT;
+ ff = ff / FMAXINT; /* shift radix point by 32 bits */
+ f = ff * 1000000000.0; /* treat fraction as parts per billion */
+ ND_PRINT((ndo, "%u.%09d", i, f));
+
+#ifdef HAVE_STRFTIME
+ /*
+ * print the time in human-readable format.
+ */
+ if (i) {
+ time_t seconds = i - JAN_1970;
+ struct tm *tm;
+ char time_buf[128];
+
+ tm = localtime(&seconds);
+ strftime(time_buf, sizeof (time_buf), "%Y/%m/%d %H:%M:%S", tm);
+ ND_PRINT((ndo, " (%s)", time_buf));
+ }
+#endif
+}
+
+/* Prints time difference between *lfp and *olfp */
+static void
+p_ntp_delta(netdissect_options *ndo,
+ register const struct l_fixedpt *olfp,
+ register const struct l_fixedpt *lfp)
+{
+ register int32_t i;
+ register uint32_t u, uf;
+ register uint32_t ou, ouf;
+ register uint32_t f;
+ register float ff;
+ int signbit;
+
+ u = EXTRACT_32BITS(&lfp->int_part);
+ ou = EXTRACT_32BITS(&olfp->int_part);
+ uf = EXTRACT_32BITS(&lfp->fraction);
+ ouf = EXTRACT_32BITS(&olfp->fraction);
+ if (ou == 0 && ouf == 0) {
+ p_ntp_time(ndo, lfp);
+ return;
+ }
+
+ i = u - ou;
+
+ if (i > 0) { /* new is definitely greater than old */
+ signbit = 0;
+ f = uf - ouf;
+ if (ouf > uf) /* must borrow from high-order bits */
+ i -= 1;
+ } else if (i < 0) { /* new is definitely less than old */
+ signbit = 1;
+ f = ouf - uf;
+ if (uf > ouf) /* must carry into the high-order bits */
+ i += 1;
+ i = -i;
+ } else { /* int_part is zero */
+ if (uf > ouf) {
+ signbit = 0;
+ f = uf - ouf;
+ } else {
+ signbit = 1;
+ f = ouf - uf;
+ }
+ }
+
+ ff = f;
+ if (ff < 0.0) /* some compilers are buggy */
+ ff += FMAXINT;
+ ff = ff / FMAXINT; /* shift radix point by 32 bits */
+ f = ff * 1000000000.0; /* treat fraction as parts per billion */
+ ND_PRINT((ndo, "%s%d.%09d", signbit ? "-" : "+", i, f));
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-null.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "af.h"
+
+/*
+ * The DLT_NULL packet header is 4 bytes long. It contains a host-byte-order
+ * 32-bit integer that specifies the family, e.g. AF_INET.
+ *
+ * Note here that "host" refers to the host on which the packets were
+ * captured; that isn't necessarily *this* host.
+ *
+ * The OpenBSD DLT_LOOP packet header is the same, except that the integer
+ * is in network byte order.
+ */
+#define NULL_HDRLEN 4
+
+/*
+ * Byte-swap a 32-bit number.
+ * ("htonl()" or "ntohl()" won't work - we want to byte-swap even on
+ * big-endian platforms.)
+ */
+#define SWAPLONG(y) \
+((((y)&0xff)<<24) | (((y)&0xff00)<<8) | (((y)&0xff0000)>>8) | (((y)>>24)&0xff))
+
+static inline void
+null_hdr_print(netdissect_options *ndo, u_int family, u_int length)
+{
+ if (!ndo->ndo_qflag) {
+ ND_PRINT((ndo, "AF %s (%u)",
+ tok2str(bsd_af_values,"Unknown",family),family));
+ } else {
+ ND_PRINT((ndo, "%s",
+ tok2str(bsd_af_values,"Unknown AF %u",family)));
+ }
+
+ ND_PRINT((ndo, ", length %u: ", length));
+}
+
+/*
+ * 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
+null_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int length = h->len;
+ u_int caplen = h->caplen;
+ u_int family;
+
+ if (caplen < NULL_HDRLEN) {
+ ND_PRINT((ndo, "[|null]"));
+ return (NULL_HDRLEN);
+ }
+
+ memcpy((char *)&family, (char *)p, sizeof(family));
+
+ /*
+ * This isn't necessarily in our host byte order; if this is
+ * a DLT_LOOP capture, it's in network byte order, and if
+ * this is a DLT_NULL capture from a machine with the opposite
+ * byte-order, it's in the opposite byte order from ours.
+ *
+ * If the upper 16 bits aren't all zero, assume it's byte-swapped.
+ */
+ if ((family & 0xFFFF0000) != 0)
+ family = SWAPLONG(family);
+
+ if (ndo->ndo_eflag)
+ null_hdr_print(ndo, family, length);
+
+ length -= NULL_HDRLEN;
+ caplen -= NULL_HDRLEN;
+ p += NULL_HDRLEN;
+
+ switch (family) {
+
+ case BSD_AFNUM_INET:
+ ip_print(ndo, p, length);
+ break;
+
+ case BSD_AFNUM_INET6_BSD:
+ case BSD_AFNUM_INET6_FREEBSD:
+ case BSD_AFNUM_INET6_DARWIN:
+ ip6_print(ndo, p, length);
+ break;
+
+ case BSD_AFNUM_ISO:
+ isoclns_print(ndo, p, length, caplen);
+ break;
+
+ case BSD_AFNUM_APPLETALK:
+ atalk_print(ndo, p, length);
+ break;
+
+ case BSD_AFNUM_IPX:
+ ipx_print(ndo, p, length);
+ break;
+
+ default:
+ /* unknown AF_ value */
+ if (!ndo->ndo_eflag)
+ null_hdr_print(ndo, family, length + NULL_HDRLEN);
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+
+ return (NULL_HDRLEN);
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1998-2007 The TCPDUMP project
+ * Copyright (c) 2009 Florian Forster
+ *
+ * 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.
+ *
+ * Optimized Link State Protocl (OLSR) as per rfc3626
+ *
+ * Original code by Hannes Gredler <hannes@juniper.net>
+ * IPv6 additions by Florian Forster <octo at verplant.org>
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+/*
+ * RFC 3626 common header
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Packet Length | Packet Sequence Number |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Message Type | Vtime | Message Size |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Originator Address |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Time To Live | Hop Count | Message Sequence Number |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * : MESSAGE :
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Message Type | Vtime | Message Size |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Originator Address |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Time To Live | Hop Count | Message Sequence Number |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * : MESSAGE :
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * : :
+ */
+
+struct olsr_common {
+ uint8_t packet_len[2];
+ uint8_t packet_seq[2];
+};
+
+#define OLSR_HELLO_MSG 1 /* rfc3626 */
+#define OLSR_TC_MSG 2 /* rfc3626 */
+#define OLSR_MID_MSG 3 /* rfc3626 */
+#define OLSR_HNA_MSG 4 /* rfc3626 */
+#define OLSR_POWERINFO_MSG 128
+#define OLSR_NAMESERVICE_MSG 130
+#define OLSR_HELLO_LQ_MSG 201 /* LQ extensions olsr.org */
+#define OLSR_TC_LQ_MSG 202 /* LQ extensions olsr.org */
+
+static const struct tok olsr_msg_values[] = {
+ { OLSR_HELLO_MSG, "Hello" },
+ { OLSR_TC_MSG, "TC" },
+ { OLSR_MID_MSG, "MID" },
+ { OLSR_HNA_MSG, "HNA" },
+ { OLSR_POWERINFO_MSG, "Powerinfo" },
+ { OLSR_NAMESERVICE_MSG, "Nameservice" },
+ { OLSR_HELLO_LQ_MSG, "Hello-LQ" },
+ { OLSR_TC_LQ_MSG, "TC-LQ" },
+ { 0, NULL}
+};
+
+struct olsr_msg4 {
+ uint8_t msg_type;
+ uint8_t vtime;
+ uint8_t msg_len[2];
+ uint8_t originator[4];
+ uint8_t ttl;
+ uint8_t hopcount;
+ uint8_t msg_seq[2];
+};
+
+struct olsr_msg6 {
+ uint8_t msg_type;
+ uint8_t vtime;
+ uint8_t msg_len[2];
+ uint8_t originator[16];
+ uint8_t ttl;
+ uint8_t hopcount;
+ uint8_t msg_seq[2];
+};
+
+struct olsr_hello {
+ uint8_t res[2];
+ uint8_t htime;
+ uint8_t will;
+};
+
+struct olsr_hello_link {
+ uint8_t link_code;
+ uint8_t res;
+ uint8_t len[2];
+};
+
+struct olsr_tc {
+ uint8_t ans_seq[2];
+ uint8_t res[2];
+};
+
+struct olsr_hna4 {
+ uint8_t network[4];
+ uint8_t mask[4];
+};
+
+struct olsr_hna6 {
+ uint8_t network[16];
+ uint8_t mask[16];
+};
+
+
+#define OLSR_EXTRACT_LINK_TYPE(link_code) (link_code & 0x3)
+#define OLSR_EXTRACT_NEIGHBOR_TYPE(link_code) (link_code >> 2)
+
+static const struct tok olsr_link_type_values[] = {
+ { 0, "Unspecified" },
+ { 1, "Asymmetric" },
+ { 2, "Symmetric" },
+ { 3, "Lost" },
+ { 0, NULL}
+};
+
+static const struct tok olsr_neighbor_type_values[] = {
+ { 0, "Not-Neighbor" },
+ { 1, "Symmetric" },
+ { 2, "Symmetric-MPR" },
+ { 0, NULL}
+};
+
+struct olsr_lq_neighbor4 {
+ uint8_t neighbor[4];
+ uint8_t link_quality;
+ uint8_t neighbor_link_quality;
+ uint8_t res[2];
+};
+
+struct olsr_lq_neighbor6 {
+ uint8_t neighbor[16];
+ uint8_t link_quality;
+ uint8_t neighbor_link_quality;
+ uint8_t res[2];
+};
+
+/*
+ * macro to convert the 8-bit mantissa/exponent to a double float
+ * taken from olsr.org.
+ */
+#define VTIME_SCALE_FACTOR 0.0625
+#define ME_TO_DOUBLE(me) \
+ (double)(VTIME_SCALE_FACTOR*(1+(double)(me>>4)/16)*(double)(1<<(me&0x0F)))
+
+/*
+ * print a neighbor list with LQ extensions.
+ */
+static int
+olsr_print_lq_neighbor4(netdissect_options *ndo,
+ const u_char *msg_data, u_int hello_len)
+{
+ struct olsr_lq_neighbor4 *lq_neighbor;
+
+ while (hello_len >= sizeof(struct olsr_lq_neighbor4)) {
+
+ lq_neighbor = (struct olsr_lq_neighbor4 *)msg_data;
+ if (!ND_TTEST(*lq_neighbor))
+ return (-1);
+
+ ND_PRINT((ndo, "\n\t neighbor %s, link-quality %.2lf%%"
+ ", neighbor-link-quality %.2lf%%",
+ ipaddr_string(ndo, lq_neighbor->neighbor),
+ ((double)lq_neighbor->link_quality/2.55),
+ ((double)lq_neighbor->neighbor_link_quality/2.55)));
+
+ msg_data += sizeof(struct olsr_lq_neighbor4);
+ hello_len -= sizeof(struct olsr_lq_neighbor4);
+ }
+ return (0);
+}
+
+#if INET6
+static int
+olsr_print_lq_neighbor6(netdissect_options *ndo,
+ const u_char *msg_data, u_int hello_len)
+{
+ struct olsr_lq_neighbor6 *lq_neighbor;
+
+ while (hello_len >= sizeof(struct olsr_lq_neighbor6)) {
+
+ lq_neighbor = (struct olsr_lq_neighbor6 *)msg_data;
+ if (!ND_TTEST(*lq_neighbor))
+ return (-1);
+
+ ND_PRINT((ndo, "\n\t neighbor %s, link-quality %.2lf%%"
+ ", neighbor-link-quality %.2lf%%",
+ ip6addr_string(ndo, lq_neighbor->neighbor),
+ ((double)lq_neighbor->link_quality/2.55),
+ ((double)lq_neighbor->neighbor_link_quality/2.55)));
+
+ msg_data += sizeof(struct olsr_lq_neighbor6);
+ hello_len -= sizeof(struct olsr_lq_neighbor6);
+ }
+ return (0);
+}
+#endif /* INET6 */
+
+/*
+ * print a neighbor list.
+ */
+static int
+olsr_print_neighbor(netdissect_options *ndo,
+ const u_char *msg_data, u_int hello_len)
+{
+ int neighbor;
+
+ ND_PRINT((ndo, "\n\t neighbor\n\t\t"));
+ neighbor = 1;
+
+ while (hello_len >= sizeof(struct in_addr)) {
+
+ if (!ND_TTEST2(*msg_data, sizeof(struct in_addr)))
+ return (-1);
+ /* print 4 neighbors per line */
+
+ ND_PRINT((ndo, "%s%s", ipaddr_string(ndo, msg_data),
+ neighbor % 4 == 0 ? "\n\t\t" : " "));
+
+ msg_data += sizeof(struct in_addr);
+ hello_len -= sizeof(struct in_addr);
+ }
+ return (0);
+}
+
+
+void
+olsr_print(netdissect_options *ndo,
+ const u_char *pptr, u_int length, int is_ipv6)
+{
+ union {
+ const struct olsr_common *common;
+ const struct olsr_msg4 *msg4;
+ const struct olsr_msg6 *msg6;
+ const struct olsr_hello *hello;
+ const struct olsr_hello_link *hello_link;
+ const struct olsr_tc *tc;
+ const struct olsr_hna4 *hna;
+ } ptr;
+
+ u_int msg_type, msg_len, msg_tlen, hello_len;
+ uint16_t name_entry_type, name_entry_len;
+ u_int name_entry_padding;
+ uint8_t link_type, neighbor_type;
+ const u_char *tptr, *msg_data;
+
+ tptr = pptr;
+
+ if (length < sizeof(struct olsr_common)) {
+ goto trunc;
+ }
+
+ ND_TCHECK2(*tptr, sizeof(struct olsr_common));
+
+ ptr.common = (struct olsr_common *)tptr;
+ length = min(length, EXTRACT_16BITS(ptr.common->packet_len));
+
+ ND_PRINT((ndo, "OLSRv%i, seq 0x%04x, length %u",
+ (is_ipv6 == 0) ? 4 : 6,
+ EXTRACT_16BITS(ptr.common->packet_seq),
+ length));
+
+ tptr += sizeof(struct olsr_common);
+
+ /*
+ * In non-verbose mode, just print version.
+ */
+ if (ndo->ndo_vflag < 1) {
+ return;
+ }
+
+ while (tptr < (pptr+length)) {
+ union
+ {
+ struct olsr_msg4 *v4;
+ struct olsr_msg6 *v6;
+ } msgptr;
+ int msg_len_valid = 0;
+
+ ND_TCHECK2(*tptr, sizeof(struct olsr_msg4));
+
+#if INET6
+ if (is_ipv6)
+ {
+ msgptr.v6 = (struct olsr_msg6 *) tptr;
+ msg_type = msgptr.v6->msg_type;
+ msg_len = EXTRACT_16BITS(msgptr.v6->msg_len);
+ if ((msg_len >= sizeof (struct olsr_msg6))
+ && (msg_len <= length))
+ msg_len_valid = 1;
+
+ /* infinite loop check */
+ if (msg_type == 0 || msg_len == 0) {
+ return;
+ }
+
+ ND_PRINT((ndo, "\n\t%s Message (%#04x), originator %s, ttl %u, hop %u"
+ "\n\t vtime %.3lfs, msg-seq 0x%04x, length %u%s",
+ tok2str(olsr_msg_values, "Unknown", msg_type),
+ msg_type, ip6addr_string(ndo, msgptr.v6->originator),
+ msgptr.v6->ttl,
+ msgptr.v6->hopcount,
+ ME_TO_DOUBLE(msgptr.v6->vtime),
+ EXTRACT_16BITS(msgptr.v6->msg_seq),
+ msg_len, (msg_len_valid == 0) ? " (invalid)" : ""));
+ if (!msg_len_valid) {
+ return;
+ }
+
+ msg_tlen = msg_len - sizeof(struct olsr_msg6);
+ msg_data = tptr + sizeof(struct olsr_msg6);
+ }
+ else /* (!is_ipv6) */
+#endif /* INET6 */
+ {
+ msgptr.v4 = (struct olsr_msg4 *) tptr;
+ msg_type = msgptr.v4->msg_type;
+ msg_len = EXTRACT_16BITS(msgptr.v4->msg_len);
+ if ((msg_len >= sizeof (struct olsr_msg4))
+ && (msg_len <= length))
+ msg_len_valid = 1;
+
+ /* infinite loop check */
+ if (msg_type == 0 || msg_len == 0) {
+ return;
+ }
+
+ ND_PRINT((ndo, "\n\t%s Message (%#04x), originator %s, ttl %u, hop %u"
+ "\n\t vtime %.3lfs, msg-seq 0x%04x, length %u%s",
+ tok2str(olsr_msg_values, "Unknown", msg_type),
+ msg_type, ipaddr_string(ndo, msgptr.v4->originator),
+ msgptr.v4->ttl,
+ msgptr.v4->hopcount,
+ ME_TO_DOUBLE(msgptr.v4->vtime),
+ EXTRACT_16BITS(msgptr.v4->msg_seq),
+ msg_len, (msg_len_valid == 0) ? " (invalid)" : ""));
+ if (!msg_len_valid) {
+ return;
+ }
+
+ msg_tlen = msg_len - sizeof(struct olsr_msg4);
+ msg_data = tptr + sizeof(struct olsr_msg4);
+ }
+
+ switch (msg_type) {
+ case OLSR_HELLO_MSG:
+ case OLSR_HELLO_LQ_MSG:
+ if (msg_tlen < sizeof(struct olsr_hello))
+ goto trunc;
+ ND_TCHECK2(*msg_data, sizeof(struct olsr_hello));
+
+ ptr.hello = (struct olsr_hello *)msg_data;
+ ND_PRINT((ndo, "\n\t hello-time %.3lfs, MPR willingness %u",
+ ME_TO_DOUBLE(ptr.hello->htime), ptr.hello->will));
+ msg_data += sizeof(struct olsr_hello);
+ msg_tlen -= sizeof(struct olsr_hello);
+
+ while (msg_tlen >= sizeof(struct olsr_hello_link)) {
+ int hello_len_valid = 0;
+
+ /*
+ * link-type.
+ */
+ ND_TCHECK2(*msg_data, sizeof(struct olsr_hello_link));
+
+ ptr.hello_link = (struct olsr_hello_link *)msg_data;
+
+ hello_len = EXTRACT_16BITS(ptr.hello_link->len);
+ link_type = OLSR_EXTRACT_LINK_TYPE(ptr.hello_link->link_code);
+ neighbor_type = OLSR_EXTRACT_NEIGHBOR_TYPE(ptr.hello_link->link_code);
+
+ if ((hello_len <= msg_tlen)
+ && (hello_len >= sizeof(struct olsr_hello_link)))
+ hello_len_valid = 1;
+
+ ND_PRINT((ndo, "\n\t link-type %s, neighbor-type %s, len %u%s",
+ tok2str(olsr_link_type_values, "Unknown", link_type),
+ tok2str(olsr_neighbor_type_values, "Unknown", neighbor_type),
+ hello_len,
+ (hello_len_valid == 0) ? " (invalid)" : ""));
+
+ if (hello_len_valid == 0)
+ break;
+
+ msg_data += sizeof(struct olsr_hello_link);
+ msg_tlen -= sizeof(struct olsr_hello_link);
+ hello_len -= sizeof(struct olsr_hello_link);
+
+ ND_TCHECK2(*msg_data, hello_len);
+ if (msg_type == OLSR_HELLO_MSG) {
+ if (olsr_print_neighbor(ndo, msg_data, hello_len) == -1)
+ goto trunc;
+ } else {
+#if INET6
+ if (is_ipv6) {
+ if (olsr_print_lq_neighbor6(ndo, msg_data, hello_len) == -1)
+ goto trunc;
+ } else
+#endif
+ {
+ if (olsr_print_lq_neighbor4(ndo, msg_data, hello_len) == -1)
+ goto trunc;
+ }
+ }
+
+ msg_data += hello_len;
+ msg_tlen -= hello_len;
+ }
+ break;
+
+ case OLSR_TC_MSG:
+ case OLSR_TC_LQ_MSG:
+ if (msg_tlen < sizeof(struct olsr_tc))
+ goto trunc;
+ ND_TCHECK2(*msg_data, sizeof(struct olsr_tc));
+
+ ptr.tc = (struct olsr_tc *)msg_data;
+ ND_PRINT((ndo, "\n\t advertised neighbor seq 0x%04x",
+ EXTRACT_16BITS(ptr.tc->ans_seq)));
+ msg_data += sizeof(struct olsr_tc);
+ msg_tlen -= sizeof(struct olsr_tc);
+
+ if (msg_type == OLSR_TC_MSG) {
+ if (olsr_print_neighbor(ndo, msg_data, msg_tlen) == -1)
+ goto trunc;
+ } else {
+#if INET6
+ if (is_ipv6) {
+ if (olsr_print_lq_neighbor6(ndo, msg_data, msg_tlen) == -1)
+ goto trunc;
+ } else
+#endif
+ {
+ if (olsr_print_lq_neighbor4(ndo, msg_data, msg_tlen) == -1)
+ goto trunc;
+ }
+ }
+ break;
+
+ case OLSR_MID_MSG:
+ {
+ size_t addr_size = sizeof(struct in_addr);
+
+#if INET6
+ if (is_ipv6)
+ addr_size = sizeof(struct in6_addr);
+#endif
+
+ while (msg_tlen >= addr_size) {
+ ND_TCHECK2(*msg_data, addr_size);
+#if INET6
+ ND_PRINT((ndo, "\n\t interface address %s",
+ is_ipv6 ? ip6addr_string(ndo, msg_data) :
+ ipaddr_string(ndo, msg_data)));
+#else
+ ND_PRINT((ndo, "\n\t interface address %s",
+ ipaddr_string(ndo, msg_data)));
+#endif
+
+ msg_data += addr_size;
+ msg_tlen -= addr_size;
+ }
+ break;
+ }
+
+ case OLSR_HNA_MSG:
+ ND_PRINT((ndo, "\n\t Advertised networks (total %u)",
+ (unsigned int) (msg_tlen / sizeof(struct olsr_hna6))));
+#if INET6
+ if (is_ipv6)
+ {
+ int i = 0;
+ while (msg_tlen >= sizeof(struct olsr_hna6)) {
+ struct olsr_hna6 *hna6;
+
+ ND_TCHECK2(*msg_data, sizeof(struct olsr_hna6));
+
+ hna6 = (struct olsr_hna6 *)msg_data;
+
+ ND_PRINT((ndo, "\n\t #%i: %s/%u",
+ i, ip6addr_string(ndo, hna6->network),
+ mask62plen (hna6->mask)));
+
+ msg_data += sizeof(struct olsr_hna6);
+ msg_tlen -= sizeof(struct olsr_hna6);
+ }
+ }
+ else
+#endif
+ {
+ int col = 0;
+ while (msg_tlen >= sizeof(struct olsr_hna4)) {
+ ND_TCHECK2(*msg_data, sizeof(struct olsr_hna4));
+
+ ptr.hna = (struct olsr_hna4 *)msg_data;
+
+ /* print 4 prefixes per line */
+ ND_PRINT((ndo, "%s%s/%u",
+ col == 0 ? "\n\t " : ", ",
+ ipaddr_string(ndo, ptr.hna->network),
+ mask2plen(EXTRACT_32BITS(ptr.hna->mask))));
+
+ msg_data += sizeof(struct olsr_hna4);
+ msg_tlen -= sizeof(struct olsr_hna4);
+
+ col = (col + 1) % 4;
+ }
+ }
+ break;
+
+ case OLSR_NAMESERVICE_MSG:
+ {
+ u_int name_entries = EXTRACT_16BITS(msg_data+2);
+ u_int addr_size = 4;
+ int name_entries_valid = 0;
+ u_int i;
+
+ if (is_ipv6)
+ addr_size = 16;
+
+ if ((name_entries > 0)
+ && ((name_entries * (4 + addr_size)) <= msg_tlen))
+ name_entries_valid = 1;
+
+ if (msg_tlen < 4)
+ goto trunc;
+ ND_TCHECK2(*msg_data, 4);
+
+ ND_PRINT((ndo, "\n\t Version %u, Entries %u%s",
+ EXTRACT_16BITS(msg_data),
+ name_entries, (name_entries_valid == 0) ? " (invalid)" : ""));
+
+ if (name_entries_valid == 0)
+ break;
+
+ msg_data += 4;
+ msg_tlen -= 4;
+
+ for (i = 0; i < name_entries; i++) {
+ int name_entry_len_valid = 0;
+
+ if (msg_tlen < 4)
+ break;
+ ND_TCHECK2(*msg_data, 4);
+
+ name_entry_type = EXTRACT_16BITS(msg_data);
+ name_entry_len = EXTRACT_16BITS(msg_data+2);
+
+ msg_data += 4;
+ msg_tlen -= 4;
+
+ if ((name_entry_len > 0) && ((addr_size + name_entry_len) <= msg_tlen))
+ name_entry_len_valid = 1;
+
+ ND_PRINT((ndo, "\n\t #%u: type %#06x, length %u%s",
+ (unsigned int) i, name_entry_type,
+ name_entry_len, (name_entry_len_valid == 0) ? " (invalid)" : ""));
+
+ if (name_entry_len_valid == 0)
+ break;
+
+ /* 32-bit alignment */
+ name_entry_padding = 0;
+ if (name_entry_len%4 != 0)
+ name_entry_padding = 4-(name_entry_len%4);
+
+ if (msg_tlen < addr_size + name_entry_len + name_entry_padding)
+ goto trunc;
+
+ ND_TCHECK2(*msg_data, addr_size + name_entry_len + name_entry_padding);
+
+#if INET6
+ if (is_ipv6)
+ ND_PRINT((ndo, ", address %s, name \"",
+ ip6addr_string(ndo, msg_data)));
+ else
+#endif
+ ND_PRINT((ndo, ", address %s, name \"",
+ ipaddr_string(ndo, msg_data)));
+ (void)fn_printn(ndo, msg_data + addr_size, name_entry_len, NULL);
+ ND_PRINT((ndo, "\""));
+
+ msg_data += addr_size + name_entry_len + name_entry_padding;
+ msg_tlen -= addr_size + name_entry_len + name_entry_padding;
+ } /* for (i = 0; i < name_entries; i++) */
+ break;
+ } /* case OLSR_NAMESERVICE_MSG */
+
+ /*
+ * FIXME those are the defined messages that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+ case OLSR_POWERINFO_MSG:
+ default:
+ print_unknown_data(ndo, msg_data, "\n\t ", msg_tlen);
+ break;
+ } /* switch (msg_type) */
+ tptr += msg_len;
+ } /* while (tptr < (pptr+length)) */
+
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "[|olsr]"));
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ * This module implements decoding of OpenFlow protocol version 1.0 (wire
+ * protocol 0x01). The decoder implements terse (default), detailed (-v) and
+ * full (-vv) output formats and, as much as each format implies, detects and
+ * tries to work around sizing anomalies inside the messages. The decoder marks
+ * up bogus values of selected message fields and decodes partially captured
+ * messages up to the snapshot end. It is based on the specification below:
+ *
+ * [OF10] http://www.openflow.org/documents/openflow-spec-v1.0.0.pdf
+ *
+ * Most functions in this file take 3 arguments into account:
+ * * cp -- the pointer to the first octet to decode
+ * * len -- the length of the current structure as declared on the wire
+ * * ep -- the pointer to the end of the captured frame
+ * They return either the pointer to the next not-yet-decoded part of the frame
+ * or the value of ep, which means the current frame processing is over as it
+ * has been fully decoded or is malformed or truncated. This way it is possible
+ * to chain and nest such functions uniformly to decode an OF1.0 message, which
+ * consists of several layers of nested structures.
+ *
+ * Decoding of Ethernet frames nested in OFPT_PACKET_IN and OFPT_PACKET_OUT
+ * messages is done only when the verbosity level set by command-line argument
+ * is "-vvv" or higher. In that case the verbosity level is temporarily
+ * decremented by 3 during the nested frame decoding. For example, running
+ * tcpdump with "-vvvv" will do full decoding of OpenFlow and "-v" decoding of
+ * the nested frames.
+ *
+ * Partial decoding of Big Switch Networks vendor extensions is done after the
+ * oftest (OpenFlow Testing Framework) and Loxigen (library generator) source
+ * code.
+ *
+ *
+ * Copyright (c) 2013 The TCPDUMP 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
+ * COPYRIGHT HOLDER 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.
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+#include "ether.h"
+#include "ethertype.h"
+#include "ipproto.h"
+#include "oui.h"
+#include "openflow.h"
+
+static const char tstr[] = " [|openflow]";
+static const char cstr[] = " (corrupt)";
+
+#define OFPT_HELLO 0x00
+#define OFPT_ERROR 0x01
+#define OFPT_ECHO_REQUEST 0x02
+#define OFPT_ECHO_REPLY 0x03
+#define OFPT_VENDOR 0x04
+#define OFPT_FEATURES_REQUEST 0x05
+#define OFPT_FEATURES_REPLY 0x06
+#define OFPT_GET_CONFIG_REQUEST 0x07
+#define OFPT_GET_CONFIG_REPLY 0x08
+#define OFPT_SET_CONFIG 0x09
+#define OFPT_PACKET_IN 0x0a
+#define OFPT_FLOW_REMOVED 0x0b
+#define OFPT_PORT_STATUS 0x0c
+#define OFPT_PACKET_OUT 0x0d
+#define OFPT_FLOW_MOD 0x0e
+#define OFPT_PORT_MOD 0x0f
+#define OFPT_STATS_REQUEST 0x10
+#define OFPT_STATS_REPLY 0x11
+#define OFPT_BARRIER_REQUEST 0x12
+#define OFPT_BARRIER_REPLY 0x13
+#define OFPT_QUEUE_GET_CONFIG_REQUEST 0x14
+#define OFPT_QUEUE_GET_CONFIG_REPLY 0x15
+static const struct tok ofpt_str[] = {
+ { OFPT_HELLO, "HELLO" },
+ { OFPT_ERROR, "ERROR" },
+ { OFPT_ECHO_REQUEST, "ECHO_REQUEST" },
+ { OFPT_ECHO_REPLY, "ECHO_REPLY" },
+ { OFPT_VENDOR, "VENDOR" },
+ { OFPT_FEATURES_REQUEST, "FEATURES_REQUEST" },
+ { OFPT_FEATURES_REPLY, "FEATURES_REPLY" },
+ { OFPT_GET_CONFIG_REQUEST, "GET_CONFIG_REQUEST" },
+ { OFPT_GET_CONFIG_REPLY, "GET_CONFIG_REPLY" },
+ { OFPT_SET_CONFIG, "SET_CONFIG" },
+ { OFPT_PACKET_IN, "PACKET_IN" },
+ { OFPT_FLOW_REMOVED, "FLOW_REMOVED" },
+ { OFPT_PORT_STATUS, "PORT_STATUS" },
+ { OFPT_PACKET_OUT, "PACKET_OUT" },
+ { OFPT_FLOW_MOD, "FLOW_MOD" },
+ { OFPT_PORT_MOD, "PORT_MOD" },
+ { OFPT_STATS_REQUEST, "STATS_REQUEST" },
+ { OFPT_STATS_REPLY, "STATS_REPLY" },
+ { OFPT_BARRIER_REQUEST, "BARRIER_REQUEST" },
+ { OFPT_BARRIER_REPLY, "BARRIER_REPLY" },
+ { OFPT_QUEUE_GET_CONFIG_REQUEST, "QUEUE_GET_CONFIG_REQUEST" },
+ { OFPT_QUEUE_GET_CONFIG_REPLY, "QUEUE_GET_CONFIG_REPLY" },
+ { 0, NULL }
+};
+
+#define OFPPC_PORT_DOWN (1 << 0)
+#define OFPPC_NO_STP (1 << 1)
+#define OFPPC_NO_RECV (1 << 2)
+#define OFPPC_NO_RECV_STP (1 << 3)
+#define OFPPC_NO_FLOOD (1 << 4)
+#define OFPPC_NO_FWD (1 << 5)
+#define OFPPC_NO_PACKET_IN (1 << 6)
+static const struct tok ofppc_bm[] = {
+ { OFPPC_PORT_DOWN, "PORT_DOWN" },
+ { OFPPC_NO_STP, "NO_STP" },
+ { OFPPC_NO_RECV, "NO_RECV" },
+ { OFPPC_NO_RECV_STP, "NO_RECV_STP" },
+ { OFPPC_NO_FLOOD, "NO_FLOOD" },
+ { OFPPC_NO_FWD, "NO_FWD" },
+ { OFPPC_NO_PACKET_IN, "NO_PACKET_IN" },
+ { 0, NULL }
+};
+#define OFPPC_U (~(OFPPC_PORT_DOWN | OFPPC_NO_STP | OFPPC_NO_RECV | \
+ OFPPC_NO_RECV_STP | OFPPC_NO_FLOOD | OFPPC_NO_FWD | \
+ OFPPC_NO_PACKET_IN))
+
+#define OFPPS_LINK_DOWN (1 << 0)
+#define OFPPS_STP_LISTEN (0 << 8)
+#define OFPPS_STP_LEARN (1 << 8)
+#define OFPPS_STP_FORWARD (2 << 8)
+#define OFPPS_STP_BLOCK (3 << 8)
+#define OFPPS_STP_MASK (3 << 8)
+static const struct tok ofpps_bm[] = {
+ { OFPPS_LINK_DOWN, "LINK_DOWN" },
+ { OFPPS_STP_LISTEN, "STP_LISTEN" },
+ { OFPPS_STP_LEARN, "STP_LEARN" },
+ { OFPPS_STP_FORWARD, "STP_FORWARD" },
+ { OFPPS_STP_BLOCK, "STP_BLOCK" },
+ { 0, NULL }
+};
+#define OFPPS_U (~(OFPPS_LINK_DOWN | OFPPS_STP_LISTEN | OFPPS_STP_LEARN | \
+ OFPPS_STP_FORWARD | OFPPS_STP_BLOCK))
+
+#define OFPP_MAX 0xff00
+#define OFPP_IN_PORT 0xfff8
+#define OFPP_TABLE 0xfff9
+#define OFPP_NORMAL 0xfffa
+#define OFPP_FLOOD 0xfffb
+#define OFPP_ALL 0xfffc
+#define OFPP_CONTROLLER 0xfffd
+#define OFPP_LOCAL 0xfffe
+#define OFPP_NONE 0xffff
+static const struct tok ofpp_str[] = {
+ { OFPP_MAX, "MAX" },
+ { OFPP_IN_PORT, "IN_PORT" },
+ { OFPP_TABLE, "TABLE" },
+ { OFPP_NORMAL, "NORMAL" },
+ { OFPP_FLOOD, "FLOOD" },
+ { OFPP_ALL, "ALL" },
+ { OFPP_CONTROLLER, "CONTROLLER" },
+ { OFPP_LOCAL, "LOCAL" },
+ { OFPP_NONE, "NONE" },
+ { 0, NULL }
+};
+
+#define OFPPF_10MB_HD (1 << 0)
+#define OFPPF_10MB_FD (1 << 1)
+#define OFPPF_100MB_HD (1 << 2)
+#define OFPPF_100MB_FD (1 << 3)
+#define OFPPF_1GB_HD (1 << 4)
+#define OFPPF_1GB_FD (1 << 5)
+#define OFPPF_10GB_FD (1 << 6)
+#define OFPPF_COPPER (1 << 7)
+#define OFPPF_FIBER (1 << 8)
+#define OFPPF_AUTONEG (1 << 9)
+#define OFPPF_PAUSE (1 << 10)
+#define OFPPF_PAUSE_ASYM (1 << 11)
+static const struct tok ofppf_bm[] = {
+ { OFPPF_10MB_HD, "10MB_HD" },
+ { OFPPF_10MB_FD, "10MB_FD" },
+ { OFPPF_100MB_HD, "100MB_HD" },
+ { OFPPF_100MB_FD, "100MB_FD" },
+ { OFPPF_1GB_HD, "1GB_HD" },
+ { OFPPF_1GB_FD, "1GB_FD" },
+ { OFPPF_10GB_FD, "10GB_FD" },
+ { OFPPF_COPPER, "COPPER" },
+ { OFPPF_FIBER, "FIBER" },
+ { OFPPF_AUTONEG, "AUTONEG" },
+ { OFPPF_PAUSE, "PAUSE" },
+ { OFPPF_PAUSE_ASYM, "PAUSE_ASYM" },
+ { 0, NULL }
+};
+#define OFPPF_U (~(OFPPF_10MB_HD | OFPPF_10MB_FD | OFPPF_100MB_HD | \
+ OFPPF_100MB_FD | OFPPF_1GB_HD | OFPPF_1GB_FD | \
+ OFPPF_10GB_FD | OFPPF_COPPER | OFPPF_FIBER | \
+ OFPPF_AUTONEG | OFPPF_PAUSE | OFPPF_PAUSE_ASYM))
+
+#define OFPQT_NONE 0x0000
+#define OFPQT_MIN_RATE 0x0001
+static const struct tok ofpqt_str[] = {
+ { OFPQT_NONE, "NONE" },
+ { OFPQT_MIN_RATE, "MIN_RATE" },
+ { 0, NULL }
+};
+
+#define OFPFW_IN_PORT (1 << 0)
+#define OFPFW_DL_VLAN (1 << 1)
+#define OFPFW_DL_SRC (1 << 2)
+#define OFPFW_DL_DST (1 << 3)
+#define OFPFW_DL_TYPE (1 << 4)
+#define OFPFW_NW_PROTO (1 << 5)
+#define OFPFW_TP_SRC (1 << 6)
+#define OFPFW_TP_DST (1 << 7)
+#define OFPFW_NW_SRC_SHIFT 8
+#define OFPFW_NW_SRC_BITS 6
+#define OFPFW_NW_SRC_MASK (((1 << OFPFW_NW_SRC_BITS) - 1) << OFPFW_NW_SRC_SHIFT)
+#define OFPFW_NW_DST_SHIFT 14
+#define OFPFW_NW_DST_BITS 6
+#define OFPFW_NW_DST_MASK (((1 << OFPFW_NW_DST_BITS) - 1) << OFPFW_NW_DST_SHIFT)
+#define OFPFW_DL_VLAN_PCP (1 << 20)
+#define OFPFW_NW_TOS (1 << 21)
+#define OFPFW_ALL ((1 << 22) - 1)
+static const struct tok ofpfw_bm[] = {
+ { OFPFW_IN_PORT, "IN_PORT" },
+ { OFPFW_DL_VLAN, "DL_VLAN" },
+ { OFPFW_DL_SRC, "DL_SRC" },
+ { OFPFW_DL_DST, "DL_DST" },
+ { OFPFW_DL_TYPE, "DL_TYPE" },
+ { OFPFW_NW_PROTO, "NW_PROTO" },
+ { OFPFW_TP_SRC, "TP_SRC" },
+ { OFPFW_TP_DST, "TP_DST" },
+ { OFPFW_DL_VLAN_PCP, "DL_VLAN_PCP" },
+ { OFPFW_NW_TOS, "NW_TOS" },
+ { 0, NULL }
+};
+/* The above array does not include bits 8~13 (OFPFW_NW_SRC_*) and 14~19
+ * (OFPFW_NW_DST_*), which are not a part of the bitmap and require decoding
+ * other than that of tok2str(). The macro below includes these bits such that
+ * they are not reported as bogus in the decoding. */
+#define OFPFW_U (~(OFPFW_ALL))
+
+#define OFPAT_OUTPUT 0x0000
+#define OFPAT_SET_VLAN_VID 0x0001
+#define OFPAT_SET_VLAN_PCP 0x0002
+#define OFPAT_STRIP_VLAN 0x0003
+#define OFPAT_SET_DL_SRC 0x0004
+#define OFPAT_SET_DL_DST 0x0005
+#define OFPAT_SET_NW_SRC 0x0006
+#define OFPAT_SET_NW_DST 0x0007
+#define OFPAT_SET_NW_TOS 0x0008
+#define OFPAT_SET_TP_SRC 0x0009
+#define OFPAT_SET_TP_DST 0x000a
+#define OFPAT_ENQUEUE 0x000b
+#define OFPAT_VENDOR 0xffff
+static const struct tok ofpat_str[] = {
+ { OFPAT_OUTPUT, "OUTPUT" },
+ { OFPAT_SET_VLAN_VID, "SET_VLAN_VID" },
+ { OFPAT_SET_VLAN_PCP, "SET_VLAN_PCP" },
+ { OFPAT_STRIP_VLAN, "STRIP_VLAN" },
+ { OFPAT_SET_DL_SRC, "SET_DL_SRC" },
+ { OFPAT_SET_DL_DST, "SET_DL_DST" },
+ { OFPAT_SET_NW_SRC, "SET_NW_SRC" },
+ { OFPAT_SET_NW_DST, "SET_NW_DST" },
+ { OFPAT_SET_NW_TOS, "SET_NW_TOS" },
+ { OFPAT_SET_TP_SRC, "SET_TP_SRC" },
+ { OFPAT_SET_TP_DST, "SET_TP_DST" },
+ { OFPAT_ENQUEUE, "ENQUEUE" },
+ { OFPAT_VENDOR, "VENDOR" },
+ { 0, NULL }
+};
+
+/* bit-shifted, w/o vendor action */
+static const struct tok ofpat_bm[] = {
+ { 1 << OFPAT_OUTPUT, "OUTPUT" },
+ { 1 << OFPAT_SET_VLAN_VID, "SET_VLAN_VID" },
+ { 1 << OFPAT_SET_VLAN_PCP, "SET_VLAN_PCP" },
+ { 1 << OFPAT_STRIP_VLAN, "STRIP_VLAN" },
+ { 1 << OFPAT_SET_DL_SRC, "SET_DL_SRC" },
+ { 1 << OFPAT_SET_DL_DST, "SET_DL_DST" },
+ { 1 << OFPAT_SET_NW_SRC, "SET_NW_SRC" },
+ { 1 << OFPAT_SET_NW_DST, "SET_NW_DST" },
+ { 1 << OFPAT_SET_NW_TOS, "SET_NW_TOS" },
+ { 1 << OFPAT_SET_TP_SRC, "SET_TP_SRC" },
+ { 1 << OFPAT_SET_TP_DST, "SET_TP_DST" },
+ { 1 << OFPAT_ENQUEUE, "ENQUEUE" },
+ { 0, NULL }
+};
+#define OFPAT_U (~(1 << OFPAT_OUTPUT | 1 << OFPAT_SET_VLAN_VID | \
+ 1 << OFPAT_SET_VLAN_PCP | 1 << OFPAT_STRIP_VLAN | \
+ 1 << OFPAT_SET_DL_SRC | 1 << OFPAT_SET_DL_DST | \
+ 1 << OFPAT_SET_NW_SRC | 1 << OFPAT_SET_NW_DST | \
+ 1 << OFPAT_SET_NW_TOS | 1 << OFPAT_SET_TP_SRC | \
+ 1 << OFPAT_SET_TP_DST | 1 << OFPAT_ENQUEUE))
+
+#define OFPC_FLOW_STATS (1 << 0)
+#define OFPC_TABLE_STATS (1 << 1)
+#define OFPC_PORT_STATS (1 << 2)
+#define OFPC_STP (1 << 3)
+#define OFPC_RESERVED (1 << 4)
+#define OFPC_IP_REASM (1 << 5)
+#define OFPC_QUEUE_STATS (1 << 6)
+#define OFPC_ARP_MATCH_IP (1 << 7)
+static const struct tok ofp_capabilities_bm[] = {
+ { OFPC_FLOW_STATS, "FLOW_STATS" },
+ { OFPC_TABLE_STATS, "TABLE_STATS" },
+ { OFPC_PORT_STATS, "PORT_STATS" },
+ { OFPC_STP, "STP" },
+ { OFPC_RESERVED, "RESERVED" }, /* not in the mask below */
+ { OFPC_IP_REASM, "IP_REASM" },
+ { OFPC_QUEUE_STATS, "QUEUE_STATS" },
+ { OFPC_ARP_MATCH_IP, "ARP_MATCH_IP" },
+ { 0, NULL }
+};
+#define OFPCAP_U (~(OFPC_FLOW_STATS | OFPC_TABLE_STATS | OFPC_PORT_STATS | \
+ OFPC_STP | OFPC_IP_REASM | OFPC_QUEUE_STATS | \
+ OFPC_ARP_MATCH_IP))
+
+#define OFPC_FRAG_NORMAL 0x0000
+#define OFPC_FRAG_DROP 0x0001
+#define OFPC_FRAG_REASM 0x0002
+#define OFPC_FRAG_MASK 0x0003
+static const struct tok ofp_config_str[] = {
+ { OFPC_FRAG_NORMAL, "FRAG_NORMAL" },
+ { OFPC_FRAG_DROP, "FRAG_DROP" },
+ { OFPC_FRAG_REASM, "FRAG_REASM" },
+ { 0, NULL }
+};
+
+#define OFPFC_ADD 0x0000
+#define OFPFC_MODIFY 0x0001
+#define OFPFC_MODIFY_STRICT 0x0002
+#define OFPFC_DELETE 0x0003
+#define OFPFC_DELETE_STRICT 0x0004
+static const struct tok ofpfc_str[] = {
+ { OFPFC_ADD, "ADD" },
+ { OFPFC_MODIFY, "MODIFY" },
+ { OFPFC_MODIFY_STRICT, "MODIFY_STRICT" },
+ { OFPFC_DELETE, "DELETE" },
+ { OFPFC_DELETE_STRICT, "DELETE_STRICT" },
+ { 0, NULL }
+};
+
+static const struct tok bufferid_str[] = {
+ { 0xffffffff, "NONE" },
+ { 0, NULL }
+};
+
+#define OFPFF_SEND_FLOW_REM (1 << 0)
+#define OFPFF_CHECK_OVERLAP (1 << 1)
+#define OFPFF_EMERG (1 << 2)
+static const struct tok ofpff_bm[] = {
+ { OFPFF_SEND_FLOW_REM, "SEND_FLOW_REM" },
+ { OFPFF_CHECK_OVERLAP, "CHECK_OVERLAP" },
+ { OFPFF_EMERG, "EMERG" },
+ { 0, NULL }
+};
+#define OFPFF_U (~(OFPFF_SEND_FLOW_REM | OFPFF_CHECK_OVERLAP | OFPFF_EMERG))
+
+#define OFPST_DESC 0x0000
+#define OFPST_FLOW 0x0001
+#define OFPST_AGGREGATE 0x0002
+#define OFPST_TABLE 0x0003
+#define OFPST_PORT 0x0004
+#define OFPST_QUEUE 0x0005
+#define OFPST_VENDOR 0xffff
+static const struct tok ofpst_str[] = {
+ { OFPST_DESC, "DESC" },
+ { OFPST_FLOW, "FLOW" },
+ { OFPST_AGGREGATE, "AGGREGATE" },
+ { OFPST_TABLE, "TABLE" },
+ { OFPST_PORT, "PORT" },
+ { OFPST_QUEUE, "QUEUE" },
+ { OFPST_VENDOR, "VENDOR" },
+ { 0, NULL }
+};
+
+static const struct tok tableid_str[] = {
+ { 0xfe, "EMERG" },
+ { 0xff, "ALL" },
+ { 0, NULL }
+};
+
+#define OFPQ_ALL 0xffffffff
+static const struct tok ofpq_str[] = {
+ { OFPQ_ALL, "ALL" },
+ { 0, NULL }
+};
+
+#define OFPSF_REPLY_MORE 0x0001
+static const struct tok ofpsf_reply_bm[] = {
+ { OFPSF_REPLY_MORE, "MORE" },
+ { 0, NULL }
+};
+#define OFPSF_REPLY_U (~(OFPSF_REPLY_MORE))
+
+#define OFPR_NO_MATCH 0x00
+#define OFPR_ACTION 0x01
+static const struct tok ofpr_str[] = {
+ { OFPR_NO_MATCH, "NO_MATCH" },
+ { OFPR_ACTION, "ACTION" },
+ { 0, NULL }
+};
+
+#define OFPRR_IDLE_TIMEOUT 0x00
+#define OFPRR_HARD_TIMEOUT 0x01
+#define OFPRR_DELETE 0x02
+static const struct tok ofprr_str[] = {
+ { OFPRR_IDLE_TIMEOUT, "IDLE_TIMEOUT" },
+ { OFPRR_HARD_TIMEOUT, "HARD_TIMEOUT" },
+ { OFPRR_DELETE, "DELETE" },
+ { 0, NULL }
+};
+
+#define OFPPR_ADD 0x00
+#define OFPPR_DELETE 0x01
+#define OFPPR_MODIFY 0x02
+static const struct tok ofppr_str[] = {
+ { OFPPR_ADD, "ADD" },
+ { OFPPR_DELETE, "DELETE" },
+ { OFPPR_MODIFY, "MODIFY" },
+ { 0, NULL }
+};
+
+#define OFPET_HELLO_FAILED 0x0000
+#define OFPET_BAD_REQUEST 0x0001
+#define OFPET_BAD_ACTION 0x0002
+#define OFPET_FLOW_MOD_FAILED 0x0003
+#define OFPET_PORT_MOD_FAILED 0x0004
+#define OFPET_QUEUE_OP_FAILED 0x0005
+static const struct tok ofpet_str[] = {
+ { OFPET_HELLO_FAILED, "HELLO_FAILED" },
+ { OFPET_BAD_REQUEST, "BAD_REQUEST" },
+ { OFPET_BAD_ACTION, "BAD_ACTION" },
+ { OFPET_FLOW_MOD_FAILED, "FLOW_MOD_FAILED" },
+ { OFPET_PORT_MOD_FAILED, "PORT_MOD_FAILED" },
+ { OFPET_QUEUE_OP_FAILED, "QUEUE_OP_FAILED" },
+ { 0, NULL }
+};
+
+#define OFPHFC_INCOMPATIBLE 0x0000
+#define OFPHFC_EPERM 0x0001
+static const struct tok ofphfc_str[] = {
+ { OFPHFC_INCOMPATIBLE, "INCOMPATIBLE" },
+ { OFPHFC_EPERM, "EPERM" },
+ { 0, NULL }
+};
+
+#define OFPBRC_BAD_VERSION 0x0000
+#define OFPBRC_BAD_TYPE 0x0001
+#define OFPBRC_BAD_STAT 0x0002
+#define OFPBRC_BAD_VENDOR 0x0003
+#define OFPBRC_BAD_SUBTYPE 0x0004
+#define OFPBRC_EPERM 0x0005
+#define OFPBRC_BAD_LEN 0x0006
+#define OFPBRC_BUFFER_EMPTY 0x0007
+#define OFPBRC_BUFFER_UNKNOWN 0x0008
+static const struct tok ofpbrc_str[] = {
+ { OFPBRC_BAD_VERSION, "BAD_VERSION" },
+ { OFPBRC_BAD_TYPE, "BAD_TYPE" },
+ { OFPBRC_BAD_STAT, "BAD_STAT" },
+ { OFPBRC_BAD_VENDOR, "BAD_VENDOR" },
+ { OFPBRC_BAD_SUBTYPE, "BAD_SUBTYPE" },
+ { OFPBRC_EPERM, "EPERM" },
+ { OFPBRC_BAD_LEN, "BAD_LEN" },
+ { OFPBRC_BUFFER_EMPTY, "BUFFER_EMPTY" },
+ { OFPBRC_BUFFER_UNKNOWN, "BUFFER_UNKNOWN" },
+ { 0, NULL }
+};
+
+#define OFPBAC_BAD_TYPE 0x0000
+#define OFPBAC_BAD_LEN 0x0001
+#define OFPBAC_BAD_VENDOR 0x0002
+#define OFPBAC_BAD_VENDOR_TYPE 0x0003
+#define OFPBAC_BAD_OUT_PORT 0x0004
+#define OFPBAC_BAD_ARGUMENT 0x0005
+#define OFPBAC_EPERM 0x0006
+#define OFPBAC_TOO_MANY 0x0007
+#define OFPBAC_BAD_QUEUE 0x0008
+static const struct tok ofpbac_str[] = {
+ { OFPBAC_BAD_TYPE, "BAD_TYPE" },
+ { OFPBAC_BAD_LEN, "BAD_LEN" },
+ { OFPBAC_BAD_VENDOR, "BAD_VENDOR" },
+ { OFPBAC_BAD_VENDOR_TYPE, "BAD_VENDOR_TYPE" },
+ { OFPBAC_BAD_OUT_PORT, "BAD_OUT_PORT" },
+ { OFPBAC_BAD_ARGUMENT, "BAD_ARGUMENT" },
+ { OFPBAC_EPERM, "EPERM" },
+ { OFPBAC_TOO_MANY, "TOO_MANY" },
+ { OFPBAC_BAD_QUEUE, "BAD_QUEUE" },
+ { 0, NULL }
+};
+
+#define OFPFMFC_ALL_TABLES_FULL 0x0000
+#define OFPFMFC_OVERLAP 0x0001
+#define OFPFMFC_EPERM 0x0002
+#define OFPFMFC_BAD_EMERG_TIMEOUT 0x0003
+#define OFPFMFC_BAD_COMMAND 0x0004
+#define OFPFMFC_UNSUPPORTED 0x0005
+static const struct tok ofpfmfc_str[] = {
+ { OFPFMFC_ALL_TABLES_FULL, "ALL_TABLES_FULL" },
+ { OFPFMFC_OVERLAP, "OVERLAP" },
+ { OFPFMFC_EPERM, "EPERM" },
+ { OFPFMFC_BAD_EMERG_TIMEOUT, "BAD_EMERG_TIMEOUT" },
+ { OFPFMFC_BAD_COMMAND, "BAD_COMMAND" },
+ { OFPFMFC_UNSUPPORTED, "UNSUPPORTED" },
+ { 0, NULL }
+};
+
+#define OFPPMFC_BAD_PORT 0x0000
+#define OFPPMFC_BAD_HW_ADDR 0x0001
+static const struct tok ofppmfc_str[] = {
+ { OFPPMFC_BAD_PORT, "BAD_PORT" },
+ { OFPPMFC_BAD_HW_ADDR, "BAD_HW_ADDR" },
+ { 0, NULL }
+};
+
+#define OFPQOFC_BAD_PORT 0x0000
+#define OFPQOFC_BAD_QUEUE 0x0001
+#define OFPQOFC_EPERM 0x0002
+static const struct tok ofpqofc_str[] = {
+ { OFPQOFC_BAD_PORT, "BAD_PORT" },
+ { OFPQOFC_BAD_QUEUE, "BAD_QUEUE" },
+ { OFPQOFC_EPERM, "EPERM" },
+ { 0, NULL }
+};
+
+static const struct tok empty_str[] = {
+ { 0, NULL }
+};
+
+/* lengths (fixed or minimal) of particular protocol structures */
+#define OF_SWITCH_CONFIG_LEN 12
+#define OF_PHY_PORT_LEN 48
+#define OF_SWITCH_FEATURES_LEN 32
+#define OF_PORT_STATUS_LEN 64
+#define OF_PORT_MOD_LEN 32
+#define OF_PACKET_IN_LEN 20
+#define OF_ACTION_OUTPUT_LEN 8
+#define OF_ACTION_VLAN_VID_LEN 8
+#define OF_ACTION_VLAN_PCP_LEN 8
+#define OF_ACTION_DL_ADDR_LEN 16
+#define OF_ACTION_NW_ADDR_LEN 8
+#define OF_ACTION_TP_PORT_LEN 8
+#define OF_ACTION_NW_TOS_LEN 8
+#define OF_ACTION_VENDOR_HEADER_LEN 8
+#define OF_ACTION_HEADER_LEN 8
+#define OF_PACKET_OUT_LEN 16
+#define OF_MATCH_LEN 40
+#define OF_FLOW_MOD_LEN 72
+#define OF_FLOW_REMOVED_LEN 88
+#define OF_ERROR_MSG_LEN 12
+#define OF_STATS_REQUEST_LEN 12
+#define OF_STATS_REPLY_LEN 12
+#define OF_DESC_STATS_LEN 1056
+#define OF_FLOW_STATS_REQUEST_LEN 44
+#define OF_FLOW_STATS_LEN 88
+#define OF_AGGREGATE_STATS_REQUEST_LEN 44
+#define OF_AGGREGATE_STATS_REPLY_LEN 24
+#define OF_TABLE_STATS_LEN 64
+#define OF_PORT_STATS_REQUEST_LEN 8
+#define OF_PORT_STATS_LEN 104
+#define OF_VENDOR_HEADER_LEN 12
+#define OF_QUEUE_PROP_HEADER_LEN 8
+#define OF_QUEUE_PROP_MIN_RATE_LEN 16
+#define OF_PACKET_QUEUE_LEN 8
+#define OF_QUEUE_GET_CONFIG_REQUEST_LEN 12
+#define OF_QUEUE_GET_CONFIG_REPLY_LEN 16
+#define OF_ACTION_ENQUEUE_LEN 16
+#define OF_QUEUE_STATS_REQUEST_LEN 8
+#define OF_QUEUE_STATS_LEN 32
+
+/* miscellaneous constants from [OF10] */
+#define OFP_MAX_TABLE_NAME_LEN 32
+#define OFP_MAX_PORT_NAME_LEN 16
+#define DESC_STR_LEN 256
+#define SERIAL_NUM_LEN 32
+#define OFP_VLAN_NONE 0xffff
+
+/* vendor extensions */
+#define BSN_SET_IP_MASK 0
+#define BSN_GET_IP_MASK_REQUEST 1
+#define BSN_GET_IP_MASK_REPLY 2
+#define BSN_SET_MIRRORING 3
+#define BSN_GET_MIRRORING_REQUEST 4
+#define BSN_GET_MIRRORING_REPLY 5
+#define BSN_SHELL_COMMAND 6
+#define BSN_SHELL_OUTPUT 7
+#define BSN_SHELL_STATUS 8
+#define BSN_GET_INTERFACES_REQUEST 9
+#define BSN_GET_INTERFACES_REPLY 10
+#define BSN_SET_PKTIN_SUPPRESSION_REQUEST 11
+#define BSN_SET_L2_TABLE_REQUEST 12
+#define BSN_GET_L2_TABLE_REQUEST 13
+#define BSN_GET_L2_TABLE_REPLY 14
+#define BSN_VIRTUAL_PORT_CREATE_REQUEST 15
+#define BSN_VIRTUAL_PORT_CREATE_REPLY 16
+#define BSN_VIRTUAL_PORT_REMOVE_REQUEST 17
+#define BSN_BW_ENABLE_SET_REQUEST 18
+#define BSN_BW_ENABLE_GET_REQUEST 19
+#define BSN_BW_ENABLE_GET_REPLY 20
+#define BSN_BW_CLEAR_DATA_REQUEST 21
+#define BSN_BW_CLEAR_DATA_REPLY 22
+#define BSN_BW_ENABLE_SET_REPLY 23
+#define BSN_SET_L2_TABLE_REPLY 24
+#define BSN_SET_PKTIN_SUPPRESSION_REPLY 25
+#define BSN_VIRTUAL_PORT_REMOVE_REPLY 26
+#define BSN_HYBRID_GET_REQUEST 27
+#define BSN_HYBRID_GET_REPLY 28
+ /* 29 */
+ /* 30 */
+#define BSN_PDU_TX_REQUEST 31
+#define BSN_PDU_TX_REPLY 32
+#define BSN_PDU_RX_REQUEST 33
+#define BSN_PDU_RX_REPLY 34
+#define BSN_PDU_RX_TIMEOUT 35
+
+static const struct tok bsn_subtype_str[] = {
+ { BSN_SET_IP_MASK, "SET_IP_MASK" },
+ { BSN_GET_IP_MASK_REQUEST, "GET_IP_MASK_REQUEST" },
+ { BSN_GET_IP_MASK_REPLY, "GET_IP_MASK_REPLY" },
+ { BSN_SET_MIRRORING, "SET_MIRRORING" },
+ { BSN_GET_MIRRORING_REQUEST, "GET_MIRRORING_REQUEST" },
+ { BSN_GET_MIRRORING_REPLY, "GET_MIRRORING_REPLY" },
+ { BSN_SHELL_COMMAND, "SHELL_COMMAND" },
+ { BSN_SHELL_OUTPUT, "SHELL_OUTPUT" },
+ { BSN_SHELL_STATUS, "SHELL_STATUS" },
+ { BSN_GET_INTERFACES_REQUEST, "GET_INTERFACES_REQUEST" },
+ { BSN_GET_INTERFACES_REPLY, "GET_INTERFACES_REPLY" },
+ { BSN_SET_PKTIN_SUPPRESSION_REQUEST, "SET_PKTIN_SUPPRESSION_REQUEST" },
+ { BSN_SET_L2_TABLE_REQUEST, "SET_L2_TABLE_REQUEST" },
+ { BSN_GET_L2_TABLE_REQUEST, "GET_L2_TABLE_REQUEST" },
+ { BSN_GET_L2_TABLE_REPLY, "GET_L2_TABLE_REPLY" },
+ { BSN_VIRTUAL_PORT_CREATE_REQUEST, "VIRTUAL_PORT_CREATE_REQUEST" },
+ { BSN_VIRTUAL_PORT_CREATE_REPLY, "VIRTUAL_PORT_CREATE_REPLY" },
+ { BSN_VIRTUAL_PORT_REMOVE_REQUEST, "VIRTUAL_PORT_REMOVE_REQUEST" },
+ { BSN_BW_ENABLE_SET_REQUEST, "BW_ENABLE_SET_REQUEST" },
+ { BSN_BW_ENABLE_GET_REQUEST, "BW_ENABLE_GET_REQUEST" },
+ { BSN_BW_ENABLE_GET_REPLY, "BW_ENABLE_GET_REPLY" },
+ { BSN_BW_CLEAR_DATA_REQUEST, "BW_CLEAR_DATA_REQUEST" },
+ { BSN_BW_CLEAR_DATA_REPLY, "BW_CLEAR_DATA_REPLY" },
+ { BSN_BW_ENABLE_SET_REPLY, "BW_ENABLE_SET_REPLY" },
+ { BSN_SET_L2_TABLE_REPLY, "SET_L2_TABLE_REPLY" },
+ { BSN_SET_PKTIN_SUPPRESSION_REPLY, "SET_PKTIN_SUPPRESSION_REPLY" },
+ { BSN_VIRTUAL_PORT_REMOVE_REPLY, "VIRTUAL_PORT_REMOVE_REPLY" },
+ { BSN_HYBRID_GET_REQUEST, "HYBRID_GET_REQUEST" },
+ { BSN_HYBRID_GET_REPLY, "HYBRID_GET_REPLY" },
+ { BSN_PDU_TX_REQUEST, "PDU_TX_REQUEST" },
+ { BSN_PDU_TX_REPLY, "PDU_TX_REPLY" },
+ { BSN_PDU_RX_REQUEST, "PDU_RX_REQUEST" },
+ { BSN_PDU_RX_REPLY, "PDU_RX_REPLY" },
+ { BSN_PDU_RX_TIMEOUT, "PDU_RX_TIMEOUT" },
+ { 0, NULL }
+};
+
+#define BSN_ACTION_MIRROR 1
+#define BSN_ACTION_SET_TUNNEL_DST 2
+ /* 3 */
+#define BSN_ACTION_CHECKSUM 4
+
+static const struct tok bsn_action_subtype_str[] = {
+ { BSN_ACTION_MIRROR, "MIRROR" },
+ { BSN_ACTION_SET_TUNNEL_DST, "SET_TUNNEL_DST" },
+ { BSN_ACTION_CHECKSUM, "CHECKSUM" },
+ { 0, NULL }
+};
+
+static const struct tok bsn_mirror_copy_stage_str[] = {
+ { 0, "INGRESS" },
+ { 1, "EGRESS" },
+ { 0, NULL },
+};
+
+static const struct tok bsn_onoff_str[] = {
+ { 0, "OFF" },
+ { 1, "ON" },
+ { 0, NULL },
+};
+
+static const char *
+vlan_str(const uint16_t vid)
+{
+ static char buf[sizeof("65535 (bogus)")];
+ const char *fmt;
+
+ if (vid == OFP_VLAN_NONE)
+ return "NONE";
+ fmt = (vid > 0 && vid < 0x0fff) ? "%u" : "%u (bogus)";
+ snprintf(buf, sizeof(buf), fmt, vid);
+ return buf;
+}
+
+static const char *
+pcp_str(const uint8_t pcp)
+{
+ static char buf[sizeof("255 (bogus)")];
+ snprintf(buf, sizeof(buf), pcp <= 7 ? "%u" : "%u (bogus)", pcp);
+ return buf;
+}
+
+static void
+of10_bitmap_print(netdissect_options *ndo,
+ const struct tok *t, const uint32_t v, const uint32_t u)
+{
+ const char *sep = " (";
+
+ if (v == 0)
+ return;
+ /* assigned bits */
+ for (; t->s != NULL; t++)
+ if (v & t->v) {
+ ND_PRINT((ndo, "%s%s", sep, t->s));
+ sep = ", ";
+ }
+ /* unassigned bits? */
+ ND_PRINT((ndo, v & u ? ") (bogus)" : ")"));
+}
+
+static const u_char *
+of10_data_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ if (len == 0)
+ return cp;
+ /* data */
+ ND_PRINT((ndo, "\n\t data (%u octets)", len));
+ ND_TCHECK2(*cp, len);
+ if (ndo->ndo_vflag >= 2)
+ hex_and_ascii_print(ndo, "\n\t ", cp, len);
+ return cp + len;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+static const u_char *
+of10_bsn_message_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ const u_char *cp0 = cp;
+ uint32_t subtype;
+
+ if (len < 4)
+ goto corrupt;
+ /* subtype */
+ ND_TCHECK2(*cp, 4);
+ subtype = EXTRACT_32BITS(cp);
+ cp += 4;
+ ND_PRINT((ndo, "\n\t subtype %s", tok2str(bsn_subtype_str, "unknown (0x%08x)", subtype)));
+ switch (subtype) {
+ case BSN_GET_IP_MASK_REQUEST:
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +---------------+---------------+---------------+---------------+
+ * | subtype |
+ * +---------------+---------------+---------------+---------------+
+ * | index | pad |
+ * +---------------+---------------+---------------+---------------+
+ * | pad |
+ * +---------------+---------------+---------------+---------------+
+ *
+ */
+ if (len != 12)
+ goto corrupt;
+ /* index */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", index %u", *cp));
+ cp += 1;
+ /* pad */
+ ND_TCHECK2(*cp, 7);
+ cp += 7;
+ break;
+ case BSN_SET_IP_MASK:
+ case BSN_GET_IP_MASK_REPLY:
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +---------------+---------------+---------------+---------------+
+ * | subtype |
+ * +---------------+---------------+---------------+---------------+
+ * | index | pad |
+ * +---------------+---------------+---------------+---------------+
+ * | mask |
+ * +---------------+---------------+---------------+---------------+
+ *
+ */
+ if (len != 12)
+ goto corrupt;
+ /* index */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", index %u", *cp));
+ cp += 1;
+ /* pad */
+ ND_TCHECK2(*cp, 3);
+ cp += 3;
+ /* mask */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", mask %s", ipaddr_string(ndo, cp)));
+ cp += 4;
+ break;
+ case BSN_SET_MIRRORING:
+ case BSN_GET_MIRRORING_REQUEST:
+ case BSN_GET_MIRRORING_REPLY:
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +---------------+---------------+---------------+---------------+
+ * | subtype |
+ * +---------------+---------------+---------------+---------------+
+ * | report m. p. | pad |
+ * +---------------+---------------+---------------+---------------+
+ *
+ */
+ if (len != 8)
+ goto corrupt;
+ /* report_mirror_ports */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", report_mirror_ports %s", tok2str(bsn_onoff_str, "bogus (%u)", *cp)));
+ cp += 1;
+ /* pad */
+ ND_TCHECK2(*cp, 3);
+ cp += 3;
+ break;
+ case BSN_GET_INTERFACES_REQUEST:
+ case BSN_GET_L2_TABLE_REQUEST:
+ case BSN_BW_ENABLE_GET_REQUEST:
+ case BSN_BW_CLEAR_DATA_REQUEST:
+ case BSN_HYBRID_GET_REQUEST:
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +---------------+---------------+---------------+---------------+
+ * | subtype |
+ * +---------------+---------------+---------------+---------------+
+ *
+ */
+ if (len != 4)
+ goto corrupt;
+ break;
+ case BSN_VIRTUAL_PORT_REMOVE_REQUEST:
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +---------------+---------------+---------------+---------------+
+ * | subtype |
+ * +---------------+---------------+---------------+---------------+
+ * | vport_no |
+ * +---------------+---------------+---------------+---------------+
+ *
+ */
+ if (len != 8)
+ goto corrupt;
+ /* vport_no */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", vport_no %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ break;
+ case BSN_SHELL_COMMAND:
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +---------------+---------------+---------------+---------------+
+ * | subtype |
+ * +---------------+---------------+---------------+---------------+
+ * | service |
+ * +---------------+---------------+---------------+---------------+
+ * | data ...
+ * +---------------+---------------+--------
+ *
+ */
+ if (len < 8)
+ goto corrupt;
+ /* service */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", service %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* data */
+ ND_PRINT((ndo, ", data '"));
+ if (fn_printn(ndo, cp, len - 8, ep)) {
+ ND_PRINT((ndo, "'"));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "'"));
+ cp += len - 8;
+ break;
+ case BSN_SHELL_OUTPUT:
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +---------------+---------------+---------------+---------------+
+ * | subtype |
+ * +---------------+---------------+---------------+---------------+
+ * | data ...
+ * +---------------+---------------+--------
+ *
+ */
+ /* already checked that len >= 4 */
+ /* data */
+ ND_PRINT((ndo, ", data '"));
+ if (fn_printn(ndo, cp, len - 4, ep)) {
+ ND_PRINT((ndo, "'"));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "'"));
+ cp += len - 4;
+ break;
+ case BSN_SHELL_STATUS:
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +---------------+---------------+---------------+---------------+
+ * | subtype |
+ * +---------------+---------------+---------------+---------------+
+ * | status |
+ * +---------------+---------------+---------------+---------------+
+ *
+ */
+ if (len != 8)
+ goto corrupt;
+ /* status */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", status 0x%08x", EXTRACT_32BITS(cp)));
+ cp += 4;
+ break;
+ default:
+ ND_TCHECK2(*cp, len - 4);
+ cp += len - 4;
+ }
+ return cp;
+
+corrupt: /* skip the undersized data */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp0, len);
+ return cp0 + len;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+static const u_char *
+of10_bsn_actions_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ const u_char *cp0 = cp;
+ uint32_t subtype, vlan_tag;
+
+ if (len < 4)
+ goto corrupt;
+ /* subtype */
+ ND_TCHECK2(*cp, 4);
+ subtype = EXTRACT_32BITS(cp);
+ cp += 4;
+ ND_PRINT((ndo, "\n\t subtype %s", tok2str(bsn_action_subtype_str, "unknown (0x%08x)", subtype)));
+ switch (subtype) {
+ case BSN_ACTION_MIRROR:
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +---------------+---------------+---------------+---------------+
+ * | subtype |
+ * +---------------+---------------+---------------+---------------+
+ * | dest_port |
+ * +---------------+---------------+---------------+---------------+
+ * | vlan_tag |
+ * +---------------+---------------+---------------+---------------+
+ * | copy_stage | pad |
+ * +---------------+---------------+---------------+---------------+
+ *
+ */
+ if (len != 16)
+ goto corrupt;
+ /* dest_port */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", dest_port %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* vlan_tag */
+ ND_TCHECK2(*cp, 4);
+ vlan_tag = EXTRACT_32BITS(cp);
+ cp += 4;
+ switch (vlan_tag >> 16) {
+ case 0:
+ ND_PRINT((ndo, ", vlan_tag none"));
+ break;
+ case ETHERTYPE_8021Q:
+ ND_PRINT((ndo, ", vlan_tag 802.1Q (%s)", ieee8021q_tci_string(vlan_tag & 0xffff)));
+ break;
+ default:
+ ND_PRINT((ndo, ", vlan_tag unknown (0x%04x)", vlan_tag >> 16));
+ }
+ /* copy_stage */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", copy_stage %s", tok2str(bsn_mirror_copy_stage_str, "unknown (%u)", *cp)));
+ cp += 1;
+ /* pad */
+ ND_TCHECK2(*cp, 3);
+ cp += 3;
+ break;
+ default:
+ ND_TCHECK2(*cp, len - 4);
+ cp += len - 4;
+ }
+
+ return cp;
+
+corrupt:
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp0, len);
+ return cp0 + len;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+static const u_char *
+of10_vendor_action_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ uint32_t vendor;
+ const u_char *(*decoder)(netdissect_options *, const u_char *, const u_char *, const u_int);
+
+ if (len < 4)
+ goto corrupt;
+ /* vendor */
+ ND_TCHECK2(*cp, 4);
+ vendor = EXTRACT_32BITS(cp);
+ cp += 4;
+ ND_PRINT((ndo, ", vendor 0x%08x (%s)", vendor, of_vendor_name(vendor)));
+ /* data */
+ decoder =
+ vendor == OUI_BSN ? of10_bsn_actions_print :
+ of10_data_print;
+ return decoder(ndo, cp, ep, len - 4);
+
+corrupt: /* skip the undersized data */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, len);
+ return cp + len;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+static const u_char *
+of10_vendor_message_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ uint32_t vendor;
+ const u_char *(*decoder)(netdissect_options *, const u_char *, const u_char *, u_int);
+
+ if (len < 4)
+ goto corrupt;
+ /* vendor */
+ ND_TCHECK2(*cp, 4);
+ vendor = EXTRACT_32BITS(cp);
+ cp += 4;
+ ND_PRINT((ndo, ", vendor 0x%08x (%s)", vendor, of_vendor_name(vendor)));
+ /* data */
+ decoder =
+ vendor == OUI_BSN ? of10_bsn_message_print :
+ of10_data_print;
+ return decoder(ndo, cp, ep, len - 4);
+
+corrupt: /* skip the undersized data */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, len);
+ return cp + len;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* Vendor ID is mandatory, data is optional. */
+static const u_char *
+of10_vendor_data_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ uint32_t vendor;
+
+ if (len < 4)
+ goto corrupt;
+ /* vendor */
+ ND_TCHECK2(*cp, 4);
+ vendor = EXTRACT_32BITS(cp);
+ cp += 4;
+ ND_PRINT((ndo, ", vendor 0x%08x (%s)", vendor, of_vendor_name(vendor)));
+ /* data */
+ return of10_data_print(ndo, cp, ep, len - 4);
+
+corrupt: /* skip the undersized data */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, len);
+ return cp + len;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+static const u_char *
+of10_packet_data_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ if (len == 0)
+ return cp;
+ /* data */
+ ND_PRINT((ndo, "\n\t data (%u octets)", len));
+ if (ndo->ndo_vflag < 3)
+ return cp + len;
+ ND_TCHECK2(*cp, len);
+ ndo->ndo_vflag -= 3;
+ ND_PRINT((ndo, ", frame decoding below\n"));
+ ether_print(ndo, cp, len, ndo->ndo_snapend - cp, NULL, NULL);
+ ndo->ndo_vflag += 3;
+ return cp + len;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* [OF10] Section 5.2.1 */
+static const u_char *
+of10_phy_ports_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, u_int len)
+{
+ const u_char *cp0 = cp;
+ const u_int len0 = len;
+
+ while (len) {
+ if (len < OF_PHY_PORT_LEN)
+ goto corrupt;
+ /* port_no */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* hw_addr */
+ ND_TCHECK2(*cp, ETHER_ADDR_LEN);
+ ND_PRINT((ndo, ", hw_addr %s", etheraddr_string(ndo, cp)));
+ cp += ETHER_ADDR_LEN;
+ /* name */
+ ND_TCHECK2(*cp, OFP_MAX_PORT_NAME_LEN);
+ ND_PRINT((ndo, ", name '"));
+ fn_print(ndo, cp, cp + OFP_MAX_PORT_NAME_LEN);
+ ND_PRINT((ndo, "'"));
+ cp += OFP_MAX_PORT_NAME_LEN;
+
+ if (ndo->ndo_vflag < 2) {
+ ND_TCHECK2(*cp, 24);
+ cp += 24;
+ goto next_port;
+ }
+ /* config */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t config 0x%08x", EXTRACT_32BITS(cp)));
+ of10_bitmap_print(ndo, ofppc_bm, EXTRACT_32BITS(cp), OFPPC_U);
+ cp += 4;
+ /* state */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t state 0x%08x", EXTRACT_32BITS(cp)));
+ of10_bitmap_print(ndo, ofpps_bm, EXTRACT_32BITS(cp), OFPPS_U);
+ cp += 4;
+ /* curr */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t curr 0x%08x", EXTRACT_32BITS(cp)));
+ of10_bitmap_print(ndo, ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U);
+ cp += 4;
+ /* advertised */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t advertised 0x%08x", EXTRACT_32BITS(cp)));
+ of10_bitmap_print(ndo, ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U);
+ cp += 4;
+ /* supported */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t supported 0x%08x", EXTRACT_32BITS(cp)));
+ of10_bitmap_print(ndo, ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U);
+ cp += 4;
+ /* peer */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t peer 0x%08x", EXTRACT_32BITS(cp)));
+ of10_bitmap_print(ndo, ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U);
+ cp += 4;
+next_port:
+ len -= OF_PHY_PORT_LEN;
+ } /* while */
+ return cp;
+
+corrupt: /* skip the undersized trailing data */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp0, len0);
+ return cp0 + len0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* [OF10] Section 5.2.2 */
+static const u_char *
+of10_queue_props_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, u_int len)
+{
+ const u_char *cp0 = cp;
+ const u_int len0 = len;
+ uint16_t property, plen, rate;
+
+ while (len) {
+ u_char plen_bogus = 0, skip = 0;
+
+ if (len < OF_QUEUE_PROP_HEADER_LEN)
+ goto corrupt;
+ /* property */
+ ND_TCHECK2(*cp, 2);
+ property = EXTRACT_16BITS(cp);
+ cp += 2;
+ ND_PRINT((ndo, "\n\t property %s", tok2str(ofpqt_str, "invalid (0x%04x)", property)));
+ /* len */
+ ND_TCHECK2(*cp, 2);
+ plen = EXTRACT_16BITS(cp);
+ cp += 2;
+ ND_PRINT((ndo, ", len %u", plen));
+ if (plen < OF_QUEUE_PROP_HEADER_LEN || plen > len)
+ goto corrupt;
+ /* pad */
+ ND_TCHECK2(*cp, 4);
+ cp += 4;
+ /* property-specific constraints and decoding */
+ switch (property) {
+ case OFPQT_NONE:
+ plen_bogus = plen != OF_QUEUE_PROP_HEADER_LEN;
+ break;
+ case OFPQT_MIN_RATE:
+ plen_bogus = plen != OF_QUEUE_PROP_MIN_RATE_LEN;
+ break;
+ default:
+ skip = 1;
+ }
+ if (plen_bogus) {
+ ND_PRINT((ndo, " (bogus)"));
+ skip = 1;
+ }
+ if (skip) {
+ ND_TCHECK2(*cp, plen - 4);
+ cp += plen - 4;
+ goto next_property;
+ }
+ if (property == OFPQT_MIN_RATE) { /* the only case of property decoding */
+ /* rate */
+ ND_TCHECK2(*cp, 2);
+ rate = EXTRACT_16BITS(cp);
+ cp += 2;
+ if (rate > 1000)
+ ND_PRINT((ndo, ", rate disabled"));
+ else
+ ND_PRINT((ndo, ", rate %u.%u%%", rate / 10, rate % 10));
+ /* pad */
+ ND_TCHECK2(*cp, 6);
+ cp += 6;
+ }
+next_property:
+ len -= plen;
+ } /* while */
+ return cp;
+
+corrupt: /* skip the rest of queue properties */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp0, len0);
+ return cp0 + len0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* ibid */
+static const u_char *
+of10_queues_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, u_int len)
+{
+ const u_char *cp0 = cp;
+ const u_int len0 = len;
+ uint16_t desclen;
+
+ while (len) {
+ if (len < OF_PACKET_QUEUE_LEN)
+ goto corrupt;
+ /* queue_id */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t queue_id %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* len */
+ ND_TCHECK2(*cp, 2);
+ desclen = EXTRACT_16BITS(cp);
+ cp += 2;
+ ND_PRINT((ndo, ", len %u", desclen));
+ if (desclen < OF_PACKET_QUEUE_LEN || desclen > len)
+ goto corrupt;
+ /* pad */
+ ND_TCHECK2(*cp, 2);
+ cp += 2;
+ /* properties */
+ if (ndo->ndo_vflag < 2) {
+ ND_TCHECK2(*cp, desclen - OF_PACKET_QUEUE_LEN);
+ cp += desclen - OF_PACKET_QUEUE_LEN;
+ goto next_queue;
+ }
+ if (ep == (cp = of10_queue_props_print(ndo, cp, ep, desclen - OF_PACKET_QUEUE_LEN)))
+ return ep; /* end of snapshot */
+next_queue:
+ len -= desclen;
+ } /* while */
+ return cp;
+
+corrupt: /* skip the rest of queues */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp0, len0);
+ return cp0 + len0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* [OF10] Section 5.2.3 */
+static const u_char *
+of10_match_print(netdissect_options *ndo,
+ const char *pfx, const u_char *cp, const u_char *ep)
+{
+ uint32_t wildcards;
+ uint16_t dl_type;
+ uint8_t nw_proto;
+ u_char nw_bits;
+ const char *field_name;
+
+ /* wildcards */
+ ND_TCHECK2(*cp, 4);
+ wildcards = EXTRACT_32BITS(cp);
+ if (wildcards & OFPFW_U)
+ ND_PRINT((ndo, "%swildcards 0x%08x (bogus)", pfx, wildcards));
+ cp += 4;
+ /* in_port */
+ ND_TCHECK2(*cp, 2);
+ if (! (wildcards & OFPFW_IN_PORT))
+ ND_PRINT((ndo, "%smatch in_port %s", pfx, tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* dl_src */
+ ND_TCHECK2(*cp, ETHER_ADDR_LEN);
+ if (! (wildcards & OFPFW_DL_SRC))
+ ND_PRINT((ndo, "%smatch dl_src %s", pfx, etheraddr_string(ndo, cp)));
+ cp += ETHER_ADDR_LEN;
+ /* dl_dst */
+ ND_TCHECK2(*cp, ETHER_ADDR_LEN);
+ if (! (wildcards & OFPFW_DL_DST))
+ ND_PRINT((ndo, "%smatch dl_dst %s", pfx, etheraddr_string(ndo, cp)));
+ cp += ETHER_ADDR_LEN;
+ /* dl_vlan */
+ ND_TCHECK2(*cp, 2);
+ if (! (wildcards & OFPFW_DL_VLAN))
+ ND_PRINT((ndo, "%smatch dl_vlan %s", pfx, vlan_str(EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* dl_vlan_pcp */
+ ND_TCHECK2(*cp, 1);
+ if (! (wildcards & OFPFW_DL_VLAN_PCP))
+ ND_PRINT((ndo, "%smatch dl_vlan_pcp %s", pfx, pcp_str(*cp)));
+ cp += 1;
+ /* pad1 */
+ ND_TCHECK2(*cp, 1);
+ cp += 1;
+ /* dl_type */
+ ND_TCHECK2(*cp, 2);
+ dl_type = EXTRACT_16BITS(cp);
+ cp += 2;
+ if (! (wildcards & OFPFW_DL_TYPE))
+ ND_PRINT((ndo, "%smatch dl_type 0x%04x", pfx, dl_type));
+ /* nw_tos */
+ ND_TCHECK2(*cp, 1);
+ if (! (wildcards & OFPFW_NW_TOS))
+ ND_PRINT((ndo, "%smatch nw_tos 0x%02x", pfx, *cp));
+ cp += 1;
+ /* nw_proto */
+ ND_TCHECK2(*cp, 1);
+ nw_proto = *cp;
+ cp += 1;
+ if (! (wildcards & OFPFW_NW_PROTO)) {
+ field_name = ! (wildcards & OFPFW_DL_TYPE) && dl_type == ETHERTYPE_ARP
+ ? "arp_opcode" : "nw_proto";
+ ND_PRINT((ndo, "%smatch %s %u", pfx, field_name, nw_proto));
+ }
+ /* pad2 */
+ ND_TCHECK2(*cp, 2);
+ cp += 2;
+ /* nw_src */
+ ND_TCHECK2(*cp, 4);
+ nw_bits = (wildcards & OFPFW_NW_SRC_MASK) >> OFPFW_NW_SRC_SHIFT;
+ if (nw_bits < 32)
+ ND_PRINT((ndo, "%smatch nw_src %s/%u", pfx, ipaddr_string(ndo, cp), 32 - nw_bits));
+ cp += 4;
+ /* nw_dst */
+ ND_TCHECK2(*cp, 4);
+ nw_bits = (wildcards & OFPFW_NW_DST_MASK) >> OFPFW_NW_DST_SHIFT;
+ if (nw_bits < 32)
+ ND_PRINT((ndo, "%smatch nw_dst %s/%u", pfx, ipaddr_string(ndo, cp), 32 - nw_bits));
+ cp += 4;
+ /* tp_src */
+ ND_TCHECK2(*cp, 2);
+ if (! (wildcards & OFPFW_TP_SRC)) {
+ field_name = ! (wildcards & OFPFW_DL_TYPE) && dl_type == ETHERTYPE_IP
+ && ! (wildcards & OFPFW_NW_PROTO) && nw_proto == IPPROTO_ICMP
+ ? "icmp_type" : "tp_src";
+ ND_PRINT((ndo, "%smatch %s %u", pfx, field_name, EXTRACT_16BITS(cp)));
+ }
+ cp += 2;
+ /* tp_dst */
+ ND_TCHECK2(*cp, 2);
+ if (! (wildcards & OFPFW_TP_DST)) {
+ field_name = ! (wildcards & OFPFW_DL_TYPE) && dl_type == ETHERTYPE_IP
+ && ! (wildcards & OFPFW_NW_PROTO) && nw_proto == IPPROTO_ICMP
+ ? "icmp_code" : "tp_dst";
+ ND_PRINT((ndo, "%smatch %s %u", pfx, field_name, EXTRACT_16BITS(cp)));
+ }
+ return cp + 2;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* [OF10] Section 5.2.4 */
+static const u_char *
+of10_actions_print(netdissect_options *ndo,
+ const char *pfx, const u_char *cp, const u_char *ep,
+ u_int len)
+{
+ const u_char *cp0 = cp;
+ const u_int len0 = len;
+ uint16_t type, alen, output_port;
+
+ while (len) {
+ u_char alen_bogus = 0, skip = 0;
+
+ if (len < OF_ACTION_HEADER_LEN)
+ goto corrupt;
+ /* type */
+ ND_TCHECK2(*cp, 2);
+ type = EXTRACT_16BITS(cp);
+ cp += 2;
+ ND_PRINT((ndo, "%saction type %s", pfx, tok2str(ofpat_str, "invalid (0x%04x)", type)));
+ /* length */
+ ND_TCHECK2(*cp, 2);
+ alen = EXTRACT_16BITS(cp);
+ cp += 2;
+ ND_PRINT((ndo, ", len %u", alen));
+ /* On action size underrun/overrun skip the rest of the action list. */
+ if (alen < OF_ACTION_HEADER_LEN || alen > len)
+ goto corrupt;
+ /* On action size inappropriate for the given type or invalid type just skip
+ * the current action, as the basic length constraint has been met. */
+ switch (type) {
+ case OFPAT_OUTPUT:
+ case OFPAT_SET_VLAN_VID:
+ case OFPAT_SET_VLAN_PCP:
+ case OFPAT_STRIP_VLAN:
+ case OFPAT_SET_NW_SRC:
+ case OFPAT_SET_NW_DST:
+ case OFPAT_SET_NW_TOS:
+ case OFPAT_SET_TP_SRC:
+ case OFPAT_SET_TP_DST:
+ alen_bogus = alen != 8;
+ break;
+ case OFPAT_SET_DL_SRC:
+ case OFPAT_SET_DL_DST:
+ case OFPAT_ENQUEUE:
+ alen_bogus = alen != 16;
+ break;
+ case OFPAT_VENDOR:
+ alen_bogus = alen % 8 != 0; /* already >= 8 so far */
+ break;
+ default:
+ skip = 1;
+ }
+ if (alen_bogus) {
+ ND_PRINT((ndo, " (bogus)"));
+ skip = 1;
+ }
+ if (skip) {
+ ND_TCHECK2(*cp, alen - 4);
+ cp += alen - 4;
+ goto next_action;
+ }
+ /* OK to decode the rest of the action structure */
+ switch (type) {
+ case OFPAT_OUTPUT:
+ /* port */
+ ND_TCHECK2(*cp, 2);
+ output_port = EXTRACT_16BITS(cp);
+ cp += 2;
+ ND_PRINT((ndo, ", port %s", tok2str(ofpp_str, "%u", output_port)));
+ /* max_len */
+ ND_TCHECK2(*cp, 2);
+ if (output_port == OFPP_CONTROLLER)
+ ND_PRINT((ndo, ", max_len %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ break;
+ case OFPAT_SET_VLAN_VID:
+ /* vlan_vid */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", vlan_vid %s", vlan_str(EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* pad */
+ ND_TCHECK2(*cp, 2);
+ cp += 2;
+ break;
+ case OFPAT_SET_VLAN_PCP:
+ /* vlan_pcp */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", vlan_pcp %s", pcp_str(*cp)));
+ cp += 1;
+ /* pad */
+ ND_TCHECK2(*cp, 3);
+ cp += 3;
+ break;
+ case OFPAT_SET_DL_SRC:
+ case OFPAT_SET_DL_DST:
+ /* dl_addr */
+ ND_TCHECK2(*cp, ETHER_ADDR_LEN);
+ ND_PRINT((ndo, ", dl_addr %s", etheraddr_string(ndo, cp)));
+ cp += ETHER_ADDR_LEN;
+ /* pad */
+ ND_TCHECK2(*cp, 6);
+ cp += 6;
+ break;
+ case OFPAT_SET_NW_SRC:
+ case OFPAT_SET_NW_DST:
+ /* nw_addr */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", nw_addr %s", ipaddr_string(ndo, cp)));
+ cp += 4;
+ break;
+ case OFPAT_SET_NW_TOS:
+ /* nw_tos */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", nw_tos 0x%02x", *cp));
+ cp += 1;
+ /* pad */
+ ND_TCHECK2(*cp, 3);
+ cp += 3;
+ break;
+ case OFPAT_SET_TP_SRC:
+ case OFPAT_SET_TP_DST:
+ /* nw_tos */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", tp_port %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* pad */
+ ND_TCHECK2(*cp, 2);
+ cp += 2;
+ break;
+ case OFPAT_ENQUEUE:
+ /* port */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* pad */
+ ND_TCHECK2(*cp, 6);
+ cp += 6;
+ /* queue_id */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", queue_id %s", tok2str(ofpq_str, "%u", EXTRACT_32BITS(cp))));
+ cp += 4;
+ break;
+ case OFPAT_VENDOR:
+ if (ep == (cp = of10_vendor_action_print(ndo, cp, ep, alen - 4)))
+ return ep; /* end of snapshot */
+ break;
+ case OFPAT_STRIP_VLAN:
+ /* pad */
+ ND_TCHECK2(*cp, 4);
+ cp += 4;
+ break;
+ } /* switch */
+next_action:
+ len -= alen;
+ } /* while */
+ return cp;
+
+corrupt: /* skip the rest of actions */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp0, len0);
+ return cp0 + len0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* [OF10] Section 5.3.1 */
+static const u_char *
+of10_features_reply_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ /* datapath_id */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, "\n\t dpid 0x%016" PRIx64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* n_buffers */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", n_buffers %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* n_tables */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", n_tables %u", *cp));
+ cp += 1;
+ /* pad */
+ ND_TCHECK2(*cp, 3);
+ cp += 3;
+ /* capabilities */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t capabilities 0x%08x", EXTRACT_32BITS(cp)));
+ of10_bitmap_print(ndo, ofp_capabilities_bm, EXTRACT_32BITS(cp), OFPCAP_U);
+ cp += 4;
+ /* actions */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t actions 0x%08x", EXTRACT_32BITS(cp)));
+ of10_bitmap_print(ndo, ofpat_bm, EXTRACT_32BITS(cp), OFPAT_U);
+ cp += 4;
+ /* ports */
+ return of10_phy_ports_print(ndo, cp, ep, len - OF_SWITCH_FEATURES_LEN);
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* [OF10] Section 5.3.3 */
+static const u_char *
+of10_flow_mod_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ uint16_t command;
+
+ /* match */
+ if (ep == (cp = of10_match_print(ndo, "\n\t ", cp, ep)))
+ return ep; /* end of snapshot */
+ /* cookie */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, "\n\t cookie 0x%016" PRIx64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* command */
+ ND_TCHECK2(*cp, 2);
+ command = EXTRACT_16BITS(cp);
+ ND_PRINT((ndo, ", command %s", tok2str(ofpfc_str, "invalid (0x%04x)", command)));
+ cp += 2;
+ /* idle_timeout */
+ ND_TCHECK2(*cp, 2);
+ if (EXTRACT_16BITS(cp))
+ ND_PRINT((ndo, ", idle_timeout %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* hard_timeout */
+ ND_TCHECK2(*cp, 2);
+ if (EXTRACT_16BITS(cp))
+ ND_PRINT((ndo, ", hard_timeout %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* priority */
+ ND_TCHECK2(*cp, 2);
+ if (EXTRACT_16BITS(cp))
+ ND_PRINT((ndo, ", priority %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* buffer_id */
+ ND_TCHECK2(*cp, 4);
+ if (command == OFPFC_ADD || command == OFPFC_MODIFY ||
+ command == OFPFC_MODIFY_STRICT)
+ ND_PRINT((ndo, ", buffer_id %s", tok2str(bufferid_str, "0x%08x", EXTRACT_32BITS(cp))));
+ cp += 4;
+ /* out_port */
+ ND_TCHECK2(*cp, 2);
+ if (command == OFPFC_DELETE || command == OFPFC_DELETE_STRICT)
+ ND_PRINT((ndo, ", out_port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* flags */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", flags 0x%04x", EXTRACT_16BITS(cp)));
+ of10_bitmap_print(ndo, ofpff_bm, EXTRACT_16BITS(cp), OFPFF_U);
+ cp += 2;
+ /* actions */
+ return of10_actions_print(ndo, "\n\t ", cp, ep, len - OF_FLOW_MOD_LEN);
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* ibid */
+static const u_char *
+of10_port_mod_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep)
+{
+ /* port_no */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* hw_addr */
+ ND_TCHECK2(*cp, ETHER_ADDR_LEN);
+ ND_PRINT((ndo, ", hw_addr %s", etheraddr_string(ndo, cp)));
+ cp += ETHER_ADDR_LEN;
+ /* config */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t config 0x%08x", EXTRACT_32BITS(cp)));
+ of10_bitmap_print(ndo, ofppc_bm, EXTRACT_32BITS(cp), OFPPC_U);
+ cp += 4;
+ /* mask */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t mask 0x%08x", EXTRACT_32BITS(cp)));
+ of10_bitmap_print(ndo, ofppc_bm, EXTRACT_32BITS(cp), OFPPC_U);
+ cp += 4;
+ /* advertise */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t advertise 0x%08x", EXTRACT_32BITS(cp)));
+ of10_bitmap_print(ndo, ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U);
+ cp += 4;
+ /* pad */
+ ND_TCHECK2(*cp, 4);
+ return cp + 4;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* [OF10] Section 5.3.5 */
+static const u_char *
+of10_stats_request_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, u_int len)
+{
+ const u_char *cp0 = cp;
+ const u_int len0 = len;
+ uint16_t type;
+
+ /* type */
+ ND_TCHECK2(*cp, 2);
+ type = EXTRACT_16BITS(cp);
+ cp += 2;
+ ND_PRINT((ndo, "\n\t type %s", tok2str(ofpst_str, "invalid (0x%04x)", type)));
+ /* flags */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", flags 0x%04x", EXTRACT_16BITS(cp)));
+ if (EXTRACT_16BITS(cp))
+ ND_PRINT((ndo, " (bogus)"));
+ cp += 2;
+ /* type-specific body of one of fixed lengths */
+ len -= OF_STATS_REQUEST_LEN;
+ switch(type) {
+ case OFPST_DESC:
+ case OFPST_TABLE:
+ if (len)
+ goto corrupt;
+ return cp;
+ case OFPST_FLOW:
+ case OFPST_AGGREGATE:
+ if (len != OF_FLOW_STATS_REQUEST_LEN)
+ goto corrupt;
+ /* match */
+ if (ep == (cp = of10_match_print(ndo, "\n\t ", cp, ep)))
+ return ep; /* end of snapshot */
+ /* table_id */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, "\n\t table_id %s", tok2str(tableid_str, "%u", *cp)));
+ cp += 1;
+ /* pad */
+ ND_TCHECK2(*cp, 1);
+ cp += 1;
+ /* out_port */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", out_port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ return cp + 2;
+ case OFPST_PORT:
+ if (len != OF_PORT_STATS_REQUEST_LEN)
+ goto corrupt;
+ /* port_no */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* pad */
+ ND_TCHECK2(*cp, 6);
+ return cp + 6;
+ case OFPST_QUEUE:
+ if (len != OF_QUEUE_STATS_REQUEST_LEN)
+ goto corrupt;
+ /* port_no */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* pad */
+ ND_TCHECK2(*cp, 2);
+ cp += 2;
+ /* queue_id */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", queue_id %s", tok2str(ofpq_str, "%u", EXTRACT_32BITS(cp))));
+ return cp + 4;
+ case OFPST_VENDOR:
+ return of10_vendor_data_print(ndo, cp, ep, len);
+ }
+ return cp;
+
+corrupt: /* skip the message body */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp0, len0);
+ return cp0 + len0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* ibid */
+static const u_char *
+of10_desc_stats_reply_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ if (len != OF_DESC_STATS_LEN)
+ goto corrupt;
+ /* mfr_desc */
+ ND_TCHECK2(*cp, DESC_STR_LEN);
+ ND_PRINT((ndo, "\n\t mfr_desc '"));
+ fn_print(ndo, cp, cp + DESC_STR_LEN);
+ ND_PRINT((ndo, "'"));
+ cp += DESC_STR_LEN;
+ /* hw_desc */
+ ND_TCHECK2(*cp, DESC_STR_LEN);
+ ND_PRINT((ndo, "\n\t hw_desc '"));
+ fn_print(ndo, cp, cp + DESC_STR_LEN);
+ ND_PRINT((ndo, "'"));
+ cp += DESC_STR_LEN;
+ /* sw_desc */
+ ND_TCHECK2(*cp, DESC_STR_LEN);
+ ND_PRINT((ndo, "\n\t sw_desc '"));
+ fn_print(ndo, cp, cp + DESC_STR_LEN);
+ ND_PRINT((ndo, "'"));
+ cp += DESC_STR_LEN;
+ /* serial_num */
+ ND_TCHECK2(*cp, SERIAL_NUM_LEN);
+ ND_PRINT((ndo, "\n\t serial_num '"));
+ fn_print(ndo, cp, cp + SERIAL_NUM_LEN);
+ ND_PRINT((ndo, "'"));
+ cp += SERIAL_NUM_LEN;
+ /* dp_desc */
+ ND_TCHECK2(*cp, DESC_STR_LEN);
+ ND_PRINT((ndo, "\n\t dp_desc '"));
+ fn_print(ndo, cp, cp + DESC_STR_LEN);
+ ND_PRINT((ndo, "'"));
+ return cp + DESC_STR_LEN;
+
+corrupt: /* skip the message body */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, len);
+ return cp + len;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* ibid */
+static const u_char *
+of10_flow_stats_reply_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, u_int len)
+{
+ const u_char *cp0 = cp;
+ const u_int len0 = len;
+ uint16_t entry_len;
+
+ while (len) {
+ if (len < OF_FLOW_STATS_LEN)
+ goto corrupt;
+ /* length */
+ ND_TCHECK2(*cp, 2);
+ entry_len = EXTRACT_16BITS(cp);
+ ND_PRINT((ndo, "\n\t length %u", entry_len));
+ if (entry_len < OF_FLOW_STATS_LEN || entry_len > len)
+ goto corrupt;
+ cp += 2;
+ /* table_id */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", table_id %s", tok2str(tableid_str, "%u", *cp)));
+ cp += 1;
+ /* pad */
+ ND_TCHECK2(*cp, 1);
+ cp += 1;
+ /* match */
+ if (ep == (cp = of10_match_print(ndo, "\n\t ", cp, ep)))
+ return ep; /* end of snapshot */
+ /* duration_sec */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t duration_sec %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* duration_nsec */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", duration_nsec %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* priority */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", priority %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* idle_timeout */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", idle_timeout %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* hard_timeout */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", hard_timeout %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* pad2 */
+ ND_TCHECK2(*cp, 6);
+ cp += 6;
+ /* cookie */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", cookie 0x%016" PRIx64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* packet_count */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", packet_count %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* byte_count */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", byte_count %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* actions */
+ if (ep == (cp = of10_actions_print(ndo, "\n\t ", cp, ep, entry_len - OF_FLOW_STATS_LEN)))
+ return ep; /* end of snapshot */
+
+ len -= entry_len;
+ } /* while */
+ return cp;
+
+corrupt: /* skip the rest of flow statistics entries */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp0, len0);
+ return cp0 + len0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* ibid */
+static const u_char *
+of10_aggregate_stats_reply_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep,
+ const u_int len)
+{
+ if (len != OF_AGGREGATE_STATS_REPLY_LEN)
+ goto corrupt;
+ /* packet_count */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, "\n\t packet_count %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* byte_count */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", byte_count %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* flow_count */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", flow_count %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* pad */
+ ND_TCHECK2(*cp, 4);
+ return cp + 4;
+
+corrupt: /* skip the message body */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, len);
+ return cp + len;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* ibid */
+static const u_char *
+of10_table_stats_reply_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, u_int len)
+{
+ const u_char *cp0 = cp;
+ const u_int len0 = len;
+
+ while (len) {
+ if (len < OF_TABLE_STATS_LEN)
+ goto corrupt;
+ /* table_id */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, "\n\t table_id %s", tok2str(tableid_str, "%u", *cp)));
+ cp += 1;
+ /* pad */
+ ND_TCHECK2(*cp, 3);
+ cp += 3;
+ /* name */
+ ND_TCHECK2(*cp, OFP_MAX_TABLE_NAME_LEN);
+ ND_PRINT((ndo, ", name '"));
+ fn_print(ndo, cp, cp + OFP_MAX_TABLE_NAME_LEN);
+ ND_PRINT((ndo, "'"));
+ cp += OFP_MAX_TABLE_NAME_LEN;
+ /* wildcards */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t wildcards 0x%08x", EXTRACT_32BITS(cp)));
+ of10_bitmap_print(ndo, ofpfw_bm, EXTRACT_32BITS(cp), OFPFW_U);
+ cp += 4;
+ /* max_entries */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t max_entries %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* active_count */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", active_count %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* lookup_count */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", lookup_count %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* matched_count */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", matched_count %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+
+ len -= OF_TABLE_STATS_LEN;
+ } /* while */
+ return cp;
+
+corrupt: /* skip the undersized trailing data */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp0, len0);
+ return cp0 + len0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* ibid */
+static const u_char *
+of10_port_stats_reply_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, u_int len)
+{
+ const u_char *cp0 = cp;
+ const u_int len0 = len;
+
+ while (len) {
+ if (len < OF_PORT_STATS_LEN)
+ goto corrupt;
+ /* port_no */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ cp += 2;
+ if (ndo->ndo_vflag < 2) {
+ ND_TCHECK2(*cp, OF_PORT_STATS_LEN - 2);
+ cp += OF_PORT_STATS_LEN - 2;
+ goto next_port;
+ }
+ /* pad */
+ ND_TCHECK2(*cp, 6);
+ cp += 6;
+ /* rx_packets */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", rx_packets %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* tx_packets */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", tx_packets %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* rx_bytes */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", rx_bytes %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* tx_bytes */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", tx_bytes %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* rx_dropped */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", rx_dropped %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* tx_dropped */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", tx_dropped %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* rx_errors */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", rx_errors %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* tx_errors */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", tx_errors %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* rx_frame_err */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", rx_frame_err %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* rx_over_err */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", rx_over_err %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* rx_crc_err */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", rx_crc_err %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* collisions */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", collisions %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+next_port:
+ len -= OF_PORT_STATS_LEN;
+ } /* while */
+ return cp;
+
+corrupt: /* skip the undersized trailing data */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp0, len0);
+ return cp0 + len0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* ibid */
+static const u_char *
+of10_queue_stats_reply_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, u_int len)
+{
+ const u_char *cp0 = cp;
+ const u_int len0 = len;
+
+ while (len) {
+ if (len < OF_QUEUE_STATS_LEN)
+ goto corrupt;
+ /* port_no */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* pad */
+ ND_TCHECK2(*cp, 2);
+ cp += 2;
+ /* queue_id */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", queue_id %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* tx_bytes */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", tx_bytes %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* tx_packets */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", tx_packets %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* tx_errors */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", tx_errors %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+
+ len -= OF_QUEUE_STATS_LEN;
+ } /* while */
+ return cp;
+
+corrupt: /* skip the undersized trailing data */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp0, len0);
+ return cp0 + len0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* ibid */
+static const u_char *
+of10_stats_reply_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ const u_char *cp0 = cp;
+ uint16_t type;
+
+ /* type */
+ ND_TCHECK2(*cp, 2);
+ type = EXTRACT_16BITS(cp);
+ ND_PRINT((ndo, "\n\t type %s", tok2str(ofpst_str, "invalid (0x%04x)", type)));
+ cp += 2;
+ /* flags */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", flags 0x%04x", EXTRACT_16BITS(cp)));
+ of10_bitmap_print(ndo, ofpsf_reply_bm, EXTRACT_16BITS(cp), OFPSF_REPLY_U);
+ cp += 2;
+
+ if (ndo->ndo_vflag > 0) {
+ const u_char *(*decoder)(netdissect_options *, const u_char *, const u_char *, u_int) =
+ type == OFPST_DESC ? of10_desc_stats_reply_print :
+ type == OFPST_FLOW ? of10_flow_stats_reply_print :
+ type == OFPST_AGGREGATE ? of10_aggregate_stats_reply_print :
+ type == OFPST_TABLE ? of10_table_stats_reply_print :
+ type == OFPST_PORT ? of10_port_stats_reply_print :
+ type == OFPST_QUEUE ? of10_queue_stats_reply_print :
+ type == OFPST_VENDOR ? of10_vendor_data_print :
+ NULL;
+ if (decoder != NULL)
+ return decoder(ndo, cp, ep, len - OF_STATS_REPLY_LEN);
+ }
+ ND_TCHECK2(*cp0, len);
+ return cp0 + len;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* [OF10] Section 5.3.6 */
+static const u_char *
+of10_packet_out_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ const u_char *cp0 = cp;
+ const u_int len0 = len;
+ uint16_t actions_len;
+
+ /* buffer_id */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t buffer_id 0x%08x", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* in_port */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", in_port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* actions_len */
+ ND_TCHECK2(*cp, 2);
+ actions_len = EXTRACT_16BITS(cp);
+ cp += 2;
+ if (actions_len > len - OF_PACKET_OUT_LEN)
+ goto corrupt;
+ /* actions */
+ if (ep == (cp = of10_actions_print(ndo, "\n\t ", cp, ep, actions_len)))
+ return ep; /* end of snapshot */
+ /* data */
+ return of10_packet_data_print(ndo, cp, ep, len - OF_PACKET_OUT_LEN - actions_len);
+
+corrupt: /* skip the rest of the message body */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp0, len0);
+ return cp0 + len0;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* [OF10] Section 5.4.1 */
+static const u_char *
+of10_packet_in_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ /* buffer_id */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, "\n\t buffer_id %s", tok2str(bufferid_str, "0x%08x", EXTRACT_32BITS(cp))));
+ cp += 4;
+ /* total_len */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", total_len %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* in_port */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", in_port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* reason */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", reason %s", tok2str(ofpr_str, "invalid (0x%02x)", *cp)));
+ cp += 1;
+ /* pad */
+ ND_TCHECK2(*cp, 1);
+ cp += 1;
+ /* data */
+ /* 2 mock octets count in OF_PACKET_IN_LEN but not in len */
+ return of10_packet_data_print(ndo, cp, ep, len - (OF_PACKET_IN_LEN - 2));
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* [OF10] Section 5.4.2 */
+static const u_char *
+of10_flow_removed_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep)
+{
+ /* match */
+ if (ep == (cp = of10_match_print(ndo, "\n\t ", cp, ep)))
+ return ep; /* end of snapshot */
+ /* cookie */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, "\n\t cookie 0x%016" PRIx64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* priority */
+ ND_TCHECK2(*cp, 2);
+ if (EXTRACT_16BITS(cp))
+ ND_PRINT((ndo, ", priority %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* reason */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, ", reason %s", tok2str(ofprr_str, "unknown (0x%02x)", *cp)));
+ cp += 1;
+ /* pad */
+ ND_TCHECK2(*cp, 1);
+ cp += 1;
+ /* duration_sec */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", duration_sec %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* duration_nsec */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", duration_nsec %u", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* idle_timeout */
+ ND_TCHECK2(*cp, 2);
+ if (EXTRACT_16BITS(cp))
+ ND_PRINT((ndo, ", idle_timeout %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* pad2 */
+ ND_TCHECK2(*cp, 2);
+ cp += 2;
+ /* packet_count */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", packet_count %" PRIu64, EXTRACT_64BITS(cp)));
+ cp += 8;
+ /* byte_count */
+ ND_TCHECK2(*cp, 8);
+ ND_PRINT((ndo, ", byte_count %" PRIu64, EXTRACT_64BITS(cp)));
+ return cp + 8;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* [OF10] Section 5.4.4 */
+static const u_char *
+of10_error_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ uint16_t type;
+ const struct tok *code_str;
+
+ /* type */
+ ND_TCHECK2(*cp, 2);
+ type = EXTRACT_16BITS(cp);
+ cp += 2;
+ ND_PRINT((ndo, "\n\t type %s", tok2str(ofpet_str, "invalid (0x%04x)", type)));
+ /* code */
+ ND_TCHECK2(*cp, 2);
+ code_str =
+ type == OFPET_HELLO_FAILED ? ofphfc_str :
+ type == OFPET_BAD_REQUEST ? ofpbrc_str :
+ type == OFPET_BAD_ACTION ? ofpbac_str :
+ type == OFPET_FLOW_MOD_FAILED ? ofpfmfc_str :
+ type == OFPET_PORT_MOD_FAILED ? ofppmfc_str :
+ type == OFPET_QUEUE_OP_FAILED ? ofpqofc_str :
+ empty_str;
+ ND_PRINT((ndo, ", code %s", tok2str(code_str, "invalid (0x%04x)", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* data */
+ return of10_data_print(ndo, cp, ep, len - OF_ERROR_MSG_LEN);
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+const u_char *
+of10_header_body_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const uint8_t type,
+ const uint16_t len, const uint32_t xid)
+{
+ const u_char *cp0 = cp;
+ const u_int len0 = len;
+ /* Thus far message length is not less than the basic header size, but most
+ * message types have additional assorted constraints on the length. Wherever
+ * possible, check that message length meets the constraint, in remaining
+ * cases check that the length is OK to begin decoding and leave any final
+ * verification up to a lower-layer function. When the current message is
+ * corrupt, proceed to the next message. */
+
+ /* [OF10] Section 5.1 */
+ ND_PRINT((ndo, "\n\tversion 1.0, type %s, length %u, xid 0x%08x",
+ tok2str(ofpt_str, "invalid (0x%02x)", type), len, xid));
+ switch (type) {
+ /* OpenFlow header only. */
+ case OFPT_FEATURES_REQUEST: /* [OF10] Section 5.3.1 */
+ case OFPT_GET_CONFIG_REQUEST: /* [OF10] Section 5.3.2 */
+ case OFPT_BARRIER_REQUEST: /* [OF10] Section 5.3.7 */
+ case OFPT_BARRIER_REPLY: /* ibid */
+ if (len != OF_HEADER_LEN)
+ goto corrupt;
+ break;
+
+ /* OpenFlow header and fixed-size message body. */
+ case OFPT_SET_CONFIG: /* [OF10] Section 5.3.2 */
+ case OFPT_GET_CONFIG_REPLY: /* ibid */
+ if (len != OF_SWITCH_CONFIG_LEN)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ /* flags */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, "\n\t flags %s", tok2str(ofp_config_str, "invalid (0x%04x)", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* miss_send_len */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", miss_send_len %u", EXTRACT_16BITS(cp)));
+ return cp + 2;
+ case OFPT_PORT_MOD:
+ if (len != OF_PORT_MOD_LEN)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ return of10_port_mod_print(ndo, cp, ep);
+ case OFPT_QUEUE_GET_CONFIG_REQUEST: /* [OF10] Section 5.3.4 */
+ if (len != OF_QUEUE_GET_CONFIG_REQUEST_LEN)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ /* port */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* pad */
+ ND_TCHECK2(*cp, 2);
+ return cp + 2;
+ case OFPT_FLOW_REMOVED:
+ if (len != OF_FLOW_REMOVED_LEN)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ return of10_flow_removed_print(ndo, cp, ep);
+ case OFPT_PORT_STATUS: /* [OF10] Section 5.4.3 */
+ if (len != OF_PORT_STATUS_LEN)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ /* reason */
+ ND_TCHECK2(*cp, 1);
+ ND_PRINT((ndo, "\n\t reason %s", tok2str(ofppr_str, "invalid (0x%02x)", *cp)));
+ cp += 1;
+ /* pad */
+ ND_TCHECK2(*cp, 7);
+ cp += 7;
+ /* desc */
+ return of10_phy_ports_print(ndo, cp, ep, OF_PHY_PORT_LEN);
+
+ /* OpenFlow header, fixed-size message body and n * fixed-size data units. */
+ case OFPT_FEATURES_REPLY:
+ if (len < OF_SWITCH_FEATURES_LEN)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ return of10_features_reply_print(ndo, cp, ep, len);
+
+ /* OpenFlow header and variable-size data. */
+ case OFPT_HELLO: /* [OF10] Section 5.5.1 */
+ case OFPT_ECHO_REQUEST: /* [OF10] Section 5.5.2 */
+ case OFPT_ECHO_REPLY: /* [OF10] Section 5.5.3 */
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ return of10_data_print(ndo, cp, ep, len - OF_HEADER_LEN);
+
+ /* OpenFlow header, fixed-size message body and variable-size data. */
+ case OFPT_ERROR:
+ if (len < OF_ERROR_MSG_LEN)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ return of10_error_print(ndo, cp, ep, len);
+ case OFPT_VENDOR:
+ /* [OF10] Section 5.5.4 */
+ if (len < OF_VENDOR_HEADER_LEN)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ return of10_vendor_message_print(ndo, cp, ep, len - OF_HEADER_LEN);
+ case OFPT_PACKET_IN:
+ /* 2 mock octets count in OF_PACKET_IN_LEN but not in len */
+ if (len < OF_PACKET_IN_LEN - 2)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ return of10_packet_in_print(ndo, cp, ep, len);
+
+ /* a. OpenFlow header. */
+ /* b. OpenFlow header and one of the fixed-size message bodies. */
+ /* c. OpenFlow header, fixed-size message body and variable-size data. */
+ case OFPT_STATS_REQUEST:
+ if (len < OF_STATS_REQUEST_LEN)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ return of10_stats_request_print(ndo, cp, ep, len);
+
+ /* a. OpenFlow header and fixed-size message body. */
+ /* b. OpenFlow header and n * fixed-size data units. */
+ /* c. OpenFlow header and n * variable-size data units. */
+ /* d. OpenFlow header, fixed-size message body and variable-size data. */
+ case OFPT_STATS_REPLY:
+ if (len < OF_STATS_REPLY_LEN)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ return of10_stats_reply_print(ndo, cp, ep, len);
+
+ /* OpenFlow header and n * variable-size data units and variable-size data. */
+ case OFPT_PACKET_OUT:
+ if (len < OF_PACKET_OUT_LEN)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ return of10_packet_out_print(ndo, cp, ep, len);
+
+ /* OpenFlow header, fixed-size message body and n * variable-size data units. */
+ case OFPT_FLOW_MOD:
+ if (len < OF_FLOW_MOD_LEN)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ return of10_flow_mod_print(ndo, cp, ep, len);
+
+ /* OpenFlow header, fixed-size message body and n * variable-size data units. */
+ case OFPT_QUEUE_GET_CONFIG_REPLY: /* [OF10] Section 5.3.4 */
+ if (len < OF_QUEUE_GET_CONFIG_REPLY_LEN)
+ goto corrupt;
+ if (ndo->ndo_vflag < 1)
+ goto next_message;
+ /* port */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* pad */
+ ND_TCHECK2(*cp, 6);
+ cp += 6;
+ /* queues */
+ return of10_queues_print(ndo, cp, ep, len - OF_QUEUE_GET_CONFIG_REPLY_LEN);
+ } /* switch (type) */
+ goto next_message;
+
+corrupt: /* skip the message body */
+ ND_PRINT((ndo, "%s", cstr));
+next_message:
+ ND_TCHECK2(*cp0, len0 - OF_HEADER_LEN);
+ return cp0 + len0 - OF_HEADER_LEN;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
--- /dev/null
+/*
+ * This module implements printing of the very basic (version-independent)
+ * OpenFlow header and iteration over OpenFlow messages. It is intended for
+ * dispatching of version-specific OpenFlow message decoding.
+ *
+ *
+ * Copyright (c) 2013 The TCPDUMP 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
+ * COPYRIGHT HOLDER 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.
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "openflow.h"
+#include "oui.h"
+
+static const char tstr[] = " [|openflow]";
+static const char cstr[] = " (corrupt)";
+
+#define OF_VER_1_0 0x01
+
+const struct tok onf_exp_str[] = {
+ { ONF_EXP_ONF, "ONF Extensions" },
+ { ONF_EXP_BUTE, "Budapest University of Technology and Economics" },
+ { ONF_EXP_NOVIFLOW, "NoviFlow" },
+ { ONF_EXP_L3, "L3+ Extensions, Vendor Neutral" },
+ { ONF_EXP_L4L7, "L4-L7 Extensions" },
+ { ONF_EXP_WMOB, "Wireless and Mobility Extensions" },
+ { ONF_EXP_FABS, "Forwarding Abstractions Extensions" },
+ { ONF_EXP_OTRANS, "Optical Transport Extensions" },
+ { 0, NULL }
+};
+
+const char *
+of_vendor_name(const uint32_t vendor)
+{
+ const struct tok *table = (vendor & 0xff000000) == 0 ? oui_values : onf_exp_str;
+ return tok2str(table, "unknown", vendor);
+}
+
+static void
+of_header_print(netdissect_options *ndo, const uint8_t version, const uint8_t type,
+ const uint16_t length, const uint32_t xid)
+{
+ ND_PRINT((ndo, "\n\tversion unknown (0x%02x), type 0x%02x, length %u, xid 0x%08x",
+ version, type, length, xid));
+}
+
+/* Print a single OpenFlow message. */
+static const u_char *
+of_header_body_print(netdissect_options *ndo, const u_char *cp, const u_char *ep)
+{
+ uint8_t version, type;
+ uint16_t length;
+ uint32_t xid;
+
+ if (ep < cp + OF_HEADER_LEN)
+ goto corrupt;
+ /* version */
+ ND_TCHECK2(*cp, 1);
+ version = *cp;
+ cp += 1;
+ /* type */
+ ND_TCHECK2(*cp, 1);
+ type = *cp;
+ cp += 1;
+ /* length */
+ ND_TCHECK2(*cp, 2);
+ length = EXTRACT_16BITS(cp);
+ cp += 2;
+ /* xid */
+ ND_TCHECK2(*cp, 4);
+ xid = EXTRACT_32BITS(cp);
+ cp += 4;
+ /* Message length includes the header length and a message always includes
+ * the basic header. A message length underrun fails decoding of the rest of
+ * the current packet. At the same time, try decoding as much of the current
+ * message as possible even when it does not end within the current TCP
+ * segment. */
+ if (length < OF_HEADER_LEN) {
+ of_header_print(ndo, version, type, length, xid);
+ goto corrupt;
+ }
+ /* Decode known protocol versions further without printing the header (the
+ * type decoding is version-specific. */
+ switch (version) {
+ case OF_VER_1_0:
+ return of10_header_body_print(ndo, cp, ep, type, length, xid);
+ default:
+ of_header_print(ndo, version, type, length, xid);
+ ND_TCHECK2(*cp, length - OF_HEADER_LEN);
+ return cp + length - OF_HEADER_LEN; /* done with current message */
+ }
+
+corrupt: /* fail current packet */
+ ND_PRINT((ndo, "%s", cstr));
+ ND_TCHECK2(*cp, ep - cp);
+ return ep;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+/* Print a TCP segment worth of OpenFlow messages presuming the segment begins
+ * on a message boundary. */
+void
+openflow_print(netdissect_options *ndo, const u_char *cp, const u_int len)
+{
+ const u_char *ep = cp + len;
+
+ ND_PRINT((ndo, ": OpenFlow"));
+ while (cp < ep)
+ cp = of_header_body_print(ndo, cp, ep);
+}
--- /dev/null
+/*
+ * Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * OSPF support contributed by Jeffrey Honig (jch@mitchell.cit.cornell.edu)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ospf.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+#include "gmpls.h"
+
+#include "ospf.h"
+
+static const char tstr[] = " [|ospf2]";
+
+static const struct tok ospf_option_values[] = {
+ { OSPF_OPTION_T, "MultiTopology" }, /* draft-ietf-ospf-mt-09 */
+ { OSPF_OPTION_E, "External" },
+ { OSPF_OPTION_MC, "Multicast" },
+ { OSPF_OPTION_NP, "NSSA" },
+ { OSPF_OPTION_L, "LLS" },
+ { OSPF_OPTION_DC, "Demand Circuit" },
+ { OSPF_OPTION_O, "Opaque" },
+ { OSPF_OPTION_DN, "Up/Down" },
+ { 0, NULL }
+};
+
+static const struct tok ospf_authtype_values[] = {
+ { OSPF_AUTH_NONE, "none" },
+ { OSPF_AUTH_SIMPLE, "simple" },
+ { OSPF_AUTH_MD5, "MD5" },
+ { 0, NULL }
+};
+
+static const struct tok ospf_rla_flag_values[] = {
+ { RLA_FLAG_B, "ABR" },
+ { RLA_FLAG_E, "ASBR" },
+ { RLA_FLAG_W1, "Virtual" },
+ { RLA_FLAG_W2, "W2" },
+ { 0, NULL }
+};
+
+static const struct tok type2str[] = {
+ { OSPF_TYPE_UMD, "UMD" },
+ { OSPF_TYPE_HELLO, "Hello" },
+ { OSPF_TYPE_DD, "Database Description" },
+ { OSPF_TYPE_LS_REQ, "LS-Request" },
+ { OSPF_TYPE_LS_UPDATE, "LS-Update" },
+ { OSPF_TYPE_LS_ACK, "LS-Ack" },
+ { 0, NULL }
+};
+
+static const struct tok lsa_values[] = {
+ { LS_TYPE_ROUTER, "Router" },
+ { LS_TYPE_NETWORK, "Network" },
+ { LS_TYPE_SUM_IP, "Summary" },
+ { LS_TYPE_SUM_ABR, "ASBR Summary" },
+ { LS_TYPE_ASE, "External" },
+ { LS_TYPE_GROUP, "Multicast Group" },
+ { LS_TYPE_NSSA, "NSSA" },
+ { LS_TYPE_OPAQUE_LL, "Link Local Opaque" },
+ { LS_TYPE_OPAQUE_AL, "Area Local Opaque" },
+ { LS_TYPE_OPAQUE_DW, "Domain Wide Opaque" },
+ { 0, NULL }
+};
+
+static const struct tok ospf_dd_flag_values[] = {
+ { OSPF_DB_INIT, "Init" },
+ { OSPF_DB_MORE, "More" },
+ { OSPF_DB_MASTER, "Master" },
+ { OSPF_DB_RESYNC, "OOBResync" },
+ { 0, NULL }
+};
+
+static const struct tok lsa_opaque_values[] = {
+ { LS_OPAQUE_TYPE_TE, "Traffic Engineering" },
+ { LS_OPAQUE_TYPE_GRACE, "Graceful restart" },
+ { LS_OPAQUE_TYPE_RI, "Router Information" },
+ { 0, NULL }
+};
+
+static const struct tok lsa_opaque_te_tlv_values[] = {
+ { LS_OPAQUE_TE_TLV_ROUTER, "Router Address" },
+ { LS_OPAQUE_TE_TLV_LINK, "Link" },
+ { 0, NULL }
+};
+
+static const struct tok lsa_opaque_te_link_tlv_subtlv_values[] = {
+ { LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE, "Link Type" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_LINK_ID, "Link ID" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_LOCAL_IP, "Local Interface IP address" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_REMOTE_IP, "Remote Interface IP address" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_TE_METRIC, "Traffic Engineering Metric" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_MAX_BW, "Maximum Bandwidth" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_MAX_RES_BW, "Maximum Reservable Bandwidth" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_UNRES_BW, "Unreserved Bandwidth" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_ADMIN_GROUP, "Administrative Group" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_LINK_LOCAL_REMOTE_ID, "Link Local/Remote Identifier" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_LINK_PROTECTION_TYPE, "Link Protection Type" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_INTF_SW_CAP_DESCR, "Interface Switching Capability" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_SHARED_RISK_GROUP, "Shared Risk Link Group" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_BW_CONSTRAINTS, "Bandwidth Constraints" },
+ { 0, NULL }
+};
+
+static const struct tok lsa_opaque_grace_tlv_values[] = {
+ { LS_OPAQUE_GRACE_TLV_PERIOD, "Grace Period" },
+ { LS_OPAQUE_GRACE_TLV_REASON, "Graceful restart Reason" },
+ { LS_OPAQUE_GRACE_TLV_INT_ADDRESS, "IPv4 interface address" },
+ { 0, NULL }
+};
+
+static const struct tok lsa_opaque_grace_tlv_reason_values[] = {
+ { LS_OPAQUE_GRACE_TLV_REASON_UNKNOWN, "Unknown" },
+ { LS_OPAQUE_GRACE_TLV_REASON_SW_RESTART, "Software Restart" },
+ { LS_OPAQUE_GRACE_TLV_REASON_SW_UPGRADE, "Software Reload/Upgrade" },
+ { LS_OPAQUE_GRACE_TLV_REASON_CP_SWITCH, "Control Processor Switch" },
+ { 0, NULL }
+};
+
+static const struct tok lsa_opaque_te_tlv_link_type_sub_tlv_values[] = {
+ { LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE_PTP, "Point-to-point" },
+ { LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE_MA, "Multi-Access" },
+ { 0, NULL }
+};
+
+static const struct tok lsa_opaque_ri_tlv_values[] = {
+ { LS_OPAQUE_RI_TLV_CAP, "Router Capabilities" },
+ { 0, NULL }
+};
+
+static const struct tok lsa_opaque_ri_tlv_cap_values[] = {
+ { 1, "Reserved" },
+ { 2, "Reserved" },
+ { 4, "Reserved" },
+ { 8, "Reserved" },
+ { 16, "graceful restart capable" },
+ { 32, "graceful restart helper" },
+ { 64, "Stub router support" },
+ { 128, "Traffic engineering" },
+ { 256, "p2p over LAN" },
+ { 512, "path computation server" },
+ { 0, NULL }
+};
+
+static const struct tok ospf_lls_tlv_values[] = {
+ { OSPF_LLS_EO, "Extended Options" },
+ { OSPF_LLS_MD5, "MD5 Authentication" },
+ { 0, NULL }
+};
+
+static const struct tok ospf_lls_eo_options[] = {
+ { OSPF_LLS_EO_LR, "LSDB resync" },
+ { OSPF_LLS_EO_RS, "Restart" },
+ { 0, NULL }
+};
+
+int
+ospf_print_grace_lsa(netdissect_options *ndo,
+ const uint8_t *tptr, u_int ls_length)
+{
+ u_int tlv_type, tlv_length;
+
+
+ while (ls_length > 0) {
+ ND_TCHECK2(*tptr, 4);
+ if (ls_length < 4) {
+ ND_PRINT((ndo, "\n\t Remaining LS length %u < 4", ls_length));
+ return -1;
+ }
+ tlv_type = EXTRACT_16BITS(tptr);
+ tlv_length = EXTRACT_16BITS(tptr+2);
+ tptr+=4;
+ ls_length-=4;
+
+ ND_PRINT((ndo, "\n\t %s TLV (%u), length %u, value: ",
+ tok2str(lsa_opaque_grace_tlv_values,"unknown",tlv_type),
+ tlv_type,
+ tlv_length));
+
+ if (tlv_length > ls_length) {
+ ND_PRINT((ndo, "\n\t Bogus length %u > %u", tlv_length,
+ ls_length));
+ return -1;
+ }
+
+ /* Infinite loop protection. */
+ if (tlv_type == 0 || tlv_length ==0) {
+ return -1;
+ }
+
+ ND_TCHECK2(*tptr, tlv_length);
+ switch(tlv_type) {
+
+ case LS_OPAQUE_GRACE_TLV_PERIOD:
+ if (tlv_length != 4) {
+ ND_PRINT((ndo, "\n\t Bogus length %u != 4", tlv_length));
+ return -1;
+ }
+ ND_PRINT((ndo, "%us", EXTRACT_32BITS(tptr)));
+ break;
+
+ case LS_OPAQUE_GRACE_TLV_REASON:
+ if (tlv_length != 1) {
+ ND_PRINT((ndo, "\n\t Bogus length %u != 1", tlv_length));
+ return -1;
+ }
+ ND_PRINT((ndo, "%s (%u)",
+ tok2str(lsa_opaque_grace_tlv_reason_values, "Unknown", *tptr),
+ *tptr));
+ break;
+
+ case LS_OPAQUE_GRACE_TLV_INT_ADDRESS:
+ if (tlv_length != 4) {
+ ND_PRINT((ndo, "\n\t Bogus length %u != 4", tlv_length));
+ return -1;
+ }
+ ND_PRINT((ndo, "%s", ipaddr_string(ndo, tptr)));
+ break;
+
+ default:
+ if (ndo->ndo_vflag <= 1) {
+ if (!print_unknown_data(ndo, tptr, "\n\t ", tlv_length))
+ return -1;
+ }
+ break;
+
+ }
+ /* in OSPF everything has to be 32-bit aligned, including TLVs */
+ if (tlv_length%4 != 0)
+ tlv_length+=4-(tlv_length%4);
+ ls_length-=tlv_length;
+ tptr+=tlv_length;
+ }
+
+ return 0;
+trunc:
+ return -1;
+}
+
+int
+ospf_print_te_lsa(netdissect_options *ndo,
+ const uint8_t *tptr, u_int ls_length)
+{
+ u_int tlv_type, tlv_length, subtlv_type, subtlv_length;
+ u_int priority_level, te_class, count_srlg;
+ union { /* int to float conversion buffer for several subTLVs */
+ float f;
+ uint32_t i;
+ } bw;
+
+ while (ls_length != 0) {
+ ND_TCHECK2(*tptr, 4);
+ if (ls_length < 4) {
+ ND_PRINT((ndo, "\n\t Remaining LS length %u < 4", ls_length));
+ return -1;
+ }
+ tlv_type = EXTRACT_16BITS(tptr);
+ tlv_length = EXTRACT_16BITS(tptr+2);
+ tptr+=4;
+ ls_length-=4;
+
+ ND_PRINT((ndo, "\n\t %s TLV (%u), length: %u",
+ tok2str(lsa_opaque_te_tlv_values,"unknown",tlv_type),
+ tlv_type,
+ tlv_length));
+
+ if (tlv_length > ls_length) {
+ ND_PRINT((ndo, "\n\t Bogus length %u > %u", tlv_length,
+ ls_length));
+ return -1;
+ }
+
+ /* Infinite loop protection. */
+ if (tlv_type == 0 || tlv_length ==0) {
+ return -1;
+ }
+
+ switch(tlv_type) {
+ case LS_OPAQUE_TE_TLV_LINK:
+ while (tlv_length >= sizeof(subtlv_type) + sizeof(subtlv_length)) {
+ if (tlv_length < 4) {
+ ND_PRINT((ndo, "\n\t Remaining TLV length %u < 4",
+ tlv_length));
+ return -1;
+ }
+ ND_TCHECK2(*tptr, 4);
+ subtlv_type = EXTRACT_16BITS(tptr);
+ subtlv_length = EXTRACT_16BITS(tptr+2);
+ tptr+=4;
+ tlv_length-=4;
+
+ ND_PRINT((ndo, "\n\t %s subTLV (%u), length: %u",
+ tok2str(lsa_opaque_te_link_tlv_subtlv_values,"unknown",subtlv_type),
+ subtlv_type,
+ subtlv_length));
+
+ ND_TCHECK2(*tptr, subtlv_length);
+ switch(subtlv_type) {
+ case LS_OPAQUE_TE_LINK_SUBTLV_ADMIN_GROUP:
+ ND_PRINT((ndo, ", 0x%08x", EXTRACT_32BITS(tptr)));
+ break;
+ case LS_OPAQUE_TE_LINK_SUBTLV_LINK_ID:
+ case LS_OPAQUE_TE_LINK_SUBTLV_LINK_LOCAL_REMOTE_ID:
+ ND_PRINT((ndo, ", %s (0x%08x)",
+ ipaddr_string(ndo, tptr),
+ EXTRACT_32BITS(tptr)));
+ if (subtlv_length == 8) /* rfc4203 */
+ ND_PRINT((ndo, ", %s (0x%08x)",
+ ipaddr_string(ndo, tptr+4),
+ EXTRACT_32BITS(tptr + 4)));
+ break;
+ case LS_OPAQUE_TE_LINK_SUBTLV_LOCAL_IP:
+ case LS_OPAQUE_TE_LINK_SUBTLV_REMOTE_IP:
+ ND_PRINT((ndo, ", %s", ipaddr_string(ndo, tptr)));
+ break;
+ case LS_OPAQUE_TE_LINK_SUBTLV_MAX_BW:
+ case LS_OPAQUE_TE_LINK_SUBTLV_MAX_RES_BW:
+ bw.i = EXTRACT_32BITS(tptr);
+ ND_PRINT((ndo, ", %.3f Mbps", bw.f * 8 / 1000000));
+ break;
+ case LS_OPAQUE_TE_LINK_SUBTLV_UNRES_BW:
+ for (te_class = 0; te_class < 8; te_class++) {
+ bw.i = EXTRACT_32BITS(tptr+te_class*4);
+ ND_PRINT((ndo, "\n\t\tTE-Class %u: %.3f Mbps",
+ te_class,
+ bw.f * 8 / 1000000));
+ }
+ break;
+ case LS_OPAQUE_TE_LINK_SUBTLV_BW_CONSTRAINTS:
+ ND_PRINT((ndo, "\n\t\tBandwidth Constraints Model ID: %s (%u)",
+ tok2str(diffserv_te_bc_values, "unknown", *tptr),
+ *tptr));
+ /* decode BCs until the subTLV ends */
+ for (te_class = 0; te_class < (subtlv_length-4)/4; te_class++) {
+ bw.i = EXTRACT_32BITS(tptr+4+te_class*4);
+ ND_PRINT((ndo, "\n\t\t Bandwidth constraint CT%u: %.3f Mbps",
+ te_class,
+ bw.f * 8 / 1000000));
+ }
+ break;
+ case LS_OPAQUE_TE_LINK_SUBTLV_TE_METRIC:
+ ND_PRINT((ndo, ", Metric %u", EXTRACT_32BITS(tptr)));
+ break;
+ case LS_OPAQUE_TE_LINK_SUBTLV_LINK_PROTECTION_TYPE:
+ ND_PRINT((ndo, ", %s, Priority %u",
+ bittok2str(gmpls_link_prot_values, "none", *tptr),
+ *(tptr + 1)));
+ break;
+ case LS_OPAQUE_TE_LINK_SUBTLV_INTF_SW_CAP_DESCR:
+ ND_PRINT((ndo, "\n\t\tInterface Switching Capability: %s",
+ tok2str(gmpls_switch_cap_values, "Unknown", *(tptr))));
+ ND_PRINT((ndo, "\n\t\tLSP Encoding: %s\n\t\tMax LSP Bandwidth:",
+ tok2str(gmpls_encoding_values, "Unknown", *(tptr + 1))));
+ for (priority_level = 0; priority_level < 8; priority_level++) {
+ bw.i = EXTRACT_32BITS(tptr+4+(priority_level*4));
+ ND_PRINT((ndo, "\n\t\t priority level %d: %.3f Mbps",
+ priority_level,
+ bw.f * 8 / 1000000));
+ }
+ break;
+ case LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE:
+ ND_PRINT((ndo, ", %s (%u)",
+ tok2str(lsa_opaque_te_tlv_link_type_sub_tlv_values,"unknown",*tptr),
+ *tptr));
+ break;
+
+ case LS_OPAQUE_TE_LINK_SUBTLV_SHARED_RISK_GROUP:
+ count_srlg = subtlv_length / 4;
+ if (count_srlg != 0)
+ ND_PRINT((ndo, "\n\t\t Shared risk group: "));
+ while (count_srlg > 0) {
+ bw.i = EXTRACT_32BITS(tptr);
+ ND_PRINT((ndo, "%d", bw.i));
+ tptr+=4;
+ count_srlg--;
+ if (count_srlg > 0)
+ ND_PRINT((ndo, ", "));
+ }
+ break;
+
+ default:
+ if (ndo->ndo_vflag <= 1) {
+ if (!print_unknown_data(ndo, tptr, "\n\t\t", subtlv_length))
+ return -1;
+ }
+ break;
+ }
+ /* in OSPF everything has to be 32-bit aligned, including subTLVs */
+ if (subtlv_length%4 != 0)
+ subtlv_length+=4-(subtlv_length%4);
+
+ tlv_length-=subtlv_length;
+ tptr+=subtlv_length;
+
+ }
+ break;
+
+ case LS_OPAQUE_TE_TLV_ROUTER:
+ if (tlv_length < 4) {
+ ND_PRINT((ndo, "\n\t TLV length %u < 4", tlv_length));
+ return -1;
+ }
+ ND_TCHECK2(*tptr, 4);
+ ND_PRINT((ndo, ", %s", ipaddr_string(ndo, tptr)));
+ break;
+
+ default:
+ if (ndo->ndo_vflag <= 1) {
+ if (!print_unknown_data(ndo, tptr, "\n\t ", tlv_length))
+ return -1;
+ }
+ break;
+ }
+ /* in OSPF everything has to be 32-bit aligned, including TLVs */
+ if (tlv_length%4 != 0)
+ tlv_length+=4-(tlv_length%4);
+ ls_length-=tlv_length;
+ tptr+=tlv_length;
+ }
+ return 0;
+trunc:
+ return -1;
+}
+
+static int
+ospf_print_lshdr(netdissect_options *ndo,
+ register const struct lsa_hdr *lshp)
+{
+ u_int ls_length;
+
+ ND_TCHECK(lshp->ls_length);
+ ls_length = EXTRACT_16BITS(&lshp->ls_length);
+ if (ls_length < sizeof(struct lsa_hdr)) {
+ ND_PRINT((ndo, "\n\t Bogus length %u < header (%lu)", ls_length,
+ (unsigned long)sizeof(struct lsa_hdr)));
+ return(-1);
+ }
+
+ ND_TCHECK(lshp->ls_seq); /* XXX - ls_length check checked this */
+ ND_PRINT((ndo, "\n\t Advertising Router %s, seq 0x%08x, age %us, length %u",
+ ipaddr_string(ndo, &lshp->ls_router),
+ EXTRACT_32BITS(&lshp->ls_seq),
+ EXTRACT_16BITS(&lshp->ls_age),
+ ls_length - (u_int)sizeof(struct lsa_hdr)));
+
+ ND_TCHECK(lshp->ls_type); /* XXX - ls_length check checked this */
+ switch (lshp->ls_type) {
+ /* the LSA header for opaque LSAs was slightly changed */
+ case LS_TYPE_OPAQUE_LL:
+ case LS_TYPE_OPAQUE_AL:
+ case LS_TYPE_OPAQUE_DW:
+ ND_PRINT((ndo, "\n\t %s LSA (%d), Opaque-Type %s LSA (%u), Opaque-ID %u",
+ tok2str(lsa_values,"unknown",lshp->ls_type),
+ lshp->ls_type,
+
+ tok2str(lsa_opaque_values,
+ "unknown",
+ *(&lshp->un_lsa_id.opaque_field.opaque_type)),
+ *(&lshp->un_lsa_id.opaque_field.opaque_type),
+ EXTRACT_24BITS(&lshp->un_lsa_id.opaque_field.opaque_id)
+
+ ));
+ break;
+
+ /* all other LSA types use regular style LSA headers */
+ default:
+ ND_PRINT((ndo, "\n\t %s LSA (%d), LSA-ID: %s",
+ tok2str(lsa_values,"unknown",lshp->ls_type),
+ lshp->ls_type,
+ ipaddr_string(ndo, &lshp->un_lsa_id.lsa_id)));
+ break;
+ }
+
+ ND_TCHECK(lshp->ls_options); /* XXX - ls_length check checked this */
+ ND_PRINT((ndo, "\n\t Options: [%s]", bittok2str(ospf_option_values, "none", lshp->ls_options)));
+
+ return (ls_length);
+trunc:
+ return (-1);
+}
+
+/* draft-ietf-ospf-mt-09 */
+static const struct tok ospf_topology_values[] = {
+ { 0, "default " },
+ { 1, "multicast " },
+ { 2, "management " },
+ { 0, NULL }
+};
+
+/*
+ * Print all the per-topology metrics.
+ */
+static void
+ospf_print_tos_metrics(netdissect_options *ndo,
+ const union un_tos *tos)
+{
+ int metric_count;
+ int toscount;
+
+ toscount = tos->link.link_tos_count+1;
+ metric_count = 0;
+
+ /*
+ * All but the first metric contain a valid topology id.
+ */
+ while (toscount) {
+ ND_PRINT((ndo, "\n\t\ttopology %s(%u), metric %u",
+ tok2str(ospf_topology_values, "",
+ metric_count ? tos->metrics.tos_type : 0),
+ metric_count ? tos->metrics.tos_type : 0,
+ EXTRACT_16BITS(&tos->metrics.tos_metric)));
+ metric_count++;
+ tos++;
+ toscount--;
+ }
+}
+
+/*
+ * Print a single link state advertisement. If truncated or if LSA length
+ * field is less than the length of the LSA header, return NULl, else
+ * return pointer to data past end of LSA.
+ */
+static const uint8_t *
+ospf_print_lsa(netdissect_options *ndo,
+ register const struct lsa *lsap)
+{
+ register const uint8_t *ls_end;
+ register const struct rlalink *rlp;
+ register const struct in_addr *ap;
+ register const struct aslametric *almp;
+ register const struct mcla *mcp;
+ register const uint32_t *lp;
+ register int j, tlv_type, tlv_length, topology;
+ register int ls_length;
+ const uint8_t *tptr;
+
+ tptr = (uint8_t *)lsap->lsa_un.un_unknown; /* squelch compiler warnings */
+ ls_length = ospf_print_lshdr(ndo, &lsap->ls_hdr);
+ if (ls_length == -1)
+ return(NULL);
+ ls_end = (uint8_t *)lsap + ls_length;
+ ls_length -= sizeof(struct lsa_hdr);
+
+ switch (lsap->ls_hdr.ls_type) {
+
+ case LS_TYPE_ROUTER:
+ ND_TCHECK(lsap->lsa_un.un_rla.rla_flags);
+ ND_PRINT((ndo, "\n\t Router LSA Options: [%s]",
+ bittok2str(ospf_rla_flag_values, "none", lsap->lsa_un.un_rla.rla_flags)));
+
+ ND_TCHECK(lsap->lsa_un.un_rla.rla_count);
+ j = EXTRACT_16BITS(&lsap->lsa_un.un_rla.rla_count);
+ ND_TCHECK(lsap->lsa_un.un_rla.rla_link);
+ rlp = lsap->lsa_un.un_rla.rla_link;
+ while (j--) {
+ ND_TCHECK(*rlp);
+ switch (rlp->un_tos.link.link_type) {
+
+ case RLA_TYPE_VIRTUAL:
+ ND_PRINT((ndo, "\n\t Virtual Link: Neighbor Router-ID: %s, Interface Address: %s",
+ ipaddr_string(ndo, &rlp->link_id),
+ ipaddr_string(ndo, &rlp->link_data)));
+ break;
+
+ case RLA_TYPE_ROUTER:
+ ND_PRINT((ndo, "\n\t Neighbor Router-ID: %s, Interface Address: %s",
+ ipaddr_string(ndo, &rlp->link_id),
+ ipaddr_string(ndo, &rlp->link_data)));
+ break;
+
+ case RLA_TYPE_TRANSIT:
+ ND_PRINT((ndo, "\n\t Neighbor Network-ID: %s, Interface Address: %s",
+ ipaddr_string(ndo, &rlp->link_id),
+ ipaddr_string(ndo, &rlp->link_data)));
+ break;
+
+ case RLA_TYPE_STUB:
+ ND_PRINT((ndo, "\n\t Stub Network: %s, Mask: %s",
+ ipaddr_string(ndo, &rlp->link_id),
+ ipaddr_string(ndo, &rlp->link_data)));
+ break;
+
+ default:
+ ND_PRINT((ndo, "\n\t Unknown Router Link Type (%u)",
+ rlp->un_tos.link.link_type));
+ return (ls_end);
+ }
+
+ ospf_print_tos_metrics(ndo, &rlp->un_tos);
+
+ rlp = (struct rlalink *)((u_char *)(rlp + 1) +
+ ((rlp->un_tos.link.link_tos_count) * sizeof(union un_tos)));
+ }
+ break;
+
+ case LS_TYPE_NETWORK:
+ ND_TCHECK(lsap->lsa_un.un_nla.nla_mask);
+ ND_PRINT((ndo, "\n\t Mask %s\n\t Connected Routers:",
+ ipaddr_string(ndo, &lsap->lsa_un.un_nla.nla_mask)));
+ ap = lsap->lsa_un.un_nla.nla_router;
+ while ((u_char *)ap < ls_end) {
+ ND_TCHECK(*ap);
+ ND_PRINT((ndo, "\n\t %s", ipaddr_string(ndo, ap)));
+ ++ap;
+ }
+ break;
+
+ case LS_TYPE_SUM_IP:
+ ND_TCHECK(lsap->lsa_un.un_nla.nla_mask);
+ ND_PRINT((ndo, "\n\t Mask %s",
+ ipaddr_string(ndo, &lsap->lsa_un.un_sla.sla_mask)));
+ ND_TCHECK(lsap->lsa_un.un_sla.sla_tosmetric);
+ lp = lsap->lsa_un.un_sla.sla_tosmetric;
+ while ((u_char *)lp < ls_end) {
+ register uint32_t ul;
+
+ ND_TCHECK(*lp);
+ ul = EXTRACT_32BITS(lp);
+ topology = (ul & SLA_MASK_TOS) >> SLA_SHIFT_TOS;
+ ND_PRINT((ndo, "\n\t\ttopology %s(%u) metric %d",
+ tok2str(ospf_topology_values, "", topology),
+ topology,
+ ul & SLA_MASK_METRIC));
+ ++lp;
+ }
+ break;
+
+ case LS_TYPE_SUM_ABR:
+ ND_TCHECK(lsap->lsa_un.un_sla.sla_tosmetric);
+ lp = lsap->lsa_un.un_sla.sla_tosmetric;
+ while ((u_char *)lp < ls_end) {
+ register uint32_t ul;
+
+ ND_TCHECK(*lp);
+ ul = EXTRACT_32BITS(lp);
+ topology = (ul & SLA_MASK_TOS) >> SLA_SHIFT_TOS;
+ ND_PRINT((ndo, "\n\t\ttopology %s(%u) metric %d",
+ tok2str(ospf_topology_values, "", topology),
+ topology,
+ ul & SLA_MASK_METRIC));
+ ++lp;
+ }
+ break;
+
+ case LS_TYPE_ASE:
+ case LS_TYPE_NSSA: /* fall through - those LSAs share the same format */
+ ND_TCHECK(lsap->lsa_un.un_nla.nla_mask);
+ ND_PRINT((ndo, "\n\t Mask %s",
+ ipaddr_string(ndo, &lsap->lsa_un.un_asla.asla_mask)));
+
+ ND_TCHECK(lsap->lsa_un.un_sla.sla_tosmetric);
+ almp = lsap->lsa_un.un_asla.asla_metric;
+ while ((u_char *)almp < ls_end) {
+ register uint32_t ul;
+
+ ND_TCHECK(almp->asla_tosmetric);
+ ul = EXTRACT_32BITS(&almp->asla_tosmetric);
+ topology = ((ul & ASLA_MASK_TOS) >> ASLA_SHIFT_TOS);
+ ND_PRINT((ndo, "\n\t\ttopology %s(%u), type %d, metric",
+ tok2str(ospf_topology_values, "", topology),
+ topology,
+ (ul & ASLA_FLAG_EXTERNAL) ? 2 : 1));
+ if ((ul & ASLA_MASK_METRIC) == 0xffffff)
+ ND_PRINT((ndo, " infinite"));
+ else
+ ND_PRINT((ndo, " %d", (ul & ASLA_MASK_METRIC)));
+
+ ND_TCHECK(almp->asla_forward);
+ if (almp->asla_forward.s_addr) {
+ ND_PRINT((ndo, ", forward %s", ipaddr_string(ndo, &almp->asla_forward)));
+ }
+ ND_TCHECK(almp->asla_tag);
+ if (almp->asla_tag.s_addr) {
+ ND_PRINT((ndo, ", tag %s", ipaddr_string(ndo, &almp->asla_tag)));
+ }
+ ++almp;
+ }
+ break;
+
+ case LS_TYPE_GROUP:
+ /* Multicast extensions as of 23 July 1991 */
+ mcp = lsap->lsa_un.un_mcla;
+ while ((u_char *)mcp < ls_end) {
+ ND_TCHECK(mcp->mcla_vid);
+ switch (EXTRACT_32BITS(&mcp->mcla_vtype)) {
+
+ case MCLA_VERTEX_ROUTER:
+ ND_PRINT((ndo, "\n\t Router Router-ID %s",
+ ipaddr_string(ndo, &mcp->mcla_vid)));
+ break;
+
+ case MCLA_VERTEX_NETWORK:
+ ND_PRINT((ndo, "\n\t Network Designated Router %s",
+ ipaddr_string(ndo, &mcp->mcla_vid)));
+ break;
+
+ default:
+ ND_PRINT((ndo, "\n\t unknown VertexType (%u)",
+ EXTRACT_32BITS(&mcp->mcla_vtype)));
+ break;
+ }
+ ++mcp;
+ }
+ break;
+
+ case LS_TYPE_OPAQUE_LL: /* fall through */
+ case LS_TYPE_OPAQUE_AL:
+ case LS_TYPE_OPAQUE_DW:
+
+ switch (*(&lsap->ls_hdr.un_lsa_id.opaque_field.opaque_type)) {
+ case LS_OPAQUE_TYPE_RI:
+ tptr = (uint8_t *)(&lsap->lsa_un.un_ri_tlv.type);
+
+ while (ls_length != 0) {
+ ND_TCHECK2(*tptr, 4);
+ if (ls_length < 4) {
+ ND_PRINT((ndo, "\n\t Remaining LS length %u < 4", ls_length));
+ return(ls_end);
+ }
+ tlv_type = EXTRACT_16BITS(tptr);
+ tlv_length = EXTRACT_16BITS(tptr+2);
+ tptr+=4;
+ ls_length-=4;
+
+ ND_PRINT((ndo, "\n\t %s TLV (%u), length: %u, value: ",
+ tok2str(lsa_opaque_ri_tlv_values,"unknown",tlv_type),
+ tlv_type,
+ tlv_length));
+
+ if (tlv_length > ls_length) {
+ ND_PRINT((ndo, "\n\t Bogus length %u > %u", tlv_length,
+ ls_length));
+ return(ls_end);
+ }
+ ND_TCHECK2(*tptr, tlv_length);
+ switch(tlv_type) {
+
+ case LS_OPAQUE_RI_TLV_CAP:
+ if (tlv_length != 4) {
+ ND_PRINT((ndo, "\n\t Bogus length %u != 4", tlv_length));
+ return(ls_end);
+ }
+ ND_PRINT((ndo, "Capabilities: %s",
+ bittok2str(lsa_opaque_ri_tlv_cap_values, "Unknown", EXTRACT_32BITS(tptr))));
+ break;
+ default:
+ if (ndo->ndo_vflag <= 1) {
+ if (!print_unknown_data(ndo, tptr, "\n\t ", tlv_length))
+ return(ls_end);
+ }
+ break;
+
+ }
+ tptr+=tlv_length;
+ ls_length-=tlv_length;
+ }
+ break;
+
+ case LS_OPAQUE_TYPE_GRACE:
+ if (ospf_print_grace_lsa(ndo, (uint8_t *)(&lsap->lsa_un.un_grace_tlv.type),
+ ls_length) == -1) {
+ return(ls_end);
+ }
+ break;
+
+ case LS_OPAQUE_TYPE_TE:
+ if (ospf_print_te_lsa(ndo, (uint8_t *)(&lsap->lsa_un.un_te_lsa_tlv.type),
+ ls_length) == -1) {
+ return(ls_end);
+ }
+ break;
+
+ default:
+ if (ndo->ndo_vflag <= 1) {
+ if (!print_unknown_data(ndo, (uint8_t *)lsap->lsa_un.un_unknown,
+ "\n\t ", ls_length))
+ return(ls_end);
+ }
+ break;
+ }
+ }
+
+ /* do we want to see an additionally hexdump ? */
+ if (ndo->ndo_vflag> 1)
+ if (!print_unknown_data(ndo, (uint8_t *)lsap->lsa_un.un_unknown,
+ "\n\t ", ls_length)) {
+ return(ls_end);
+ }
+
+ return (ls_end);
+trunc:
+ return (NULL);
+}
+
+static int
+ospf_decode_lls(netdissect_options *ndo,
+ register const struct ospfhdr *op, register u_int length)
+{
+ register const u_char *dptr;
+ register const u_char *dataend;
+ register u_int length2;
+ register uint16_t lls_type, lls_len;
+ register uint32_t lls_flags;
+
+ switch (op->ospf_type) {
+
+ case OSPF_TYPE_HELLO:
+ if (!(op->ospf_hello.hello_options & OSPF_OPTION_L))
+ return (0);
+ break;
+
+ case OSPF_TYPE_DD:
+ if (!(op->ospf_db.db_options & OSPF_OPTION_L))
+ return (0);
+ break;
+
+ default:
+ return (0);
+ }
+
+ /* dig deeper if LLS data is available; see RFC4813 */
+ length2 = EXTRACT_16BITS(&op->ospf_len);
+ dptr = (u_char *)op + length2;
+ dataend = (u_char *)op + length;
+
+ if (EXTRACT_16BITS(&op->ospf_authtype) == OSPF_AUTH_MD5) {
+ dptr = dptr + op->ospf_authdata[3];
+ length2 += op->ospf_authdata[3];
+ }
+ if (length2 >= length) {
+ ND_PRINT((ndo, "\n\t[LLS truncated]"));
+ return (1);
+ }
+ ND_TCHECK2(*dptr, 2);
+ ND_PRINT((ndo, "\n\t LLS: checksum: 0x%04x", (u_int)EXTRACT_16BITS(dptr)));
+
+ dptr += 2;
+ ND_TCHECK2(*dptr, 2);
+ length2 = EXTRACT_16BITS(dptr);
+ ND_PRINT((ndo, ", length: %u", length2));
+
+ dptr += 2;
+ ND_TCHECK(*dptr);
+ while (dptr < dataend) {
+ ND_TCHECK2(*dptr, 2);
+ lls_type = EXTRACT_16BITS(dptr);
+ ND_PRINT((ndo, "\n\t %s (%u)",
+ tok2str(ospf_lls_tlv_values,"Unknown TLV",lls_type),
+ lls_type));
+ dptr += 2;
+ ND_TCHECK2(*dptr, 2);
+ lls_len = EXTRACT_16BITS(dptr);
+ ND_PRINT((ndo, ", length: %u", lls_len));
+ dptr += 2;
+ switch (lls_type) {
+
+ case OSPF_LLS_EO:
+ if (lls_len != 4) {
+ ND_PRINT((ndo, " [should be 4]"));
+ lls_len = 4;
+ }
+ ND_TCHECK2(*dptr, 4);
+ lls_flags = EXTRACT_32BITS(dptr);
+ ND_PRINT((ndo, "\n\t Options: 0x%08x [%s]", lls_flags,
+ bittok2str(ospf_lls_eo_options, "?", lls_flags)));
+
+ break;
+
+ case OSPF_LLS_MD5:
+ if (lls_len != 20) {
+ ND_PRINT((ndo, " [should be 20]"));
+ lls_len = 20;
+ }
+ ND_TCHECK2(*dptr, 4);
+ ND_PRINT((ndo, "\n\t Sequence number: 0x%08x", EXTRACT_32BITS(dptr)));
+ break;
+ }
+
+ dptr += lls_len;
+ }
+
+ return (0);
+trunc:
+ return (1);
+}
+
+static int
+ospf_decode_v2(netdissect_options *ndo,
+ register const struct ospfhdr *op, register const u_char *dataend)
+{
+ register const struct in_addr *ap;
+ register const struct lsr *lsrp;
+ register const struct lsa_hdr *lshp;
+ register const struct lsa *lsap;
+ register uint32_t lsa_count,lsa_count_max;
+
+ switch (op->ospf_type) {
+
+ case OSPF_TYPE_UMD:
+ /*
+ * Rob Coltun's special monitoring packets;
+ * do nothing
+ */
+ break;
+
+ case OSPF_TYPE_HELLO:
+ ND_PRINT((ndo, "\n\tOptions [%s]",
+ bittok2str(ospf_option_values,"none",op->ospf_hello.hello_options)));
+
+ ND_TCHECK(op->ospf_hello.hello_deadint);
+ ND_PRINT((ndo, "\n\t Hello Timer %us, Dead Timer %us, Mask %s, Priority %u",
+ EXTRACT_16BITS(&op->ospf_hello.hello_helloint),
+ EXTRACT_32BITS(&op->ospf_hello.hello_deadint),
+ ipaddr_string(ndo, &op->ospf_hello.hello_mask),
+ op->ospf_hello.hello_priority));
+
+ ND_TCHECK(op->ospf_hello.hello_dr);
+ if (op->ospf_hello.hello_dr.s_addr != 0)
+ ND_PRINT((ndo, "\n\t Designated Router %s",
+ ipaddr_string(ndo, &op->ospf_hello.hello_dr)));
+
+ ND_TCHECK(op->ospf_hello.hello_bdr);
+ if (op->ospf_hello.hello_bdr.s_addr != 0)
+ ND_PRINT((ndo, ", Backup Designated Router %s",
+ ipaddr_string(ndo, &op->ospf_hello.hello_bdr)));
+
+ ap = op->ospf_hello.hello_neighbor;
+ if ((u_char *)ap < dataend)
+ ND_PRINT((ndo, "\n\t Neighbor List:"));
+ while ((u_char *)ap < dataend) {
+ ND_TCHECK(*ap);
+ ND_PRINT((ndo, "\n\t %s", ipaddr_string(ndo, ap)));
+ ++ap;
+ }
+ break; /* HELLO */
+
+ case OSPF_TYPE_DD:
+ ND_TCHECK(op->ospf_db.db_options);
+ ND_PRINT((ndo, "\n\tOptions [%s]",
+ bittok2str(ospf_option_values, "none", op->ospf_db.db_options)));
+ ND_TCHECK(op->ospf_db.db_flags);
+ ND_PRINT((ndo, ", DD Flags [%s]",
+ bittok2str(ospf_dd_flag_values, "none", op->ospf_db.db_flags)));
+ ND_TCHECK(op->ospf_db.db_ifmtu);
+ if (op->ospf_db.db_ifmtu) {
+ ND_PRINT((ndo, ", MTU: %u", EXTRACT_16BITS(&op->ospf_db.db_ifmtu)));
+ }
+ ND_TCHECK(op->ospf_db.db_seq);
+ ND_PRINT((ndo, ", Sequence: 0x%08x", EXTRACT_32BITS(&op->ospf_db.db_seq)));
+
+ /* Print all the LS adv's */
+ lshp = op->ospf_db.db_lshdr;
+ while (((u_char *)lshp < dataend) && ospf_print_lshdr(ndo, lshp) != -1) {
+ ++lshp;
+ }
+ break;
+
+ case OSPF_TYPE_LS_REQ:
+ lsrp = op->ospf_lsr;
+ while ((u_char *)lsrp < dataend) {
+ ND_TCHECK(*lsrp);
+
+ ND_PRINT((ndo, "\n\t Advertising Router: %s, %s LSA (%u)",
+ ipaddr_string(ndo, &lsrp->ls_router),
+ tok2str(lsa_values,"unknown",EXTRACT_32BITS(lsrp->ls_type)),
+ EXTRACT_32BITS(&lsrp->ls_type)));
+
+ switch (EXTRACT_32BITS(lsrp->ls_type)) {
+ /* the LSA header for opaque LSAs was slightly changed */
+ case LS_TYPE_OPAQUE_LL:
+ case LS_TYPE_OPAQUE_AL:
+ case LS_TYPE_OPAQUE_DW:
+ ND_PRINT((ndo, ", Opaque-Type: %s LSA (%u), Opaque-ID: %u",
+ tok2str(lsa_opaque_values, "unknown",lsrp->un_ls_stateid.opaque_field.opaque_type),
+ lsrp->un_ls_stateid.opaque_field.opaque_type,
+ EXTRACT_24BITS(&lsrp->un_ls_stateid.opaque_field.opaque_id)));
+ break;
+ default:
+ ND_PRINT((ndo, ", LSA-ID: %s",
+ ipaddr_string(ndo, &lsrp->un_ls_stateid.ls_stateid)));
+ break;
+ }
+
+ ++lsrp;
+ }
+ break;
+
+ case OSPF_TYPE_LS_UPDATE:
+ lsap = op->ospf_lsu.lsu_lsa;
+ ND_TCHECK(op->ospf_lsu.lsu_count);
+ lsa_count_max = EXTRACT_32BITS(&op->ospf_lsu.lsu_count);
+ ND_PRINT((ndo, ", %d LSA%s", lsa_count_max, PLURAL_SUFFIX(lsa_count_max)));
+ for (lsa_count=1;lsa_count <= lsa_count_max;lsa_count++) {
+ ND_PRINT((ndo, "\n\t LSA #%u", lsa_count));
+ lsap = (const struct lsa *)ospf_print_lsa(ndo, lsap);
+ if (lsap == NULL)
+ goto trunc;
+ }
+ break;
+
+ case OSPF_TYPE_LS_ACK:
+ lshp = op->ospf_lsa.lsa_lshdr;
+ while (ospf_print_lshdr(ndo, lshp) != -1) {
+ ++lshp;
+ }
+ break;
+
+ default:
+ break;
+ }
+ return (0);
+trunc:
+ return (1);
+}
+
+void
+ospf_print(netdissect_options *ndo,
+ register const u_char *bp, register u_int length,
+ const u_char *bp2 _U_)
+{
+ register const struct ospfhdr *op;
+ register const u_char *dataend;
+ register const char *cp;
+
+ op = (struct ospfhdr *)bp;
+
+ /* XXX Before we do anything else, strip off the MD5 trailer */
+ ND_TCHECK(op->ospf_authtype);
+ if (EXTRACT_16BITS(&op->ospf_authtype) == OSPF_AUTH_MD5) {
+ length -= OSPF_AUTH_MD5_LEN;
+ ndo->ndo_snapend -= OSPF_AUTH_MD5_LEN;
+ }
+
+ /* If the type is valid translate it, or just print the type */
+ /* value. If it's not valid, say so and return */
+ ND_TCHECK(op->ospf_type);
+ cp = tok2str(type2str, "unknown LS-type", op->ospf_type);
+ ND_PRINT((ndo, "OSPFv%u, %s, length %u", op->ospf_version, cp, length));
+ if (*cp == 'u')
+ return;
+
+ if (!ndo->ndo_vflag) { /* non verbose - so lets bail out here */
+ return;
+ }
+
+ ND_TCHECK(op->ospf_len);
+ if (length != EXTRACT_16BITS(&op->ospf_len)) {
+ ND_PRINT((ndo, " [len %d]", EXTRACT_16BITS(&op->ospf_len)));
+ }
+
+ if (length > EXTRACT_16BITS(&op->ospf_len)) {
+ dataend = bp + EXTRACT_16BITS(&op->ospf_len);
+ } else {
+ dataend = bp + length;
+ }
+
+ ND_TCHECK(op->ospf_routerid);
+ ND_PRINT((ndo, "\n\tRouter-ID %s", ipaddr_string(ndo, &op->ospf_routerid)));
+
+ ND_TCHECK(op->ospf_areaid);
+ if (op->ospf_areaid.s_addr != 0)
+ ND_PRINT((ndo, ", Area %s", ipaddr_string(ndo, &op->ospf_areaid)));
+ else
+ ND_PRINT((ndo, ", Backbone Area"));
+
+ if (ndo->ndo_vflag) {
+ /* Print authentication data (should we really do this?) */
+ ND_TCHECK2(op->ospf_authdata[0], sizeof(op->ospf_authdata));
+
+ ND_PRINT((ndo, ", Authentication Type: %s (%u)",
+ tok2str(ospf_authtype_values, "unknown", EXTRACT_16BITS(&op->ospf_authtype)),
+ EXTRACT_16BITS(&op->ospf_authtype)));
+
+ switch (EXTRACT_16BITS(&op->ospf_authtype)) {
+
+ case OSPF_AUTH_NONE:
+ break;
+
+ case OSPF_AUTH_SIMPLE:
+ ND_PRINT((ndo, "\n\tSimple text password: "));
+ safeputs(ndo, op->ospf_authdata, OSPF_AUTH_SIMPLE_LEN);
+ break;
+
+ case OSPF_AUTH_MD5:
+ ND_PRINT((ndo, "\n\tKey-ID: %u, Auth-Length: %u, Crypto Sequence Number: 0x%08x",
+ *((op->ospf_authdata) + 2),
+ *((op->ospf_authdata) + 3),
+ EXTRACT_32BITS((op->ospf_authdata) + 4)));
+ break;
+
+ default:
+ return;
+ }
+ }
+ /* Do rest according to version. */
+ switch (op->ospf_version) {
+
+ case 2:
+ /* ospf version 2 */
+ if (ospf_decode_v2(ndo, op, dataend))
+ goto trunc;
+ if (length > EXTRACT_16BITS(&op->ospf_len)) {
+ if (ospf_decode_lls(ndo, op, length))
+ goto trunc;
+ }
+ break;
+
+ default:
+ ND_PRINT((ndo, " ospf [version %d]", op->ospf_version));
+ break;
+ } /* end switch on version */
+
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
--- /dev/null
+/*
+ * Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * OSPF support contributed by Jeffrey Honig (jch@mitchell.cit.cornell.edu)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ospf6.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#include "ospf.h"
+
+#define OSPF_TYPE_HELLO 1 /* Hello */
+#define OSPF_TYPE_DD 2 /* Database Description */
+#define OSPF_TYPE_LS_REQ 3 /* Link State Request */
+#define OSPF_TYPE_LS_UPDATE 4 /* Link State Update */
+#define OSPF_TYPE_LS_ACK 5 /* Link State Ack */
+
+/* Options *_options */
+#define OSPF6_OPTION_V6 0x01 /* V6 bit: A bit for peeping tom */
+#define OSPF6_OPTION_E 0x02 /* E bit: External routes advertised */
+#define OSPF6_OPTION_MC 0x04 /* MC bit: Multicast capable */
+#define OSPF6_OPTION_N 0x08 /* N bit: For type-7 LSA */
+#define OSPF6_OPTION_R 0x10 /* R bit: Router bit */
+#define OSPF6_OPTION_DC 0x20 /* DC bit: Demand circuits */
+/* The field is actually 24-bit (RFC5340 Section A.2). */
+#define OSPF6_OPTION_AF 0x0100 /* AF bit: Multiple address families */
+#define OSPF6_OPTION_L 0x0200 /* L bit: Link-local signaling (LLS) */
+#define OSPF6_OPTION_AT 0x0400 /* AT bit: Authentication trailer */
+
+
+/* db_flags */
+#define OSPF6_DB_INIT 0x04 /* */
+#define OSPF6_DB_MORE 0x02
+#define OSPF6_DB_MASTER 0x01
+#define OSPF6_DB_M6 0x10 /* IPv6 MTU */
+
+/* ls_type */
+#define LS_TYPE_ROUTER 1 /* router link */
+#define LS_TYPE_NETWORK 2 /* network link */
+#define LS_TYPE_INTER_AP 3 /* Inter-Area-Prefix */
+#define LS_TYPE_INTER_AR 4 /* Inter-Area-Router */
+#define LS_TYPE_ASE 5 /* ASE */
+#define LS_TYPE_GROUP 6 /* Group membership */
+#define LS_TYPE_NSSA 7 /* NSSA */
+#define LS_TYPE_LINK 8 /* Link LSA */
+#define LS_TYPE_INTRA_AP 9 /* Intra-Area-Prefix */
+#define LS_TYPE_INTRA_ATE 10 /* Intra-Area-TE */
+#define LS_TYPE_GRACE 11 /* Grace LSA */
+#define LS_TYPE_RI 12 /* Router information */
+#define LS_TYPE_INTER_ASTE 13 /* Inter-AS-TE */
+#define LS_TYPE_L1VPN 14 /* L1VPN */
+#define LS_TYPE_MASK 0x1fff
+
+#define LS_SCOPE_LINKLOCAL 0x0000
+#define LS_SCOPE_AREA 0x2000
+#define LS_SCOPE_AS 0x4000
+#define LS_SCOPE_MASK 0x6000
+#define LS_SCOPE_U 0x8000
+
+/* rla_link.link_type */
+#define RLA_TYPE_ROUTER 1 /* point-to-point to another router */
+#define RLA_TYPE_TRANSIT 2 /* connection to transit network */
+#define RLA_TYPE_VIRTUAL 4 /* virtual link */
+
+/* rla_flags */
+#define RLA_FLAG_B 0x01
+#define RLA_FLAG_E 0x02
+#define RLA_FLAG_V 0x04
+#define RLA_FLAG_W 0x08
+#define RLA_FLAG_N 0x10
+
+/* lsa_prefix options */
+#define LSA_PREFIX_OPT_NU 0x01
+#define LSA_PREFIX_OPT_LA 0x02
+#define LSA_PREFIX_OPT_MC 0x04
+#define LSA_PREFIX_OPT_P 0x08
+#define LSA_PREFIX_OPT_DN 0x10
+
+/* sla_tosmetric breakdown */
+#define SLA_MASK_TOS 0x7f000000
+#define SLA_MASK_METRIC 0x00ffffff
+#define SLA_SHIFT_TOS 24
+
+/* asla_metric */
+#define ASLA_FLAG_FWDADDR 0x02000000
+#define ASLA_FLAG_ROUTETAG 0x01000000
+#define ASLA_MASK_METRIC 0x00ffffff
+
+/* RFC6506 Section 4.1 */
+#define OSPF6_AT_HDRLEN 16U
+#define OSPF6_AUTH_TYPE_HMAC 0x0001
+
+typedef uint32_t rtrid_t;
+
+/* link state advertisement header */
+struct lsa6_hdr {
+ uint16_t ls_age;
+ uint16_t ls_type;
+ rtrid_t ls_stateid;
+ rtrid_t ls_router;
+ uint32_t ls_seq;
+ uint16_t ls_chksum;
+ uint16_t ls_length;
+};
+
+/* Length of an IPv6 address, in bytes. */
+#define IPV6_ADDR_LEN_BYTES (128/8)
+
+struct lsa6_prefix {
+ uint8_t lsa_p_len;
+ uint8_t lsa_p_opt;
+ uint16_t lsa_p_metric;
+ uint8_t lsa_p_prefix[IPV6_ADDR_LEN_BYTES]; /* maximum length */
+};
+
+/* link state advertisement */
+struct lsa6 {
+ struct lsa6_hdr ls_hdr;
+
+ /* Link state types */
+ union {
+ /* Router links advertisements */
+ struct {
+ union {
+ uint8_t flg;
+ uint32_t opt;
+ } rla_flgandopt;
+#define rla_flags rla_flgandopt.flg
+#define rla_options rla_flgandopt.opt
+ struct rlalink6 {
+ uint8_t link_type;
+ uint8_t link_zero[1];
+ uint16_t link_metric;
+ uint32_t link_ifid;
+ uint32_t link_nifid;
+ rtrid_t link_nrtid;
+ } rla_link[1]; /* may repeat */
+ } un_rla;
+
+ /* Network links advertisements */
+ struct {
+ uint32_t nla_options;
+ rtrid_t nla_router[1]; /* may repeat */
+ } un_nla;
+
+ /* Inter Area Prefix LSA */
+ struct {
+ uint32_t inter_ap_metric;
+ struct lsa6_prefix inter_ap_prefix[1];
+ } un_inter_ap;
+
+ /* AS external links advertisements */
+ struct {
+ uint32_t asla_metric;
+ struct lsa6_prefix asla_prefix[1];
+ /* some optional fields follow */
+ } un_asla;
+
+#if 0
+ /* Summary links advertisements */
+ struct {
+ struct in_addr sla_mask;
+ uint32_t sla_tosmetric[1]; /* may repeat */
+ } un_sla;
+
+ /* Multicast group membership */
+ struct mcla {
+ uint32_t mcla_vtype;
+ struct in_addr mcla_vid;
+ } un_mcla[1];
+#endif
+
+ /* Type 7 LSA */
+
+ /* Link LSA */
+ struct llsa {
+ union {
+ uint8_t pri;
+ uint32_t opt;
+ } llsa_priandopt;
+#define llsa_priority llsa_priandopt.pri
+#define llsa_options llsa_priandopt.opt
+ struct in6_addr llsa_lladdr;
+ uint32_t llsa_nprefix;
+ struct lsa6_prefix llsa_prefix[1];
+ } un_llsa;
+
+ /* Intra-Area-Prefix */
+ struct {
+ uint16_t intra_ap_nprefix;
+ uint16_t intra_ap_lstype;
+ rtrid_t intra_ap_lsid;
+ rtrid_t intra_ap_rtid;
+ struct lsa6_prefix intra_ap_prefix[1];
+ } un_intra_ap;
+ } lsa_un;
+};
+
+/*
+ * the main header
+ */
+struct ospf6hdr {
+ uint8_t ospf6_version;
+ uint8_t ospf6_type;
+ uint16_t ospf6_len;
+ rtrid_t ospf6_routerid;
+ rtrid_t ospf6_areaid;
+ uint16_t ospf6_chksum;
+ uint8_t ospf6_instanceid;
+ uint8_t ospf6_rsvd;
+};
+
+/*
+ * The OSPF6 header length is 16 bytes, regardless of how your compiler
+ * might choose to pad the above structure.
+ */
+#define OSPF6HDR_LEN 16
+
+/* Hello packet */
+struct hello6 {
+ uint32_t hello_ifid;
+ union {
+ uint8_t pri;
+ uint32_t opt;
+ } hello_priandopt;
+#define hello_priority hello_priandopt.pri
+#define hello_options hello_priandopt.opt
+ uint16_t hello_helloint;
+ uint16_t hello_deadint;
+ rtrid_t hello_dr;
+ rtrid_t hello_bdr;
+ rtrid_t hello_neighbor[1]; /* may repeat */
+};
+
+/* Database Description packet */
+struct dd6 {
+ uint32_t db_options;
+ uint16_t db_mtu;
+ uint8_t db_mbz;
+ uint8_t db_flags;
+ uint32_t db_seq;
+ struct lsa6_hdr db_lshdr[1]; /* may repeat */
+};
+
+/* Link State Request */
+struct lsr6 {
+ uint16_t ls_mbz;
+ uint16_t ls_type;
+ rtrid_t ls_stateid;
+ rtrid_t ls_router;
+};
+
+/* Link State Update */
+struct lsu6 {
+ uint32_t lsu_count;
+ struct lsa6 lsu_lsa[1]; /* may repeat */
+};
+
+static const char tstr[] = " [|ospf3]";
+
+static const struct tok ospf6_option_values[] = {
+ { OSPF6_OPTION_V6, "V6" },
+ { OSPF6_OPTION_E, "External" },
+ { OSPF6_OPTION_MC, "Deprecated" },
+ { OSPF6_OPTION_N, "NSSA" },
+ { OSPF6_OPTION_R, "Router" },
+ { OSPF6_OPTION_DC, "Demand Circuit" },
+ { OSPF6_OPTION_AF, "AFs Support" },
+ { OSPF6_OPTION_L, "LLS" },
+ { OSPF6_OPTION_AT, "Authentication Trailer" },
+ { 0, NULL }
+};
+
+static const struct tok ospf6_rla_flag_values[] = {
+ { RLA_FLAG_B, "ABR" },
+ { RLA_FLAG_E, "External" },
+ { RLA_FLAG_V, "Virtual-Link Endpoint" },
+ { RLA_FLAG_W, "Wildcard Receiver" },
+ { RLA_FLAG_N, "NSSA Translator" },
+ { 0, NULL }
+};
+
+static const struct tok ospf6_asla_flag_values[] = {
+ { ASLA_FLAG_EXTERNAL, "External Type 2" },
+ { ASLA_FLAG_FWDADDR, "Forwarding" },
+ { ASLA_FLAG_ROUTETAG, "Tag" },
+ { 0, NULL }
+};
+
+static const struct tok ospf6_type_values[] = {
+ { OSPF_TYPE_HELLO, "Hello" },
+ { OSPF_TYPE_DD, "Database Description" },
+ { OSPF_TYPE_LS_REQ, "LS-Request" },
+ { OSPF_TYPE_LS_UPDATE, "LS-Update" },
+ { OSPF_TYPE_LS_ACK, "LS-Ack" },
+ { 0, NULL }
+};
+
+static const struct tok ospf6_lsa_values[] = {
+ { LS_TYPE_ROUTER, "Router" },
+ { LS_TYPE_NETWORK, "Network" },
+ { LS_TYPE_INTER_AP, "Inter-Area Prefix" },
+ { LS_TYPE_INTER_AR, "Inter-Area Router" },
+ { LS_TYPE_ASE, "External" },
+ { LS_TYPE_GROUP, "Deprecated" },
+ { LS_TYPE_NSSA, "NSSA" },
+ { LS_TYPE_LINK, "Link" },
+ { LS_TYPE_INTRA_AP, "Intra-Area Prefix" },
+ { LS_TYPE_INTRA_ATE, "Intra-Area TE" },
+ { LS_TYPE_GRACE, "Grace" },
+ { LS_TYPE_RI, "Router Information" },
+ { LS_TYPE_INTER_ASTE, "Inter-AS-TE" },
+ { LS_TYPE_L1VPN, "Layer 1 VPN" },
+ { 0, NULL }
+};
+
+static const struct tok ospf6_ls_scope_values[] = {
+ { LS_SCOPE_LINKLOCAL, "Link Local" },
+ { LS_SCOPE_AREA, "Area Local" },
+ { LS_SCOPE_AS, "Domain Wide" },
+ { 0, NULL }
+};
+
+static const struct tok ospf6_dd_flag_values[] = {
+ { OSPF6_DB_INIT, "Init" },
+ { OSPF6_DB_MORE, "More" },
+ { OSPF6_DB_MASTER, "Master" },
+ { OSPF6_DB_M6, "IPv6 MTU" },
+ { 0, NULL }
+};
+
+static const struct tok ospf6_lsa_prefix_option_values[] = {
+ { LSA_PREFIX_OPT_NU, "No Unicast" },
+ { LSA_PREFIX_OPT_LA, "Local address" },
+ { LSA_PREFIX_OPT_MC, "Deprecated" },
+ { LSA_PREFIX_OPT_P, "Propagate" },
+ { LSA_PREFIX_OPT_DN, "Down" },
+ { 0, NULL }
+};
+
+static const struct tok ospf6_auth_type_str[] = {
+ { OSPF6_AUTH_TYPE_HMAC, "HMAC" },
+ { 0, NULL }
+};
+
+static void
+ospf6_print_ls_type(netdissect_options *ndo,
+ register u_int ls_type, register const rtrid_t *ls_stateid)
+{
+ ND_PRINT((ndo, "\n\t %s LSA (%d), %s Scope%s, LSA-ID %s",
+ tok2str(ospf6_lsa_values, "Unknown", ls_type & LS_TYPE_MASK),
+ ls_type & LS_TYPE_MASK,
+ tok2str(ospf6_ls_scope_values, "Unknown", ls_type & LS_SCOPE_MASK),
+ ls_type &0x8000 ? ", transitive" : "", /* U-bit */
+ ipaddr_string(ndo, ls_stateid)));
+}
+
+static int
+ospf6_print_lshdr(netdissect_options *ndo,
+ register const struct lsa6_hdr *lshp, const u_char *dataend)
+{
+ if ((u_char *)(lshp + 1) > dataend)
+ goto trunc;
+ ND_TCHECK(lshp->ls_type);
+ ND_TCHECK(lshp->ls_seq);
+
+ ND_PRINT((ndo, "\n\t Advertising Router %s, seq 0x%08x, age %us, length %u",
+ ipaddr_string(ndo, &lshp->ls_router),
+ EXTRACT_32BITS(&lshp->ls_seq),
+ EXTRACT_16BITS(&lshp->ls_age),
+ EXTRACT_16BITS(&lshp->ls_length)-(u_int)sizeof(struct lsa6_hdr)));
+
+ ospf6_print_ls_type(ndo, EXTRACT_16BITS(&lshp->ls_type), &lshp->ls_stateid);
+
+ return (0);
+trunc:
+ return (1);
+}
+
+static int
+ospf6_print_lsaprefix(netdissect_options *ndo,
+ const uint8_t *tptr, u_int lsa_length)
+{
+ const struct lsa6_prefix *lsapp = (struct lsa6_prefix *)tptr;
+ u_int wordlen;
+ struct in6_addr prefix;
+
+ if (lsa_length < sizeof (*lsapp) - IPV6_ADDR_LEN_BYTES)
+ goto trunc;
+ lsa_length -= sizeof (*lsapp) - IPV6_ADDR_LEN_BYTES;
+ ND_TCHECK2(*lsapp, sizeof (*lsapp) - IPV6_ADDR_LEN_BYTES);
+ wordlen = (lsapp->lsa_p_len + 31) / 32;
+ if (wordlen * 4 > sizeof(struct in6_addr)) {
+ ND_PRINT((ndo, " bogus prefixlen /%d", lsapp->lsa_p_len));
+ goto trunc;
+ }
+ if (lsa_length < wordlen * 4)
+ goto trunc;
+ lsa_length -= wordlen * 4;
+ ND_TCHECK2(lsapp->lsa_p_prefix, wordlen * 4);
+ memset(&prefix, 0, sizeof(prefix));
+ memcpy(&prefix, lsapp->lsa_p_prefix, wordlen * 4);
+ ND_PRINT((ndo, "\n\t\t%s/%d", ip6addr_string(ndo, &prefix),
+ lsapp->lsa_p_len));
+ if (lsapp->lsa_p_opt) {
+ ND_PRINT((ndo, ", Options [%s]",
+ bittok2str(ospf6_lsa_prefix_option_values,
+ "none", lsapp->lsa_p_opt)));
+ }
+ ND_PRINT((ndo, ", metric %u", EXTRACT_16BITS(&lsapp->lsa_p_metric)));
+ return sizeof(*lsapp) - IPV6_ADDR_LEN_BYTES + wordlen * 4;
+
+trunc:
+ return -1;
+}
+
+
+/*
+ * Print a single link state advertisement. If truncated return 1, else 0.
+ */
+static int
+ospf6_print_lsa(netdissect_options *ndo,
+ register const struct lsa6 *lsap, const u_char *dataend)
+{
+ register const struct rlalink6 *rlp;
+#if 0
+ register const struct tos_metric *tosp;
+#endif
+ register const rtrid_t *ap;
+#if 0
+ register const struct aslametric *almp;
+ register const struct mcla *mcp;
+#endif
+ register const struct llsa *llsap;
+ register const struct lsa6_prefix *lsapp;
+#if 0
+ register const uint32_t *lp;
+#endif
+ register u_int prefixes;
+ register int bytelen;
+ register u_int length, lsa_length;
+ uint32_t flags32;
+ const uint8_t *tptr;
+
+ if (ospf6_print_lshdr(ndo, &lsap->ls_hdr, dataend))
+ return (1);
+ ND_TCHECK(lsap->ls_hdr.ls_length);
+ length = EXTRACT_16BITS(&lsap->ls_hdr.ls_length);
+
+ /*
+ * The LSA length includes the length of the header;
+ * it must have a value that's at least that length.
+ * If it does, find the length of what follows the
+ * header.
+ */
+ if (length < sizeof(struct lsa6_hdr) || (u_char *)lsap + length > dataend)
+ return (1);
+ lsa_length = length - sizeof(struct lsa6_hdr);
+ tptr = (uint8_t *)lsap+sizeof(struct lsa6_hdr);
+
+ switch (EXTRACT_16BITS(&lsap->ls_hdr.ls_type)) {
+ case LS_TYPE_ROUTER | LS_SCOPE_AREA:
+ if (lsa_length < sizeof (lsap->lsa_un.un_rla.rla_options))
+ return (1);
+ lsa_length -= sizeof (lsap->lsa_un.un_rla.rla_options);
+ ND_TCHECK(lsap->lsa_un.un_rla.rla_options);
+ ND_PRINT((ndo, "\n\t Options [%s]",
+ bittok2str(ospf6_option_values, "none",
+ EXTRACT_32BITS(&lsap->lsa_un.un_rla.rla_options))));
+ ND_PRINT((ndo, ", RLA-Flags [%s]",
+ bittok2str(ospf6_rla_flag_values, "none",
+ lsap->lsa_un.un_rla.rla_flags)));
+
+ rlp = lsap->lsa_un.un_rla.rla_link;
+ while (lsa_length != 0) {
+ if (lsa_length < sizeof (*rlp))
+ return (1);
+ lsa_length -= sizeof (*rlp);
+ ND_TCHECK(*rlp);
+ switch (rlp->link_type) {
+
+ case RLA_TYPE_VIRTUAL:
+ ND_PRINT((ndo, "\n\t Virtual Link: Neighbor Router-ID %s"
+ "\n\t Neighbor Interface-ID %s, Interface %s",
+ ipaddr_string(ndo, &rlp->link_nrtid),
+ ipaddr_string(ndo, &rlp->link_nifid),
+ ipaddr_string(ndo, &rlp->link_ifid)));
+ break;
+
+ case RLA_TYPE_ROUTER:
+ ND_PRINT((ndo, "\n\t Neighbor Router-ID %s"
+ "\n\t Neighbor Interface-ID %s, Interface %s",
+ ipaddr_string(ndo, &rlp->link_nrtid),
+ ipaddr_string(ndo, &rlp->link_nifid),
+ ipaddr_string(ndo, &rlp->link_ifid)));
+ break;
+
+ case RLA_TYPE_TRANSIT:
+ ND_PRINT((ndo, "\n\t Neighbor Network-ID %s"
+ "\n\t Neighbor Interface-ID %s, Interface %s",
+ ipaddr_string(ndo, &rlp->link_nrtid),
+ ipaddr_string(ndo, &rlp->link_nifid),
+ ipaddr_string(ndo, &rlp->link_ifid)));
+ break;
+
+ default:
+ ND_PRINT((ndo, "\n\t Unknown Router Links Type 0x%02x",
+ rlp->link_type));
+ return (0);
+ }
+ ND_PRINT((ndo, ", metric %d", EXTRACT_16BITS(&rlp->link_metric)));
+ rlp++;
+ }
+ break;
+
+ case LS_TYPE_NETWORK | LS_SCOPE_AREA:
+ if (lsa_length < sizeof (lsap->lsa_un.un_nla.nla_options))
+ return (1);
+ lsa_length -= sizeof (lsap->lsa_un.un_nla.nla_options);
+ ND_TCHECK(lsap->lsa_un.un_nla.nla_options);
+ ND_PRINT((ndo, "\n\t Options [%s]",
+ bittok2str(ospf6_option_values, "none",
+ EXTRACT_32BITS(&lsap->lsa_un.un_nla.nla_options))));
+
+ ND_PRINT((ndo, "\n\t Connected Routers:"));
+ ap = lsap->lsa_un.un_nla.nla_router;
+ while (lsa_length != 0) {
+ if (lsa_length < sizeof (*ap))
+ return (1);
+ lsa_length -= sizeof (*ap);
+ ND_TCHECK(*ap);
+ ND_PRINT((ndo, "\n\t\t%s", ipaddr_string(ndo, ap)));
+ ++ap;
+ }
+ break;
+
+ case LS_TYPE_INTER_AP | LS_SCOPE_AREA:
+ if (lsa_length < sizeof (lsap->lsa_un.un_inter_ap.inter_ap_metric))
+ return (1);
+ lsa_length -= sizeof (lsap->lsa_un.un_inter_ap.inter_ap_metric);
+ ND_TCHECK(lsap->lsa_un.un_inter_ap.inter_ap_metric);
+ ND_PRINT((ndo, ", metric %u",
+ EXTRACT_32BITS(&lsap->lsa_un.un_inter_ap.inter_ap_metric) & SLA_MASK_METRIC));
+
+ tptr = (uint8_t *)lsap->lsa_un.un_inter_ap.inter_ap_prefix;
+ while (lsa_length != 0) {
+ bytelen = ospf6_print_lsaprefix(ndo, tptr, lsa_length);
+ if (bytelen < 0)
+ goto trunc;
+ lsa_length -= bytelen;
+ tptr += bytelen;
+ }
+ break;
+
+ case LS_TYPE_ASE | LS_SCOPE_AS:
+ if (lsa_length < sizeof (lsap->lsa_un.un_asla.asla_metric))
+ return (1);
+ lsa_length -= sizeof (lsap->lsa_un.un_asla.asla_metric);
+ ND_TCHECK(lsap->lsa_un.un_asla.asla_metric);
+ flags32 = EXTRACT_32BITS(&lsap->lsa_un.un_asla.asla_metric);
+ ND_PRINT((ndo, "\n\t Flags [%s]",
+ bittok2str(ospf6_asla_flag_values, "none", flags32)));
+ ND_PRINT((ndo, " metric %u",
+ EXTRACT_32BITS(&lsap->lsa_un.un_asla.asla_metric) &
+ ASLA_MASK_METRIC));
+
+ tptr = (uint8_t *)lsap->lsa_un.un_asla.asla_prefix;
+ lsapp = (struct lsa6_prefix *)tptr;
+ bytelen = ospf6_print_lsaprefix(ndo, tptr, lsa_length);
+ if (bytelen < 0)
+ goto trunc;
+ lsa_length -= bytelen;
+ tptr += bytelen;
+
+ if ((flags32 & ASLA_FLAG_FWDADDR) != 0) {
+ struct in6_addr *fwdaddr6;
+
+ fwdaddr6 = (struct in6_addr *)tptr;
+ if (lsa_length < sizeof (*fwdaddr6))
+ return (1);
+ lsa_length -= sizeof (*fwdaddr6);
+ ND_TCHECK(*fwdaddr6);
+ ND_PRINT((ndo, " forward %s",
+ ip6addr_string(ndo, fwdaddr6)));
+ tptr += sizeof(*fwdaddr6);
+ }
+
+ if ((flags32 & ASLA_FLAG_ROUTETAG) != 0) {
+ if (lsa_length < sizeof (uint32_t))
+ return (1);
+ lsa_length -= sizeof (uint32_t);
+ ND_TCHECK(*(uint32_t *)tptr);
+ ND_PRINT((ndo, " tag %s",
+ ipaddr_string(ndo, (uint32_t *)tptr)));
+ tptr += sizeof(uint32_t);
+ }
+
+ if (lsapp->lsa_p_metric) {
+ if (lsa_length < sizeof (uint32_t))
+ return (1);
+ lsa_length -= sizeof (uint32_t);
+ ND_TCHECK(*(uint32_t *)tptr);
+ ND_PRINT((ndo, " RefLSID: %s",
+ ipaddr_string(ndo, (uint32_t *)tptr)));
+ tptr += sizeof(uint32_t);
+ }
+ break;
+
+ case LS_TYPE_LINK:
+ /* Link LSA */
+ llsap = &lsap->lsa_un.un_llsa;
+ if (lsa_length < sizeof (llsap->llsa_priandopt))
+ return (1);
+ lsa_length -= sizeof (llsap->llsa_priandopt);
+ ND_TCHECK(llsap->llsa_priandopt);
+ ND_PRINT((ndo, "\n\t Options [%s]",
+ bittok2str(ospf6_option_values, "none",
+ EXTRACT_32BITS(&llsap->llsa_options))));
+
+ if (lsa_length < sizeof (llsap->llsa_lladdr) + sizeof (llsap->llsa_nprefix))
+ return (1);
+ lsa_length -= sizeof (llsap->llsa_lladdr) + sizeof (llsap->llsa_nprefix);
+ prefixes = EXTRACT_32BITS(&llsap->llsa_nprefix);
+ ND_PRINT((ndo, "\n\t Priority %d, Link-local address %s, Prefixes %d:",
+ llsap->llsa_priority,
+ ip6addr_string(ndo, &llsap->llsa_lladdr),
+ prefixes));
+
+ tptr = (uint8_t *)llsap->llsa_prefix;
+ while (prefixes > 0) {
+ bytelen = ospf6_print_lsaprefix(ndo, tptr, lsa_length);
+ if (bytelen < 0)
+ goto trunc;
+ prefixes--;
+ lsa_length -= bytelen;
+ tptr += bytelen;
+ }
+ break;
+
+ case LS_TYPE_INTRA_AP | LS_SCOPE_AREA:
+ /* Intra-Area-Prefix LSA */
+ if (lsa_length < sizeof (lsap->lsa_un.un_intra_ap.intra_ap_rtid))
+ return (1);
+ lsa_length -= sizeof (lsap->lsa_un.un_intra_ap.intra_ap_rtid);
+ ND_TCHECK(lsap->lsa_un.un_intra_ap.intra_ap_rtid);
+ ospf6_print_ls_type(ndo,
+ EXTRACT_16BITS(&lsap->lsa_un.un_intra_ap.intra_ap_lstype),
+ &lsap->lsa_un.un_intra_ap.intra_ap_lsid);
+
+ if (lsa_length < sizeof (lsap->lsa_un.un_intra_ap.intra_ap_nprefix))
+ return (1);
+ lsa_length -= sizeof (lsap->lsa_un.un_intra_ap.intra_ap_nprefix);
+ ND_TCHECK(lsap->lsa_un.un_intra_ap.intra_ap_nprefix);
+ prefixes = EXTRACT_16BITS(&lsap->lsa_un.un_intra_ap.intra_ap_nprefix);
+ ND_PRINT((ndo, "\n\t Prefixes %d:", prefixes));
+
+ tptr = (uint8_t *)lsap->lsa_un.un_intra_ap.intra_ap_prefix;
+ while (prefixes > 0) {
+ bytelen = ospf6_print_lsaprefix(ndo, tptr, lsa_length);
+ if (bytelen < 0)
+ goto trunc;
+ prefixes--;
+ lsa_length -= bytelen;
+ tptr += bytelen;
+ }
+ break;
+
+ case LS_TYPE_GRACE | LS_SCOPE_LINKLOCAL:
+ if (ospf_print_grace_lsa(ndo, tptr, lsa_length) == -1) {
+ return 1;
+ }
+ break;
+
+ case LS_TYPE_INTRA_ATE | LS_SCOPE_LINKLOCAL:
+ if (ospf_print_te_lsa(ndo, tptr, lsa_length) == -1) {
+ return 1;
+ }
+ break;
+
+ default:
+ if(!print_unknown_data(ndo,tptr,
+ "\n\t ",
+ lsa_length)) {
+ return (1);
+ }
+ break;
+ }
+
+ return (0);
+trunc:
+ return (1);
+}
+
+static int
+ospf6_decode_v3(netdissect_options *ndo,
+ register const struct ospf6hdr *op,
+ register const u_char *dataend)
+{
+ register const rtrid_t *ap;
+ register const struct lsr6 *lsrp;
+ register const struct lsa6_hdr *lshp;
+ register const struct lsa6 *lsap;
+ register int i;
+
+ switch (op->ospf6_type) {
+
+ case OSPF_TYPE_HELLO: {
+ register const struct hello6 *hellop = (const struct hello6 *)((uint8_t *)op + OSPF6HDR_LEN);
+
+ ND_PRINT((ndo, "\n\tOptions [%s]",
+ bittok2str(ospf6_option_values, "none",
+ EXTRACT_32BITS(&hellop->hello_options))));
+
+ ND_TCHECK(hellop->hello_deadint);
+ ND_PRINT((ndo, "\n\t Hello Timer %us, Dead Timer %us, Interface-ID %s, Priority %u",
+ EXTRACT_16BITS(&hellop->hello_helloint),
+ EXTRACT_16BITS(&hellop->hello_deadint),
+ ipaddr_string(ndo, &hellop->hello_ifid),
+ hellop->hello_priority));
+
+ ND_TCHECK(hellop->hello_dr);
+ if (EXTRACT_32BITS(&hellop->hello_dr) != 0)
+ ND_PRINT((ndo, "\n\t Designated Router %s",
+ ipaddr_string(ndo, &hellop->hello_dr)));
+ ND_TCHECK(hellop->hello_bdr);
+ if (EXTRACT_32BITS(&hellop->hello_bdr) != 0)
+ ND_PRINT((ndo, ", Backup Designated Router %s",
+ ipaddr_string(ndo, &hellop->hello_bdr)));
+ if (ndo->ndo_vflag > 1) {
+ ND_PRINT((ndo, "\n\t Neighbor List:"));
+ ap = hellop->hello_neighbor;
+ while ((u_char *)ap < dataend) {
+ ND_TCHECK(*ap);
+ ND_PRINT((ndo, "\n\t %s", ipaddr_string(ndo, ap)));
+ ++ap;
+ }
+ }
+ break; /* HELLO */
+ }
+
+ case OSPF_TYPE_DD: {
+ register const struct dd6 *ddp = (const struct dd6 *)((uint8_t *)op + OSPF6HDR_LEN);
+
+ ND_TCHECK(ddp->db_options);
+ ND_PRINT((ndo, "\n\tOptions [%s]",
+ bittok2str(ospf6_option_values, "none",
+ EXTRACT_32BITS(&ddp->db_options))));
+ ND_TCHECK(ddp->db_flags);
+ ND_PRINT((ndo, ", DD Flags [%s]",
+ bittok2str(ospf6_dd_flag_values,"none",ddp->db_flags)));
+
+ ND_TCHECK(ddp->db_seq);
+ ND_PRINT((ndo, ", MTU %u, DD-Sequence 0x%08x",
+ EXTRACT_16BITS(&ddp->db_mtu),
+ EXTRACT_32BITS(&ddp->db_seq)));
+ if (ndo->ndo_vflag > 1) {
+ /* Print all the LS adv's */
+ lshp = ddp->db_lshdr;
+ while ((u_char *)lshp < dataend) {
+ if (ospf6_print_lshdr(ndo, lshp++, dataend))
+ goto trunc;
+ }
+ }
+ break;
+ }
+
+ case OSPF_TYPE_LS_REQ:
+ if (ndo->ndo_vflag > 1) {
+ lsrp = (const struct lsr6 *)((uint8_t *)op + OSPF6HDR_LEN);
+ while ((u_char *)lsrp < dataend) {
+ ND_TCHECK(*lsrp);
+ ND_PRINT((ndo, "\n\t Advertising Router %s",
+ ipaddr_string(ndo, &lsrp->ls_router)));
+ ospf6_print_ls_type(ndo, EXTRACT_16BITS(&lsrp->ls_type),
+ &lsrp->ls_stateid);
+ ++lsrp;
+ }
+ }
+ break;
+
+ case OSPF_TYPE_LS_UPDATE:
+ if (ndo->ndo_vflag > 1) {
+ register const struct lsu6 *lsup = (const struct lsu6 *)((uint8_t *)op + OSPF6HDR_LEN);
+
+ ND_TCHECK(lsup->lsu_count);
+ i = EXTRACT_32BITS(&lsup->lsu_count);
+ lsap = lsup->lsu_lsa;
+ while ((u_char *)lsap < dataend && i--) {
+ if (ospf6_print_lsa(ndo, lsap, dataend))
+ goto trunc;
+ lsap = (struct lsa6 *)((u_char *)lsap +
+ EXTRACT_16BITS(&lsap->ls_hdr.ls_length));
+ }
+ }
+ break;
+
+ case OSPF_TYPE_LS_ACK:
+ if (ndo->ndo_vflag > 1) {
+ lshp = (const struct lsa6_hdr *)((uint8_t *)op + OSPF6HDR_LEN);
+ while ((u_char *)lshp < dataend) {
+ if (ospf6_print_lshdr(ndo, lshp++, dataend))
+ goto trunc;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ return (0);
+trunc:
+ return (1);
+}
+
+/* RFC5613 Section 2.2 (w/o the TLVs) */
+static int
+ospf6_print_lls(netdissect_options *ndo,
+ const u_char *cp, const u_int len)
+{
+ uint16_t llsdatalen;
+
+ if (len == 0)
+ return 0;
+ if (len < OSPF_LLS_HDRLEN)
+ goto trunc;
+ /* Checksum */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, "\n\tLLS Checksum 0x%04x", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* LLS Data Length */
+ ND_TCHECK2(*cp, 2);
+ llsdatalen = EXTRACT_16BITS(cp);
+ ND_PRINT((ndo, ", Data Length %u", llsdatalen));
+ if (llsdatalen < OSPF_LLS_HDRLEN || llsdatalen > len)
+ goto trunc;
+ cp += 2;
+ /* LLS TLVs */
+ ND_TCHECK2(*cp, llsdatalen - OSPF_LLS_HDRLEN);
+ /* FIXME: code in print-ospf.c can be reused to decode the TLVs */
+
+ return llsdatalen;
+trunc:
+ return -1;
+}
+
+/* RFC6506 Section 4.1 */
+static int
+ospf6_decode_at(netdissect_options *ndo,
+ const u_char *cp, const u_int len)
+{
+ uint16_t authdatalen;
+
+ if (len == 0)
+ return 0;
+ if (len < OSPF6_AT_HDRLEN)
+ goto trunc;
+ /* Authentication Type */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, "\n\tAuthentication Type %s", tok2str(ospf6_auth_type_str, "unknown (0x%04x)", EXTRACT_16BITS(cp))));
+ cp += 2;
+ /* Auth Data Len */
+ ND_TCHECK2(*cp, 2);
+ authdatalen = EXTRACT_16BITS(cp);
+ ND_PRINT((ndo, ", Length %u", authdatalen));
+ if (authdatalen < OSPF6_AT_HDRLEN || authdatalen > len)
+ goto trunc;
+ cp += 2;
+ /* Reserved */
+ ND_TCHECK2(*cp, 2);
+ cp += 2;
+ /* Security Association ID */
+ ND_TCHECK2(*cp, 2);
+ ND_PRINT((ndo, ", SAID %u", EXTRACT_16BITS(cp)));
+ cp += 2;
+ /* Cryptographic Sequence Number (High-Order 32 Bits) */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ", CSN 0x%08x", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* Cryptographic Sequence Number (Low-Order 32 Bits) */
+ ND_TCHECK2(*cp, 4);
+ ND_PRINT((ndo, ":%08x", EXTRACT_32BITS(cp)));
+ cp += 4;
+ /* Authentication Data */
+ ND_TCHECK2(*cp, authdatalen - OSPF6_AT_HDRLEN);
+ if (ndo->ndo_vflag > 1)
+ print_unknown_data(ndo,cp, "\n\tAuthentication Data ", authdatalen - OSPF6_AT_HDRLEN);
+ return 0;
+
+trunc:
+ return 1;
+}
+
+/* The trailing data may include LLS and/or AT data (in this specific order).
+ * LLS data may be present only in Hello and DBDesc packets with the L-bit set.
+ * AT data may be present in Hello and DBDesc packets with the AT-bit set or in
+ * any other packet type, thus decode the AT data regardless of the AT-bit.
+ */
+static int
+ospf6_decode_v3_trailer(netdissect_options *ndo,
+ const struct ospf6hdr *op, const u_char *cp, const unsigned len)
+{
+ int llslen = 0;
+ int lls_hello = 0;
+ int lls_dd = 0;
+
+ if (op->ospf6_type == OSPF_TYPE_HELLO) {
+ const struct hello6 *hellop = (const struct hello6 *)((uint8_t *)op + OSPF6HDR_LEN);
+ if (EXTRACT_32BITS(&hellop->hello_options) & OSPF6_OPTION_L)
+ lls_hello = 1;
+ } else if (op->ospf6_type == OSPF_TYPE_DD) {
+ const struct dd6 *ddp = (const struct dd6 *)((uint8_t *)op + OSPF6HDR_LEN);
+ if (EXTRACT_32BITS(&ddp->db_options) & OSPF6_OPTION_L)
+ lls_dd = 1;
+ }
+ if ((lls_hello || lls_dd) && (llslen = ospf6_print_lls(ndo, cp, len)) < 0)
+ goto trunc;
+ return ospf6_decode_at(ndo, cp + llslen, len - llslen);
+
+trunc:
+ return 1;
+}
+
+void
+ospf6_print(netdissect_options *ndo,
+ register const u_char *bp, register u_int length)
+{
+ register const struct ospf6hdr *op;
+ register const u_char *dataend;
+ register const char *cp;
+ uint16_t datalen;
+
+ op = (struct ospf6hdr *)bp;
+
+ /* If the type is valid translate it, or just print the type */
+ /* value. If it's not valid, say so and return */
+ ND_TCHECK(op->ospf6_type);
+ cp = tok2str(ospf6_type_values, "unknown packet type (%u)", op->ospf6_type);
+ ND_PRINT((ndo, "OSPFv%u, %s, length %d", op->ospf6_version, cp, length));
+ if (*cp == 'u') {
+ return;
+ }
+
+ if(!ndo->ndo_vflag) { /* non verbose - so lets bail out here */
+ return;
+ }
+
+ /* OSPFv3 data always comes first and optional trailing data may follow. */
+ ND_TCHECK(op->ospf6_len);
+ datalen = EXTRACT_16BITS(&op->ospf6_len);
+ if (datalen > length) {
+ ND_PRINT((ndo, " [len %d]", datalen));
+ return;
+ }
+ dataend = bp + datalen;
+
+ ND_TCHECK(op->ospf6_routerid);
+ ND_PRINT((ndo, "\n\tRouter-ID %s", ipaddr_string(ndo, &op->ospf6_routerid)));
+
+ ND_TCHECK(op->ospf6_areaid);
+ if (EXTRACT_32BITS(&op->ospf6_areaid) != 0)
+ ND_PRINT((ndo, ", Area %s", ipaddr_string(ndo, &op->ospf6_areaid)));
+ else
+ ND_PRINT((ndo, ", Backbone Area"));
+ ND_TCHECK(op->ospf6_instanceid);
+ if (op->ospf6_instanceid)
+ ND_PRINT((ndo, ", Instance %u", op->ospf6_instanceid));
+
+ /* Do rest according to version. */
+ switch (op->ospf6_version) {
+
+ case 3:
+ /* ospf version 3 */
+ if (ospf6_decode_v3(ndo, op, dataend) ||
+ ospf6_decode_v3_trailer(ndo, op, dataend, length - datalen))
+ goto trunc;
+ break;
+ } /* end switch on version */
+
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Francesco Fondelli (francesco dot fondelli, gmail dot com)
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+/*
+ * OTV header, draft-hasmit-otv-04
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |R|R|R|R|I|R|R|R| Overlay ID |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Instance ID | Reserved |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+void
+otv_print(netdissect_options *ndo, const u_char *bp, u_int len)
+{
+ uint8_t flags;
+ uint32_t overlay_id;
+ uint32_t instance_id;
+
+ if (len < 8) {
+ ND_PRINT((ndo, "[|OTV]"));
+ return;
+ }
+
+ flags = *bp;
+ bp += 1;
+
+ overlay_id = EXTRACT_24BITS(bp);
+ bp += 3;
+
+ instance_id = EXTRACT_24BITS(bp);
+ bp += 4;
+
+ ND_PRINT((ndo, "OTV, "));
+ ND_PRINT((ndo, "flags [%s] (0x%02x), ", flags & 0x08 ? "I" : ".", flags));
+ ND_PRINT((ndo, "overlay %u, ", overlay_id));
+ ND_PRINT((ndo, "instance %u\n", instance_id));
+
+ ether_print(ndo, bp, len - 8, len - 8, NULL, NULL);
+}
--- /dev/null
+/*
+ * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-pflog.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifndef HAVE_NET_PFVAR_H
+#error "No pf headers available"
+#endif
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/pfvar.h>
+#include <net/if_pflog.h>
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+static const char tstr[] = "[|pflog]";
+
+static const struct tok pf_reasons[] = {
+ { 0, "0(match)" },
+ { 1, "1(bad-offset)" },
+ { 2, "2(fragment)" },
+ { 3, "3(short)" },
+ { 4, "4(normalize)" },
+ { 5, "5(memory)" },
+ { 6, "6(bad-timestamp)" },
+ { 7, "7(congestion)" },
+ { 8, "8(ip-option)" },
+ { 9, "9(proto-cksum)" },
+ { 10, "10(state-mismatch)" },
+ { 11, "11(state-insert)" },
+ { 12, "12(state-limit)" },
+ { 13, "13(src-limit)" },
+ { 14, "14(synproxy)" },
+ { 0, NULL }
+};
+
+static const struct tok pf_actions[] = {
+ { PF_PASS, "pass" },
+ { PF_DROP, "block" },
+ { PF_SCRUB, "scrub" },
+ { PF_NAT, "nat" },
+ { PF_NONAT, "nat" },
+ { PF_BINAT, "binat" },
+ { PF_NOBINAT, "binat" },
+ { PF_RDR, "rdr" },
+ { PF_NORDR, "rdr" },
+ { PF_SYNPROXY_DROP, "synproxy-drop" },
+ { 0, NULL }
+};
+
+static const struct tok pf_directions[] = {
+ { PF_INOUT, "in/out" },
+ { PF_IN, "in" },
+ { PF_OUT, "out" },
+ { 0, NULL }
+};
+
+/* For reading capture files on other systems */
+#define OPENBSD_AF_INET 2
+#define OPENBSD_AF_INET6 24
+
+static void
+pflog_print(netdissect_options *ndo, const struct pfloghdr *hdr)
+{
+ uint32_t rulenr, subrulenr;
+
+ rulenr = EXTRACT_32BITS(&hdr->rulenr);
+ subrulenr = EXTRACT_32BITS(&hdr->subrulenr);
+ if (subrulenr == (uint32_t)-1)
+ ND_PRINT((ndo, "rule %u/", rulenr));
+ else
+ ND_PRINT((ndo, "rule %u.%s.%u/", rulenr, hdr->ruleset, subrulenr));
+
+ ND_PRINT((ndo, "%s: %s %s on %s: ",
+ tok2str(pf_reasons, "unkn(%u)", hdr->reason),
+ tok2str(pf_actions, "unkn(%u)", hdr->action),
+ tok2str(pf_directions, "unkn(%u)", hdr->dir),
+ hdr->ifname));
+}
+
+u_int
+pflog_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
+ register const u_char *p)
+{
+ u_int length = h->len;
+ u_int hdrlen;
+ u_int caplen = h->caplen;
+ const struct pfloghdr *hdr;
+ uint8_t af;
+
+ /* check length */
+ if (caplen < sizeof(uint8_t)) {
+ ND_PRINT((ndo, "%s", tstr));
+ return (caplen);
+ }
+
+#define MIN_PFLOG_HDRLEN 45
+ hdr = (struct pfloghdr *)p;
+ if (hdr->length < MIN_PFLOG_HDRLEN) {
+ ND_PRINT((ndo, "[pflog: invalid header length!]"));
+ return (hdr->length); /* XXX: not really */
+ }
+ hdrlen = BPF_WORDALIGN(hdr->length);
+
+ if (caplen < hdrlen) {
+ ND_PRINT((ndo, "%s", tstr));
+ return (hdrlen); /* XXX: true? */
+ }
+
+ /* print what we know */
+ hdr = (struct pfloghdr *)p;
+ ND_TCHECK(*hdr);
+ if (ndo->ndo_eflag)
+ pflog_print(ndo, hdr);
+
+ /* skip to the real packet */
+ af = hdr->af;
+ length -= hdrlen;
+ caplen -= hdrlen;
+ p += hdrlen;
+ switch (af) {
+
+ case AF_INET:
+#if OPENBSD_AF_INET != AF_INET
+ case OPENBSD_AF_INET: /* XXX: read pcap files */
+#endif
+ ip_print(ndo, p, length);
+ break;
+
+#if defined(AF_INET6) || defined(OPENBSD_AF_INET6)
+#ifdef AF_INET6
+ case AF_INET6:
+#endif /* AF_INET6 */
+#if !defined(AF_INET6) || OPENBSD_AF_INET6 != AF_INET6
+ case OPENBSD_AF_INET6: /* XXX: read pcap files */
+#endif /* !defined(AF_INET6) || OPENBSD_AF_INET6 != AF_INET6 */
+ ip6_print(ndo, p, length);
+ break;
+#endif /* defined(AF_INET6) || defined(OPENBSD_AF_INET6) */
+
+ default:
+ /* address family not handled, print raw packet */
+ if (!ndo->ndo_eflag)
+ pflog_print(ndo, hdr);
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+
+ return (hdrlen);
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return (hdrlen);
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/* $NetBSD: print-pfsync.c,v 1.2 2014/11/20 03:05:03 christos Exp $ */
+/* $OpenBSD: print-pfsync.c,v 1.30 2007/05/31 04:16:26 mcbride Exp $ */
+
+/*
+ * Copyright (c) 2002 Michael Shalayeff
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR OR HIS RELATIVES 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 MIND, 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static const char rcsid[] =
+ "@(#) $Header: /cvsroot/src/external/bsd/tcpdump/dist/print-pfsync.c,v 1.2 2014/11/20 03:05:03 christos Exp $";
+#else
+__RCSID("$NetBSD: print-pfsync.c,v 1.2 2014/11/20 03:05:03 christos Exp $");
+#endif
+#endif
+
+#define NETDISECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/file.h>
+#include <sys/ioctl.h>
+#include <sys/mbuf.h>
+
+#ifdef __STDC__
+struct rtentry;
+#endif
+#include <net/if.h>
+
+#if 0
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#endif
+
+#include <net/pfvar.h>
+#include <net/if_pfsync.h>
+
+#include <ctype.h>
+#include <netdb.h>
+#include <pcap.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "pfctl_parser.h"
+#include "pfctl.h"
+
+const char *pfsync_acts[] = { PFSYNC_ACTIONS };
+
+static void pfsync_print(struct pfsync_header *, int);
+
+u_int
+pfsync_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int caplen = h->caplen;
+
+ ts_print(ndo, &h->ts);
+
+ if (caplen < PFSYNC_HDRLEN) {
+ ND_PRINT((ndo, "[|pfsync]"));
+ goto out;
+ }
+
+ pfsync_print((struct pfsync_header *)p,
+ caplen - sizeof(struct pfsync_header));
+out:
+ if (xflag) {
+ default_print((const u_char *)h, caplen);
+ }
+ //putchar('\n');
+
+ return 0;
+}
+
+void
+pfsync_ip_print(const u_char *bp, u_int len, const u_char *bp2 __unused)
+{
+ struct pfsync_header *hdr = (struct pfsync_header *)bp;
+
+ if (len < PFSYNC_HDRLEN)
+ printf("[|pfsync]");
+ else
+ pfsync_print(hdr, (len - sizeof(struct pfsync_header)));
+ //putchar('\n');
+}
+
+static void
+pfsync_print(struct pfsync_header *hdr, int len)
+{
+ struct pfsync_state *s;
+ struct pfsync_state_upd *u;
+ struct pfsync_state_del *d;
+ struct pfsync_state_clr *c;
+ struct pfsync_state_upd_req *r;
+ struct pfsync_state_bus *b;
+ struct pfsync_tdb *t;
+ int i, flags = 0, min, sec;
+ u_int64_t id;
+
+ if (eflag)
+ printf("PFSYNCv%d count %d: ",
+ hdr->version, hdr->count);
+
+ if (hdr->action < PFSYNC_ACT_MAX)
+ printf("%s %s:", (vflag == 0) ? "PFSYNC" : "",
+ pfsync_acts[hdr->action]);
+ else
+ printf("%s %d?:", (vflag == 0) ? "PFSYNC" : "",
+ hdr->action);
+
+ if (!vflag)
+ return;
+ if (vflag)
+ flags |= PF_OPT_VERBOSE;
+ if (vflag > 1)
+ flags |= PF_OPT_VERBOSE2;
+ if (!nflag)
+ flags |= PF_OPT_USEDNS;
+
+ switch (hdr->action) {
+ case PFSYNC_ACT_CLR:
+ if (sizeof(*c) <= len) {
+ c = (void *)((char *)hdr + PFSYNC_HDRLEN);
+ printf("\n\tcreatorid: %08x", htonl(c->creatorid));
+ if (c->ifname[0] != '\0')
+ printf(" interface: %s", c->ifname);
+ }
+ case PFSYNC_ACT_INS:
+ case PFSYNC_ACT_UPD:
+ case PFSYNC_ACT_DEL:
+ for (i = 1, s = (void *)((char *)hdr + PFSYNC_HDRLEN);
+ i <= hdr->count && i * sizeof(*s) <= len; i++, s++) {
+
+ putchar('\n');
+ print_state(s, flags);
+ if (vflag > 1 && hdr->action == PFSYNC_ACT_UPD)
+ printf(" updates: %d", s->updates);
+ }
+ break;
+ case PFSYNC_ACT_UPD_C:
+ for (i = 1, u = (void *)((char *)hdr + PFSYNC_HDRLEN);
+ i <= hdr->count && i * sizeof(*u) <= len; i++, u++) {
+ memcpy(&id, &u->id, sizeof(id));
+ printf("\n\tid: %" PRIu64 " creatorid: %08x",
+ be64toh(id), ntohl(u->creatorid));
+ if (vflag > 1)
+ printf(" updates: %d", u->updates);
+ }
+ break;
+ case PFSYNC_ACT_DEL_C:
+ for (i = 1, d = (void *)((char *)hdr + PFSYNC_HDRLEN);
+ i <= hdr->count && i * sizeof(*d) <= len; i++, d++) {
+ memcpy(&id, &d->id, sizeof(id));
+ printf("\n\tid: %" PRIu64 " creatorid: %08x",
+ be64toh(id), ntohl(d->creatorid));
+ }
+ break;
+ case PFSYNC_ACT_UREQ:
+ for (i = 1, r = (void *)((char *)hdr + PFSYNC_HDRLEN);
+ i <= hdr->count && i * sizeof(*r) <= len; i++, r++) {
+ memcpy(&id, &r->id, sizeof(id));
+ printf("\n\tid: %" PRIu64 " creatorid: %08x",
+ be64toh(id), ntohl(r->creatorid));
+ }
+ break;
+ case PFSYNC_ACT_BUS:
+ if (sizeof(*b) <= len) {
+ b = (void *)((char *)hdr + PFSYNC_HDRLEN);
+ printf("\n\tcreatorid: %08x", htonl(b->creatorid));
+ sec = b->endtime % 60;
+ b->endtime /= 60;
+ min = b->endtime % 60;
+ b->endtime /= 60;
+ printf(" age %.2u:%.2u:%.2u", b->endtime, min, sec);
+ switch (b->status) {
+ case PFSYNC_BUS_START:
+ printf(" status: start");
+ break;
+ case PFSYNC_BUS_END:
+ printf(" status: end");
+ break;
+ default:
+ printf(" status: ?");
+ break;
+ }
+ }
+ break;
+ case PFSYNC_ACT_TDB_UPD:
+ for (i = 1, t = (void *)((char *)hdr + PFSYNC_HDRLEN);
+ i <= hdr->count && i * sizeof(*t) <= len; i++, t++)
+ printf("\n\tspi: %08x rpl: %u cur_bytes: %" PRIu64,
+ htonl(t->spi), htonl(t->rpl),
+ be64toh(t->cur_bytes));
+ /* XXX add dst and sproto? */
+ break;
+ default:
+ break;
+ }
+}
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Andy Heffernan (ahh@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-pgm.c,v 1.6 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+#include "ip.h"
+#ifdef INET6
+#include "ip6.h"
+#endif
+#include "ipproto.h"
+#include "af.h"
+
+/*
+ * PGM header (RFC 3208)
+ */
+struct pgm_header {
+ uint16_t pgm_sport;
+ uint16_t pgm_dport;
+ uint8_t pgm_type;
+ uint8_t pgm_options;
+ uint16_t pgm_sum;
+ uint8_t pgm_gsid[6];
+ uint16_t pgm_length;
+};
+
+struct pgm_spm {
+ uint32_t pgms_seq;
+ uint32_t pgms_trailseq;
+ uint32_t pgms_leadseq;
+ uint16_t pgms_nla_afi;
+ uint16_t pgms_reserved;
+ /* ... uint8_t pgms_nla[0]; */
+ /* ... options */
+};
+
+struct pgm_nak {
+ uint32_t pgmn_seq;
+ uint16_t pgmn_source_afi;
+ uint16_t pgmn_reserved;
+ /* ... uint8_t pgmn_source[0]; */
+ /* ... uint16_t pgmn_group_afi */
+ /* ... uint16_t pgmn_reserved2; */
+ /* ... uint8_t pgmn_group[0]; */
+ /* ... options */
+};
+
+struct pgm_ack {
+ uint32_t pgma_rx_max_seq;
+ uint32_t pgma_bitmap;
+ /* ... options */
+};
+
+struct pgm_poll {
+ uint32_t pgmp_seq;
+ uint16_t pgmp_round;
+ uint16_t pgmp_reserved;
+ /* ... options */
+};
+
+struct pgm_polr {
+ uint32_t pgmp_seq;
+ uint16_t pgmp_round;
+ uint16_t pgmp_subtype;
+ uint16_t pgmp_nla_afi;
+ uint16_t pgmp_reserved;
+ /* ... uint8_t pgmp_nla[0]; */
+ /* ... options */
+};
+
+struct pgm_data {
+ uint32_t pgmd_seq;
+ uint32_t pgmd_trailseq;
+ /* ... options */
+};
+
+typedef enum _pgm_type {
+ PGM_SPM = 0, /* source path message */
+ PGM_POLL = 1, /* POLL Request */
+ PGM_POLR = 2, /* POLL Response */
+ PGM_ODATA = 4, /* original data */
+ PGM_RDATA = 5, /* repair data */
+ PGM_NAK = 8, /* NAK */
+ PGM_NULLNAK = 9, /* Null NAK */
+ PGM_NCF = 10, /* NAK Confirmation */
+ PGM_ACK = 11, /* ACK for congestion control */
+ PGM_SPMR = 12, /* SPM request */
+ PGM_MAX = 255
+} pgm_type;
+
+#define PGM_OPT_BIT_PRESENT 0x01
+#define PGM_OPT_BIT_NETWORK 0x02
+#define PGM_OPT_BIT_VAR_PKTLEN 0x40
+#define PGM_OPT_BIT_PARITY 0x80
+
+#define PGM_OPT_LENGTH 0x00
+#define PGM_OPT_FRAGMENT 0x01
+#define PGM_OPT_NAK_LIST 0x02
+#define PGM_OPT_JOIN 0x03
+#define PGM_OPT_NAK_BO_IVL 0x04
+#define PGM_OPT_NAK_BO_RNG 0x05
+
+#define PGM_OPT_REDIRECT 0x07
+#define PGM_OPT_PARITY_PRM 0x08
+#define PGM_OPT_PARITY_GRP 0x09
+#define PGM_OPT_CURR_TGSIZE 0x0A
+#define PGM_OPT_NBR_UNREACH 0x0B
+#define PGM_OPT_PATH_NLA 0x0C
+
+#define PGM_OPT_SYN 0x0D
+#define PGM_OPT_FIN 0x0E
+#define PGM_OPT_RST 0x0F
+#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 */
+
+#define PGM_MIN_OPT_LEN 4
+
+void
+pgm_print(netdissect_options *ndo,
+ register const u_char *bp, register u_int length,
+ register const u_char *bp2)
+{
+ register const struct pgm_header *pgm;
+ register const struct ip *ip;
+ register char ch;
+ uint16_t sport, dport;
+ int addr_size;
+ const void *nla;
+ int nla_af;
+#ifdef INET6
+ char nla_buf[INET6_ADDRSTRLEN];
+ register const struct ip6_hdr *ip6;
+#else
+ char nla_buf[INET_ADDRSTRLEN];
+#endif
+ uint8_t opt_type, opt_len;
+ uint32_t seq, opts_len, len, offset;
+
+ pgm = (struct pgm_header *)bp;
+ ip = (struct ip *)bp2;
+#ifdef INET6
+ if (IP_V(ip) == 6)
+ ip6 = (struct ip6_hdr *)bp2;
+ else
+ ip6 = NULL;
+#else /* INET6 */
+ if (IP_V(ip) == 6) {
+ ND_PRINT((ndo, "Can't handle IPv6"));
+ return;
+ }
+#endif /* INET6 */
+ ch = '\0';
+ if (!ND_TTEST(pgm->pgm_dport)) {
+#ifdef INET6
+ if (ip6) {
+ ND_PRINT((ndo, "%s > %s: [|pgm]",
+ ip6addr_string(ndo, &ip6->ip6_src),
+ ip6addr_string(ndo, &ip6->ip6_dst)));
+ return;
+ } else
+#endif /* INET6 */
+ {
+ ND_PRINT((ndo, "%s > %s: [|pgm]",
+ ipaddr_string(ndo, &ip->ip_src),
+ ipaddr_string(ndo, &ip->ip_dst)));
+ return;
+ }
+ }
+
+ sport = EXTRACT_16BITS(&pgm->pgm_sport);
+ dport = EXTRACT_16BITS(&pgm->pgm_dport);
+
+#ifdef INET6
+ if (ip6) {
+ if (ip6->ip6_nxt == IPPROTO_PGM) {
+ ND_PRINT((ndo, "%s.%s > %s.%s: ",
+ ip6addr_string(ndo, &ip6->ip6_src),
+ tcpport_string(sport),
+ ip6addr_string(ndo, &ip6->ip6_dst),
+ tcpport_string(dport)));
+ } else {
+ ND_PRINT((ndo, "%s > %s: ",
+ tcpport_string(sport), tcpport_string(dport)));
+ }
+ } else
+#endif /*INET6*/
+ {
+ if (ip->ip_p == IPPROTO_PGM) {
+ ND_PRINT((ndo, "%s.%s > %s.%s: ",
+ ipaddr_string(ndo, &ip->ip_src),
+ tcpport_string(sport),
+ ipaddr_string(ndo, &ip->ip_dst),
+ tcpport_string(dport)));
+ } else {
+ ND_PRINT((ndo, "%s > %s: ",
+ tcpport_string(sport), tcpport_string(dport)));
+ }
+ }
+
+ ND_TCHECK(*pgm);
+
+ ND_PRINT((ndo, "PGM, length %u", EXTRACT_16BITS(&pgm->pgm_length)));
+
+ if (!ndo->ndo_vflag)
+ return;
+
+ ND_PRINT((ndo, " 0x%02x%02x%02x%02x%02x%02x ",
+ pgm->pgm_gsid[0],
+ pgm->pgm_gsid[1],
+ pgm->pgm_gsid[2],
+ pgm->pgm_gsid[3],
+ pgm->pgm_gsid[4],
+ pgm->pgm_gsid[5]));
+ switch (pgm->pgm_type) {
+ case PGM_SPM: {
+ struct pgm_spm *spm;
+
+ spm = (struct pgm_spm *)(pgm + 1);
+ ND_TCHECK(*spm);
+
+ switch (EXTRACT_16BITS(&spm->pgms_nla_afi)) {
+ case AFNUM_INET:
+ addr_size = sizeof(struct in_addr);
+ nla_af = AF_INET;
+ break;
+#ifdef INET6
+ case AFNUM_INET6:
+ addr_size = sizeof(struct in6_addr);
+ nla_af = AF_INET6;
+ break;
+#endif
+ default:
+ goto trunc;
+ break;
+ }
+ bp = (u_char *) (spm + 1);
+ ND_TCHECK2(*bp, addr_size);
+ nla = bp;
+ bp += addr_size;
+
+ inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf));
+ ND_PRINT((ndo, "SPM seq %u trail %u lead %u nla %s",
+ EXTRACT_32BITS(&spm->pgms_seq),
+ EXTRACT_32BITS(&spm->pgms_trailseq),
+ EXTRACT_32BITS(&spm->pgms_leadseq),
+ nla_buf));
+ break;
+ }
+
+ case PGM_POLL: {
+ struct pgm_poll *poll;
+
+ poll = (struct pgm_poll *)(pgm + 1);
+ ND_TCHECK(*poll);
+ ND_PRINT((ndo, "POLL seq %u round %u",
+ EXTRACT_32BITS(&poll->pgmp_seq),
+ EXTRACT_16BITS(&poll->pgmp_round)));
+ bp = (u_char *) (poll + 1);
+ break;
+ }
+ case PGM_POLR: {
+ struct pgm_polr *polr;
+ uint32_t ivl, rnd, mask;
+
+ polr = (struct pgm_polr *)(pgm + 1);
+ ND_TCHECK(*polr);
+
+ switch (EXTRACT_16BITS(&polr->pgmp_nla_afi)) {
+ case AFNUM_INET:
+ addr_size = sizeof(struct in_addr);
+ nla_af = AF_INET;
+ break;
+#ifdef INET6
+ case AFNUM_INET6:
+ addr_size = sizeof(struct in6_addr);
+ nla_af = AF_INET6;
+ break;
+#endif
+ default:
+ goto trunc;
+ break;
+ }
+ bp = (u_char *) (polr + 1);
+ ND_TCHECK2(*bp, addr_size);
+ nla = bp;
+ bp += addr_size;
+
+ inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf));
+
+ ND_TCHECK2(*bp, sizeof(uint32_t));
+ ivl = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+
+ ND_TCHECK2(*bp, sizeof(uint32_t));
+ rnd = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+
+ ND_TCHECK2(*bp, sizeof(uint32_t));
+ mask = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+
+ ND_PRINT((ndo, "POLR seq %u round %u nla %s ivl %u rnd 0x%08x "
+ "mask 0x%08x", EXTRACT_32BITS(&polr->pgmp_seq),
+ EXTRACT_16BITS(&polr->pgmp_round), nla_buf, ivl, rnd, mask));
+ break;
+ }
+ case PGM_ODATA: {
+ struct pgm_data *odata;
+
+ odata = (struct pgm_data *)(pgm + 1);
+ ND_TCHECK(*odata);
+ ND_PRINT((ndo, "ODATA trail %u seq %u",
+ EXTRACT_32BITS(&odata->pgmd_trailseq),
+ EXTRACT_32BITS(&odata->pgmd_seq)));
+ bp = (u_char *) (odata + 1);
+ break;
+ }
+
+ case PGM_RDATA: {
+ struct pgm_data *rdata;
+
+ rdata = (struct pgm_data *)(pgm + 1);
+ ND_TCHECK(*rdata);
+ ND_PRINT((ndo, "RDATA trail %u seq %u",
+ EXTRACT_32BITS(&rdata->pgmd_trailseq),
+ EXTRACT_32BITS(&rdata->pgmd_seq)));
+ bp = (u_char *) (rdata + 1);
+ break;
+ }
+
+ case PGM_NAK:
+ case PGM_NULLNAK:
+ case PGM_NCF: {
+ struct pgm_nak *nak;
+ const void *source, *group;
+ int source_af, group_af;
+#ifdef INET6
+ char source_buf[INET6_ADDRSTRLEN], group_buf[INET6_ADDRSTRLEN];
+#else
+ char source_buf[INET_ADDRSTRLEN], group_buf[INET_ADDRSTRLEN];
+#endif
+
+ nak = (struct pgm_nak *)(pgm + 1);
+ ND_TCHECK(*nak);
+
+ /*
+ * Skip past the source, saving info along the way
+ * and stopping if we don't have enough.
+ */
+ switch (EXTRACT_16BITS(&nak->pgmn_source_afi)) {
+ case AFNUM_INET:
+ addr_size = sizeof(struct in_addr);
+ source_af = AF_INET;
+ break;
+#ifdef INET6
+ case AFNUM_INET6:
+ addr_size = sizeof(struct in6_addr);
+ source_af = AF_INET6;
+ break;
+#endif
+ default:
+ goto trunc;
+ break;
+ }
+ bp = (u_char *) (nak + 1);
+ ND_TCHECK2(*bp, addr_size);
+ source = bp;
+ bp += addr_size;
+
+ /*
+ * Skip past the group, saving info along the way
+ * and stopping if we don't have enough.
+ */
+ switch (EXTRACT_16BITS(bp)) {
+ case AFNUM_INET:
+ addr_size = sizeof(struct in_addr);
+ group_af = AF_INET;
+ break;
+#ifdef INET6
+ case AFNUM_INET6:
+ addr_size = sizeof(struct in6_addr);
+ group_af = AF_INET6;
+ break;
+#endif
+ default:
+ goto trunc;
+ break;
+ }
+ bp += (2 * sizeof(uint16_t));
+ ND_TCHECK2(*bp, addr_size);
+ group = bp;
+ bp += addr_size;
+
+ /*
+ * Options decoding can go here.
+ */
+ inet_ntop(source_af, source, source_buf, sizeof(source_buf));
+ inet_ntop(group_af, group, group_buf, sizeof(group_buf));
+ switch (pgm->pgm_type) {
+ case PGM_NAK:
+ ND_PRINT((ndo, "NAK "));
+ break;
+ case PGM_NULLNAK:
+ ND_PRINT((ndo, "NNAK "));
+ break;
+ case PGM_NCF:
+ ND_PRINT((ndo, "NCF "));
+ break;
+ default:
+ break;
+ }
+ ND_PRINT((ndo, "(%s -> %s), seq %u",
+ source_buf, group_buf, EXTRACT_32BITS(&nak->pgmn_seq)));
+ break;
+ }
+
+ case PGM_ACK: {
+ struct pgm_ack *ack;
+
+ ack = (struct pgm_ack *)(pgm + 1);
+ ND_TCHECK(*ack);
+ ND_PRINT((ndo, "ACK seq %u",
+ EXTRACT_32BITS(&ack->pgma_rx_max_seq)));
+ bp = (u_char *) (ack + 1);
+ break;
+ }
+
+ case PGM_SPMR:
+ ND_PRINT((ndo, "SPMR"));
+ break;
+
+ default:
+ ND_PRINT((ndo, "UNKNOWN type 0x%02x", pgm->pgm_type));
+ break;
+
+ }
+ if (pgm->pgm_options & PGM_OPT_BIT_PRESENT) {
+
+ /*
+ * make sure there's enough for the first option header
+ */
+ if (!ND_TTEST2(*bp, PGM_MIN_OPT_LEN)) {
+ ND_PRINT((ndo, "[|OPT]"));
+ return;
+ }
+
+ /*
+ * That option header MUST be an OPT_LENGTH option
+ * (see the first paragraph of section 9.1 in RFC 3208).
+ */
+ opt_type = *bp++;
+ if ((opt_type & PGM_OPT_MASK) != PGM_OPT_LENGTH) {
+ ND_PRINT((ndo, "[First option bad, should be PGM_OPT_LENGTH, is %u]", opt_type & PGM_OPT_MASK));
+ return;
+ }
+ opt_len = *bp++;
+ if (opt_len != 4) {
+ ND_PRINT((ndo, "[Bad OPT_LENGTH option, length %u != 4]", opt_len));
+ return;
+ }
+ opts_len = EXTRACT_16BITS(bp);
+ if (opts_len < 4) {
+ ND_PRINT((ndo, "[Bad total option length %u < 4]", opts_len));
+ return;
+ }
+ bp += sizeof(uint16_t);
+ ND_PRINT((ndo, " OPTS LEN %d", opts_len));
+ opts_len -= 4;
+
+ while (opts_len) {
+ if (opts_len < PGM_MIN_OPT_LEN) {
+ ND_PRINT((ndo, "[Total option length leaves no room for final option]"));
+ return;
+ }
+ opt_type = *bp++;
+ opt_len = *bp++;
+ if (opt_len < PGM_MIN_OPT_LEN) {
+ ND_PRINT((ndo, "[Bad option, length %u < %u]", opt_len,
+ PGM_MIN_OPT_LEN));
+ break;
+ }
+ if (opts_len < opt_len) {
+ ND_PRINT((ndo, "[Total option length leaves no room for final option]"));
+ return;
+ }
+ if (!ND_TTEST2(*bp, opt_len - 2)) {
+ ND_PRINT((ndo, " [|OPT]"));
+ return;
+ }
+
+ switch (opt_type & PGM_OPT_MASK) {
+ case PGM_OPT_LENGTH:
+ if (opt_len != 4) {
+ ND_PRINT((ndo, "[Bad OPT_LENGTH option, length %u != 4]", opt_len));
+ return;
+ }
+ ND_PRINT((ndo, " OPTS LEN (extra?) %d", EXTRACT_16BITS(bp)));
+ bp += sizeof(uint16_t);
+ opts_len -= 4;
+ break;
+
+ case PGM_OPT_FRAGMENT:
+ if (opt_len != 16) {
+ ND_PRINT((ndo, "[Bad OPT_FRAGMENT option, length %u != 16]", opt_len));
+ return;
+ }
+ bp += 2;
+ seq = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+ offset = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+ len = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+ ND_PRINT((ndo, " FRAG seq %u off %u len %u", seq, offset, len));
+ opts_len -= 16;
+ break;
+
+ case PGM_OPT_NAK_LIST:
+ bp += 2;
+ opt_len -= sizeof(uint32_t); /* option header */
+ ND_PRINT((ndo, " NAK LIST"));
+ while (opt_len) {
+ if (opt_len < sizeof(uint32_t)) {
+ ND_PRINT((ndo, "[Option length not a multiple of 4]"));
+ return;
+ }
+ ND_TCHECK2(*bp, sizeof(uint32_t));
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(bp)));
+ bp += sizeof(uint32_t);
+ opt_len -= sizeof(uint32_t);
+ opts_len -= sizeof(uint32_t);
+ }
+ break;
+
+ case PGM_OPT_JOIN:
+ if (opt_len != 8) {
+ ND_PRINT((ndo, "[Bad OPT_JOIN option, length %u != 8]", opt_len));
+ return;
+ }
+ bp += 2;
+ seq = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+ ND_PRINT((ndo, " JOIN %u", seq));
+ opts_len -= 8;
+ break;
+
+ case PGM_OPT_NAK_BO_IVL:
+ if (opt_len != 12) {
+ ND_PRINT((ndo, "[Bad OPT_NAK_BO_IVL option, length %u != 12]", opt_len));
+ return;
+ }
+ bp += 2;
+ offset = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+ seq = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+ ND_PRINT((ndo, " BACKOFF ivl %u ivlseq %u", offset, seq));
+ opts_len -= 12;
+ break;
+
+ case PGM_OPT_NAK_BO_RNG:
+ if (opt_len != 12) {
+ ND_PRINT((ndo, "[Bad OPT_NAK_BO_RNG option, length %u != 12]", opt_len));
+ return;
+ }
+ bp += 2;
+ offset = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+ seq = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+ ND_PRINT((ndo, " BACKOFF max %u min %u", offset, seq));
+ opts_len -= 12;
+ break;
+
+ case PGM_OPT_REDIRECT:
+ bp += 2;
+ switch (EXTRACT_16BITS(bp)) {
+ case AFNUM_INET:
+ addr_size = sizeof(struct in_addr);
+ nla_af = AF_INET;
+ break;
+#ifdef INET6
+ case AFNUM_INET6:
+ addr_size = sizeof(struct in6_addr);
+ nla_af = AF_INET6;
+ break;
+#endif
+ default:
+ goto trunc;
+ break;
+ }
+ bp += (2 * sizeof(uint16_t));
+ if (opt_len != 4 + addr_size) {
+ ND_PRINT((ndo, "[Bad OPT_REDIRECT option, length %u != 4 + address size]", opt_len));
+ return;
+ }
+ ND_TCHECK2(*bp, addr_size);
+ nla = bp;
+ bp += addr_size;
+
+ inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf));
+ ND_PRINT((ndo, " REDIRECT %s", (char *)nla));
+ opts_len -= 4 + addr_size;
+ break;
+
+ case PGM_OPT_PARITY_PRM:
+ if (opt_len != 8) {
+ ND_PRINT((ndo, "[Bad OPT_PARITY_PRM option, length %u != 8]", opt_len));
+ return;
+ }
+ bp += 2;
+ len = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+ ND_PRINT((ndo, " PARITY MAXTGS %u", len));
+ opts_len -= 8;
+ break;
+
+ case PGM_OPT_PARITY_GRP:
+ if (opt_len != 8) {
+ ND_PRINT((ndo, "[Bad OPT_PARITY_GRP option, length %u != 8]", opt_len));
+ return;
+ }
+ bp += 2;
+ seq = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+ ND_PRINT((ndo, " PARITY GROUP %u", seq));
+ opts_len -= 8;
+ break;
+
+ case PGM_OPT_CURR_TGSIZE:
+ if (opt_len != 8) {
+ ND_PRINT((ndo, "[Bad OPT_CURR_TGSIZE option, length %u != 8]", opt_len));
+ return;
+ }
+ bp += 2;
+ len = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+ ND_PRINT((ndo, " PARITY ATGS %u", len));
+ opts_len -= 8;
+ break;
+
+ case PGM_OPT_NBR_UNREACH:
+ if (opt_len != 4) {
+ ND_PRINT((ndo, "[Bad OPT_NBR_UNREACH option, length %u != 4]", opt_len));
+ return;
+ }
+ bp += 2;
+ ND_PRINT((ndo, " NBR_UNREACH"));
+ opts_len -= 4;
+ break;
+
+ case PGM_OPT_PATH_NLA:
+ ND_PRINT((ndo, " PATH_NLA [%d]", opt_len));
+ bp += opt_len;
+ opts_len -= opt_len;
+ break;
+
+ case PGM_OPT_SYN:
+ if (opt_len != 4) {
+ ND_PRINT((ndo, "[Bad OPT_SYN option, length %u != 4]", opt_len));
+ return;
+ }
+ bp += 2;
+ ND_PRINT((ndo, " SYN"));
+ opts_len -= 4;
+ break;
+
+ case PGM_OPT_FIN:
+ if (opt_len != 4) {
+ ND_PRINT((ndo, "[Bad OPT_FIN option, length %u != 4]", opt_len));
+ return;
+ }
+ bp += 2;
+ ND_PRINT((ndo, " FIN"));
+ opts_len -= 4;
+ break;
+
+ case PGM_OPT_RST:
+ if (opt_len != 4) {
+ ND_PRINT((ndo, "[Bad OPT_RST option, length %u != 4]", opt_len));
+ return;
+ }
+ bp += 2;
+ ND_PRINT((ndo, " RST"));
+ opts_len -= 4;
+ break;
+
+ case PGM_OPT_CR:
+ ND_PRINT((ndo, " CR"));
+ bp += opt_len;
+ opts_len -= opt_len;
+ break;
+
+ case PGM_OPT_CRQST:
+ if (opt_len != 4) {
+ ND_PRINT((ndo, "[Bad OPT_CRQST option, length %u != 4]", opt_len));
+ return;
+ }
+ bp += 2;
+ ND_PRINT((ndo, " CRQST"));
+ opts_len -= 4;
+ break;
+
+ case PGM_OPT_PGMCC_DATA:
+ bp += 2;
+ offset = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+ switch (EXTRACT_16BITS(bp)) {
+ case AFNUM_INET:
+ addr_size = sizeof(struct in_addr);
+ nla_af = AF_INET;
+ break;
+#ifdef INET6
+ case AFNUM_INET6:
+ addr_size = sizeof(struct in6_addr);
+ nla_af = AF_INET6;
+ break;
+#endif
+ default:
+ goto trunc;
+ break;
+ }
+ bp += (2 * sizeof(uint16_t));
+ if (opt_len != 12 + addr_size) {
+ ND_PRINT((ndo, "[Bad OPT_PGMCC_DATA option, length %u != 12 + address size]", opt_len));
+ return;
+ }
+ ND_TCHECK2(*bp, addr_size);
+ nla = bp;
+ bp += addr_size;
+
+ inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf));
+ ND_PRINT((ndo, " PGMCC DATA %u %s", offset, (char*)nla));
+ opts_len -= 16;
+ break;
+
+ case PGM_OPT_PGMCC_FEEDBACK:
+ bp += 2;
+ offset = EXTRACT_32BITS(bp);
+ bp += sizeof(uint32_t);
+ switch (EXTRACT_16BITS(bp)) {
+ case AFNUM_INET:
+ addr_size = sizeof(struct in_addr);
+ nla_af = AF_INET;
+ break;
+#ifdef INET6
+ case AFNUM_INET6:
+ addr_size = sizeof(struct in6_addr);
+ nla_af = AF_INET6;
+ break;
+#endif
+ default:
+ goto trunc;
+ break;
+ }
+ bp += (2 * sizeof(uint16_t));
+ if (opt_len != 12 + addr_size) {
+ ND_PRINT((ndo, "[Bad OPT_PGMCC_FEEDBACK option, length %u != 12 + address size]", opt_len));
+ return;
+ }
+ ND_TCHECK2(*bp, addr_size);
+ nla = bp;
+ bp += addr_size;
+
+ inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf));
+ ND_PRINT((ndo, " PGMCC FEEDBACK %u %s", offset, (char*)nla));
+ opts_len -= 16;
+ break;
+
+ default:
+ ND_PRINT((ndo, " OPT_%02X [%d] ", opt_type, opt_len));
+ bp += opt_len;
+ opts_len -= opt_len;
+ break;
+ }
+
+ if (opt_type & PGM_OPT_END)
+ break;
+ }
+ }
+
+ ND_PRINT((ndo, " [%u]", length));
+ if (ndo->ndo_packettype == PT_PGM_ZMTP1 &&
+ (pgm->pgm_type == PGM_ODATA || pgm->pgm_type == PGM_RDATA))
+ zmtp1_print_datagram(ndo, bp, EXTRACT_16BITS(&pgm->pgm_length));
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|pgm]"));
+ if (ch != '\0')
+ ND_PRINT((ndo, ">"));
+}
--- /dev/null
+/*
+ * Copyright (c) 1995, 1996
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-pim.c,v 1.7 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#include "ip.h"
+
+#define PIMV1_TYPE_QUERY 0
+#define PIMV1_TYPE_REGISTER 1
+#define PIMV1_TYPE_REGISTER_STOP 2
+#define PIMV1_TYPE_JOIN_PRUNE 3
+#define PIMV1_TYPE_RP_REACHABILITY 4
+#define PIMV1_TYPE_ASSERT 5
+#define PIMV1_TYPE_GRAFT 6
+#define PIMV1_TYPE_GRAFT_ACK 7
+
+static const struct tok pimv1_type_str[] = {
+ { PIMV1_TYPE_QUERY, "Query" },
+ { PIMV1_TYPE_REGISTER, "Register" },
+ { PIMV1_TYPE_REGISTER_STOP, "Register-Stop" },
+ { PIMV1_TYPE_JOIN_PRUNE, "Join/Prune" },
+ { PIMV1_TYPE_RP_REACHABILITY, "RP-reachable" },
+ { PIMV1_TYPE_ASSERT, "Assert" },
+ { PIMV1_TYPE_GRAFT, "Graft" },
+ { PIMV1_TYPE_GRAFT_ACK, "Graft-ACK" },
+ { 0, NULL }
+};
+
+#define PIMV2_TYPE_HELLO 0
+#define PIMV2_TYPE_REGISTER 1
+#define PIMV2_TYPE_REGISTER_STOP 2
+#define PIMV2_TYPE_JOIN_PRUNE 3
+#define PIMV2_TYPE_BOOTSTRAP 4
+#define PIMV2_TYPE_ASSERT 5
+#define PIMV2_TYPE_GRAFT 6
+#define PIMV2_TYPE_GRAFT_ACK 7
+#define PIMV2_TYPE_CANDIDATE_RP 8
+#define PIMV2_TYPE_PRUNE_REFRESH 9
+#define PIMV2_TYPE_DF_ELECTION 10
+#define PIMV2_TYPE_ECMP_REDIRECT 11
+
+static const struct tok pimv2_type_values[] = {
+ { PIMV2_TYPE_HELLO, "Hello" },
+ { PIMV2_TYPE_REGISTER, "Register" },
+ { PIMV2_TYPE_REGISTER_STOP, "Register Stop" },
+ { PIMV2_TYPE_JOIN_PRUNE, "Join / Prune" },
+ { PIMV2_TYPE_BOOTSTRAP, "Bootstrap" },
+ { PIMV2_TYPE_ASSERT, "Assert" },
+ { PIMV2_TYPE_GRAFT, "Graft" },
+ { PIMV2_TYPE_GRAFT_ACK, "Graft Acknowledgement" },
+ { PIMV2_TYPE_CANDIDATE_RP, "Candidate RP Advertisement" },
+ { PIMV2_TYPE_PRUNE_REFRESH, "Prune Refresh" },
+ { PIMV2_TYPE_DF_ELECTION, "DF Election" },
+ { PIMV2_TYPE_ECMP_REDIRECT, "ECMP Redirect" },
+ { 0, NULL}
+};
+
+#define PIMV2_HELLO_OPTION_HOLDTIME 1
+#define PIMV2_HELLO_OPTION_LANPRUNEDELAY 2
+#define PIMV2_HELLO_OPTION_DR_PRIORITY_OLD 18
+#define PIMV2_HELLO_OPTION_DR_PRIORITY 19
+#define PIMV2_HELLO_OPTION_GENID 20
+#define PIMV2_HELLO_OPTION_REFRESH_CAP 21
+#define PIMV2_HELLO_OPTION_BIDIR_CAP 22
+#define PIMV2_HELLO_OPTION_ADDRESS_LIST 24
+#define PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD 65001
+
+static const struct tok pimv2_hello_option_values[] = {
+ { PIMV2_HELLO_OPTION_HOLDTIME, "Hold Time" },
+ { PIMV2_HELLO_OPTION_LANPRUNEDELAY, "LAN Prune Delay" },
+ { PIMV2_HELLO_OPTION_DR_PRIORITY_OLD, "DR Priority (Old)" },
+ { PIMV2_HELLO_OPTION_DR_PRIORITY, "DR Priority" },
+ { PIMV2_HELLO_OPTION_GENID, "Generation ID" },
+ { PIMV2_HELLO_OPTION_REFRESH_CAP, "State Refresh Capability" },
+ { PIMV2_HELLO_OPTION_BIDIR_CAP, "Bi-Directional Capability" },
+ { PIMV2_HELLO_OPTION_ADDRESS_LIST, "Address List" },
+ { PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD, "Address List (Old)" },
+ { 0, NULL}
+};
+
+#define PIMV2_REGISTER_FLAG_LEN 4
+#define PIMV2_REGISTER_FLAG_BORDER 0x80000000
+#define PIMV2_REGISTER_FLAG_NULL 0x40000000
+
+static const struct tok pimv2_register_flag_values[] = {
+ { PIMV2_REGISTER_FLAG_BORDER, "Border" },
+ { PIMV2_REGISTER_FLAG_NULL, "Null" },
+ { 0, NULL}
+};
+
+/*
+ * XXX: We consider a case where IPv6 is not ready yet for portability,
+ * but PIM dependent defintions should be independent of IPv6...
+ */
+
+struct pim {
+ uint8_t pim_typever;
+ /* upper 4bit: PIM version number; 2 for PIMv2 */
+ /* lower 4bit: the PIM message type, currently they are:
+ * Hello, Register, Register-Stop, Join/Prune,
+ * Bootstrap, Assert, Graft (PIM-DM only),
+ * Graft-Ack (PIM-DM only), C-RP-Adv
+ */
+#define PIM_VER(x) (((x) & 0xf0) >> 4)
+#define PIM_TYPE(x) ((x) & 0x0f)
+ u_char pim_rsv; /* Reserved */
+ u_short pim_cksum; /* IP style check sum */
+};
+
+static void pimv2_print(netdissect_options *, register const u_char *bp, register u_int len, u_int cksum);
+
+static void
+pimv1_join_prune_print(netdissect_options *ndo,
+ register const u_char *bp, register u_int len)
+{
+ int ngroups, njoin, nprune;
+ int njp;
+
+ /* If it's a single group and a single source, use 1-line output. */
+ if (ND_TTEST2(bp[0], 30) && bp[11] == 1 &&
+ ((njoin = EXTRACT_16BITS(&bp[20])) + EXTRACT_16BITS(&bp[22])) == 1) {
+ int hold;
+
+ ND_PRINT((ndo, " RPF %s ", ipaddr_string(ndo, bp)));
+ hold = EXTRACT_16BITS(&bp[6]);
+ if (hold != 180) {
+ ND_PRINT((ndo, "Hold "));
+ relts_print(ndo, hold);
+ }
+ ND_PRINT((ndo, "%s (%s/%d, %s", njoin ? "Join" : "Prune",
+ ipaddr_string(ndo, &bp[26]), bp[25] & 0x3f,
+ ipaddr_string(ndo, &bp[12])));
+ if (EXTRACT_32BITS(&bp[16]) != 0xffffffff)
+ ND_PRINT((ndo, "/%s", ipaddr_string(ndo, &bp[16])));
+ ND_PRINT((ndo, ") %s%s %s",
+ (bp[24] & 0x01) ? "Sparse" : "Dense",
+ (bp[25] & 0x80) ? " WC" : "",
+ (bp[25] & 0x40) ? "RP" : "SPT"));
+ return;
+ }
+
+ ND_TCHECK2(bp[0], sizeof(struct in_addr));
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, "\n"));
+ ND_PRINT((ndo, " Upstream Nbr: %s", ipaddr_string(ndo, bp)));
+ ND_TCHECK2(bp[6], 2);
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, "\n"));
+ ND_PRINT((ndo, " Hold time: "));
+ relts_print(ndo, EXTRACT_16BITS(&bp[6]));
+ if (ndo->ndo_vflag < 2)
+ return;
+ bp += 8;
+ len -= 8;
+
+ ND_TCHECK2(bp[0], 4);
+ ngroups = bp[3];
+ bp += 4;
+ len -= 4;
+ while (ngroups--) {
+ /*
+ * XXX - does the address have length "addrlen" and the
+ * mask length "maddrlen"?
+ */
+ ND_TCHECK2(bp[0], sizeof(struct in_addr));
+ ND_PRINT((ndo, "\n\tGroup: %s", ipaddr_string(ndo, bp)));
+ ND_TCHECK2(bp[4], sizeof(struct in_addr));
+ if (EXTRACT_32BITS(&bp[4]) != 0xffffffff)
+ ND_PRINT((ndo, "/%s", ipaddr_string(ndo, &bp[4])));
+ ND_TCHECK2(bp[8], 4);
+ njoin = EXTRACT_16BITS(&bp[8]);
+ nprune = EXTRACT_16BITS(&bp[10]);
+ ND_PRINT((ndo, " joined: %d pruned: %d", njoin, nprune));
+ bp += 12;
+ len -= 12;
+ for (njp = 0; njp < (njoin + nprune); njp++) {
+ const char *type;
+
+ if (njp < njoin)
+ type = "Join ";
+ else
+ type = "Prune";
+ ND_TCHECK2(bp[0], 6);
+ ND_PRINT((ndo, "\n\t%s %s%s%s%s/%d", type,
+ (bp[0] & 0x01) ? "Sparse " : "Dense ",
+ (bp[1] & 0x80) ? "WC " : "",
+ (bp[1] & 0x40) ? "RP " : "SPT ",
+ ipaddr_string(ndo, &bp[2]), bp[1] & 0x3f));
+ bp += 6;
+ len -= 6;
+ }
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "[|pim]"));
+ return;
+}
+
+void
+pimv1_print(netdissect_options *ndo,
+ register const u_char *bp, register u_int len)
+{
+ register const u_char *ep;
+ register u_char type;
+
+ ep = (const u_char *)ndo->ndo_snapend;
+ if (bp >= ep)
+ return;
+
+ ND_TCHECK(bp[1]);
+ type = bp[1];
+
+ ND_PRINT((ndo, " %s", tok2str(pimv1_type_str, "[type %u]", type)));
+ switch (type) {
+ case PIMV1_TYPE_QUERY:
+ if (ND_TTEST(bp[8])) {
+ switch (bp[8] >> 4) {
+ case 0:
+ ND_PRINT((ndo, " Dense-mode"));
+ break;
+ case 1:
+ ND_PRINT((ndo, " Sparse-mode"));
+ break;
+ case 2:
+ ND_PRINT((ndo, " Sparse-Dense-mode"));
+ break;
+ default:
+ ND_PRINT((ndo, " mode-%d", bp[8] >> 4));
+ break;
+ }
+ }
+ if (ndo->ndo_vflag) {
+ ND_TCHECK2(bp[10],2);
+ ND_PRINT((ndo, " (Hold-time "));
+ relts_print(ndo, EXTRACT_16BITS(&bp[10]));
+ ND_PRINT((ndo, ")"));
+ }
+ break;
+
+ case PIMV1_TYPE_REGISTER:
+ ND_TCHECK2(bp[8], 20); /* ip header */
+ ND_PRINT((ndo, " for %s > %s", ipaddr_string(ndo, &bp[20]),
+ ipaddr_string(ndo, &bp[24])));
+ break;
+ case PIMV1_TYPE_REGISTER_STOP:
+ ND_TCHECK2(bp[12], sizeof(struct in_addr));
+ ND_PRINT((ndo, " for %s > %s", ipaddr_string(ndo, &bp[8]),
+ ipaddr_string(ndo, &bp[12])));
+ break;
+ case PIMV1_TYPE_RP_REACHABILITY:
+ if (ndo->ndo_vflag) {
+ ND_TCHECK2(bp[22], 2);
+ ND_PRINT((ndo, " group %s", ipaddr_string(ndo, &bp[8])));
+ if (EXTRACT_32BITS(&bp[12]) != 0xffffffff)
+ ND_PRINT((ndo, "/%s", ipaddr_string(ndo, &bp[12])));
+ ND_PRINT((ndo, " RP %s hold ", ipaddr_string(ndo, &bp[16])));
+ relts_print(ndo, EXTRACT_16BITS(&bp[22]));
+ }
+ break;
+ case PIMV1_TYPE_ASSERT:
+ ND_TCHECK2(bp[16], sizeof(struct in_addr));
+ ND_PRINT((ndo, " for %s > %s", ipaddr_string(ndo, &bp[16]),
+ ipaddr_string(ndo, &bp[8])));
+ if (EXTRACT_32BITS(&bp[12]) != 0xffffffff)
+ ND_PRINT((ndo, "/%s", ipaddr_string(ndo, &bp[12])));
+ ND_TCHECK2(bp[24], 4);
+ ND_PRINT((ndo, " %s pref %d metric %d",
+ (bp[20] & 0x80) ? "RP-tree" : "SPT",
+ EXTRACT_32BITS(&bp[20]) & 0x7fffffff,
+ EXTRACT_32BITS(&bp[24])));
+ break;
+ case PIMV1_TYPE_JOIN_PRUNE:
+ case PIMV1_TYPE_GRAFT:
+ case PIMV1_TYPE_GRAFT_ACK:
+ if (ndo->ndo_vflag)
+ pimv1_join_prune_print(ndo, &bp[8], len - 8);
+ break;
+ }
+ if ((bp[4] >> 4) != 1)
+ ND_PRINT((ndo, " [v%d]", bp[4] >> 4));
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|pim]"));
+ return;
+}
+
+/*
+ * auto-RP is a cisco protocol, documented at
+ * ftp://ftpeng.cisco.com/ipmulticast/specs/pim-autorp-spec01.txt
+ *
+ * This implements version 1+, dated Sept 9, 1998.
+ */
+void
+cisco_autorp_print(netdissect_options *ndo,
+ register const u_char *bp, register u_int len)
+{
+ int type;
+ int numrps;
+ int hold;
+
+ ND_TCHECK(bp[0]);
+ ND_PRINT((ndo, " auto-rp "));
+ type = bp[0];
+ switch (type) {
+ case 0x11:
+ ND_PRINT((ndo, "candidate-advert"));
+ break;
+ case 0x12:
+ ND_PRINT((ndo, "mapping"));
+ break;
+ default:
+ ND_PRINT((ndo, "type-0x%02x", type));
+ break;
+ }
+
+ ND_TCHECK(bp[1]);
+ numrps = bp[1];
+
+ ND_TCHECK2(bp[2], 2);
+ ND_PRINT((ndo, " Hold "));
+ hold = EXTRACT_16BITS(&bp[2]);
+ if (hold)
+ relts_print(ndo, EXTRACT_16BITS(&bp[2]));
+ else
+ ND_PRINT((ndo, "FOREVER"));
+
+ /* Next 4 bytes are reserved. */
+
+ bp += 8; len -= 8;
+
+ /*XXX skip unless -v? */
+
+ /*
+ * Rest of packet:
+ * numrps entries of the form:
+ * 32 bits: RP
+ * 6 bits: reserved
+ * 2 bits: PIM version supported, bit 0 is "supports v1", 1 is "v2".
+ * 8 bits: # of entries for this RP
+ * each entry: 7 bits: reserved, 1 bit: negative,
+ * 8 bits: mask 32 bits: source
+ * lather, rinse, repeat.
+ */
+ while (numrps--) {
+ int nentries;
+ char s;
+
+ ND_TCHECK2(bp[0], 4);
+ ND_PRINT((ndo, " RP %s", ipaddr_string(ndo, bp)));
+ ND_TCHECK(bp[4]);
+ switch (bp[4] & 0x3) {
+ case 0: ND_PRINT((ndo, " PIMv?"));
+ break;
+ case 1: ND_PRINT((ndo, " PIMv1"));
+ break;
+ case 2: ND_PRINT((ndo, " PIMv2"));
+ break;
+ case 3: ND_PRINT((ndo, " PIMv1+2"));
+ break;
+ }
+ if (bp[4] & 0xfc)
+ ND_PRINT((ndo, " [rsvd=0x%02x]", bp[4] & 0xfc));
+ ND_TCHECK(bp[5]);
+ nentries = bp[5];
+ bp += 6; len -= 6;
+ s = ' ';
+ for (; nentries; nentries--) {
+ ND_TCHECK2(bp[0], 6);
+ ND_PRINT((ndo, "%c%s%s/%d", s, bp[0] & 1 ? "!" : "",
+ ipaddr_string(ndo, &bp[2]), bp[1]));
+ if (bp[0] & 0x02) {
+ ND_PRINT((ndo, " bidir"));
+ }
+ if (bp[0] & 0xfc) {
+ ND_PRINT((ndo, "[rsvd=0x%02x]", bp[0] & 0xfc));
+ }
+ s = ',';
+ bp += 6; len -= 6;
+ }
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|autorp]"));
+ return;
+}
+
+void
+pim_print(netdissect_options *ndo,
+ register const u_char *bp, register u_int len, u_int cksum)
+{
+ register const u_char *ep;
+ register struct pim *pim = (struct pim *)bp;
+
+ ep = (const u_char *)ndo->ndo_snapend;
+ if (bp >= ep)
+ return;
+#ifdef notyet /* currently we see only version and type */
+ ND_TCHECK(pim->pim_rsv);
+#endif
+
+ switch (PIM_VER(pim->pim_typever)) {
+ case 2:
+ if (!ndo->ndo_vflag) {
+ ND_PRINT((ndo, "PIMv%u, %s, length %u",
+ PIM_VER(pim->pim_typever),
+ tok2str(pimv2_type_values,"Unknown Type",PIM_TYPE(pim->pim_typever)),
+ len));
+ return;
+ } else {
+ ND_PRINT((ndo, "PIMv%u, length %u\n\t%s",
+ PIM_VER(pim->pim_typever),
+ len,
+ tok2str(pimv2_type_values,"Unknown Type",PIM_TYPE(pim->pim_typever))));
+ pimv2_print(ndo, bp, len, cksum);
+ }
+ break;
+ default:
+ ND_PRINT((ndo, "PIMv%u, length %u",
+ PIM_VER(pim->pim_typever),
+ len));
+ break;
+ }
+ return;
+}
+
+/*
+ * PIMv2 uses encoded address representations.
+ *
+ * The last PIM-SM I-D before RFC2117 was published specified the
+ * following representation for unicast addresses. However, RFC2117
+ * specified no encoding for unicast addresses with the unicast
+ * address length specified in the header. Therefore, we have to
+ * guess which encoding is being used (Cisco's PIMv2 implementation
+ * uses the non-RFC encoding). RFC2117 turns a previously "Reserved"
+ * field into a 'unicast-address-length-in-bytes' field. We guess
+ * that it's the draft encoding if this reserved field is zero.
+ *
+ * RFC2362 goes back to the encoded format, and calls the addr length
+ * field "reserved" again.
+ *
+ * The first byte is the address family, from:
+ *
+ * 0 Reserved
+ * 1 IP (IP version 4)
+ * 2 IP6 (IP version 6)
+ * 3 NSAP
+ * 4 HDLC (8-bit multidrop)
+ * 5 BBN 1822
+ * 6 802 (includes all 802 media plus Ethernet "canonical format")
+ * 7 E.163
+ * 8 E.164 (SMDS, Frame Relay, ATM)
+ * 9 F.69 (Telex)
+ * 10 X.121 (X.25, Frame Relay)
+ * 11 IPX
+ * 12 Appletalk
+ * 13 Decnet IV
+ * 14 Banyan Vines
+ * 15 E.164 with NSAP format subaddress
+ *
+ * In addition, the second byte is an "Encoding". 0 is the default
+ * encoding for the address family, and no other encodings are currently
+ * specified.
+ *
+ */
+
+static int pimv2_addr_len;
+
+enum pimv2_addrtype {
+ pimv2_unicast, pimv2_group, pimv2_source
+};
+
+/* 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Addr Family | Encoding Type | Unicast Address |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+++++++
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Addr Family | Encoding Type | Reserved | Mask Len |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Group multicast Address |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Addr Family | Encoding Type | Rsrvd |S|W|R| Mask Len |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Source Address |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+static int
+pimv2_addr_print(netdissect_options *ndo,
+ const u_char *bp, enum pimv2_addrtype at, int silent)
+{
+ int af;
+ int len, hdrlen;
+
+ ND_TCHECK(bp[0]);
+
+ if (pimv2_addr_len == 0) {
+ ND_TCHECK(bp[1]);
+ switch (bp[0]) {
+ case 1:
+ af = AF_INET;
+ len = sizeof(struct in_addr);
+ break;
+#ifdef INET6
+ case 2:
+ af = AF_INET6;
+ len = sizeof(struct in6_addr);
+ break;
+#endif
+ default:
+ return -1;
+ }
+ if (bp[1] != 0)
+ return -1;
+ hdrlen = 2;
+ } else {
+ switch (pimv2_addr_len) {
+ case sizeof(struct in_addr):
+ af = AF_INET;
+ break;
+#ifdef INET6
+ case sizeof(struct in6_addr):
+ af = AF_INET6;
+ break;
+#endif
+ default:
+ return -1;
+ break;
+ }
+ len = pimv2_addr_len;
+ hdrlen = 0;
+ }
+
+ bp += hdrlen;
+ switch (at) {
+ case pimv2_unicast:
+ ND_TCHECK2(bp[0], len);
+ if (af == AF_INET) {
+ if (!silent)
+ ND_PRINT((ndo, "%s", ipaddr_string(ndo, bp)));
+ }
+#ifdef INET6
+ else if (af == AF_INET6) {
+ if (!silent)
+ ND_PRINT((ndo, "%s", ip6addr_string(ndo, bp)));
+ }
+#endif
+ return hdrlen + len;
+ case pimv2_group:
+ case pimv2_source:
+ ND_TCHECK2(bp[0], len + 2);
+ if (af == AF_INET) {
+ if (!silent) {
+ ND_PRINT((ndo, "%s", ipaddr_string(ndo, bp + 2)));
+ if (bp[1] != 32)
+ ND_PRINT((ndo, "/%u", bp[1]));
+ }
+ }
+#ifdef INET6
+ else if (af == AF_INET6) {
+ if (!silent) {
+ ND_PRINT((ndo, "%s", ip6addr_string(ndo, bp + 2)));
+ if (bp[1] != 128)
+ ND_PRINT((ndo, "/%u", bp[1]));
+ }
+ }
+#endif
+ if (bp[0] && !silent) {
+ if (at == pimv2_group) {
+ ND_PRINT((ndo, "(0x%02x)", bp[0]));
+ } else {
+ ND_PRINT((ndo, "(%s%s%s",
+ bp[0] & 0x04 ? "S" : "",
+ bp[0] & 0x02 ? "W" : "",
+ bp[0] & 0x01 ? "R" : ""));
+ if (bp[0] & 0xf8) {
+ ND_PRINT((ndo, "+0x%02x", bp[0] & 0xf8));
+ }
+ ND_PRINT((ndo, ")"));
+ }
+ }
+ return hdrlen + 2 + len;
+ default:
+ return -1;
+ }
+trunc:
+ return -1;
+}
+
+static void
+pimv2_print(netdissect_options *ndo,
+ register const u_char *bp, register u_int len, u_int cksum)
+{
+ register const u_char *ep;
+ register struct pim *pim = (struct pim *)bp;
+ int advance;
+
+ ep = (const u_char *)ndo->ndo_snapend;
+ if (bp >= ep)
+ return;
+ if (ep > bp + len)
+ ep = bp + len;
+ ND_TCHECK(pim->pim_rsv);
+ pimv2_addr_len = pim->pim_rsv;
+ if (pimv2_addr_len != 0)
+ ND_PRINT((ndo, ", RFC2117-encoding"));
+
+ ND_PRINT((ndo, ", cksum 0x%04x ", EXTRACT_16BITS(&pim->pim_cksum)));
+ if (EXTRACT_16BITS(&pim->pim_cksum) == 0) {
+ ND_PRINT((ndo, "(unverified)"));
+ } else {
+ ND_PRINT((ndo, "(%scorrect)", ND_TTEST2(bp[0], len) && cksum ? "in" : "" ));
+ }
+
+ switch (PIM_TYPE(pim->pim_typever)) {
+ case PIMV2_TYPE_HELLO:
+ {
+ uint16_t otype, olen;
+ bp += 4;
+ while (bp < ep) {
+ ND_TCHECK2(bp[0], 4);
+ otype = EXTRACT_16BITS(&bp[0]);
+ olen = EXTRACT_16BITS(&bp[2]);
+ ND_TCHECK2(bp[0], 4 + olen);
+ ND_PRINT((ndo, "\n\t %s Option (%u), length %u, Value: ",
+ tok2str(pimv2_hello_option_values, "Unknown", otype),
+ otype,
+ olen));
+ bp += 4;
+
+ switch (otype) {
+ case PIMV2_HELLO_OPTION_HOLDTIME:
+ relts_print(ndo, EXTRACT_16BITS(bp));
+ break;
+
+ case PIMV2_HELLO_OPTION_LANPRUNEDELAY:
+ if (olen != 4) {
+ ND_PRINT((ndo, "ERROR: Option Length != 4 Bytes (%u)", olen));
+ } else {
+ char t_bit;
+ uint16_t lan_delay, override_interval;
+ lan_delay = EXTRACT_16BITS(bp);
+ override_interval = EXTRACT_16BITS(bp+2);
+ t_bit = (lan_delay & 0x8000)? 1 : 0;
+ lan_delay &= ~0x8000;
+ ND_PRINT((ndo, "\n\t T-bit=%d, LAN delay %dms, Override interval %dms",
+ t_bit, lan_delay, override_interval));
+ }
+ break;
+
+ case PIMV2_HELLO_OPTION_DR_PRIORITY_OLD:
+ case PIMV2_HELLO_OPTION_DR_PRIORITY:
+ switch (olen) {
+ case 0:
+ ND_PRINT((ndo, "Bi-Directional Capability (Old)"));
+ break;
+ case 4:
+ ND_PRINT((ndo, "%u", EXTRACT_32BITS(bp)));
+ break;
+ default:
+ ND_PRINT((ndo, "ERROR: Option Length != 4 Bytes (%u)", olen));
+ break;
+ }
+ break;
+
+ case PIMV2_HELLO_OPTION_GENID:
+ ND_PRINT((ndo, "0x%08x", EXTRACT_32BITS(bp)));
+ break;
+
+ case PIMV2_HELLO_OPTION_REFRESH_CAP:
+ ND_PRINT((ndo, "v%d", *bp));
+ if (*(bp+1) != 0) {
+ ND_PRINT((ndo, ", interval "));
+ relts_print(ndo, *(bp+1));
+ }
+ if (EXTRACT_16BITS(bp+2) != 0) {
+ ND_PRINT((ndo, " ?0x%04x?", EXTRACT_16BITS(bp+2)));
+ }
+ break;
+
+ case PIMV2_HELLO_OPTION_BIDIR_CAP:
+ break;
+
+ case PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD:
+ case PIMV2_HELLO_OPTION_ADDRESS_LIST:
+ if (ndo->ndo_vflag > 1) {
+ const u_char *ptr = bp;
+ while (ptr < (bp+olen)) {
+ int advance;
+
+ ND_PRINT((ndo, "\n\t "));
+ advance = pimv2_addr_print(ndo, ptr, pimv2_unicast, 0);
+ if (advance < 0) {
+ ND_PRINT((ndo, "..."));
+ break;
+ }
+ ptr += advance;
+ }
+ }
+ break;
+ default:
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, bp, "\n\t ", olen);
+ break;
+ }
+ /* do we want to see an additionally hexdump ? */
+ if (ndo->ndo_vflag> 1)
+ print_unknown_data(ndo, bp, "\n\t ", olen);
+ bp += olen;
+ }
+ break;
+ }
+
+ case PIMV2_TYPE_REGISTER:
+ {
+ struct ip *ip;
+
+ ND_TCHECK2(*(bp + 4), PIMV2_REGISTER_FLAG_LEN);
+
+ ND_PRINT((ndo, ", Flags [ %s ]\n\t",
+ tok2str(pimv2_register_flag_values,
+ "none",
+ EXTRACT_32BITS(bp+4))));
+
+ bp += 8; len -= 8;
+ /* encapsulated multicast packet */
+ ip = (struct ip *)bp;
+ switch (IP_V(ip)) {
+ case 0: /* Null header */
+ ND_PRINT((ndo, "IP-Null-header %s > %s",
+ ipaddr_string(ndo, &ip->ip_src),
+ ipaddr_string(ndo, &ip->ip_dst)));
+ break;
+
+ case 4: /* IPv4 */
+ ip_print(ndo, bp, len);
+ break;
+
+ case 6: /* IPv6 */
+ ip6_print(ndo, bp, len);
+ break;
+
+ default:
+ ND_PRINT((ndo, "IP ver %d", IP_V(ip)));
+ break;
+ }
+ break;
+ }
+
+ case PIMV2_TYPE_REGISTER_STOP:
+ bp += 4; len -= 4;
+ if (bp >= ep)
+ break;
+ ND_PRINT((ndo, " group="));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_group, 0)) < 0) {
+ ND_PRINT((ndo, "..."));
+ break;
+ }
+ bp += advance; len -= advance;
+ if (bp >= ep)
+ break;
+ ND_PRINT((ndo, " source="));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_unicast, 0)) < 0) {
+ ND_PRINT((ndo, "..."));
+ break;
+ }
+ bp += advance; len -= advance;
+ break;
+
+ case PIMV2_TYPE_JOIN_PRUNE:
+ case PIMV2_TYPE_GRAFT:
+ case PIMV2_TYPE_GRAFT_ACK:
+
+
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |PIM Ver| Type | Addr length | Checksum |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Unicast-Upstream Neighbor Address |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Reserved | Num groups | Holdtime |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Encoded-Multicast Group Address-1 |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Number of Joined Sources | Number of Pruned Sources |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Encoded-Joined Source Address-1 |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | . |
+ * | . |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Encoded-Joined Source Address-n |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Encoded-Pruned Source Address-1 |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | . |
+ * | . |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Encoded-Pruned Source Address-n |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | . |
+ * | . |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Encoded-Multicast Group Address-n |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+ {
+ uint8_t ngroup;
+ uint16_t holdtime;
+ uint16_t njoin;
+ uint16_t nprune;
+ int i, j;
+
+ bp += 4; len -= 4;
+ if (PIM_TYPE(pim->pim_typever) != 7) { /*not for Graft-ACK*/
+ if (bp >= ep)
+ break;
+ ND_PRINT((ndo, ", upstream-neighbor: "));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_unicast, 0)) < 0) {
+ ND_PRINT((ndo, "..."));
+ break;
+ }
+ bp += advance; len -= advance;
+ }
+ if (bp + 4 > ep)
+ break;
+ ngroup = bp[1];
+ holdtime = EXTRACT_16BITS(&bp[2]);
+ ND_PRINT((ndo, "\n\t %u group(s)", ngroup));
+ if (PIM_TYPE(pim->pim_typever) != 7) { /*not for Graft-ACK*/
+ ND_PRINT((ndo, ", holdtime: "));
+ if (holdtime == 0xffff)
+ ND_PRINT((ndo, "infinite"));
+ else
+ relts_print(ndo, holdtime);
+ }
+ bp += 4; len -= 4;
+ for (i = 0; i < ngroup; i++) {
+ if (bp >= ep)
+ goto jp_done;
+ ND_PRINT((ndo, "\n\t group #%u: ", i+1));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_group, 0)) < 0) {
+ ND_PRINT((ndo, "...)"));
+ goto jp_done;
+ }
+ bp += advance; len -= advance;
+ if (bp + 4 > ep) {
+ ND_PRINT((ndo, "...)"));
+ goto jp_done;
+ }
+ njoin = EXTRACT_16BITS(&bp[0]);
+ nprune = EXTRACT_16BITS(&bp[2]);
+ ND_PRINT((ndo, ", joined sources: %u, pruned sources: %u", njoin, nprune));
+ bp += 4; len -= 4;
+ for (j = 0; j < njoin; j++) {
+ ND_PRINT((ndo, "\n\t joined source #%u: ", j+1));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_source, 0)) < 0) {
+ ND_PRINT((ndo, "...)"));
+ goto jp_done;
+ }
+ bp += advance; len -= advance;
+ }
+ for (j = 0; j < nprune; j++) {
+ ND_PRINT((ndo, "\n\t pruned source #%u: ", j+1));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_source, 0)) < 0) {
+ ND_PRINT((ndo, "...)"));
+ goto jp_done;
+ }
+ bp += advance; len -= advance;
+ }
+ }
+ jp_done:
+ break;
+ }
+
+ case PIMV2_TYPE_BOOTSTRAP:
+ {
+ int i, j, frpcnt;
+ bp += 4;
+
+ /* Fragment Tag, Hash Mask len, and BSR-priority */
+ if (bp + sizeof(uint16_t) >= ep) break;
+ ND_PRINT((ndo, " tag=%x", EXTRACT_16BITS(bp)));
+ bp += sizeof(uint16_t);
+ if (bp >= ep) break;
+ ND_PRINT((ndo, " hashmlen=%d", bp[0]));
+ if (bp + 1 >= ep) break;
+ ND_PRINT((ndo, " BSRprio=%d", bp[1]));
+ bp += 2;
+
+ /* Encoded-Unicast-BSR-Address */
+ if (bp >= ep) break;
+ ND_PRINT((ndo, " BSR="));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_unicast, 0)) < 0) {
+ ND_PRINT((ndo, "..."));
+ break;
+ }
+ bp += advance;
+
+ for (i = 0; bp < ep; i++) {
+ /* Encoded-Group Address */
+ ND_PRINT((ndo, " (group%d: ", i));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_group, 0))
+ < 0) {
+ ND_PRINT((ndo, "...)"));
+ goto bs_done;
+ }
+ bp += advance;
+
+ /* RP-Count, Frag RP-Cnt, and rsvd */
+ if (bp >= ep) {
+ ND_PRINT((ndo, "...)"));
+ goto bs_done;
+ }
+ ND_PRINT((ndo, " RPcnt=%d", bp[0]));
+ if (bp + 1 >= ep) {
+ ND_PRINT((ndo, "...)"));
+ goto bs_done;
+ }
+ ND_PRINT((ndo, " FRPcnt=%d", frpcnt = bp[1]));
+ bp += 4;
+
+ for (j = 0; j < frpcnt && bp < ep; j++) {
+ /* each RP info */
+ ND_PRINT((ndo, " RP%d=", j));
+ if ((advance = pimv2_addr_print(ndo, bp,
+ pimv2_unicast,
+ 0)) < 0) {
+ ND_PRINT((ndo, "...)"));
+ goto bs_done;
+ }
+ bp += advance;
+
+ if (bp + 1 >= ep) {
+ ND_PRINT((ndo, "...)"));
+ goto bs_done;
+ }
+ ND_PRINT((ndo, ",holdtime="));
+ relts_print(ndo, EXTRACT_16BITS(bp));
+ if (bp + 2 >= ep) {
+ ND_PRINT((ndo, "...)"));
+ goto bs_done;
+ }
+ ND_PRINT((ndo, ",prio=%d", bp[2]));
+ bp += 4;
+ }
+ ND_PRINT((ndo, ")"));
+ }
+ bs_done:
+ break;
+ }
+ case PIMV2_TYPE_ASSERT:
+ bp += 4; len -= 4;
+ if (bp >= ep)
+ break;
+ ND_PRINT((ndo, " group="));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_group, 0)) < 0) {
+ ND_PRINT((ndo, "..."));
+ break;
+ }
+ bp += advance; len -= advance;
+ if (bp >= ep)
+ break;
+ ND_PRINT((ndo, " src="));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_unicast, 0)) < 0) {
+ ND_PRINT((ndo, "..."));
+ break;
+ }
+ bp += advance; len -= advance;
+ if (bp + 8 > ep)
+ break;
+ if (bp[0] & 0x80)
+ ND_PRINT((ndo, " RPT"));
+ ND_PRINT((ndo, " pref=%u", EXTRACT_32BITS(&bp[0]) & 0x7fffffff));
+ ND_PRINT((ndo, " metric=%u", EXTRACT_32BITS(&bp[4])));
+ break;
+
+ case PIMV2_TYPE_CANDIDATE_RP:
+ {
+ int i, pfxcnt;
+ bp += 4;
+
+ /* Prefix-Cnt, Priority, and Holdtime */
+ if (bp >= ep) break;
+ ND_PRINT((ndo, " prefix-cnt=%d", bp[0]));
+ pfxcnt = bp[0];
+ if (bp + 1 >= ep) break;
+ ND_PRINT((ndo, " prio=%d", bp[1]));
+ if (bp + 3 >= ep) break;
+ ND_PRINT((ndo, " holdtime="));
+ relts_print(ndo, EXTRACT_16BITS(&bp[2]));
+ bp += 4;
+
+ /* Encoded-Unicast-RP-Address */
+ if (bp >= ep) break;
+ ND_PRINT((ndo, " RP="));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_unicast, 0)) < 0) {
+ ND_PRINT((ndo, "..."));
+ break;
+ }
+ bp += advance;
+
+ /* Encoded-Group Addresses */
+ for (i = 0; i < pfxcnt && bp < ep; i++) {
+ ND_PRINT((ndo, " Group%d=", i));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_group, 0))
+ < 0) {
+ ND_PRINT((ndo, "..."));
+ break;
+ }
+ bp += advance;
+ }
+ break;
+ }
+
+ case PIMV2_TYPE_PRUNE_REFRESH:
+ ND_PRINT((ndo, " src="));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_unicast, 0)) < 0) {
+ ND_PRINT((ndo, "..."));
+ break;
+ }
+ bp += advance;
+ ND_PRINT((ndo, " grp="));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_group, 0)) < 0) {
+ ND_PRINT((ndo, "..."));
+ break;
+ }
+ bp += advance;
+ ND_PRINT((ndo, " forwarder="));
+ if ((advance = pimv2_addr_print(ndo, bp, pimv2_unicast, 0)) < 0) {
+ ND_PRINT((ndo, "..."));
+ break;
+ }
+ bp += advance;
+ ND_TCHECK2(bp[0], 2);
+ ND_PRINT((ndo, " TUNR "));
+ relts_print(ndo, EXTRACT_16BITS(bp));
+ break;
+
+
+ default:
+ ND_PRINT((ndo, " [type %d]", PIM_TYPE(pim->pim_typever)));
+ break;
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|pim]"));
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-pktap.c,v 1.2 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+#ifdef DLT_PKTAP
+
+/*
+ * XXX - these are little-endian in the captures I've seen, but Apple
+ * no longer make any big-endian machines (Macs use x86, iOS machines
+ * use ARM and run it little-endian), so that might be by definition
+ * or they might be host-endian.
+ *
+ * If a big-endian PKTAP file ever shows up, and it comes from a
+ * big-endian machine, presumably these are host-endian, and we need
+ * to just fetch the fields directly in tcpdump but byte-swap them
+ * to host byte order in libpcap.
+ */
+typedef struct pktap_header {
+ uint32_t pkt_len; /* length of pktap header */
+ uint32_t pkt_rectype; /* type of record */
+ uint32_t pkt_dlt; /* DLT type of this packet */
+ char pkt_ifname[24]; /* interface name */
+ uint32_t pkt_flags;
+ uint32_t pkt_pfamily; /* "protocol family" */
+ uint32_t pkt_llhdrlen; /* link-layer header length? */
+ uint32_t pkt_lltrlrlen; /* link-layer trailer length? */
+ uint32_t pkt_pid; /* process ID */
+ char pkt_cmdname[20]; /* command name */
+ uint32_t pkt_svc_class; /* "service class" */
+ uint16_t pkt_iftype; /* "interface type" */
+ uint16_t pkt_ifunit; /* unit number of interface? */
+ uint32_t pkt_epid; /* "effective process ID" */
+ char pkt_ecmdname[20]; /* "effective command name" */
+} pktap_header_t;
+
+/*
+ * Record types.
+ */
+#define PKT_REC_NONE 0 /* nothing follows the header */
+#define PKT_REC_PACKET 1 /* a packet follows the header */
+
+static inline void
+pktap_header_print(netdissect_options *ndo, const u_char *bp, u_int length)
+{
+ const pktap_header_t *hdr;
+ uint32_t dlt, hdrlen;
+
+ hdr = (const pktap_header_t *)bp;
+
+ dlt = EXTRACT_LE_32BITS(&hdr->pkt_dlt);
+ hdrlen = EXTRACT_LE_32BITS(&hdr->pkt_len);
+ if (!ndo->ndo_qflag) {
+ ND_PRINT((ndo,", DLT %s (%d) len %d",
+ pcap_datalink_val_to_name(dlt), dlt, hdrlen));
+ } else {
+ ND_PRINT((ndo,", %s", pcap_datalink_val_to_name(dlt)));
+ }
+
+ ND_PRINT((ndo, ", length %u: ", length));
+}
+
+/*
+ * 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
+pktap_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, const u_char *p)
+{
+ uint32_t dlt, hdrlen, rectype;
+ u_int caplen = h->caplen;
+ u_int length = h->len;
+ if_ndo_printer ndo_printer;
+ if_printer printer;
+ pktap_header_t *hdr;
+
+ if (caplen < sizeof(pktap_header_t) || length < sizeof(pktap_header_t)) {
+ ND_PRINT((ndo, "[|pktap]"));
+ return (0);
+ }
+ hdr = (pktap_header_t *)p;
+ dlt = EXTRACT_LE_32BITS(&hdr->pkt_dlt);
+ hdrlen = EXTRACT_LE_32BITS(&hdr->pkt_len);
+ if (hdrlen < sizeof(pktap_header_t)) {
+ /*
+ * Claimed header length < structure length.
+ * XXX - does this just mean some fields aren't
+ * being supplied, or is it truly an error (i.e.,
+ * is the length supplied so that the header can
+ * be expanded in the future)?
+ */
+ ND_PRINT((ndo, "[|pktap]"));
+ return (0);
+ }
+ if (caplen < hdrlen || length < hdrlen) {
+ ND_PRINT((ndo, "[|pktap]"));
+ return (hdrlen);
+ }
+
+ if (ndo->ndo_eflag)
+ pktap_header_print(ndo, p, length);
+
+ length -= hdrlen;
+ caplen -= hdrlen;
+ p += hdrlen;
+
+ rectype = EXTRACT_LE_32BITS(&hdr->pkt_rectype);
+ switch (rectype) {
+
+ case PKT_REC_NONE:
+ ND_PRINT((ndo, "no data"));
+ break;
+
+ case PKT_REC_PACKET:
+ 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)
+ pktap_header_print(ndo, (u_char *)hdr,
+ length + hdrlen);
+
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+ break;
+ }
+
+ return (hdrlen);
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
+
+#endif /* DLT_PKTAP */
--- /dev/null
+/*
+ * Oracle
+ */
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+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
+
+#ifdef DLT_PPI
+
+static inline void
+ppi_header_print(netdissect_options *ndo, const u_char *bp, u_int length)
+{
+ const ppi_header_t *hdr;
+ uint16_t len;
+ uint32_t dlt;
+
+ hdr = (const ppi_header_t *)bp;
+
+ len = EXTRACT_LE_16BITS(&hdr->ppi_len);
+ dlt = EXTRACT_LE_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(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;
+ uint16_t len;
+ uint32_t dlt;
+
+ if (caplen < sizeof(ppi_header_t)) {
+ ND_PRINT((ndo, "[|ppi]"));
+ return;
+ }
+
+ hdr = (ppi_header_t *)p;
+ len = EXTRACT_LE_16BITS(&hdr->ppi_len);
+ if (len < sizeof(ppi_header_t)) {
+ ND_PRINT((ndo, "[|ppi]"));
+ return;
+ }
+ if (caplen < len) {
+ ND_PRINT((ndo, "[|ppi]"));
+ return;
+ }
+ dlt = EXTRACT_LE_32BITS(&hdr->ppi_dlt);
+
+ if (ndo->ndo_eflag)
+ ppi_header_print(ndo, p, length);
+
+ length -= len;
+ caplen -= len;
+ p += len;
+
+ 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 + len);
+
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(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(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 */
--- /dev/null
+/*
+ * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * Extensively modified by Motonori Shindo (mshindo@mshindo.net) for more
+ * complete PPP support.
+ */
+
+/*
+ * TODO:
+ * o resolve XXX as much as possible
+ * o MP support
+ * o BAP support
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ppp.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#ifdef __bsdi__
+#include <net/slcompress.h>
+#include <net/if_ppp.h>
+#endif
+
+#include <stdlib.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+#include "ppp.h"
+#include "chdlc.h"
+#include "ethertype.h"
+#include "oui.h"
+
+/*
+ * The following constatns are defined by IANA. Please refer to
+ * http://www.isi.edu/in-notes/iana/assignments/ppp-numbers
+ * for the up-to-date information.
+ */
+
+/* Protocol Codes defined in ppp.h */
+
+static const struct tok ppptype2str[] = {
+ { PPP_IP, "IP" },
+ { PPP_OSI, "OSI" },
+ { PPP_NS, "NS" },
+ { PPP_DECNET, "DECNET" },
+ { PPP_APPLE, "APPLE" },
+ { PPP_IPX, "IPX" },
+ { PPP_VJC, "VJC IP" },
+ { PPP_VJNC, "VJNC IP" },
+ { PPP_BRPDU, "BRPDU" },
+ { PPP_STII, "STII" },
+ { PPP_VINES, "VINES" },
+ { PPP_MPLS_UCAST, "MPLS" },
+ { PPP_MPLS_MCAST, "MPLS" },
+ { PPP_COMP, "Compressed"},
+ { PPP_ML, "MLPPP"},
+ { PPP_IPV6, "IP6"},
+
+ { PPP_HELLO, "HELLO" },
+ { PPP_LUXCOM, "LUXCOM" },
+ { PPP_SNS, "SNS" },
+ { PPP_IPCP, "IPCP" },
+ { PPP_OSICP, "OSICP" },
+ { PPP_NSCP, "NSCP" },
+ { PPP_DECNETCP, "DECNETCP" },
+ { PPP_APPLECP, "APPLECP" },
+ { PPP_IPXCP, "IPXCP" },
+ { PPP_STIICP, "STIICP" },
+ { PPP_VINESCP, "VINESCP" },
+ { PPP_IPV6CP, "IP6CP" },
+ { PPP_MPLSCP, "MPLSCP" },
+
+ { PPP_LCP, "LCP" },
+ { PPP_PAP, "PAP" },
+ { PPP_LQM, "LQM" },
+ { PPP_CHAP, "CHAP" },
+ { PPP_EAP, "EAP" },
+ { PPP_SPAP, "SPAP" },
+ { PPP_SPAP_OLD, "Old-SPAP" },
+ { PPP_BACP, "BACP" },
+ { PPP_BAP, "BAP" },
+ { PPP_MPCP, "MLPPP-CP" },
+ { PPP_CCP, "CCP" },
+ { 0, NULL }
+};
+
+/* Control Protocols (LCP/IPCP/CCP etc.) Codes defined in RFC 1661 */
+
+#define CPCODES_VEXT 0 /* Vendor-Specific (RFC2153) */
+#define CPCODES_CONF_REQ 1 /* Configure-Request */
+#define CPCODES_CONF_ACK 2 /* Configure-Ack */
+#define CPCODES_CONF_NAK 3 /* Configure-Nak */
+#define CPCODES_CONF_REJ 4 /* Configure-Reject */
+#define CPCODES_TERM_REQ 5 /* Terminate-Request */
+#define CPCODES_TERM_ACK 6 /* Terminate-Ack */
+#define CPCODES_CODE_REJ 7 /* Code-Reject */
+#define CPCODES_PROT_REJ 8 /* Protocol-Reject (LCP only) */
+#define CPCODES_ECHO_REQ 9 /* Echo-Request (LCP only) */
+#define CPCODES_ECHO_RPL 10 /* Echo-Reply (LCP only) */
+#define CPCODES_DISC_REQ 11 /* Discard-Request (LCP only) */
+#define CPCODES_ID 12 /* Identification (LCP only) RFC1570 */
+#define CPCODES_TIME_REM 13 /* Time-Remaining (LCP only) RFC1570 */
+#define CPCODES_RESET_REQ 14 /* Reset-Request (CCP only) RFC1962 */
+#define CPCODES_RESET_REP 15 /* Reset-Reply (CCP only) */
+
+static const struct tok cpcodes[] = {
+ {CPCODES_VEXT, "Vendor-Extension"}, /* RFC2153 */
+ {CPCODES_CONF_REQ, "Conf-Request"},
+ {CPCODES_CONF_ACK, "Conf-Ack"},
+ {CPCODES_CONF_NAK, "Conf-Nack"},
+ {CPCODES_CONF_REJ, "Conf-Reject"},
+ {CPCODES_TERM_REQ, "Term-Request"},
+ {CPCODES_TERM_ACK, "Term-Ack"},
+ {CPCODES_CODE_REJ, "Code-Reject"},
+ {CPCODES_PROT_REJ, "Prot-Reject"},
+ {CPCODES_ECHO_REQ, "Echo-Request"},
+ {CPCODES_ECHO_RPL, "Echo-Reply"},
+ {CPCODES_DISC_REQ, "Disc-Req"},
+ {CPCODES_ID, "Ident"}, /* RFC1570 */
+ {CPCODES_TIME_REM, "Time-Rem"}, /* RFC1570 */
+ {CPCODES_RESET_REQ, "Reset-Req"}, /* RFC1962 */
+ {CPCODES_RESET_REP, "Reset-Ack"}, /* RFC1962 */
+ {0, NULL}
+};
+
+/* LCP Config Options */
+
+#define LCPOPT_VEXT 0
+#define LCPOPT_MRU 1
+#define LCPOPT_ACCM 2
+#define LCPOPT_AP 3
+#define LCPOPT_QP 4
+#define LCPOPT_MN 5
+#define LCPOPT_DEP6 6
+#define LCPOPT_PFC 7
+#define LCPOPT_ACFC 8
+#define LCPOPT_FCSALT 9
+#define LCPOPT_SDP 10
+#define LCPOPT_NUMMODE 11
+#define LCPOPT_DEP12 12
+#define LCPOPT_CBACK 13
+#define LCPOPT_DEP14 14
+#define LCPOPT_DEP15 15
+#define LCPOPT_DEP16 16
+#define LCPOPT_MLMRRU 17
+#define LCPOPT_MLSSNHF 18
+#define LCPOPT_MLED 19
+#define LCPOPT_PROP 20
+#define LCPOPT_DCEID 21
+#define LCPOPT_MPP 22
+#define LCPOPT_LD 23
+#define LCPOPT_LCPAOPT 24
+#define LCPOPT_COBS 25
+#define LCPOPT_PE 26
+#define LCPOPT_MLHF 27
+#define LCPOPT_I18N 28
+#define LCPOPT_SDLOS 29
+#define LCPOPT_PPPMUX 30
+
+#define LCPOPT_MIN LCPOPT_VEXT
+#define LCPOPT_MAX LCPOPT_PPPMUX
+
+static const char *lcpconfopts[] = {
+ "Vend-Ext", /* (0) */
+ "MRU", /* (1) */
+ "ACCM", /* (2) */
+ "Auth-Prot", /* (3) */
+ "Qual-Prot", /* (4) */
+ "Magic-Num", /* (5) */
+ "deprecated(6)", /* used to be a Quality Protocol */
+ "PFC", /* (7) */
+ "ACFC", /* (8) */
+ "FCS-Alt", /* (9) */
+ "SDP", /* (10) */
+ "Num-Mode", /* (11) */
+ "deprecated(12)", /* used to be a Multi-Link-Procedure*/
+ "Call-Back", /* (13) */
+ "deprecated(14)", /* used to be a Connect-Time */
+ "deprecated(15)", /* used to be a Compund-Frames */
+ "deprecated(16)", /* used to be a Nominal-Data-Encap */
+ "MRRU", /* (17) */
+ "12-Bit seq #", /* (18) */
+ "End-Disc", /* (19) */
+ "Proprietary", /* (20) */
+ "DCE-Id", /* (21) */
+ "MP+", /* (22) */
+ "Link-Disc", /* (23) */
+ "LCP-Auth-Opt", /* (24) */
+ "COBS", /* (25) */
+ "Prefix-elision", /* (26) */
+ "Multilink-header-Form",/* (27) */
+ "I18N", /* (28) */
+ "SDL-over-SONET/SDH", /* (29) */
+ "PPP-Muxing", /* (30) */
+};
+
+/* ECP - to be supported */
+
+/* CCP Config Options */
+
+#define CCPOPT_OUI 0 /* RFC1962 */
+#define CCPOPT_PRED1 1 /* RFC1962 */
+#define CCPOPT_PRED2 2 /* RFC1962 */
+#define CCPOPT_PJUMP 3 /* RFC1962 */
+/* 4-15 unassigned */
+#define CCPOPT_HPPPC 16 /* RFC1962 */
+#define CCPOPT_STACLZS 17 /* RFC1974 */
+#define CCPOPT_MPPC 18 /* RFC2118 */
+#define CCPOPT_GFZA 19 /* RFC1962 */
+#define CCPOPT_V42BIS 20 /* RFC1962 */
+#define CCPOPT_BSDCOMP 21 /* RFC1977 */
+/* 22 unassigned */
+#define CCPOPT_LZSDCP 23 /* RFC1967 */
+#define CCPOPT_MVRCA 24 /* RFC1975 */
+#define CCPOPT_DEC 25 /* RFC1976 */
+#define CCPOPT_DEFLATE 26 /* RFC1979 */
+/* 27-254 unassigned */
+#define CCPOPT_RESV 255 /* RFC1962 */
+
+static const struct tok ccpconfopts_values[] = {
+ { CCPOPT_OUI, "OUI" },
+ { CCPOPT_PRED1, "Pred-1" },
+ { CCPOPT_PRED2, "Pred-2" },
+ { CCPOPT_PJUMP, "Puddle" },
+ { CCPOPT_HPPPC, "HP-PPC" },
+ { CCPOPT_STACLZS, "Stac-LZS" },
+ { CCPOPT_MPPC, "MPPC" },
+ { CCPOPT_GFZA, "Gand-FZA" },
+ { CCPOPT_V42BIS, "V.42bis" },
+ { CCPOPT_BSDCOMP, "BSD-Comp" },
+ { CCPOPT_LZSDCP, "LZS-DCP" },
+ { CCPOPT_MVRCA, "MVRCA" },
+ { CCPOPT_DEC, "DEC" },
+ { CCPOPT_DEFLATE, "Deflate" },
+ { CCPOPT_RESV, "Reserved"},
+ {0, NULL}
+};
+
+/* BACP Config Options */
+
+#define BACPOPT_FPEER 1 /* RFC2125 */
+
+static const struct tok bacconfopts_values[] = {
+ { BACPOPT_FPEER, "Favored-Peer" },
+ {0, NULL}
+};
+
+
+/* SDCP - to be supported */
+
+/* IPCP Config Options */
+#define IPCPOPT_2ADDR 1 /* RFC1172, RFC1332 (deprecated) */
+#define IPCPOPT_IPCOMP 2 /* RFC1332 */
+#define IPCPOPT_ADDR 3 /* RFC1332 */
+#define IPCPOPT_MOBILE4 4 /* RFC2290 */
+#define IPCPOPT_PRIDNS 129 /* RFC1877 */
+#define IPCPOPT_PRINBNS 130 /* RFC1877 */
+#define IPCPOPT_SECDNS 131 /* RFC1877 */
+#define IPCPOPT_SECNBNS 132 /* RFC1877 */
+
+static const struct tok ipcpopt_values[] = {
+ { IPCPOPT_2ADDR, "IP-Addrs" },
+ { IPCPOPT_IPCOMP, "IP-Comp" },
+ { IPCPOPT_ADDR, "IP-Addr" },
+ { IPCPOPT_MOBILE4, "Home-Addr" },
+ { IPCPOPT_PRIDNS, "Pri-DNS" },
+ { IPCPOPT_PRINBNS, "Pri-NBNS" },
+ { IPCPOPT_SECDNS, "Sec-DNS" },
+ { IPCPOPT_SECNBNS, "Sec-NBNS" },
+ { 0, NULL }
+};
+
+#define IPCPOPT_IPCOMP_HDRCOMP 0x61 /* rfc3544 */
+#define IPCPOPT_IPCOMP_MINLEN 14
+
+static const struct tok ipcpopt_compproto_values[] = {
+ { PPP_VJC, "VJ-Comp" },
+ { IPCPOPT_IPCOMP_HDRCOMP, "IP Header Compression" },
+ { 0, NULL }
+};
+
+static const struct tok ipcpopt_compproto_subopt_values[] = {
+ { 1, "RTP-Compression" },
+ { 2, "Enhanced RTP-Compression" },
+ { 0, NULL }
+};
+
+/* IP6CP Config Options */
+#define IP6CP_IFID 1
+
+static const struct tok ip6cpopt_values[] = {
+ { IP6CP_IFID, "Interface-ID" },
+ { 0, NULL }
+};
+
+/* ATCP - to be supported */
+/* OSINLCP - to be supported */
+/* BVCP - to be supported */
+/* BCP - to be supported */
+/* IPXCP - to be supported */
+/* MPLSCP - to be supported */
+
+/* Auth Algorithms */
+
+/* 0-4 Reserved (RFC1994) */
+#define AUTHALG_CHAPMD5 5 /* RFC1994 */
+#define AUTHALG_MSCHAP1 128 /* RFC2433 */
+#define AUTHALG_MSCHAP2 129 /* RFC2795 */
+
+static const struct tok authalg_values[] = {
+ { AUTHALG_CHAPMD5, "MD5" },
+ { AUTHALG_MSCHAP1, "MS-CHAPv1" },
+ { AUTHALG_MSCHAP2, "MS-CHAPv2" },
+ { 0, NULL }
+};
+
+/* FCS Alternatives - to be supported */
+
+/* Multilink Endpoint Discriminator (RFC1717) */
+#define MEDCLASS_NULL 0 /* Null Class */
+#define MEDCLASS_LOCAL 1 /* Locally Assigned */
+#define MEDCLASS_IPV4 2 /* Internet Protocol (IPv4) */
+#define MEDCLASS_MAC 3 /* IEEE 802.1 global MAC address */
+#define MEDCLASS_MNB 4 /* PPP Magic Number Block */
+#define MEDCLASS_PSNDN 5 /* Public Switched Network Director Number */
+
+/* PPP LCP Callback */
+#define CALLBACK_AUTH 0 /* Location determined by user auth */
+#define CALLBACK_DSTR 1 /* Dialing string */
+#define CALLBACK_LID 2 /* Location identifier */
+#define CALLBACK_E164 3 /* E.164 number */
+#define CALLBACK_X500 4 /* X.500 distinguished name */
+#define CALLBACK_CBCP 6 /* Location is determined during CBCP nego */
+
+static const struct tok ppp_callback_values[] = {
+ { CALLBACK_AUTH, "UserAuth" },
+ { CALLBACK_DSTR, "DialString" },
+ { CALLBACK_LID, "LocalID" },
+ { CALLBACK_E164, "E.164" },
+ { CALLBACK_X500, "X.500" },
+ { CALLBACK_CBCP, "CBCP" },
+ { 0, NULL }
+};
+
+/* CHAP */
+
+#define CHAP_CHAL 1
+#define CHAP_RESP 2
+#define CHAP_SUCC 3
+#define CHAP_FAIL 4
+
+static const struct tok chapcode_values[] = {
+ { CHAP_CHAL, "Challenge" },
+ { CHAP_RESP, "Response" },
+ { CHAP_SUCC, "Success" },
+ { CHAP_FAIL, "Fail" },
+ { 0, NULL}
+};
+
+/* PAP */
+
+#define PAP_AREQ 1
+#define PAP_AACK 2
+#define PAP_ANAK 3
+
+static const struct tok papcode_values[] = {
+ { PAP_AREQ, "Auth-Req" },
+ { PAP_AACK, "Auth-ACK" },
+ { PAP_ANAK, "Auth-NACK" },
+ { 0, NULL }
+};
+
+/* BAP */
+#define BAP_CALLREQ 1
+#define BAP_CALLRES 2
+#define BAP_CBREQ 3
+#define BAP_CBRES 4
+#define BAP_LDQREQ 5
+#define BAP_LDQRES 6
+#define BAP_CSIND 7
+#define BAP_CSRES 8
+
+static int print_lcp_config_options(netdissect_options *, const u_char *p, int);
+static int print_ipcp_config_options(netdissect_options *, const u_char *p, int);
+static int print_ip6cp_config_options(netdissect_options *, const u_char *p, int);
+static int print_ccp_config_options(netdissect_options *, const u_char *p, int);
+static int print_bacp_config_options(netdissect_options *, const u_char *p, int);
+static void handle_ppp(netdissect_options *, u_int proto, const u_char *p, int length);
+
+/* generic Control Protocol (e.g. LCP, IPCP, CCP, etc.) handler */
+static void
+handle_ctrl_proto(netdissect_options *ndo,
+ u_int proto, const u_char *pptr, int length)
+{
+ const char *typestr;
+ u_int code, len;
+ int (*pfunc)(netdissect_options *, const u_char *, int);
+ int x, j;
+ const u_char *tptr;
+
+ tptr=pptr;
+
+ typestr = tok2str(ppptype2str, "unknown ctrl-proto (0x%04x)", proto);
+ ND_PRINT((ndo, "%s, ", typestr));
+
+ if (length < 4) /* FIXME weak boundary checking */
+ goto trunc;
+ ND_TCHECK2(*tptr, 2);
+
+ code = *tptr++;
+
+ ND_PRINT((ndo, "%s (0x%02x), id %u, length %u",
+ tok2str(cpcodes, "Unknown Opcode",code),
+ code,
+ *tptr++, /* ID */
+ length + 2));
+
+ if (!ndo->ndo_vflag)
+ return;
+
+ if (length <= 4)
+ return; /* there may be a NULL confreq etc. */
+
+ ND_TCHECK2(*tptr, 2);
+ len = EXTRACT_16BITS(tptr);
+ tptr += 2;
+
+ ND_PRINT((ndo, "\n\tencoded length %u (=Option(s) length %u)", len, len - 4));
+
+ if (ndo->ndo_vflag > 1)
+ print_unknown_data(ndo, pptr - 2, "\n\t", 6);
+
+
+ switch (code) {
+ case CPCODES_VEXT:
+ if (length < 11)
+ break;
+ ND_TCHECK2(*tptr, 4);
+ ND_PRINT((ndo, "\n\t Magic-Num 0x%08x", EXTRACT_32BITS(tptr)));
+ tptr += 4;
+ ND_TCHECK2(*tptr, 3);
+ ND_PRINT((ndo, " Vendor: %s (%u)",
+ tok2str(oui_values,"Unknown",EXTRACT_24BITS(tptr)),
+ EXTRACT_24BITS(tptr)));
+ /* XXX: need to decode Kind and Value(s)? */
+ break;
+ case CPCODES_CONF_REQ:
+ case CPCODES_CONF_ACK:
+ case CPCODES_CONF_NAK:
+ case CPCODES_CONF_REJ:
+ x = len - 4; /* Code(1), Identifier(1) and Length(2) */
+ do {
+ switch (proto) {
+ case PPP_LCP:
+ pfunc = print_lcp_config_options;
+ break;
+ case PPP_IPCP:
+ pfunc = print_ipcp_config_options;
+ break;
+ case PPP_IPV6CP:
+ pfunc = print_ip6cp_config_options;
+ break;
+ case PPP_CCP:
+ pfunc = print_ccp_config_options;
+ break;
+ case PPP_BACP:
+ pfunc = print_bacp_config_options;
+ break;
+ default:
+ /*
+ * No print routine for the options for
+ * this protocol.
+ */
+ pfunc = NULL;
+ break;
+ }
+
+ if (pfunc == NULL) /* catch the above null pointer if unknown CP */
+ break;
+
+ if ((j = (*pfunc)(ndo, tptr, len)) == 0)
+ break;
+ x -= j;
+ tptr += j;
+ } while (x > 0);
+ break;
+
+ case CPCODES_TERM_REQ:
+ case CPCODES_TERM_ACK:
+ /* XXX: need to decode Data? */
+ break;
+ case CPCODES_CODE_REJ:
+ /* XXX: need to decode Rejected-Packet? */
+ break;
+ case CPCODES_PROT_REJ:
+ if (length < 6)
+ break;
+ ND_TCHECK2(*tptr, 2);
+ ND_PRINT((ndo, "\n\t Rejected %s Protocol (0x%04x)",
+ tok2str(ppptype2str,"unknown", EXTRACT_16BITS(tptr)),
+ EXTRACT_16BITS(tptr)));
+ /* XXX: need to decode Rejected-Information? - hexdump for now */
+ if (len > 6) {
+ ND_PRINT((ndo, "\n\t Rejected Packet"));
+ print_unknown_data(ndo, tptr + 2, "\n\t ", len - 2);
+ }
+ break;
+ case CPCODES_ECHO_REQ:
+ case CPCODES_ECHO_RPL:
+ case CPCODES_DISC_REQ:
+ if (length < 8)
+ break;
+ ND_TCHECK2(*tptr, 4);
+ ND_PRINT((ndo, "\n\t Magic-Num 0x%08x", EXTRACT_32BITS(tptr)));
+ /* XXX: need to decode Data? - hexdump for now */
+ if (len > 8) {
+ ND_PRINT((ndo, "\n\t -----trailing data-----"));
+ ND_TCHECK2(tptr[4], len - 8);
+ print_unknown_data(ndo, tptr + 4, "\n\t ", len - 8);
+ }
+ break;
+ case CPCODES_ID:
+ if (length < 8)
+ break;
+ ND_TCHECK2(*tptr, 4);
+ ND_PRINT((ndo, "\n\t Magic-Num 0x%08x", EXTRACT_32BITS(tptr)));
+ /* RFC 1661 says this is intended to be human readable */
+ if (len > 8) {
+ ND_PRINT((ndo, "\n\t Message\n\t "));
+ if (fn_printn(ndo, tptr + 4, len - 4, ndo->ndo_snapend))
+ goto trunc;
+ }
+ break;
+ case CPCODES_TIME_REM:
+ if (length < 12)
+ break;
+ ND_TCHECK2(*tptr, 4);
+ ND_PRINT((ndo, "\n\t Magic-Num 0x%08x", EXTRACT_32BITS(tptr)));
+ ND_TCHECK2(*(tptr + 4), 4);
+ ND_PRINT((ndo, ", Seconds-Remaining %us", EXTRACT_32BITS(tptr + 4)));
+ /* XXX: need to decode Message? */
+ break;
+ default:
+ /* XXX this is dirty but we do not get the
+ * original pointer passed to the begin
+ * the PPP packet */
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, pptr - 2, "\n\t ", length + 2);
+ break;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|%s]", typestr));
+}
+
+/* LCP config options */
+static int
+print_lcp_config_options(netdissect_options *ndo,
+ const u_char *p, int length)
+{
+ int len, opt;
+
+ if (length < 2)
+ return 0;
+ ND_TCHECK2(*p, 2);
+ len = p[1];
+ opt = p[0];
+ if (length < len)
+ return 0;
+ if (len < 2) {
+ if ((opt >= LCPOPT_MIN) && (opt <= LCPOPT_MAX))
+ ND_PRINT((ndo, "\n\t %s Option (0x%02x), length %u (length bogus, should be >= 2)",
+ lcpconfopts[opt], opt, len));
+ else
+ ND_PRINT((ndo, "\n\tunknown LCP option 0x%02x", opt));
+ return 0;
+ }
+ if ((opt >= LCPOPT_MIN) && (opt <= LCPOPT_MAX))
+ ND_PRINT((ndo, "\n\t %s Option (0x%02x), length %u", lcpconfopts[opt], opt, len));
+ else {
+ ND_PRINT((ndo, "\n\tunknown LCP option 0x%02x", opt));
+ return len;
+ }
+
+ switch (opt) {
+ case LCPOPT_VEXT:
+ if (len < 6) {
+ ND_PRINT((ndo, " (length bogus, should be >= 6)"));
+ return len;
+ }
+ ND_TCHECK2(*(p + 2), 3);
+ ND_PRINT((ndo, ": Vendor: %s (%u)",
+ tok2str(oui_values,"Unknown",EXTRACT_24BITS(p+2)),
+ EXTRACT_24BITS(p + 2)));
+#if 0
+ ND_TCHECK(p[5]);
+ ND_PRINT((ndo, ", kind: 0x%02x", p[5]));
+ ND_PRINT((ndo, ", Value: 0x"));
+ for (i = 0; i < len - 6; i++) {
+ ND_TCHECK(p[6 + i]);
+ ND_PRINT((ndo, "%02x", p[6 + i]));
+ }
+#endif
+ break;
+ case LCPOPT_MRU:
+ if (len != 4) {
+ ND_PRINT((ndo, " (length bogus, should be = 4)"));
+ return len;
+ }
+ ND_TCHECK2(*(p + 2), 2);
+ ND_PRINT((ndo, ": %u", EXTRACT_16BITS(p + 2)));
+ break;
+ case LCPOPT_ACCM:
+ if (len != 6) {
+ ND_PRINT((ndo, " (length bogus, should be = 6)"));
+ return len;
+ }
+ ND_TCHECK2(*(p + 2), 4);
+ ND_PRINT((ndo, ": 0x%08x", EXTRACT_32BITS(p + 2)));
+ break;
+ case LCPOPT_AP:
+ if (len < 4) {
+ ND_PRINT((ndo, " (length bogus, should be >= 4)"));
+ return len;
+ }
+ ND_TCHECK2(*(p + 2), 2);
+ ND_PRINT((ndo, ": %s", tok2str(ppptype2str, "Unknown Auth Proto (0x04x)", EXTRACT_16BITS(p + 2))));
+
+ switch (EXTRACT_16BITS(p+2)) {
+ case PPP_CHAP:
+ ND_TCHECK(p[4]);
+ ND_PRINT((ndo, ", %s", tok2str(authalg_values, "Unknown Auth Alg %u", p[4])));
+ break;
+ case PPP_PAP: /* fall through */
+ case PPP_EAP:
+ case PPP_SPAP:
+ case PPP_SPAP_OLD:
+ break;
+ default:
+ print_unknown_data(ndo, p, "\n\t", len);
+ }
+ break;
+ case LCPOPT_QP:
+ if (len < 4) {
+ ND_PRINT((ndo, " (length bogus, should be >= 4)"));
+ return 0;
+ }
+ ND_TCHECK2(*(p + 2), 2);
+ if (EXTRACT_16BITS(p+2) == PPP_LQM)
+ ND_PRINT((ndo, ": LQR"));
+ else
+ ND_PRINT((ndo, ": unknown"));
+ break;
+ case LCPOPT_MN:
+ if (len != 6) {
+ ND_PRINT((ndo, " (length bogus, should be = 6)"));
+ return 0;
+ }
+ ND_TCHECK2(*(p + 2), 4);
+ ND_PRINT((ndo, ": 0x%08x", EXTRACT_32BITS(p + 2)));
+ break;
+ case LCPOPT_PFC:
+ break;
+ case LCPOPT_ACFC:
+ break;
+ case LCPOPT_LD:
+ if (len != 4) {
+ ND_PRINT((ndo, " (length bogus, should be = 4)"));
+ return 0;
+ }
+ ND_TCHECK2(*(p + 2), 2);
+ ND_PRINT((ndo, ": 0x%04x", EXTRACT_16BITS(p + 2)));
+ break;
+ case LCPOPT_CBACK:
+ if (len < 3) {
+ ND_PRINT((ndo, " (length bogus, should be >= 3)"));
+ return 0;
+ }
+ ND_PRINT((ndo, ": "));
+ ND_TCHECK(p[2]);
+ ND_PRINT((ndo, ": Callback Operation %s (%u)",
+ tok2str(ppp_callback_values, "Unknown", p[2]),
+ p[2]));
+ break;
+ case LCPOPT_MLMRRU:
+ if (len != 4) {
+ ND_PRINT((ndo, " (length bogus, should be = 4)"));
+ return 0;
+ }
+ ND_TCHECK2(*(p + 2), 2);
+ ND_PRINT((ndo, ": %u", EXTRACT_16BITS(p + 2)));
+ break;
+ case LCPOPT_MLED:
+ if (len < 3) {
+ ND_PRINT((ndo, " (length bogus, should be >= 3)"));
+ return 0;
+ }
+ ND_TCHECK(p[2]);
+ switch (p[2]) { /* class */
+ case MEDCLASS_NULL:
+ ND_PRINT((ndo, ": Null"));
+ break;
+ case MEDCLASS_LOCAL:
+ ND_PRINT((ndo, ": Local")); /* XXX */
+ break;
+ case MEDCLASS_IPV4:
+ if (len != 7) {
+ ND_PRINT((ndo, " (length bogus, should be = 7)"));
+ return 0;
+ }
+ ND_TCHECK2(*(p + 3), 4);
+ ND_PRINT((ndo, ": IPv4 %s", ipaddr_string(ndo, p + 3)));
+ break;
+ case MEDCLASS_MAC:
+ if (len != 9) {
+ ND_PRINT((ndo, " (length bogus, should be = 9)"));
+ return 0;
+ }
+ ND_TCHECK2(*(p + 3), 6);
+ ND_PRINT((ndo, ": MAC %s", etheraddr_string(ndo, p + 3)));
+ break;
+ case MEDCLASS_MNB:
+ ND_PRINT((ndo, ": Magic-Num-Block")); /* XXX */
+ break;
+ case MEDCLASS_PSNDN:
+ ND_PRINT((ndo, ": PSNDN")); /* XXX */
+ break;
+ default:
+ ND_PRINT((ndo, ": Unknown class %u", p[2]));
+ break;
+ }
+ break;
+
+/* XXX: to be supported */
+#if 0
+ case LCPOPT_DEP6:
+ case LCPOPT_FCSALT:
+ case LCPOPT_SDP:
+ case LCPOPT_NUMMODE:
+ case LCPOPT_DEP12:
+ case LCPOPT_DEP14:
+ case LCPOPT_DEP15:
+ case LCPOPT_DEP16:
+ case LCPOPT_MLSSNHF:
+ case LCPOPT_PROP:
+ case LCPOPT_DCEID:
+ case LCPOPT_MPP:
+ case LCPOPT_LCPAOPT:
+ case LCPOPT_COBS:
+ case LCPOPT_PE:
+ case LCPOPT_MLHF:
+ case LCPOPT_I18N:
+ case LCPOPT_SDLOS:
+ case LCPOPT_PPPMUX:
+ break;
+#endif
+ default:
+ /*
+ * Unknown option; dump it as raw bytes now if we're
+ * not going to do so below.
+ */
+ if (ndo->ndo_vflag < 2)
+ print_unknown_data(ndo, &p[2], "\n\t ", len - 2);
+ break;
+ }
+
+ if (ndo->ndo_vflag > 1)
+ print_unknown_data(ndo, &p[2], "\n\t ", len - 2); /* exclude TLV header */
+
+ return len;
+
+trunc:
+ ND_PRINT((ndo, "[|lcp]"));
+ return 0;
+}
+
+/* ML-PPP*/
+static const struct tok ppp_ml_flag_values[] = {
+ { 0x80, "begin" },
+ { 0x40, "end" },
+ { 0, NULL }
+};
+
+static void
+handle_mlppp(netdissect_options *ndo,
+ const u_char *p, int length)
+{
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, "MLPPP, "));
+
+ ND_PRINT((ndo, "seq 0x%03x, Flags [%s], length %u",
+ (EXTRACT_16BITS(p))&0x0fff, /* only support 12-Bit sequence space for now */
+ bittok2str(ppp_ml_flag_values, "none", *p & 0xc0),
+ length));
+}
+
+/* CHAP */
+static void
+handle_chap(netdissect_options *ndo,
+ const u_char *p, int length)
+{
+ u_int code, len;
+ int val_size, name_size, msg_size;
+ const u_char *p0;
+ int i;
+
+ p0 = p;
+ if (length < 1) {
+ ND_PRINT((ndo, "[|chap]"));
+ return;
+ } else if (length < 4) {
+ ND_TCHECK(*p);
+ ND_PRINT((ndo, "[|chap 0x%02x]", *p));
+ return;
+ }
+
+ ND_TCHECK(*p);
+ code = *p;
+ ND_PRINT((ndo, "CHAP, %s (0x%02x)",
+ tok2str(chapcode_values,"unknown",code),
+ code));
+ p++;
+
+ ND_TCHECK(*p);
+ ND_PRINT((ndo, ", id %u", *p)); /* ID */
+ p++;
+
+ ND_TCHECK2(*p, 2);
+ len = EXTRACT_16BITS(p);
+ p += 2;
+
+ /*
+ * Note that this is a generic CHAP decoding routine. Since we
+ * don't know which flavor of CHAP (i.e. CHAP-MD5, MS-CHAPv1,
+ * MS-CHAPv2) is used at this point, we can't decode packet
+ * specifically to each algorithms. Instead, we simply decode
+ * the GCD (Gratest Common Denominator) for all algorithms.
+ */
+ switch (code) {
+ case CHAP_CHAL:
+ case CHAP_RESP:
+ if (length - (p - p0) < 1)
+ return;
+ ND_TCHECK(*p);
+ val_size = *p; /* value size */
+ p++;
+ if (length - (p - p0) < val_size)
+ return;
+ ND_PRINT((ndo, ", Value "));
+ for (i = 0; i < val_size; i++) {
+ ND_TCHECK(*p);
+ ND_PRINT((ndo, "%02x", *p++));
+ }
+ name_size = len - (p - p0);
+ ND_PRINT((ndo, ", Name "));
+ for (i = 0; i < name_size; i++) {
+ ND_TCHECK(*p);
+ safeputchar(ndo, *p++);
+ }
+ break;
+ case CHAP_SUCC:
+ case CHAP_FAIL:
+ msg_size = len - (p - p0);
+ ND_PRINT((ndo, ", Msg "));
+ for (i = 0; i< msg_size; i++) {
+ ND_TCHECK(*p);
+ safeputchar(ndo, *p++);
+ }
+ break;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|chap]"));
+}
+
+/* PAP (see RFC 1334) */
+static void
+handle_pap(netdissect_options *ndo,
+ const u_char *p, int length)
+{
+ u_int code, len;
+ int peerid_len, passwd_len, msg_len;
+ const u_char *p0;
+ int i;
+
+ p0 = p;
+ if (length < 1) {
+ ND_PRINT((ndo, "[|pap]"));
+ return;
+ } else if (length < 4) {
+ ND_TCHECK(*p);
+ ND_PRINT((ndo, "[|pap 0x%02x]", *p));
+ return;
+ }
+
+ ND_TCHECK(*p);
+ code = *p;
+ ND_PRINT((ndo, "PAP, %s (0x%02x)",
+ tok2str(papcode_values, "unknown", code),
+ code));
+ p++;
+
+ ND_TCHECK(*p);
+ ND_PRINT((ndo, ", id %u", *p)); /* ID */
+ p++;
+
+ ND_TCHECK2(*p, 2);
+ len = EXTRACT_16BITS(p);
+ p += 2;
+
+ if ((int)len > length) {
+ ND_PRINT((ndo, ", length %u > packet size", len));
+ return;
+ }
+ length = len;
+ if (length < (p - p0)) {
+ ND_PRINT((ndo, ", length %u < PAP header length", length));
+ return;
+ }
+
+ switch (code) {
+ case PAP_AREQ:
+ if (length - (p - p0) < 1)
+ return;
+ ND_TCHECK(*p);
+ peerid_len = *p; /* Peer-ID Length */
+ p++;
+ if (length - (p - p0) < peerid_len)
+ return;
+ ND_PRINT((ndo, ", Peer "));
+ for (i = 0; i < peerid_len; i++) {
+ ND_TCHECK(*p);
+ safeputchar(ndo, *p++);
+ }
+
+ if (length - (p - p0) < 1)
+ return;
+ ND_TCHECK(*p);
+ passwd_len = *p; /* Password Length */
+ p++;
+ if (length - (p - p0) < passwd_len)
+ return;
+ ND_PRINT((ndo, ", Name "));
+ for (i = 0; i < passwd_len; i++) {
+ ND_TCHECK(*p);
+ safeputchar(ndo, *p++);
+ }
+ break;
+ case PAP_AACK:
+ case PAP_ANAK:
+ if (length - (p - p0) < 1)
+ return;
+ ND_TCHECK(*p);
+ msg_len = *p; /* Msg-Length */
+ p++;
+ if (length - (p - p0) < msg_len)
+ return;
+ ND_PRINT((ndo, ", Msg "));
+ for (i = 0; i< msg_len; i++) {
+ ND_TCHECK(*p);
+ safeputchar(ndo, *p++);
+ }
+ break;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|pap]"));
+}
+
+/* BAP */
+static void
+handle_bap(netdissect_options *ndo _U_,
+ const u_char *p _U_, int length _U_)
+{
+ /* XXX: to be supported!! */
+}
+
+
+/* IPCP config options */
+static int
+print_ipcp_config_options(netdissect_options *ndo,
+ const u_char *p, int length)
+{
+ int len, opt;
+ u_int compproto, ipcomp_subopttotallen, ipcomp_subopt, ipcomp_suboptlen;
+
+ if (length < 2)
+ return 0;
+ ND_TCHECK2(*p, 2);
+ len = p[1];
+ opt = p[0];
+ if (length < len)
+ return 0;
+ if (len < 2) {
+ ND_PRINT((ndo, "\n\t %s Option (0x%02x), length %u (length bogus, should be >= 2)",
+ tok2str(ipcpopt_values,"unknown",opt),
+ opt,
+ len));
+ return 0;
+ }
+
+ ND_PRINT((ndo, "\n\t %s Option (0x%02x), length %u",
+ tok2str(ipcpopt_values,"unknown",opt),
+ opt,
+ len));
+
+ switch (opt) {
+ case IPCPOPT_2ADDR: /* deprecated */
+ if (len != 10) {
+ ND_PRINT((ndo, " (length bogus, should be = 10)"));
+ return len;
+ }
+ ND_TCHECK2(*(p + 6), 4);
+ ND_PRINT((ndo, ": src %s, dst %s",
+ ipaddr_string(ndo, p + 2),
+ ipaddr_string(ndo, p + 6)));
+ break;
+ case IPCPOPT_IPCOMP:
+ if (len < 4) {
+ ND_PRINT((ndo, " (length bogus, should be >= 4)"));
+ return 0;
+ }
+ ND_TCHECK2(*(p + 2), 2);
+ compproto = EXTRACT_16BITS(p+2);
+
+ ND_PRINT((ndo, ": %s (0x%02x):",
+ tok2str(ipcpopt_compproto_values, "Unknown", compproto),
+ compproto));
+
+ switch (compproto) {
+ case PPP_VJC:
+ /* XXX: VJ-Comp parameters should be decoded */
+ break;
+ case IPCPOPT_IPCOMP_HDRCOMP:
+ if (len < IPCPOPT_IPCOMP_MINLEN) {
+ ND_PRINT((ndo, " (length bogus, should be >= %u)",
+ IPCPOPT_IPCOMP_MINLEN));
+ return 0;
+ }
+
+ ND_TCHECK2(*(p + 2), IPCPOPT_IPCOMP_MINLEN);
+ ND_PRINT((ndo, "\n\t TCP Space %u, non-TCP Space %u" \
+ ", maxPeriod %u, maxTime %u, maxHdr %u",
+ EXTRACT_16BITS(p+4),
+ EXTRACT_16BITS(p+6),
+ EXTRACT_16BITS(p+8),
+ EXTRACT_16BITS(p+10),
+ EXTRACT_16BITS(p+12)));
+
+ /* suboptions present ? */
+ if (len > IPCPOPT_IPCOMP_MINLEN) {
+ ipcomp_subopttotallen = len - IPCPOPT_IPCOMP_MINLEN;
+ p += IPCPOPT_IPCOMP_MINLEN;
+
+ ND_PRINT((ndo, "\n\t Suboptions, length %u", ipcomp_subopttotallen));
+
+ while (ipcomp_subopttotallen >= 2) {
+ ND_TCHECK2(*p, 2);
+ ipcomp_subopt = *p;
+ ipcomp_suboptlen = *(p+1);
+
+ /* sanity check */
+ if (ipcomp_subopt == 0 ||
+ ipcomp_suboptlen == 0 )
+ break;
+
+ /* XXX: just display the suboptions for now */
+ ND_PRINT((ndo, "\n\t\t%s Suboption #%u, length %u",
+ tok2str(ipcpopt_compproto_subopt_values,
+ "Unknown",
+ ipcomp_subopt),
+ ipcomp_subopt,
+ ipcomp_suboptlen));
+
+ ipcomp_subopttotallen -= ipcomp_suboptlen;
+ p += ipcomp_suboptlen;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case IPCPOPT_ADDR: /* those options share the same format - fall through */
+ case IPCPOPT_MOBILE4:
+ case IPCPOPT_PRIDNS:
+ case IPCPOPT_PRINBNS:
+ case IPCPOPT_SECDNS:
+ case IPCPOPT_SECNBNS:
+ if (len != 6) {
+ ND_PRINT((ndo, " (length bogus, should be = 6)"));
+ return 0;
+ }
+ ND_TCHECK2(*(p + 2), 4);
+ ND_PRINT((ndo, ": %s", ipaddr_string(ndo, p + 2)));
+ break;
+ default:
+ /*
+ * Unknown option; dump it as raw bytes now if we're
+ * not going to do so below.
+ */
+ if (ndo->ndo_vflag < 2)
+ print_unknown_data(ndo, &p[2], "\n\t ", len - 2);
+ break;
+ }
+ if (ndo->ndo_vflag > 1)
+ print_unknown_data(ndo, &p[2], "\n\t ", len - 2); /* exclude TLV header */
+ return len;
+
+trunc:
+ ND_PRINT((ndo, "[|ipcp]"));
+ return 0;
+}
+
+/* IP6CP config options */
+static int
+print_ip6cp_config_options(netdissect_options *ndo,
+ const u_char *p, int length)
+{
+ int len, opt;
+
+ if (length < 2)
+ return 0;
+ ND_TCHECK2(*p, 2);
+ len = p[1];
+ opt = p[0];
+ if (length < len)
+ return 0;
+ if (len < 2) {
+ ND_PRINT((ndo, "\n\t %s Option (0x%02x), length %u (length bogus, should be >= 2)",
+ tok2str(ip6cpopt_values,"unknown",opt),
+ opt,
+ len));
+ return 0;
+ }
+
+ ND_PRINT((ndo, "\n\t %s Option (0x%02x), length %u",
+ tok2str(ip6cpopt_values,"unknown",opt),
+ opt,
+ len));
+
+ switch (opt) {
+ case IP6CP_IFID:
+ if (len != 10) {
+ ND_PRINT((ndo, " (length bogus, should be = 10)"));
+ return len;
+ }
+ ND_TCHECK2(*(p + 2), 8);
+ ND_PRINT((ndo, ": %04x:%04x:%04x:%04x",
+ EXTRACT_16BITS(p + 2),
+ EXTRACT_16BITS(p + 4),
+ EXTRACT_16BITS(p + 6),
+ EXTRACT_16BITS(p + 8)));
+ break;
+ default:
+ /*
+ * Unknown option; dump it as raw bytes now if we're
+ * not going to do so below.
+ */
+ if (ndo->ndo_vflag < 2)
+ print_unknown_data(ndo, &p[2], "\n\t ", len - 2);
+ break;
+ }
+ if (ndo->ndo_vflag > 1)
+ print_unknown_data(ndo, &p[2], "\n\t ", len - 2); /* exclude TLV header */
+
+ return len;
+
+trunc:
+ ND_PRINT((ndo, "[|ip6cp]"));
+ return 0;
+}
+
+
+/* CCP config options */
+static int
+print_ccp_config_options(netdissect_options *ndo,
+ const u_char *p, int length)
+{
+ int len, opt;
+
+ if (length < 2)
+ return 0;
+ ND_TCHECK2(*p, 2);
+ len = p[1];
+ opt = p[0];
+ if (length < len)
+ return 0;
+ if (len < 2) {
+ ND_PRINT((ndo, "\n\t %s Option (0x%02x), length %u (length bogus, should be >= 2)",
+ tok2str(ccpconfopts_values, "Unknown", opt),
+ opt,
+ len));
+ return 0;
+ }
+
+ ND_PRINT((ndo, "\n\t %s Option (0x%02x), length %u",
+ tok2str(ccpconfopts_values, "Unknown", opt),
+ opt,
+ len));
+
+ switch (opt) {
+ case CCPOPT_BSDCOMP:
+ if (len < 3) {
+ ND_PRINT((ndo, " (length bogus, should be >= 3)"));
+ return len;
+ }
+ ND_TCHECK2(*(p + 2), 1);
+ ND_PRINT((ndo, ": Version: %u, Dictionary Bits: %u",
+ p[2] >> 5, p[2] & 0x1f));
+ break;
+ case CCPOPT_MVRCA:
+ if (len < 4) {
+ ND_PRINT((ndo, " (length bogus, should be >= 4)"));
+ return len;
+ }
+ ND_TCHECK2(*(p + 2), 1);
+ ND_PRINT((ndo, ": Features: %u, PxP: %s, History: %u, #CTX-ID: %u",
+ (p[2] & 0xc0) >> 6,
+ (p[2] & 0x20) ? "Enabled" : "Disabled",
+ p[2] & 0x1f, p[3]));
+ break;
+ case CCPOPT_DEFLATE:
+ if (len < 4) {
+ ND_PRINT((ndo, " (length bogus, should be >= 4)"));
+ return len;
+ }
+ ND_TCHECK2(*(p + 2), 1);
+ ND_PRINT((ndo, ": Window: %uK, Method: %s (0x%x), MBZ: %u, CHK: %u",
+ (p[2] & 0xf0) >> 4,
+ ((p[2] & 0x0f) == 8) ? "zlib" : "unkown",
+ p[2] & 0x0f, (p[3] & 0xfc) >> 2, p[3] & 0x03));
+ break;
+
+/* XXX: to be supported */
+#if 0
+ case CCPOPT_OUI:
+ case CCPOPT_PRED1:
+ case CCPOPT_PRED2:
+ case CCPOPT_PJUMP:
+ case CCPOPT_HPPPC:
+ case CCPOPT_STACLZS:
+ case CCPOPT_MPPC:
+ case CCPOPT_GFZA:
+ case CCPOPT_V42BIS:
+ case CCPOPT_LZSDCP:
+ case CCPOPT_DEC:
+ case CCPOPT_RESV:
+ break;
+#endif
+ default:
+ /*
+ * Unknown option; dump it as raw bytes now if we're
+ * not going to do so below.
+ */
+ if (ndo->ndo_vflag < 2)
+ print_unknown_data(ndo, &p[2], "\n\t ", len - 2);
+ break;
+ }
+ if (ndo->ndo_vflag > 1)
+ print_unknown_data(ndo, &p[2], "\n\t ", len - 2); /* exclude TLV header */
+
+ return len;
+
+trunc:
+ ND_PRINT((ndo, "[|ccp]"));
+ return 0;
+}
+
+/* BACP config options */
+static int
+print_bacp_config_options(netdissect_options *ndo,
+ const u_char *p, int length)
+{
+ int len, opt;
+
+ if (length < 2)
+ return 0;
+ ND_TCHECK2(*p, 2);
+ len = p[1];
+ opt = p[0];
+ if (length < len)
+ return 0;
+ if (len < 2) {
+ ND_PRINT((ndo, "\n\t %s Option (0x%02x), length %u (length bogus, should be >= 2)",
+ tok2str(bacconfopts_values, "Unknown", opt),
+ opt,
+ len));
+ return 0;
+ }
+
+ ND_PRINT((ndo, "\n\t %s Option (0x%02x), length %u",
+ tok2str(bacconfopts_values, "Unknown", opt),
+ opt,
+ len));
+
+ switch (opt) {
+ case BACPOPT_FPEER:
+ if (len != 6) {
+ ND_PRINT((ndo, " (length bogus, should be = 6)"));
+ return len;
+ }
+ ND_TCHECK2(*(p + 2), 4);
+ ND_PRINT((ndo, ": Magic-Num 0x%08x", EXTRACT_32BITS(p + 2)));
+ break;
+ default:
+ /*
+ * Unknown option; dump it as raw bytes now if we're
+ * not going to do so below.
+ */
+ if (ndo->ndo_vflag < 2)
+ print_unknown_data(ndo, &p[2], "\n\t ", len - 2);
+ break;
+ }
+ if (ndo->ndo_vflag > 1)
+ print_unknown_data(ndo, &p[2], "\n\t ", len - 2); /* exclude TLV header */
+
+ return len;
+
+trunc:
+ ND_PRINT((ndo, "[|bacp]"));
+ return 0;
+}
+
+static void
+ppp_hdlc(netdissect_options *ndo,
+ const u_char *p, int length)
+{
+ u_char *b, *t, c;
+ const u_char *s;
+ int i, proto;
+ const void *se;
+
+ if (length <= 0)
+ return;
+
+ b = (u_char *)malloc(length);
+ if (b == NULL)
+ return;
+
+ /*
+ * Unescape all the data into a temporary, private, buffer.
+ * Do this so that we dont overwrite the original packet
+ * contents.
+ */
+ for (s = p, t = b, i = length; i > 0 && ND_TTEST(*s); i--) {
+ c = *s++;
+ if (c == 0x7d) {
+ if (i <= 1 || !ND_TTEST(*s))
+ break;
+ i--;
+ c = *s++ ^ 0x20;
+ }
+ *t++ = c;
+ }
+
+ se = ndo->ndo_snapend;
+ ndo->ndo_snapend = t;
+ length = t - b;
+
+ /* now lets guess about the payload codepoint format */
+ if (length < 1)
+ goto trunc;
+ proto = *b; /* start with a one-octet codepoint guess */
+
+ switch (proto) {
+ case PPP_IP:
+ ip_print(ndo, b + 1, length - 1);
+ goto cleanup;
+ case PPP_IPV6:
+ ip6_print(ndo, b + 1, length - 1);
+ goto cleanup;
+ default: /* no luck - try next guess */
+ break;
+ }
+
+ if (length < 2)
+ goto trunc;
+ proto = EXTRACT_16BITS(b); /* next guess - load two octets */
+
+ switch (proto) {
+ case (PPP_ADDRESS << 8 | PPP_CONTROL): /* looks like a PPP frame */
+ if (length < 4)
+ goto trunc;
+ proto = EXTRACT_16BITS(b+2); /* load the PPP proto-id */
+ handle_ppp(ndo, proto, b + 4, length - 4);
+ break;
+ default: /* last guess - proto must be a PPP proto-id */
+ handle_ppp(ndo, proto, b + 2, length - 2);
+ break;
+ }
+
+cleanup:
+ ndo->ndo_snapend = se;
+ free(b);
+ return;
+
+trunc:
+ ndo->ndo_snapend = se;
+ free(b);
+ ND_PRINT((ndo, "[|ppp]"));
+}
+
+
+/* PPP */
+static void
+handle_ppp(netdissect_options *ndo,
+ u_int proto, const u_char *p, int length)
+{
+ if ((proto & 0xff00) == 0x7e00) { /* is this an escape code ? */
+ ppp_hdlc(ndo, p - 1, length);
+ return;
+ }
+
+ switch (proto) {
+ case PPP_LCP: /* fall through */
+ case PPP_IPCP:
+ case PPP_OSICP:
+ case PPP_MPLSCP:
+ case PPP_IPV6CP:
+ case PPP_CCP:
+ case PPP_BACP:
+ handle_ctrl_proto(ndo, proto, p, length);
+ break;
+ case PPP_ML:
+ handle_mlppp(ndo, p, length);
+ break;
+ case PPP_CHAP:
+ handle_chap(ndo, p, length);
+ break;
+ case PPP_PAP:
+ handle_pap(ndo, p, length);
+ break;
+ case PPP_BAP: /* XXX: not yet completed */
+ handle_bap(ndo, p, length);
+ break;
+ case ETHERTYPE_IP: /*XXX*/
+ case PPP_VJNC:
+ case PPP_IP:
+ ip_print(ndo, p, length);
+ break;
+ case ETHERTYPE_IPV6: /*XXX*/
+ case PPP_IPV6:
+ ip6_print(ndo, p, length);
+ break;
+ case ETHERTYPE_IPX: /*XXX*/
+ case PPP_IPX:
+ ipx_print(ndo, p, length);
+ break;
+ case PPP_OSI:
+ isoclns_print(ndo, p, length, length);
+ break;
+ case PPP_MPLS_UCAST:
+ case PPP_MPLS_MCAST:
+ mpls_print(ndo, p, length);
+ break;
+ case PPP_COMP:
+ ND_PRINT((ndo, "compressed PPP data"));
+ break;
+ default:
+ ND_PRINT((ndo, "%s ", tok2str(ppptype2str, "unknown PPP protocol (0x%04x)", proto)));
+ print_unknown_data(ndo, p, "\n\t", length);
+ break;
+ }
+}
+
+/* Standard PPP printer */
+u_int
+ppp_print(netdissect_options *ndo,
+ register const u_char *p, u_int length)
+{
+ u_int proto,ppp_header;
+ u_int olen = length; /* _o_riginal length */
+ u_int hdr_len = 0;
+
+ /*
+ * Here, we assume that p points to the Address and Control
+ * field (if they present).
+ */
+ if (length < 2)
+ goto trunc;
+ ND_TCHECK2(*p, 2);
+ ppp_header = EXTRACT_16BITS(p);
+
+ switch(ppp_header) {
+ case (PPP_WITHDIRECTION_IN << 8 | PPP_CONTROL):
+ if (ndo->ndo_eflag) ND_PRINT((ndo, "In "));
+ p += 2;
+ length -= 2;
+ hdr_len += 2;
+ break;
+ case (PPP_WITHDIRECTION_OUT << 8 | PPP_CONTROL):
+ if (ndo->ndo_eflag) ND_PRINT((ndo, "Out "));
+ p += 2;
+ length -= 2;
+ hdr_len += 2;
+ break;
+ case (PPP_ADDRESS << 8 | PPP_CONTROL):
+ p += 2; /* ACFC not used */
+ length -= 2;
+ hdr_len += 2;
+ break;
+
+ default:
+ break;
+ }
+
+ if (length < 2)
+ goto trunc;
+ ND_TCHECK(*p);
+ if (*p % 2) {
+ proto = *p; /* PFC is used */
+ p++;
+ length--;
+ hdr_len++;
+ } else {
+ ND_TCHECK2(*p, 2);
+ proto = EXTRACT_16BITS(p);
+ p += 2;
+ length -= 2;
+ hdr_len += 2;
+ }
+
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "%s (0x%04x), length %u: ",
+ tok2str(ppptype2str, "unknown", proto),
+ proto,
+ olen));
+
+ handle_ppp(ndo, proto, p, length);
+ return (hdr_len);
+trunc:
+ ND_PRINT((ndo, "[|ppp]"));
+ return (0);
+}
+
+
+/* PPP I/F printer */
+u_int
+ppp_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ register u_int length = h->len;
+ register u_int caplen = h->caplen;
+
+ if (caplen < PPP_HDRLEN) {
+ ND_PRINT((ndo, "[|ppp]"));
+ return (caplen);
+ }
+
+#if 0
+ /*
+ * XXX: seems to assume that there are 2 octets prepended to an
+ * actual PPP frame. The 1st octet looks like Input/Output flag
+ * while 2nd octet is unknown, at least to me
+ * (mshindo@mshindo.net).
+ *
+ * That was what the original tcpdump code did.
+ *
+ * FreeBSD's "if_ppp.c" *does* set the first octet to 1 for outbound
+ * packets and 0 for inbound packets - but only if the
+ * protocol field has the 0x8000 bit set (i.e., it's a network
+ * control protocol); it does so before running the packet through
+ * "bpf_filter" to see if it should be discarded, and to see
+ * if we should update the time we sent the most recent packet...
+ *
+ * ...but it puts the original address field back after doing
+ * so.
+ *
+ * NetBSD's "if_ppp.c" doesn't set the first octet in that fashion.
+ *
+ * I don't know if any PPP implementation handed up to a BPF
+ * device packets with the first octet being 1 for outbound and
+ * 0 for inbound packets, so I (guy@alum.mit.edu) don't know
+ * whether that ever needs to be checked or not.
+ *
+ * Note that NetBSD has a DLT_PPP_SERIAL, which it uses for PPP,
+ * and its tcpdump appears to assume that the frame always
+ * begins with an address field and a control field, and that
+ * the address field might be 0x0f or 0x8f, for Cisco
+ * point-to-point with HDLC framing as per section 4.3.1 of RFC
+ * 1547, as well as 0xff, for PPP in HDLC-like framing as per
+ * RFC 1662.
+ *
+ * (Is the Cisco framing in question what DLT_C_HDLC, in
+ * BSD/OS, is?)
+ */
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "%c %4d %02x ", p[0] ? 'O' : 'I', length, p[1]));
+#endif
+
+ ppp_print(ndo, p, length);
+
+ return (0);
+}
+
+/*
+ * PPP I/F printer to use if we know that RFC 1662-style PPP in HDLC-like
+ * framing, or Cisco PPP with HDLC framing as per section 4.3.1 of RFC 1547,
+ * is being used (i.e., we don't check for PPP_ADDRESS and PPP_CONTROL,
+ * discard them *if* those are the first two octets, and parse the remaining
+ * packet as a PPP packet, as "ppp_print()" does).
+ *
+ * This handles, for example, DLT_PPP_SERIAL in NetBSD.
+ */
+u_int
+ppp_hdlc_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
+{
+ register u_int length = h->len;
+ register u_int caplen = h->caplen;
+ u_int proto;
+ u_int hdrlen = 0;
+
+ if (caplen < 2) {
+ ND_PRINT((ndo, "[|ppp]"));
+ return (caplen);
+ }
+
+ switch (p[0]) {
+
+ case PPP_ADDRESS:
+ if (caplen < 4) {
+ ND_PRINT((ndo, "[|ppp]"));
+ return (caplen);
+ }
+
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "%02x %02x %d ", p[0], p[1], length));
+ p += 2;
+ length -= 2;
+ hdrlen += 2;
+
+ proto = EXTRACT_16BITS(p);
+ p += 2;
+ length -= 2;
+ hdrlen += 2;
+ ND_PRINT((ndo, "%s: ", tok2str(ppptype2str, "unknown PPP protocol (0x%04x)", proto)));
+
+ handle_ppp(ndo, proto, p, length);
+ break;
+
+ case CHDLC_UNICAST:
+ case CHDLC_BCAST:
+ return (chdlc_if_print(ndo, h, p));
+
+ default:
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "%02x %02x %d ", p[0], p[1], length));
+ p += 2;
+ hdrlen += 2;
+
+ /*
+ * XXX - NetBSD's "ppp_netbsd_serial_if_print()" treats
+ * the next two octets as an Ethernet type; does that
+ * ever happen?
+ */
+ ND_PRINT((ndo, "unknown addr %02x; ctrl %02x", p[0], p[1]));
+ break;
+ }
+
+ return (hdrlen);
+}
+
+#define PPP_BSDI_HDRLEN 24
+
+/* BSD/OS specific PPP printer */
+u_int
+ppp_bsdos_if_print(netdissect_options *ndo _U_,
+ const struct pcap_pkthdr *h _U_, register const u_char *p _U_)
+{
+ register int hdrlength;
+#ifdef __bsdi__
+ register u_int length = h->len;
+ register u_int caplen = h->caplen;
+ uint16_t ptype;
+ const u_char *q;
+ int i;
+
+ if (caplen < PPP_BSDI_HDRLEN) {
+ ND_PRINT((ndo, "[|ppp]"));
+ return (caplen)
+ }
+
+ hdrlength = 0;
+
+#if 0
+ if (p[0] == PPP_ADDRESS && p[1] == PPP_CONTROL) {
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "%02x %02x ", p[0], p[1]));
+ p += 2;
+ hdrlength = 2;
+ }
+
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "%d ", length));
+ /* Retrieve the protocol type */
+ if (*p & 01) {
+ /* Compressed protocol field */
+ ptype = *p;
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "%02x ", ptype));
+ p++;
+ hdrlength += 1;
+ } else {
+ /* Un-compressed protocol field */
+ ptype = EXTRACT_16BITS(p);
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "%04x ", ptype));
+ p += 2;
+ hdrlength += 2;
+ }
+#else
+ ptype = 0; /*XXX*/
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "%c ", p[SLC_DIR] ? 'O' : 'I'));
+ if (p[SLC_LLHL]) {
+ /* link level header */
+ struct ppp_header *ph;
+
+ q = p + SLC_BPFHDRLEN;
+ ph = (struct ppp_header *)q;
+ if (ph->phdr_addr == PPP_ADDRESS
+ && ph->phdr_ctl == PPP_CONTROL) {
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "%02x %02x ", q[0], q[1]));
+ ptype = EXTRACT_16BITS(&ph->phdr_type);
+ if (ndo->ndo_eflag && (ptype == PPP_VJC || ptype == PPP_VJNC)) {
+ ND_PRINT((ndo, "%s ", tok2str(ppptype2str,
+ "proto-#%d", ptype)));
+ }
+ } else {
+ if (ndo->ndo_eflag) {
+ ND_PRINT((ndo, "LLH=["));
+ for (i = 0; i < p[SLC_LLHL]; i++)
+ ND_PRINT((ndo, "%02x", q[i]));
+ ND_PRINT((ndo, "] "));
+ }
+ }
+ }
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "%d ", length));
+ if (p[SLC_CHL]) {
+ q = p + SLC_BPFHDRLEN + p[SLC_LLHL];
+
+ switch (ptype) {
+ case PPP_VJC:
+ ptype = vjc_print(ndo, q, ptype);
+ hdrlength = PPP_BSDI_HDRLEN;
+ p += hdrlength;
+ switch (ptype) {
+ case PPP_IP:
+ ip_print(ndo, p, length);
+ break;
+ case PPP_IPV6:
+ ip6_print(ndo, p, length);
+ break;
+ case PPP_MPLS_UCAST:
+ case PPP_MPLS_MCAST:
+ mpls_print(ndo, p, length);
+ break;
+ }
+ goto printx;
+ case PPP_VJNC:
+ ptype = vjc_print(ndo, q, ptype);
+ hdrlength = PPP_BSDI_HDRLEN;
+ p += hdrlength;
+ switch (ptype) {
+ case PPP_IP:
+ ip_print(ndo, p, length);
+ break;
+ case PPP_IPV6:
+ ip6_print(ndo, p, length);
+ break;
+ case PPP_MPLS_UCAST:
+ case PPP_MPLS_MCAST:
+ mpls_print(ndo, p, length);
+ break;
+ }
+ goto printx;
+ default:
+ if (ndo->ndo_eflag) {
+ ND_PRINT((ndo, "CH=["));
+ for (i = 0; i < p[SLC_LLHL]; i++)
+ ND_PRINT((ndo, "%02x", q[i]));
+ ND_PRINT((ndo, "] "));
+ }
+ break;
+ }
+ }
+
+ hdrlength = PPP_BSDI_HDRLEN;
+#endif
+
+ length -= hdrlength;
+ p += hdrlength;
+
+ switch (ptype) {
+ case PPP_IP:
+ ip_print(p, length);
+ break;
+ case PPP_IPV6:
+ ip6_print(ndo, p, length);
+ break;
+ case PPP_MPLS_UCAST:
+ case PPP_MPLS_MCAST:
+ mpls_print(ndo, p, length);
+ break;
+ default:
+ ND_PRINT((ndo, "%s ", tok2str(ppptype2str, "unknown PPP protocol (0x%04x)", ptype)));
+ }
+
+printx:
+#else /* __bsdi */
+ hdrlength = 0;
+#endif /* __bsdi__ */
+ return (hdrlength);
+}
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * Original code by Greg Stark <gsstark@mit.edu>
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-pppoe.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h" /* must come after interface.h */
+
+/* Codes */
+enum {
+ PPPOE_PADI = 0x09,
+ PPPOE_PADO = 0x07,
+ PPPOE_PADR = 0x19,
+ PPPOE_PADS = 0x65,
+ PPPOE_PADT = 0xa7
+};
+
+static const struct tok pppoecode2str[] = {
+ { PPPOE_PADI, "PADI" },
+ { PPPOE_PADO, "PADO" },
+ { PPPOE_PADR, "PADR" },
+ { PPPOE_PADS, "PADS" },
+ { PPPOE_PADT, "PADT" },
+ { 0, "" }, /* PPP Data */
+ { 0, NULL }
+};
+
+/* Tags */
+enum {
+ PPPOE_EOL = 0,
+ PPPOE_SERVICE_NAME = 0x0101,
+ PPPOE_AC_NAME = 0x0102,
+ PPPOE_HOST_UNIQ = 0x0103,
+ PPPOE_AC_COOKIE = 0x0104,
+ PPPOE_VENDOR = 0x0105,
+ PPPOE_RELAY_SID = 0x0110,
+ PPPOE_MAX_PAYLOAD = 0x0120,
+ PPPOE_SERVICE_NAME_ERROR = 0x0201,
+ PPPOE_AC_SYSTEM_ERROR = 0x0202,
+ PPPOE_GENERIC_ERROR = 0x0203
+};
+
+static const struct tok pppoetag2str[] = {
+ { PPPOE_EOL, "EOL" },
+ { PPPOE_SERVICE_NAME, "Service-Name" },
+ { PPPOE_AC_NAME, "AC-Name" },
+ { PPPOE_HOST_UNIQ, "Host-Uniq" },
+ { PPPOE_AC_COOKIE, "AC-Cookie" },
+ { PPPOE_VENDOR, "Vendor-Specific" },
+ { PPPOE_RELAY_SID, "Relay-Session-ID" },
+ { PPPOE_MAX_PAYLOAD, "PPP-Max-Payload" },
+ { PPPOE_SERVICE_NAME_ERROR, "Service-Name-Error" },
+ { PPPOE_AC_SYSTEM_ERROR, "AC-System-Error" },
+ { PPPOE_GENERIC_ERROR, "Generic-Error" },
+ { 0, NULL }
+};
+
+#define PPPOE_HDRLEN 6
+#define MAXTAGPRINT 80
+
+u_int
+pppoe_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, register const u_char *p)
+{
+ return (pppoe_print(ndo, p, h->len));
+}
+
+u_int
+pppoe_print(netdissect_options *ndo, register const u_char *bp, u_int length)
+{
+ uint16_t pppoe_ver, pppoe_type, pppoe_code, pppoe_sessionid;
+ u_int pppoe_length;
+ const u_char *pppoe_packet, *pppoe_payload;
+
+ if (length < PPPOE_HDRLEN) {
+ ND_PRINT((ndo, "truncated-pppoe %u", length));
+ return (length);
+ }
+ length -= PPPOE_HDRLEN;
+ pppoe_packet = bp;
+ ND_TCHECK2(*pppoe_packet, PPPOE_HDRLEN);
+ pppoe_ver = (pppoe_packet[0] & 0xF0) >> 4;
+ pppoe_type = (pppoe_packet[0] & 0x0F);
+ pppoe_code = pppoe_packet[1];
+ pppoe_sessionid = EXTRACT_16BITS(pppoe_packet + 2);
+ pppoe_length = EXTRACT_16BITS(pppoe_packet + 4);
+ pppoe_payload = pppoe_packet + PPPOE_HDRLEN;
+
+ if (pppoe_ver != 1) {
+ ND_PRINT((ndo, " [ver %d]",pppoe_ver));
+ }
+ if (pppoe_type != 1) {
+ ND_PRINT((ndo, " [type %d]",pppoe_type));
+ }
+
+ ND_PRINT((ndo, "PPPoE %s", tok2str(pppoecode2str, "PAD-%x", pppoe_code)));
+ if (pppoe_code == PPPOE_PADI && pppoe_length > 1484 - PPPOE_HDRLEN) {
+ ND_PRINT((ndo, " [len %u!]",pppoe_length));
+ }
+ if (pppoe_length > length) {
+ ND_PRINT((ndo, " [len %u > %u!]", pppoe_length, length));
+ pppoe_length = length;
+ }
+ if (pppoe_sessionid) {
+ ND_PRINT((ndo, " [ses 0x%x]", pppoe_sessionid));
+ }
+
+ if (pppoe_code) {
+ /* PPP session packets don't contain tags */
+ u_short tag_type = 0xffff, tag_len;
+ const u_char *p = pppoe_payload;
+
+ /*
+ * loop invariant:
+ * p points to current tag,
+ * tag_type is previous tag or 0xffff for first iteration
+ */
+ while (tag_type && p < pppoe_payload + pppoe_length) {
+ ND_TCHECK2(*p, 4);
+ tag_type = EXTRACT_16BITS(p);
+ tag_len = EXTRACT_16BITS(p + 2);
+ p += 4;
+ /* p points to tag_value */
+
+ if (tag_len) {
+ unsigned isascii = 0, isgarbage = 0;
+ const u_char *v;
+ char tag_str[MAXTAGPRINT];
+ unsigned tag_str_len = 0;
+
+ /* TODO print UTF-8 decoded text */
+ ND_TCHECK2(*p, tag_len);
+ for (v = p; v < p + tag_len && tag_str_len < MAXTAGPRINT-1; v++)
+ if (*v >= 32 && *v < 127) {
+ tag_str[tag_str_len++] = *v;
+ isascii++;
+ } else {
+ tag_str[tag_str_len++] = '.';
+ isgarbage++;
+ }
+ tag_str[tag_str_len] = 0;
+
+ if (isascii > isgarbage) {
+ ND_PRINT((ndo, " [%s \"%*.*s\"]",
+ tok2str(pppoetag2str, "TAG-0x%x", tag_type),
+ (int)tag_str_len,
+ (int)tag_str_len,
+ tag_str));
+ } else {
+ /* Print hex, not fast to abuse printf but this doesn't get used much */
+ ND_PRINT((ndo, " [%s 0x", tok2str(pppoetag2str, "TAG-0x%x", tag_type)));
+ for (v=p; v<p+tag_len; v++) {
+ ND_PRINT((ndo, "%02X", *v));
+ }
+ ND_PRINT((ndo, "]"));
+ }
+
+
+ } else
+ ND_PRINT((ndo, " [%s]", tok2str(pppoetag2str,
+ "TAG-0x%x", tag_type)));
+
+ p += tag_len;
+ /* p points to next tag */
+ }
+ return (0);
+ } else {
+ /* PPPoE data */
+ ND_PRINT((ndo, " "));
+ return (PPPOE_HDRLEN + ppp_print(ndo, pppoe_payload, pppoe_length));
+ }
+
+trunc:
+ ND_PRINT((ndo, "[|pppoe]"));
+ return (PPPOE_HDRLEN);
+}
--- /dev/null
+/*
+ * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * PPTP support contributed by Motonori Shindo (mshindo@mshindo.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-pptp.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+static const char tstr[] = " [|pptp]";
+
+#define PPTP_MSG_TYPE_CTRL 1 /* Control Message */
+#define PPTP_MSG_TYPE_MGMT 2 /* Management Message (currently not used */
+#define PPTP_MAGIC_COOKIE 0x1a2b3c4d /* for sanity check */
+
+#define PPTP_CTRL_MSG_TYPE_SCCRQ 1
+#define PPTP_CTRL_MSG_TYPE_SCCRP 2
+#define PPTP_CTRL_MSG_TYPE_StopCCRQ 3
+#define PPTP_CTRL_MSG_TYPE_StopCCRP 4
+#define PPTP_CTRL_MSG_TYPE_ECHORQ 5
+#define PPTP_CTRL_MSG_TYPE_ECHORP 6
+#define PPTP_CTRL_MSG_TYPE_OCRQ 7
+#define PPTP_CTRL_MSG_TYPE_OCRP 8
+#define PPTP_CTRL_MSG_TYPE_ICRQ 9
+#define PPTP_CTRL_MSG_TYPE_ICRP 10
+#define PPTP_CTRL_MSG_TYPE_ICCN 11
+#define PPTP_CTRL_MSG_TYPE_CCRQ 12
+#define PPTP_CTRL_MSG_TYPE_CDN 13
+#define PPTP_CTRL_MSG_TYPE_WEN 14
+#define PPTP_CTRL_MSG_TYPE_SLI 15
+
+#define PPTP_FRAMING_CAP_ASYNC_MASK 0x00000001 /* Aynchronous */
+#define PPTP_FRAMING_CAP_SYNC_MASK 0x00000002 /* Synchronous */
+
+#define PPTP_BEARER_CAP_ANALOG_MASK 0x00000001 /* Analog */
+#define PPTP_BEARER_CAP_DIGITAL_MASK 0x00000002 /* Digital */
+
+static const char *pptp_message_type_string[] = {
+ "NOT_DEFINED", /* 0 Not defined in the RFC2637 */
+ "SCCRQ", /* 1 Start-Control-Connection-Request */
+ "SCCRP", /* 2 Start-Control-Connection-Reply */
+ "StopCCRQ", /* 3 Stop-Control-Connection-Request */
+ "StopCCRP", /* 4 Stop-Control-Connection-Reply */
+ "ECHORQ", /* 5 Echo Request */
+ "ECHORP", /* 6 Echo Reply */
+
+ "OCRQ", /* 7 Outgoing-Call-Request */
+ "OCRP", /* 8 Outgoing-Call-Reply */
+ "ICRQ", /* 9 Incoming-Call-Request */
+ "ICRP", /* 10 Incoming-Call-Reply */
+ "ICCN", /* 11 Incoming-Call-Connected */
+ "CCRQ", /* 12 Call-Clear-Request */
+ "CDN", /* 13 Call-Disconnect-Notify */
+
+ "WEN", /* 14 WAN-Error-Notify */
+
+ "SLI" /* 15 Set-Link-Info */
+#define PPTP_MAX_MSGTYPE_INDEX 16
+};
+
+/* common for all PPTP control messages */
+struct pptp_hdr {
+ uint16_t length;
+ uint16_t msg_type;
+ uint32_t magic_cookie;
+ uint16_t ctrl_msg_type;
+ uint16_t reserved0;
+};
+
+struct pptp_msg_sccrq {
+ uint16_t proto_ver;
+ uint16_t reserved1;
+ uint32_t framing_cap;
+ uint32_t bearer_cap;
+ uint16_t max_channel;
+ uint16_t firm_rev;
+ u_char hostname[64];
+ u_char vendor[64];
+};
+
+struct pptp_msg_sccrp {
+ uint16_t proto_ver;
+ uint8_t result_code;
+ uint8_t err_code;
+ uint32_t framing_cap;
+ uint32_t bearer_cap;
+ uint16_t max_channel;
+ uint16_t firm_rev;
+ u_char hostname[64];
+ u_char vendor[64];
+};
+
+struct pptp_msg_stopccrq {
+ uint8_t reason;
+ uint8_t reserved1;
+ uint16_t reserved2;
+};
+
+struct pptp_msg_stopccrp {
+ uint8_t result_code;
+ uint8_t err_code;
+ uint16_t reserved1;
+};
+
+struct pptp_msg_echorq {
+ uint32_t id;
+};
+
+struct pptp_msg_echorp {
+ uint32_t id;
+ uint8_t result_code;
+ uint8_t err_code;
+ uint16_t reserved1;
+};
+
+struct pptp_msg_ocrq {
+ uint16_t call_id;
+ uint16_t call_ser;
+ uint32_t min_bps;
+ uint32_t max_bps;
+ uint32_t bearer_type;
+ uint32_t framing_type;
+ uint16_t recv_winsiz;
+ uint16_t pkt_proc_delay;
+ uint16_t phone_no_len;
+ uint16_t reserved1;
+ u_char phone_no[64];
+ u_char subaddr[64];
+};
+
+struct pptp_msg_ocrp {
+ uint16_t call_id;
+ uint16_t peer_call_id;
+ uint8_t result_code;
+ uint8_t err_code;
+ uint16_t cause_code;
+ uint32_t conn_speed;
+ uint16_t recv_winsiz;
+ uint16_t pkt_proc_delay;
+ uint32_t phy_chan_id;
+};
+
+struct pptp_msg_icrq {
+ uint16_t call_id;
+ uint16_t call_ser;
+ uint32_t bearer_type;
+ uint32_t phy_chan_id;
+ uint16_t dialed_no_len;
+ uint16_t dialing_no_len;
+ u_char dialed_no[64]; /* DNIS */
+ u_char dialing_no[64]; /* CLID */
+ u_char subaddr[64];
+};
+
+struct pptp_msg_icrp {
+ uint16_t call_id;
+ uint16_t peer_call_id;
+ uint8_t result_code;
+ uint8_t err_code;
+ uint16_t recv_winsiz;
+ uint16_t pkt_proc_delay;
+ uint16_t reserved1;
+};
+
+struct pptp_msg_iccn {
+ uint16_t peer_call_id;
+ uint16_t reserved1;
+ uint32_t conn_speed;
+ uint16_t recv_winsiz;
+ uint16_t pkt_proc_delay;
+ uint32_t framing_type;
+};
+
+struct pptp_msg_ccrq {
+ uint16_t call_id;
+ uint16_t reserved1;
+};
+
+struct pptp_msg_cdn {
+ uint16_t call_id;
+ uint8_t result_code;
+ uint8_t err_code;
+ uint16_t cause_code;
+ uint16_t reserved1;
+ u_char call_stats[128];
+};
+
+struct pptp_msg_wen {
+ uint16_t peer_call_id;
+ uint16_t reserved1;
+ uint32_t crc_err;
+ uint32_t framing_err;
+ uint32_t hardware_overrun;
+ uint32_t buffer_overrun;
+ uint32_t timeout_err;
+ uint32_t align_err;
+};
+
+struct pptp_msg_sli {
+ uint16_t peer_call_id;
+ uint16_t reserved1;
+ uint32_t send_accm;
+ uint32_t recv_accm;
+};
+
+/* attributes that appear more than once in above messages:
+
+ Number of
+ occurence attributes
+ --------------------------------------
+ 2 uint32_t bearer_cap;
+ 2 uint32_t bearer_type;
+ 6 uint16_t call_id;
+ 2 uint16_t call_ser;
+ 2 uint16_t cause_code;
+ 2 uint32_t conn_speed;
+ 6 uint8_t err_code;
+ 2 uint16_t firm_rev;
+ 2 uint32_t framing_cap;
+ 2 uint32_t framing_type;
+ 2 u_char hostname[64];
+ 2 uint32_t id;
+ 2 uint16_t max_channel;
+ 5 uint16_t peer_call_id;
+ 2 uint32_t phy_chan_id;
+ 4 uint16_t pkt_proc_delay;
+ 2 uint16_t proto_ver;
+ 4 uint16_t recv_winsiz;
+ 2 uint8_t reserved1;
+ 9 uint16_t reserved1;
+ 6 uint8_t result_code;
+ 2 u_char subaddr[64];
+ 2 u_char vendor[64];
+
+ so I will prepare print out functions for these attributes (except for
+ reserved*).
+*/
+
+/******************************************/
+/* Attribute-specific print out functions */
+/******************************************/
+
+/* In these attribute-specific print-out functions, it't not necessary
+ to do ND_TCHECK because they are already checked in the caller of
+ these functions. */
+
+static void
+pptp_bearer_cap_print(netdissect_options *ndo,
+ const uint32_t *bearer_cap)
+{
+ ND_PRINT((ndo, " BEARER_CAP(%s%s)",
+ EXTRACT_32BITS(bearer_cap) & PPTP_BEARER_CAP_DIGITAL_MASK ? "D" : "",
+ EXTRACT_32BITS(bearer_cap) & PPTP_BEARER_CAP_ANALOG_MASK ? "A" : ""));
+}
+
+static const struct tok pptp_btype_str[] = {
+ { 1, "A" }, /* Analog */
+ { 2, "D" }, /* Digital */
+ { 3, "Any" },
+ { 0, NULL }
+};
+
+static void
+pptp_bearer_type_print(netdissect_options *ndo,
+ const uint32_t *bearer_type)
+{
+ ND_PRINT((ndo, " BEARER_TYPE(%s)",
+ tok2str(pptp_btype_str, "?", EXTRACT_32BITS(bearer_type))));
+}
+
+static void
+pptp_call_id_print(netdissect_options *ndo,
+ const uint16_t *call_id)
+{
+ ND_PRINT((ndo, " CALL_ID(%u)", EXTRACT_16BITS(call_id)));
+}
+
+static void
+pptp_call_ser_print(netdissect_options *ndo,
+ const uint16_t *call_ser)
+{
+ ND_PRINT((ndo, " CALL_SER_NUM(%u)", EXTRACT_16BITS(call_ser)));
+}
+
+static void
+pptp_cause_code_print(netdissect_options *ndo,
+ const uint16_t *cause_code)
+{
+ ND_PRINT((ndo, " CAUSE_CODE(%u)", EXTRACT_16BITS(cause_code)));
+}
+
+static void
+pptp_conn_speed_print(netdissect_options *ndo,
+ const uint32_t *conn_speed)
+{
+ ND_PRINT((ndo, " CONN_SPEED(%u)", EXTRACT_32BITS(conn_speed)));
+}
+
+static const struct tok pptp_errcode_str[] = {
+ { 0, "None" },
+ { 1, "Not-Connected" },
+ { 2, "Bad-Format" },
+ { 3, "Bad-Value" },
+ { 4, "No-Resource" },
+ { 5, "Bad-Call-ID" },
+ { 6, "PAC-Error" },
+ { 0, NULL }
+};
+
+static void
+pptp_err_code_print(netdissect_options *ndo,
+ const uint8_t *err_code)
+{
+ ND_PRINT((ndo, " ERR_CODE(%u", *err_code));
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, ":%s", tok2str(pptp_errcode_str, "?", *err_code)));
+ }
+ ND_PRINT((ndo, ")"));
+}
+
+static void
+pptp_firm_rev_print(netdissect_options *ndo,
+ const uint16_t *firm_rev)
+{
+ ND_PRINT((ndo, " FIRM_REV(%u)", EXTRACT_16BITS(firm_rev)));
+}
+
+static void
+pptp_framing_cap_print(netdissect_options *ndo,
+ const uint32_t *framing_cap)
+{
+ ND_PRINT((ndo, " FRAME_CAP("));
+ if (EXTRACT_32BITS(framing_cap) & PPTP_FRAMING_CAP_ASYNC_MASK) {
+ ND_PRINT((ndo, "A")); /* Async */
+ }
+ if (EXTRACT_32BITS(framing_cap) & PPTP_FRAMING_CAP_SYNC_MASK) {
+ ND_PRINT((ndo, "S")); /* Sync */
+ }
+ ND_PRINT((ndo, ")"));
+}
+
+static const struct tok pptp_ftype_str[] = {
+ { 1, "A" }, /* Async */
+ { 2, "S" }, /* Sync */
+ { 3, "E" }, /* Either */
+ { 0, NULL }
+};
+
+static void
+pptp_framing_type_print(netdissect_options *ndo,
+ const uint32_t *framing_type)
+{
+ ND_PRINT((ndo, " FRAME_TYPE(%s)",
+ tok2str(pptp_ftype_str, "?", EXTRACT_32BITS(framing_type))));
+}
+
+static void
+pptp_hostname_print(netdissect_options *ndo,
+ const u_char *hostname)
+{
+ ND_PRINT((ndo, " HOSTNAME(%.64s)", hostname));
+}
+
+static void
+pptp_id_print(netdissect_options *ndo,
+ const uint32_t *id)
+{
+ ND_PRINT((ndo, " ID(%u)", EXTRACT_32BITS(id)));
+}
+
+static void
+pptp_max_channel_print(netdissect_options *ndo,
+ const uint16_t *max_channel)
+{
+ ND_PRINT((ndo, " MAX_CHAN(%u)", EXTRACT_16BITS(max_channel)));
+}
+
+static void
+pptp_peer_call_id_print(netdissect_options *ndo,
+ const uint16_t *peer_call_id)
+{
+ ND_PRINT((ndo, " PEER_CALL_ID(%u)", EXTRACT_16BITS(peer_call_id)));
+}
+
+static void
+pptp_phy_chan_id_print(netdissect_options *ndo,
+ const uint32_t *phy_chan_id)
+{
+ ND_PRINT((ndo, " PHY_CHAN_ID(%u)", EXTRACT_32BITS(phy_chan_id)));
+}
+
+static void
+pptp_pkt_proc_delay_print(netdissect_options *ndo,
+ const uint16_t *pkt_proc_delay)
+{
+ ND_PRINT((ndo, " PROC_DELAY(%u)", EXTRACT_16BITS(pkt_proc_delay)));
+}
+
+static void
+pptp_proto_ver_print(netdissect_options *ndo,
+ const uint16_t *proto_ver)
+{
+ ND_PRINT((ndo, " PROTO_VER(%u.%u)", /* Version.Revision */
+ EXTRACT_16BITS(proto_ver) >> 8,
+ EXTRACT_16BITS(proto_ver) & 0xff));
+}
+
+static void
+pptp_recv_winsiz_print(netdissect_options *ndo,
+ const uint16_t *recv_winsiz)
+{
+ ND_PRINT((ndo, " RECV_WIN(%u)", EXTRACT_16BITS(recv_winsiz)));
+}
+
+static const struct tok pptp_scrrp_str[] = {
+ { 1, "Successful channel establishment" },
+ { 2, "General error" },
+ { 3, "Command channel already exists" },
+ { 4, "Requester is not authorized to establish a command channel" },
+ { 5, "The protocol version of the requester is not supported" },
+ { 0, NULL }
+};
+
+static const struct tok pptp_echorp_str[] = {
+ { 1, "OK" },
+ { 2, "General Error" },
+ { 0, NULL }
+};
+
+static const struct tok pptp_ocrp_str[] = {
+ { 1, "Connected" },
+ { 2, "General Error" },
+ { 3, "No Carrier" },
+ { 4, "Busy" },
+ { 5, "No Dial Tone" },
+ { 6, "Time-out" },
+ { 7, "Do Not Accept" },
+ { 0, NULL }
+};
+
+static const struct tok pptp_icrp_str[] = {
+ { 1, "Connect" },
+ { 2, "General Error" },
+ { 3, "Do Not Accept" },
+ { 0, NULL }
+};
+
+static const struct tok pptp_cdn_str[] = {
+ { 1, "Lost Carrier" },
+ { 2, "General Error" },
+ { 3, "Admin Shutdown" },
+ { 4, "Request" },
+ { 0, NULL }
+};
+
+static void
+pptp_result_code_print(netdissect_options *ndo,
+ const uint8_t *result_code, int ctrl_msg_type)
+{
+ ND_PRINT((ndo, " RESULT_CODE(%u", *result_code));
+ if (ndo->ndo_vflag) {
+ const struct tok *dict =
+ ctrl_msg_type == PPTP_CTRL_MSG_TYPE_SCCRP ? pptp_scrrp_str :
+ ctrl_msg_type == PPTP_CTRL_MSG_TYPE_StopCCRP ? pptp_echorp_str :
+ ctrl_msg_type == PPTP_CTRL_MSG_TYPE_ECHORP ? pptp_echorp_str :
+ ctrl_msg_type == PPTP_CTRL_MSG_TYPE_OCRP ? pptp_ocrp_str :
+ ctrl_msg_type == PPTP_CTRL_MSG_TYPE_ICRP ? pptp_icrp_str :
+ ctrl_msg_type == PPTP_CTRL_MSG_TYPE_CDN ? pptp_cdn_str :
+ NULL; /* assertion error */
+ if (dict != NULL)
+ ND_PRINT((ndo, ":%s", tok2str(dict, "?", *result_code)));
+ }
+ ND_PRINT((ndo, ")"));
+}
+
+static void
+pptp_subaddr_print(netdissect_options *ndo,
+ const u_char *subaddr)
+{
+ ND_PRINT((ndo, " SUB_ADDR(%.64s)", subaddr));
+}
+
+static void
+pptp_vendor_print(netdissect_options *ndo,
+ const u_char *vendor)
+{
+ ND_PRINT((ndo, " VENDOR(%.64s)", vendor));
+}
+
+/************************************/
+/* PPTP message print out functions */
+/************************************/
+static void
+pptp_sccrq_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_sccrq *ptr = (struct pptp_msg_sccrq *)dat;
+
+ ND_TCHECK(ptr->proto_ver);
+ pptp_proto_ver_print(ndo, &ptr->proto_ver);
+ ND_TCHECK(ptr->reserved1);
+ ND_TCHECK(ptr->framing_cap);
+ pptp_framing_cap_print(ndo, &ptr->framing_cap);
+ ND_TCHECK(ptr->bearer_cap);
+ pptp_bearer_cap_print(ndo, &ptr->bearer_cap);
+ ND_TCHECK(ptr->max_channel);
+ pptp_max_channel_print(ndo, &ptr->max_channel);
+ ND_TCHECK(ptr->firm_rev);
+ pptp_firm_rev_print(ndo, &ptr->firm_rev);
+ ND_TCHECK(ptr->hostname);
+ pptp_hostname_print(ndo, &ptr->hostname[0]);
+ ND_TCHECK(ptr->vendor);
+ pptp_vendor_print(ndo, &ptr->vendor[0]);
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_sccrp_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_sccrp *ptr = (struct pptp_msg_sccrp *)dat;
+
+ ND_TCHECK(ptr->proto_ver);
+ pptp_proto_ver_print(ndo, &ptr->proto_ver);
+ ND_TCHECK(ptr->result_code);
+ pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_SCCRP);
+ ND_TCHECK(ptr->err_code);
+ pptp_err_code_print(ndo, &ptr->err_code);
+ ND_TCHECK(ptr->framing_cap);
+ pptp_framing_cap_print(ndo, &ptr->framing_cap);
+ ND_TCHECK(ptr->bearer_cap);
+ pptp_bearer_cap_print(ndo, &ptr->bearer_cap);
+ ND_TCHECK(ptr->max_channel);
+ pptp_max_channel_print(ndo, &ptr->max_channel);
+ ND_TCHECK(ptr->firm_rev);
+ pptp_firm_rev_print(ndo, &ptr->firm_rev);
+ ND_TCHECK(ptr->hostname);
+ pptp_hostname_print(ndo, &ptr->hostname[0]);
+ ND_TCHECK(ptr->vendor);
+ pptp_vendor_print(ndo, &ptr->vendor[0]);
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_stopccrq_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_stopccrq *ptr = (struct pptp_msg_stopccrq *)dat;
+
+ ND_TCHECK(ptr->reason);
+ ND_PRINT((ndo, " REASON(%u", ptr->reason));
+ if (ndo->ndo_vflag) {
+ switch (ptr->reason) {
+ case 1:
+ ND_PRINT((ndo, ":None"));
+ break;
+ case 2:
+ ND_PRINT((ndo, ":Stop-Protocol"));
+ break;
+ case 3:
+ ND_PRINT((ndo, ":Stop-Local-Shutdown"));
+ break;
+ default:
+ ND_PRINT((ndo, ":?"));
+ break;
+ }
+ }
+ ND_PRINT((ndo, ")"));
+ ND_TCHECK(ptr->reserved1);
+ ND_TCHECK(ptr->reserved2);
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_stopccrp_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_stopccrp *ptr = (struct pptp_msg_stopccrp *)dat;
+
+ ND_TCHECK(ptr->result_code);
+ pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_StopCCRP);
+ ND_TCHECK(ptr->err_code);
+ pptp_err_code_print(ndo, &ptr->err_code);
+ ND_TCHECK(ptr->reserved1);
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_echorq_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_echorq *ptr = (struct pptp_msg_echorq *)dat;
+
+ ND_TCHECK(ptr->id);
+ pptp_id_print(ndo, &ptr->id);
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_echorp_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_echorp *ptr = (struct pptp_msg_echorp *)dat;
+
+ ND_TCHECK(ptr->id);
+ pptp_id_print(ndo, &ptr->id);
+ ND_TCHECK(ptr->result_code);
+ pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_ECHORP);
+ ND_TCHECK(ptr->err_code);
+ pptp_err_code_print(ndo, &ptr->err_code);
+ ND_TCHECK(ptr->reserved1);
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_ocrq_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_ocrq *ptr = (struct pptp_msg_ocrq *)dat;
+
+ ND_TCHECK(ptr->call_id);
+ pptp_call_id_print(ndo, &ptr->call_id);
+ ND_TCHECK(ptr->call_ser);
+ pptp_call_ser_print(ndo, &ptr->call_ser);
+ ND_TCHECK(ptr->min_bps);
+ ND_PRINT((ndo, " MIN_BPS(%u)", EXTRACT_32BITS(&ptr->min_bps)));
+ ND_TCHECK(ptr->max_bps);
+ ND_PRINT((ndo, " MAX_BPS(%u)", EXTRACT_32BITS(&ptr->max_bps)));
+ ND_TCHECK(ptr->bearer_type);
+ pptp_bearer_type_print(ndo, &ptr->bearer_type);
+ ND_TCHECK(ptr->framing_type);
+ pptp_framing_type_print(ndo, &ptr->framing_type);
+ ND_TCHECK(ptr->recv_winsiz);
+ pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz);
+ ND_TCHECK(ptr->pkt_proc_delay);
+ pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay);
+ ND_TCHECK(ptr->phone_no_len);
+ ND_PRINT((ndo, " PHONE_NO_LEN(%u)", EXTRACT_16BITS(&ptr->phone_no_len)));
+ ND_TCHECK(ptr->reserved1);
+ ND_TCHECK(ptr->phone_no);
+ ND_PRINT((ndo, " PHONE_NO(%.64s)", ptr->phone_no));
+ ND_TCHECK(ptr->subaddr);
+ pptp_subaddr_print(ndo, &ptr->subaddr[0]);
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_ocrp_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_ocrp *ptr = (struct pptp_msg_ocrp *)dat;
+
+ ND_TCHECK(ptr->call_id);
+ pptp_call_id_print(ndo, &ptr->call_id);
+ ND_TCHECK(ptr->peer_call_id);
+ pptp_peer_call_id_print(ndo, &ptr->peer_call_id);
+ ND_TCHECK(ptr->result_code);
+ pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_OCRP);
+ ND_TCHECK(ptr->err_code);
+ pptp_err_code_print(ndo, &ptr->err_code);
+ ND_TCHECK(ptr->cause_code);
+ pptp_cause_code_print(ndo, &ptr->cause_code);
+ ND_TCHECK(ptr->conn_speed);
+ pptp_conn_speed_print(ndo, &ptr->conn_speed);
+ ND_TCHECK(ptr->recv_winsiz);
+ pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz);
+ ND_TCHECK(ptr->pkt_proc_delay);
+ pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay);
+ ND_TCHECK(ptr->phy_chan_id);
+ pptp_phy_chan_id_print(ndo, &ptr->phy_chan_id);
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_icrq_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_icrq *ptr = (struct pptp_msg_icrq *)dat;
+
+ ND_TCHECK(ptr->call_id);
+ pptp_call_id_print(ndo, &ptr->call_id);
+ ND_TCHECK(ptr->call_ser);
+ pptp_call_ser_print(ndo, &ptr->call_ser);
+ ND_TCHECK(ptr->bearer_type);
+ pptp_bearer_type_print(ndo, &ptr->bearer_type);
+ ND_TCHECK(ptr->phy_chan_id);
+ pptp_phy_chan_id_print(ndo, &ptr->phy_chan_id);
+ ND_TCHECK(ptr->dialed_no_len);
+ ND_PRINT((ndo, " DIALED_NO_LEN(%u)", EXTRACT_16BITS(&ptr->dialed_no_len)));
+ ND_TCHECK(ptr->dialing_no_len);
+ ND_PRINT((ndo, " DIALING_NO_LEN(%u)", EXTRACT_16BITS(&ptr->dialing_no_len)));
+ ND_TCHECK(ptr->dialed_no);
+ ND_PRINT((ndo, " DIALED_NO(%.64s)", ptr->dialed_no));
+ ND_TCHECK(ptr->dialing_no);
+ ND_PRINT((ndo, " DIALING_NO(%.64s)", ptr->dialing_no));
+ ND_TCHECK(ptr->subaddr);
+ pptp_subaddr_print(ndo, &ptr->subaddr[0]);
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_icrp_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_icrp *ptr = (struct pptp_msg_icrp *)dat;
+
+ ND_TCHECK(ptr->call_id);
+ pptp_call_id_print(ndo, &ptr->call_id);
+ ND_TCHECK(ptr->peer_call_id);
+ pptp_peer_call_id_print(ndo, &ptr->peer_call_id);
+ ND_TCHECK(ptr->result_code);
+ pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_ICRP);
+ ND_TCHECK(ptr->err_code);
+ pptp_err_code_print(ndo, &ptr->err_code);
+ ND_TCHECK(ptr->recv_winsiz);
+ pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz);
+ ND_TCHECK(ptr->pkt_proc_delay);
+ pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay);
+ ND_TCHECK(ptr->reserved1);
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_iccn_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_iccn *ptr = (struct pptp_msg_iccn *)dat;
+
+ ND_TCHECK(ptr->peer_call_id);
+ pptp_peer_call_id_print(ndo, &ptr->peer_call_id);
+ ND_TCHECK(ptr->reserved1);
+ ND_TCHECK(ptr->conn_speed);
+ pptp_conn_speed_print(ndo, &ptr->conn_speed);
+ ND_TCHECK(ptr->recv_winsiz);
+ pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz);
+ ND_TCHECK(ptr->pkt_proc_delay);
+ pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay);
+ ND_TCHECK(ptr->framing_type);
+ pptp_framing_type_print(ndo, &ptr->framing_type);
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_ccrq_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_ccrq *ptr = (struct pptp_msg_ccrq *)dat;
+
+ ND_TCHECK(ptr->call_id);
+ pptp_call_id_print(ndo, &ptr->call_id);
+ ND_TCHECK(ptr->reserved1);
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_cdn_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_cdn *ptr = (struct pptp_msg_cdn *)dat;
+
+ ND_TCHECK(ptr->call_id);
+ pptp_call_id_print(ndo, &ptr->call_id);
+ ND_TCHECK(ptr->result_code);
+ pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_CDN);
+ ND_TCHECK(ptr->err_code);
+ pptp_err_code_print(ndo, &ptr->err_code);
+ ND_TCHECK(ptr->cause_code);
+ pptp_cause_code_print(ndo, &ptr->cause_code);
+ ND_TCHECK(ptr->reserved1);
+ ND_TCHECK(ptr->call_stats);
+ ND_PRINT((ndo, " CALL_STATS(%.128s)", ptr->call_stats));
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_wen_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_wen *ptr = (struct pptp_msg_wen *)dat;
+
+ ND_TCHECK(ptr->peer_call_id);
+ pptp_peer_call_id_print(ndo, &ptr->peer_call_id);
+ ND_TCHECK(ptr->reserved1);
+ ND_TCHECK(ptr->crc_err);
+ ND_PRINT((ndo, " CRC_ERR(%u)", EXTRACT_32BITS(&ptr->crc_err)));
+ ND_TCHECK(ptr->framing_err);
+ ND_PRINT((ndo, " FRAMING_ERR(%u)", EXTRACT_32BITS(&ptr->framing_err)));
+ ND_TCHECK(ptr->hardware_overrun);
+ ND_PRINT((ndo, " HARDWARE_OVERRUN(%u)", EXTRACT_32BITS(&ptr->hardware_overrun)));
+ ND_TCHECK(ptr->buffer_overrun);
+ ND_PRINT((ndo, " BUFFER_OVERRUN(%u)", EXTRACT_32BITS(&ptr->buffer_overrun)));
+ ND_TCHECK(ptr->timeout_err);
+ ND_PRINT((ndo, " TIMEOUT_ERR(%u)", EXTRACT_32BITS(&ptr->timeout_err)));
+ ND_TCHECK(ptr->align_err);
+ ND_PRINT((ndo, " ALIGN_ERR(%u)", EXTRACT_32BITS(&ptr->align_err)));
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+pptp_sli_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ struct pptp_msg_sli *ptr = (struct pptp_msg_sli *)dat;
+
+ ND_TCHECK(ptr->peer_call_id);
+ pptp_peer_call_id_print(ndo, &ptr->peer_call_id);
+ ND_TCHECK(ptr->reserved1);
+ ND_TCHECK(ptr->send_accm);
+ ND_PRINT((ndo, " SEND_ACCM(0x%08x)", EXTRACT_32BITS(&ptr->send_accm)));
+ ND_TCHECK(ptr->recv_accm);
+ ND_PRINT((ndo, " RECV_ACCM(0x%08x)", EXTRACT_32BITS(&ptr->recv_accm)));
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+void
+pptp_print(netdissect_options *ndo,
+ const u_char *dat)
+{
+ const struct pptp_hdr *hdr;
+ uint32_t mc;
+ uint16_t ctrl_msg_type;
+
+ ND_PRINT((ndo, ": pptp"));
+
+ hdr = (struct pptp_hdr *)dat;
+
+ ND_TCHECK(hdr->length);
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, " Length=%u", EXTRACT_16BITS(&hdr->length)));
+ }
+ ND_TCHECK(hdr->msg_type);
+ if (ndo->ndo_vflag) {
+ switch(EXTRACT_16BITS(&hdr->msg_type)) {
+ case PPTP_MSG_TYPE_CTRL:
+ ND_PRINT((ndo, " CTRL-MSG"));
+ break;
+ case PPTP_MSG_TYPE_MGMT:
+ ND_PRINT((ndo, " MGMT-MSG"));
+ break;
+ default:
+ ND_PRINT((ndo, " UNKNOWN-MSG-TYPE"));
+ break;
+ }
+ }
+
+ ND_TCHECK(hdr->magic_cookie);
+ mc = EXTRACT_32BITS(&hdr->magic_cookie);
+ if (mc != PPTP_MAGIC_COOKIE) {
+ ND_PRINT((ndo, " UNEXPECTED Magic-Cookie!!(%08x)", mc));
+ }
+ if (ndo->ndo_vflag || mc != PPTP_MAGIC_COOKIE) {
+ ND_PRINT((ndo, " Magic-Cookie=%08x", mc));
+ }
+ ND_TCHECK(hdr->ctrl_msg_type);
+ ctrl_msg_type = EXTRACT_16BITS(&hdr->ctrl_msg_type);
+ if (ctrl_msg_type < PPTP_MAX_MSGTYPE_INDEX) {
+ ND_PRINT((ndo, " CTRL_MSGTYPE=%s",
+ pptp_message_type_string[ctrl_msg_type]));
+ } else {
+ ND_PRINT((ndo, " UNKNOWN_CTRL_MSGTYPE(%u)", ctrl_msg_type));
+ }
+ ND_TCHECK(hdr->reserved0);
+
+ dat += 12;
+
+ switch(ctrl_msg_type) {
+ case PPTP_CTRL_MSG_TYPE_SCCRQ:
+ pptp_sccrq_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_SCCRP:
+ pptp_sccrp_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_StopCCRQ:
+ pptp_stopccrq_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_StopCCRP:
+ pptp_stopccrp_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_ECHORQ:
+ pptp_echorq_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_ECHORP:
+ pptp_echorp_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_OCRQ:
+ pptp_ocrq_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_OCRP:
+ pptp_ocrp_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_ICRQ:
+ pptp_icrq_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_ICRP:
+ pptp_icrp_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_ICCN:
+ pptp_iccn_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_CCRQ:
+ pptp_ccrq_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_CDN:
+ pptp_cdn_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_WEN:
+ pptp_wen_print(ndo, dat);
+ break;
+ case PPTP_CTRL_MSG_TYPE_SLI:
+ pptp_sli_print(ndo, dat);
+ break;
+ default:
+ /* do nothing */
+ break;
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
--- /dev/null
+/*
+ * Copyright (C) 2000 Alfredo Andres Omella. 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. The names of the authors 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.
+ */
+/*
+ * Radius printer routines as specified on:
+ *
+ * RFC 2865:
+ * "Remote Authentication Dial In User Service (RADIUS)"
+ *
+ * RFC 2866:
+ * "RADIUS Accounting"
+ *
+ * RFC 2867:
+ * "RADIUS Accounting Modifications for Tunnel Protocol Support"
+ *
+ * RFC 2868:
+ * "RADIUS Attributes for Tunnel Protocol Support"
+ *
+ * RFC 2869:
+ * "RADIUS Extensions"
+ *
+ * RFC 4675:
+ * "RADIUS Attributes for Virtual LAN and Priority Support"
+ *
+ * RFC 5176:
+ * "Dynamic Authorization Extensions to RADIUS"
+ *
+ * Alfredo Andres Omella (aandres@s21sec.com) v0.1 2000/09/15
+ *
+ * TODO: Among other things to print ok MacIntosh and Vendor values
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+#include "oui.h"
+
+static const char tstr[] = " [|radius]";
+
+#define TAM_SIZE(x) (sizeof(x)/sizeof(x[0]) )
+
+#define PRINT_HEX(bytes_len, ptr_data) \
+ while(bytes_len) \
+ { \
+ ND_PRINT((ndo, "%02X", *ptr_data )); \
+ ptr_data++; \
+ bytes_len--; \
+ }
+
+
+/* Radius packet codes */
+#define RADCMD_ACCESS_REQ 1 /* Access-Request */
+#define RADCMD_ACCESS_ACC 2 /* Access-Accept */
+#define RADCMD_ACCESS_REJ 3 /* Access-Reject */
+#define RADCMD_ACCOUN_REQ 4 /* Accounting-Request */
+#define RADCMD_ACCOUN_RES 5 /* Accounting-Response */
+#define RADCMD_ACCESS_CHA 11 /* Access-Challenge */
+#define RADCMD_STATUS_SER 12 /* Status-Server */
+#define RADCMD_STATUS_CLI 13 /* Status-Client */
+#define RADCMD_DISCON_REQ 40 /* Disconnect-Request */
+#define RADCMD_DISCON_ACK 41 /* Disconnect-ACK */
+#define RADCMD_DISCON_NAK 42 /* Disconnect-NAK */
+#define RADCMD_COA_REQ 43 /* CoA-Request */
+#define RADCMD_COA_ACK 44 /* CoA-ACK */
+#define RADCMD_COA_NAK 45 /* CoA-NAK */
+#define RADCMD_RESERVED 255 /* Reserved */
+
+static const struct tok radius_command_values[] = {
+ { RADCMD_ACCESS_REQ, "Access-Request" },
+ { RADCMD_ACCESS_ACC, "Access-Accept" },
+ { RADCMD_ACCESS_REJ, "Access-Reject" },
+ { RADCMD_ACCOUN_REQ, "Accounting-Request" },
+ { RADCMD_ACCOUN_RES, "Accounting-Response" },
+ { RADCMD_ACCESS_CHA, "Access-Challenge" },
+ { RADCMD_STATUS_SER, "Status-Server" },
+ { RADCMD_STATUS_CLI, "Status-Client" },
+ { RADCMD_DISCON_REQ, "Disconnect-Request" },
+ { RADCMD_DISCON_ACK, "Disconnect-ACK" },
+ { RADCMD_DISCON_NAK, "Disconnect-NAK" },
+ { RADCMD_COA_REQ, "CoA-Request" },
+ { RADCMD_COA_ACK, "CoA-ACK" },
+ { RADCMD_COA_NAK, "CoA-NAK" },
+ { RADCMD_RESERVED, "Reserved" },
+ { 0, NULL}
+};
+
+/********************************/
+/* Begin Radius Attribute types */
+/********************************/
+#define SERV_TYPE 6
+#define FRM_IPADDR 8
+#define LOG_IPHOST 14
+#define LOG_SERVICE 15
+#define FRM_IPX 23
+#define SESSION_TIMEOUT 27
+#define IDLE_TIMEOUT 28
+#define FRM_ATALK_LINK 37
+#define FRM_ATALK_NETWORK 38
+
+#define ACCT_DELAY 41
+#define ACCT_SESSION_TIME 46
+
+#define EGRESS_VLAN_ID 56
+#define EGRESS_VLAN_NAME 58
+
+#define TUNNEL_TYPE 64
+#define TUNNEL_MEDIUM 65
+#define TUNNEL_CLIENT_END 66
+#define TUNNEL_SERVER_END 67
+#define TUNNEL_PASS 69
+
+#define ARAP_PASS 70
+#define ARAP_FEATURES 71
+
+#define TUNNEL_PRIV_GROUP 81
+#define TUNNEL_ASSIGN_ID 82
+#define TUNNEL_PREFERENCE 83
+
+#define ARAP_CHALLENGE_RESP 84
+#define ACCT_INT_INTERVAL 85
+
+#define TUNNEL_CLIENT_AUTH 90
+#define TUNNEL_SERVER_AUTH 91
+/********************************/
+/* End Radius Attribute types */
+/********************************/
+
+#define RFC4675_TAGGED 0x31
+#define RFC4675_UNTAGGED 0x32
+
+static const struct tok rfc4675_tagged[] = {
+ { RFC4675_TAGGED, "Tagged" },
+ { RFC4675_UNTAGGED, "Untagged" },
+ { 0, NULL}
+};
+
+
+static void print_attr_string(netdissect_options *, register u_char *, u_int, u_short );
+static void print_attr_num(netdissect_options *, register u_char *, u_int, u_short );
+static void print_vendor_attr(netdissect_options *, register u_char *, u_int, u_short );
+static void print_attr_address(netdissect_options *, register u_char *, u_int, u_short);
+static void print_attr_time(netdissect_options *, register u_char *, u_int, u_short);
+static void print_attr_strange(netdissect_options *, register u_char *, u_int, u_short);
+
+
+struct radius_hdr { uint8_t code; /* Radius packet code */
+ uint8_t id; /* Radius packet id */
+ uint16_t len; /* Radius total length */
+ uint8_t auth[16]; /* Authenticator */
+ };
+
+#define MIN_RADIUS_LEN 20
+
+struct radius_attr { uint8_t type; /* Attribute type */
+ uint8_t len; /* Attribute length */
+ };
+
+
+/* Service-Type Attribute standard values */
+static const char *serv_type[]={ NULL,
+ "Login",
+ "Framed",
+ "Callback Login",
+ "Callback Framed",
+ "Outbound",
+ "Administrative",
+ "NAS Prompt",
+ "Authenticate Only",
+ "Callback NAS Prompt",
+ "Call Check",
+ "Callback Administrative",
+ };
+
+/* Framed-Protocol Attribute standard values */
+static const char *frm_proto[]={ NULL,
+ "PPP",
+ "SLIP",
+ "ARAP",
+ "Gandalf proprietary",
+ "Xylogics IPX/SLIP",
+ "X.75 Synchronous",
+ };
+
+/* Framed-Routing Attribute standard values */
+static const char *frm_routing[]={ "None",
+ "Send",
+ "Listen",
+ "Send&Listen",
+ };
+
+/* Framed-Compression Attribute standard values */
+static const char *frm_comp[]={ "None",
+ "VJ TCP/IP",
+ "IPX",
+ "Stac-LZS",
+ };
+
+/* Login-Service Attribute standard values */
+static const char *login_serv[]={ "Telnet",
+ "Rlogin",
+ "TCP Clear",
+ "PortMaster(proprietary)",
+ "LAT",
+ "X.25-PAD",
+ "X.25-T3POS",
+ "Unassigned",
+ "TCP Clear Quiet",
+ };
+
+
+/* Termination-Action Attribute standard values */
+static const char *term_action[]={ "Default",
+ "RADIUS-Request",
+ };
+
+/* Ingress-Filters Attribute standard values */
+static const char *ingress_filters[]={ NULL,
+ "Enabled",
+ "Disabled",
+ };
+
+/* NAS-Port-Type Attribute standard values */
+static const char *nas_port_type[]={ "Async",
+ "Sync",
+ "ISDN Sync",
+ "ISDN Async V.120",
+ "ISDN Async V.110",
+ "Virtual",
+ "PIAFS",
+ "HDLC Clear Channel",
+ "X.25",
+ "X.75",
+ "G.3 Fax",
+ "SDSL",
+ "ADSL-CAP",
+ "ADSL-DMT",
+ "ISDN-DSL",
+ "Ethernet",
+ "xDSL",
+ "Cable",
+ "Wireless - Other",
+ "Wireless - IEEE 802.11",
+ };
+
+/* Acct-Status-Type Accounting Attribute standard values */
+static const char *acct_status[]={ NULL,
+ "Start",
+ "Stop",
+ "Interim-Update",
+ "Unassigned",
+ "Unassigned",
+ "Unassigned",
+ "Accounting-On",
+ "Accounting-Off",
+ "Tunnel-Start",
+ "Tunnel-Stop",
+ "Tunnel-Reject",
+ "Tunnel-Link-Start",
+ "Tunnel-Link-Stop",
+ "Tunnel-Link-Reject",
+ "Failed",
+ };
+
+/* Acct-Authentic Accounting Attribute standard values */
+static const char *acct_auth[]={ NULL,
+ "RADIUS",
+ "Local",
+ "Remote",
+ };
+
+/* Acct-Terminate-Cause Accounting Attribute standard values */
+static const char *acct_term[]={ NULL,
+ "User Request",
+ "Lost Carrier",
+ "Lost Service",
+ "Idle Timeout",
+ "Session Timeout",
+ "Admin Reset",
+ "Admin Reboot",
+ "Port Error",
+ "NAS Error",
+ "NAS Request",
+ "NAS Reboot",
+ "Port Unneeded",
+ "Port Preempted",
+ "Port Suspended",
+ "Service Unavailable",
+ "Callback",
+ "User Error",
+ "Host Request",
+ };
+
+/* Tunnel-Type Attribute standard values */
+static const char *tunnel_type[]={ NULL,
+ "PPTP",
+ "L2F",
+ "L2TP",
+ "ATMP",
+ "VTP",
+ "AH",
+ "IP-IP",
+ "MIN-IP-IP",
+ "ESP",
+ "GRE",
+ "DVS",
+ "IP-in-IP Tunneling",
+ };
+
+/* Tunnel-Medium-Type Attribute standard values */
+static const char *tunnel_medium[]={ NULL,
+ "IPv4",
+ "IPv6",
+ "NSAP",
+ "HDLC",
+ "BBN 1822",
+ "802",
+ "E.163",
+ "E.164",
+ "F.69",
+ "X.121",
+ "IPX",
+ "Appletalk",
+ "Decnet IV",
+ "Banyan Vines",
+ "E.164 with NSAP subaddress",
+ };
+
+/* ARAP-Zone-Access Attribute standard values */
+static const char *arap_zone[]={ NULL,
+ "Only access to dfl zone",
+ "Use zone filter inc.",
+ "Not used",
+ "Use zone filter exc.",
+ };
+
+static const char *prompt[]={ "No Echo",
+ "Echo",
+ };
+
+
+struct attrtype { const char *name; /* Attribute name */
+ const char **subtypes; /* Standard Values (if any) */
+ u_char siz_subtypes; /* Size of total standard values */
+ u_char first_subtype; /* First standard value is 0 or 1 */
+ void (*print_func)(netdissect_options *, register u_char *, u_int, u_short);
+ } attr_type[]=
+ {
+ { NULL, NULL, 0, 0, NULL },
+ { "User-Name", NULL, 0, 0, print_attr_string },
+ { "User-Password", NULL, 0, 0, NULL },
+ { "CHAP-Password", NULL, 0, 0, NULL },
+ { "NAS-IP-Address", NULL, 0, 0, print_attr_address },
+ { "NAS-Port", NULL, 0, 0, print_attr_num },
+ { "Service-Type", serv_type, TAM_SIZE(serv_type)-1, 1, print_attr_num },
+ { "Framed-Protocol", frm_proto, TAM_SIZE(frm_proto)-1, 1, print_attr_num },
+ { "Framed-IP-Address", NULL, 0, 0, print_attr_address },
+ { "Framed-IP-Netmask", NULL, 0, 0, print_attr_address },
+ { "Framed-Routing", frm_routing, TAM_SIZE(frm_routing), 0, print_attr_num },
+ { "Filter-Id", NULL, 0, 0, print_attr_string },
+ { "Framed-MTU", NULL, 0, 0, print_attr_num },
+ { "Framed-Compression", frm_comp, TAM_SIZE(frm_comp), 0, print_attr_num },
+ { "Login-IP-Host", NULL, 0, 0, print_attr_address },
+ { "Login-Service", login_serv, TAM_SIZE(login_serv), 0, print_attr_num },
+ { "Login-TCP-Port", NULL, 0, 0, print_attr_num },
+ { "Unassigned", NULL, 0, 0, NULL }, /*17*/
+ { "Reply-Message", NULL, 0, 0, print_attr_string },
+ { "Callback-Number", NULL, 0, 0, print_attr_string },
+ { "Callback-Id", NULL, 0, 0, print_attr_string },
+ { "Unassigned", NULL, 0, 0, NULL }, /*21*/
+ { "Framed-Route", NULL, 0, 0, print_attr_string },
+ { "Framed-IPX-Network", NULL, 0, 0, print_attr_num },
+ { "State", NULL, 0, 0, print_attr_string },
+ { "Class", NULL, 0, 0, print_attr_string },
+ { "Vendor-Specific", NULL, 0, 0, print_vendor_attr },
+ { "Session-Timeout", NULL, 0, 0, print_attr_num },
+ { "Idle-Timeout", NULL, 0, 0, print_attr_num },
+ { "Termination-Action", term_action, TAM_SIZE(term_action), 0, print_attr_num },
+ { "Called-Station-Id", NULL, 0, 0, print_attr_string },
+ { "Calling-Station-Id", NULL, 0, 0, print_attr_string },
+ { "NAS-Identifier", NULL, 0, 0, print_attr_string },
+ { "Proxy-State", NULL, 0, 0, print_attr_string },
+ { "Login-LAT-Service", NULL, 0, 0, print_attr_string },
+ { "Login-LAT-Node", NULL, 0, 0, print_attr_string },
+ { "Login-LAT-Group", NULL, 0, 0, print_attr_string },
+ { "Framed-AppleTalk-Link", NULL, 0, 0, print_attr_num },
+ { "Framed-AppleTalk-Network", NULL, 0, 0, print_attr_num },
+ { "Framed-AppleTalk-Zone", NULL, 0, 0, print_attr_string },
+ { "Acct-Status-Type", acct_status, TAM_SIZE(acct_status)-1, 1, print_attr_num },
+ { "Acct-Delay-Time", NULL, 0, 0, print_attr_num },
+ { "Acct-Input-Octets", NULL, 0, 0, print_attr_num },
+ { "Acct-Output-Octets", NULL, 0, 0, print_attr_num },
+ { "Acct-Session-Id", NULL, 0, 0, print_attr_string },
+ { "Acct-Authentic", acct_auth, TAM_SIZE(acct_auth)-1, 1, print_attr_num },
+ { "Acct-Session-Time", NULL, 0, 0, print_attr_num },
+ { "Acct-Input-Packets", NULL, 0, 0, print_attr_num },
+ { "Acct-Output-Packets", NULL, 0, 0, print_attr_num },
+ { "Acct-Terminate-Cause", acct_term, TAM_SIZE(acct_term)-1, 1, print_attr_num },
+ { "Acct-Multi-Session-Id", NULL, 0, 0, print_attr_string },
+ { "Acct-Link-Count", NULL, 0, 0, print_attr_num },
+ { "Acct-Input-Gigawords", NULL, 0, 0, print_attr_num },
+ { "Acct-Output-Gigawords", NULL, 0, 0, print_attr_num },
+ { "Unassigned", NULL, 0, 0, NULL }, /*54*/
+ { "Event-Timestamp", NULL, 0, 0, print_attr_time },
+ { "Egress-VLANID", NULL, 0, 0, print_attr_num },
+ { "Ingress-Filters", ingress_filters, TAM_SIZE(ingress_filters)-1, 1, print_attr_num },
+ { "Egress-VLAN-Name", NULL, 0, 0, print_attr_string },
+ { "User-Priority-Table", NULL, 0, 0, NULL },
+ { "CHAP-Challenge", NULL, 0, 0, print_attr_string },
+ { "NAS-Port-Type", nas_port_type, TAM_SIZE(nas_port_type), 0, print_attr_num },
+ { "Port-Limit", NULL, 0, 0, print_attr_num },
+ { "Login-LAT-Port", NULL, 0, 0, print_attr_string }, /*63*/
+ { "Tunnel-Type", tunnel_type, TAM_SIZE(tunnel_type)-1, 1, print_attr_num },
+ { "Tunnel-Medium-Type", tunnel_medium, TAM_SIZE(tunnel_medium)-1, 1, print_attr_num },
+ { "Tunnel-Client-Endpoint", NULL, 0, 0, print_attr_string },
+ { "Tunnel-Server-Endpoint", NULL, 0, 0, print_attr_string },
+ { "Acct-Tunnel-Connection", NULL, 0, 0, print_attr_string },
+ { "Tunnel-Password", NULL, 0, 0, print_attr_string },
+ { "ARAP-Password", NULL, 0, 0, print_attr_strange },
+ { "ARAP-Features", NULL, 0, 0, print_attr_strange },
+ { "ARAP-Zone-Access", arap_zone, TAM_SIZE(arap_zone)-1, 1, print_attr_num }, /*72*/
+ { "ARAP-Security", NULL, 0, 0, print_attr_string },
+ { "ARAP-Security-Data", NULL, 0, 0, print_attr_string },
+ { "Password-Retry", NULL, 0, 0, print_attr_num },
+ { "Prompt", prompt, TAM_SIZE(prompt), 0, print_attr_num },
+ { "Connect-Info", NULL, 0, 0, print_attr_string },
+ { "Configuration-Token", NULL, 0, 0, print_attr_string },
+ { "EAP-Message", NULL, 0, 0, print_attr_string },
+ { "Message-Authenticator", NULL, 0, 0, print_attr_string }, /*80*/
+ { "Tunnel-Private-Group-ID", NULL, 0, 0, print_attr_string },
+ { "Tunnel-Assignment-ID", NULL, 0, 0, print_attr_string },
+ { "Tunnel-Preference", NULL, 0, 0, print_attr_num },
+ { "ARAP-Challenge-Response", NULL, 0, 0, print_attr_strange },
+ { "Acct-Interim-Interval", NULL, 0, 0, print_attr_num },
+ { "Acct-Tunnel-Packets-Lost", NULL, 0, 0, print_attr_num }, /*86*/
+ { "NAS-Port-Id", NULL, 0, 0, print_attr_string },
+ { "Framed-Pool", NULL, 0, 0, print_attr_string },
+ { "CUI", NULL, 0, 0, print_attr_string },
+ { "Tunnel-Client-Auth-ID", NULL, 0, 0, print_attr_string },
+ { "Tunnel-Server-Auth-ID", NULL, 0, 0, print_attr_string },
+ { "Unassigned", NULL, 0, 0, NULL }, /*92*/
+ { "Unassigned", NULL, 0, 0, NULL } /*93*/
+ };
+
+
+/*****************************/
+/* Print an attribute string */
+/* value pointed by 'data' */
+/* and 'length' size. */
+/*****************************/
+/* Returns nothing. */
+/*****************************/
+static void
+print_attr_string(netdissect_options *ndo,
+ register u_char *data, u_int length, u_short attr_code)
+{
+ register u_int i;
+
+ ND_TCHECK2(data[0],length);
+
+ switch(attr_code)
+ {
+ case TUNNEL_PASS:
+ if (length < 3)
+ {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+ if (*data && (*data <=0x1F) )
+ ND_PRINT((ndo, "Tag[%u] ", *data));
+ else
+ ND_PRINT((ndo, "Tag[Unused] "));
+ data++;
+ length--;
+ ND_PRINT((ndo, "Salt %u ", EXTRACT_16BITS(data)));
+ data+=2;
+ length-=2;
+ break;
+ case TUNNEL_CLIENT_END:
+ case TUNNEL_SERVER_END:
+ case TUNNEL_PRIV_GROUP:
+ case TUNNEL_ASSIGN_ID:
+ case TUNNEL_CLIENT_AUTH:
+ case TUNNEL_SERVER_AUTH:
+ if (*data <= 0x1F)
+ {
+ if (length < 1)
+ {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+ if (*data)
+ ND_PRINT((ndo, "Tag[%u] ", *data));
+ else
+ ND_PRINT((ndo, "Tag[Unused] "));
+ data++;
+ length--;
+ }
+ break;
+ case EGRESS_VLAN_NAME:
+ ND_PRINT((ndo, "%s (0x%02x) ",
+ tok2str(rfc4675_tagged,"Unknown tag",*data),
+ *data));
+ data++;
+ length--;
+ break;
+ }
+
+ for (i=0; *data && i < length ; i++, data++)
+ ND_PRINT((ndo, "%c", (*data < 32 || *data > 128) ? '.' : *data));
+
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/*
+ * print vendor specific attributes
+ */
+static void
+print_vendor_attr(netdissect_options *ndo,
+ register u_char *data, u_int length, u_short attr_code _U_)
+{
+ u_int idx;
+ u_int vendor_id;
+ u_int vendor_type;
+ u_int vendor_length;
+
+ if (length < 4)
+ goto trunc;
+ ND_TCHECK2(*data, 4);
+ vendor_id = EXTRACT_32BITS(data);
+ data+=4;
+ length-=4;
+
+ ND_PRINT((ndo, "Vendor: %s (%u)",
+ tok2str(smi_values,"Unknown",vendor_id),
+ vendor_id));
+
+ while (length >= 2) {
+ ND_TCHECK2(*data, 2);
+
+ vendor_type = *(data);
+ vendor_length = *(data+1);
+
+ if (vendor_length < 2)
+ {
+ ND_PRINT((ndo, "\n\t Vendor Attribute: %u, Length: %u (bogus, must be >= 2)",
+ vendor_type,
+ vendor_length));
+ return;
+ }
+ if (vendor_length > length)
+ {
+ ND_PRINT((ndo, "\n\t Vendor Attribute: %u, Length: %u (bogus, goes past end of vendor-specific attribute)",
+ vendor_type,
+ vendor_length));
+ return;
+ }
+ data+=2;
+ vendor_length-=2;
+ length-=2;
+ ND_TCHECK2(*data, vendor_length);
+
+ ND_PRINT((ndo, "\n\t Vendor Attribute: %u, Length: %u, Value: ",
+ vendor_type,
+ vendor_length));
+ for (idx = 0; idx < vendor_length ; idx++, data++)
+ ND_PRINT((ndo, "%c", (*data < 32 || *data > 128) ? '.' : *data));
+ length-=vendor_length;
+ }
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/******************************/
+/* Print an attribute numeric */
+/* value pointed by 'data' */
+/* and 'length' size. */
+/******************************/
+/* Returns nothing. */
+/******************************/
+static void
+print_attr_num(netdissect_options *ndo,
+ register u_char *data, u_int length, u_short attr_code)
+{
+ uint32_t timeout;
+
+ if (length != 4)
+ {
+ ND_PRINT((ndo, "ERROR: length %u != 4", length));
+ return;
+ }
+
+ ND_TCHECK2(data[0],4);
+ /* This attribute has standard values */
+ if (attr_type[attr_code].siz_subtypes)
+ {
+ static const char **table;
+ uint32_t data_value;
+ table = attr_type[attr_code].subtypes;
+
+ if ( (attr_code == TUNNEL_TYPE) || (attr_code == TUNNEL_MEDIUM) )
+ {
+ if (!*data)
+ ND_PRINT((ndo, "Tag[Unused] "));
+ else
+ ND_PRINT((ndo, "Tag[%d] ", *data));
+ data++;
+ data_value = EXTRACT_24BITS(data);
+ }
+ else
+ {
+ data_value = EXTRACT_32BITS(data);
+ }
+ if ( data_value <= (uint32_t)(attr_type[attr_code].siz_subtypes - 1 +
+ attr_type[attr_code].first_subtype) &&
+ data_value >= attr_type[attr_code].first_subtype )
+ ND_PRINT((ndo, "%s", table[data_value]));
+ else
+ ND_PRINT((ndo, "#%u", data_value));
+ }
+ else
+ {
+ switch(attr_code) /* Be aware of special cases... */
+ {
+ case FRM_IPX:
+ if (EXTRACT_32BITS( data) == 0xFFFFFFFE )
+ ND_PRINT((ndo, "NAS Select"));
+ else
+ ND_PRINT((ndo, "%d", EXTRACT_32BITS(data)));
+ break;
+
+ case SESSION_TIMEOUT:
+ case IDLE_TIMEOUT:
+ case ACCT_DELAY:
+ case ACCT_SESSION_TIME:
+ case ACCT_INT_INTERVAL:
+ timeout = EXTRACT_32BITS( data);
+ if ( timeout < 60 )
+ ND_PRINT((ndo, "%02d secs", timeout));
+ else
+ {
+ if ( timeout < 3600 )
+ ND_PRINT((ndo, "%02d:%02d min",
+ timeout / 60, timeout % 60));
+ else
+ ND_PRINT((ndo, "%02d:%02d:%02d hours",
+ timeout / 3600, (timeout % 3600) / 60,
+ timeout % 60));
+ }
+ break;
+
+ case FRM_ATALK_LINK:
+ if (EXTRACT_32BITS(data) )
+ ND_PRINT((ndo, "%d", EXTRACT_32BITS(data)));
+ else
+ ND_PRINT((ndo, "Unnumbered"));
+ break;
+
+ case FRM_ATALK_NETWORK:
+ if (EXTRACT_32BITS(data) )
+ ND_PRINT((ndo, "%d", EXTRACT_32BITS(data)));
+ else
+ ND_PRINT((ndo, "NAS assigned"));
+ break;
+
+ case TUNNEL_PREFERENCE:
+ if (*data)
+ ND_PRINT((ndo, "Tag[%d] ", *data));
+ else
+ ND_PRINT((ndo, "Tag[Unused] "));
+ data++;
+ ND_PRINT((ndo, "%d", EXTRACT_24BITS(data)));
+ break;
+
+ case EGRESS_VLAN_ID:
+ ND_PRINT((ndo, "%s (0x%02x) ",
+ tok2str(rfc4675_tagged,"Unknown tag",*data),
+ *data));
+ data++;
+ ND_PRINT((ndo, "%d", EXTRACT_24BITS(data)));
+ break;
+
+ default:
+ ND_PRINT((ndo, "%d", EXTRACT_32BITS(data)));
+ break;
+
+ } /* switch */
+
+ } /* if-else */
+
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/*****************************/
+/* Print an attribute IPv4 */
+/* address value pointed by */
+/* 'data' and 'length' size. */
+/*****************************/
+/* Returns nothing. */
+/*****************************/
+static void
+print_attr_address(netdissect_options *ndo,
+ register u_char *data, u_int length, u_short attr_code)
+{
+ if (length != 4)
+ {
+ ND_PRINT((ndo, "ERROR: length %u != 4", length));
+ return;
+ }
+
+ ND_TCHECK2(data[0],4);
+
+ switch(attr_code)
+ {
+ case FRM_IPADDR:
+ case LOG_IPHOST:
+ if (EXTRACT_32BITS(data) == 0xFFFFFFFF )
+ ND_PRINT((ndo, "User Selected"));
+ else
+ if (EXTRACT_32BITS(data) == 0xFFFFFFFE )
+ ND_PRINT((ndo, "NAS Select"));
+ else
+ ND_PRINT((ndo, "%s",ipaddr_string(ndo, data)));
+ break;
+
+ default:
+ ND_PRINT((ndo, "%s", ipaddr_string(ndo, data)));
+ break;
+ }
+
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/*************************************/
+/* Print an attribute of 'secs since */
+/* January 1, 1970 00:00 UTC' value */
+/* pointed by 'data' and 'length' */
+/* size. */
+/*************************************/
+/* Returns nothing. */
+/*************************************/
+static void
+print_attr_time(netdissect_options *ndo,
+ register u_char *data, u_int length, u_short attr_code _U_)
+{
+ time_t attr_time;
+ char string[26];
+ const char *p;
+
+ if (length != 4)
+ {
+ ND_PRINT((ndo, "ERROR: length %u != 4", length));
+ return;
+ }
+
+ ND_TCHECK2(data[0],4);
+
+ attr_time = EXTRACT_32BITS(data);
+ if ((p = ctime(&attr_time)) == NULL)
+ p = "?";
+ strlcpy(string, p, sizeof(string));
+ /* Get rid of the newline */
+ string[24] = '\0';
+ ND_PRINT((ndo, "%.24s", string));
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/***********************************/
+/* Print an attribute of 'strange' */
+/* data format pointed by 'data' */
+/* and 'length' size. */
+/***********************************/
+/* Returns nothing. */
+/***********************************/
+static void
+print_attr_strange(netdissect_options *ndo,
+ register u_char *data, u_int length, u_short attr_code)
+{
+ u_short len_data;
+
+ switch(attr_code)
+ {
+ case ARAP_PASS:
+ if (length != 16)
+ {
+ ND_PRINT((ndo, "ERROR: length %u != 16", length));
+ return;
+ }
+ ND_PRINT((ndo, "User_challenge ("));
+ ND_TCHECK2(data[0],8);
+ len_data = 8;
+ PRINT_HEX(len_data, data);
+ ND_PRINT((ndo, ") User_resp("));
+ ND_TCHECK2(data[0],8);
+ len_data = 8;
+ PRINT_HEX(len_data, data);
+ ND_PRINT((ndo, ")"));
+ break;
+
+ case ARAP_FEATURES:
+ if (length != 14)
+ {
+ ND_PRINT((ndo, "ERROR: length %u != 14", length));
+ return;
+ }
+ ND_TCHECK2(data[0],1);
+ if (*data)
+ ND_PRINT((ndo, "User can change password"));
+ else
+ ND_PRINT((ndo, "User cannot change password"));
+ data++;
+ ND_TCHECK2(data[0],1);
+ ND_PRINT((ndo, ", Min password length: %d", *data));
+ data++;
+ ND_PRINT((ndo, ", created at: "));
+ ND_TCHECK2(data[0],4);
+ len_data = 4;
+ PRINT_HEX(len_data, data);
+ ND_PRINT((ndo, ", expires in: "));
+ ND_TCHECK2(data[0],4);
+ len_data = 4;
+ PRINT_HEX(len_data, data);
+ ND_PRINT((ndo, ", Current Time: "));
+ ND_TCHECK2(data[0],4);
+ len_data = 4;
+ PRINT_HEX(len_data, data);
+ break;
+
+ case ARAP_CHALLENGE_RESP:
+ if (length < 8)
+ {
+ ND_PRINT((ndo, "ERROR: length %u != 8", length));
+ return;
+ }
+ ND_TCHECK2(data[0],8);
+ len_data = 8;
+ PRINT_HEX(len_data, data);
+ break;
+ }
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+radius_attrs_print(netdissect_options *ndo,
+ register const u_char *attr, u_int length)
+{
+ register const struct radius_attr *rad_attr = (struct radius_attr *)attr;
+ const char *attr_string;
+
+ while (length > 0)
+ {
+ if (length < 2)
+ goto trunc;
+ ND_TCHECK(*rad_attr);
+
+ if (rad_attr->type > 0 && rad_attr->type < TAM_SIZE(attr_type))
+ attr_string = attr_type[rad_attr->type].name;
+ else
+ attr_string = "Unknown";
+ if (rad_attr->len < 2)
+ {
+ ND_PRINT((ndo, "\n\t %s Attribute (%u), length: %u (bogus, must be >= 2)",
+ attr_string,
+ rad_attr->type,
+ rad_attr->len));
+ return;
+ }
+ if (rad_attr->len > length)
+ {
+ ND_PRINT((ndo, "\n\t %s Attribute (%u), length: %u (bogus, goes past end of packet)",
+ attr_string,
+ rad_attr->type,
+ rad_attr->len));
+ return;
+ }
+ ND_PRINT((ndo, "\n\t %s Attribute (%u), length: %u, Value: ",
+ attr_string,
+ rad_attr->type,
+ rad_attr->len));
+
+ if (rad_attr->type < TAM_SIZE(attr_type))
+ {
+ if (rad_attr->len > 2)
+ {
+ if ( attr_type[rad_attr->type].print_func )
+ (*attr_type[rad_attr->type].print_func)(
+ ndo, ((u_char *)(rad_attr+1)),
+ rad_attr->len - 2, rad_attr->type);
+ }
+ }
+ /* do we also want to see a hex dump ? */
+ if (ndo->ndo_vflag> 1)
+ print_unknown_data(ndo, (u_char *)rad_attr+2, "\n\t ", (rad_attr->len)-2);
+
+ length-=(rad_attr->len);
+ rad_attr = (struct radius_attr *)( ((char *)(rad_attr))+rad_attr->len);
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+void
+radius_print(netdissect_options *ndo,
+ const u_char *dat, u_int length)
+{
+ register const struct radius_hdr *rad;
+ u_int len, auth_idx;
+
+ ND_TCHECK2(*dat, MIN_RADIUS_LEN);
+ rad = (struct radius_hdr *)dat;
+ len = EXTRACT_16BITS(&rad->len);
+
+ if (len < MIN_RADIUS_LEN)
+ {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+
+ if (len > length)
+ len = length;
+
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "RADIUS, %s (%u), id: 0x%02x length: %u",
+ tok2str(radius_command_values,"Unknown Command",rad->code),
+ rad->code,
+ rad->id,
+ len));
+ return;
+ }
+ else {
+ ND_PRINT((ndo, "RADIUS, length: %u\n\t%s (%u), id: 0x%02x, Authenticator: ",
+ len,
+ tok2str(radius_command_values,"Unknown Command",rad->code),
+ rad->code,
+ rad->id));
+
+ for(auth_idx=0; auth_idx < 16; auth_idx++)
+ ND_PRINT((ndo, "%02x", rad->auth[auth_idx]));
+ }
+
+ if (len > MIN_RADIUS_LEN)
+ radius_attrs_print(ndo, dat + MIN_RADIUS_LEN, len - MIN_RADIUS_LEN);
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
--- /dev/null
+/*
+ * Copyright (c) 1996
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-raw.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+
+/*
+ * The DLT_RAW packet has no header. It contains a raw IP packet.
+ */
+
+u_int
+raw_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
+{
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "ip: "));
+
+ ipN_print(ndo, p, h->len);
+
+ return (0);
+}
--- /dev/null
+/*
+ * Copyright (c) 1989, 1990, 1991, 1993, 1994, 1996
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-rip.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+
+#include "af.h"
+
+static const char tstr[] = "[|rip]";
+
+struct rip {
+ uint8_t rip_cmd; /* request/response */
+ uint8_t rip_vers; /* protocol version # */
+ uint8_t unused[2]; /* unused */
+};
+
+#define RIPCMD_REQUEST 1 /* want info */
+#define RIPCMD_RESPONSE 2 /* responding to request */
+#define RIPCMD_TRACEON 3 /* turn tracing on */
+#define RIPCMD_TRACEOFF 4 /* turn it off */
+#define RIPCMD_POLL 5 /* want info from everybody */
+#define RIPCMD_POLLENTRY 6 /* poll for entry */
+
+static const struct tok rip_cmd_values[] = {
+ { RIPCMD_REQUEST, "Request" },
+ { RIPCMD_RESPONSE, "Response" },
+ { RIPCMD_TRACEON, "Trace on" },
+ { RIPCMD_TRACEOFF, "Trace off" },
+ { RIPCMD_POLL, "Poll" },
+ { RIPCMD_POLLENTRY, "Poll Entry" },
+ { 0, NULL}
+};
+
+#define RIP_AUTHLEN 16
+#define RIP_ROUTELEN 20
+
+/*
+ * rfc 1723
+ *
+ * 0 1 2 3 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Command (1) | Version (1) | unused |
+ * +---------------+---------------+-------------------------------+
+ * | Address Family Identifier (2) | Route Tag (2) |
+ * +-------------------------------+-------------------------------+
+ * | IP Address (4) |
+ * +---------------------------------------------------------------+
+ * | Subnet Mask (4) |
+ * +---------------------------------------------------------------+
+ * | Next Hop (4) |
+ * +---------------------------------------------------------------+
+ * | Metric (4) |
+ * +---------------------------------------------------------------+
+ *
+ */
+
+struct rip_netinfo {
+ uint16_t rip_family;
+ uint16_t rip_tag;
+ uint32_t rip_dest;
+ uint32_t rip_dest_mask;
+ uint32_t rip_router;
+ uint32_t rip_metric; /* cost of route */
+};
+
+static void
+rip_entry_print_v1(netdissect_options *ndo,
+ register const struct rip_netinfo *ni)
+{
+ register u_short family;
+
+ /* RFC 1058 */
+ family = EXTRACT_16BITS(&ni->rip_family);
+ if (family != BSD_AFNUM_INET && family != 0) {
+ ND_PRINT((ndo, "\n\t AFI %s, ", tok2str(bsd_af_values, "Unknown (%u)", family)));
+ print_unknown_data(ndo, (uint8_t *)&ni->rip_family, "\n\t ", RIP_ROUTELEN);
+ return;
+ }
+ if (EXTRACT_16BITS(&ni->rip_tag) ||
+ EXTRACT_32BITS(&ni->rip_dest_mask) ||
+ EXTRACT_32BITS(&ni->rip_router)) {
+ /* MBZ fields not zero */
+ print_unknown_data(ndo, (uint8_t *)&ni->rip_family, "\n\t ", RIP_ROUTELEN);
+ return;
+ }
+ if (family == 0) {
+ ND_PRINT((ndo, "\n\t AFI 0, %s, metric: %u",
+ ipaddr_string(ndo, &ni->rip_dest),
+ EXTRACT_32BITS(&ni->rip_metric)));
+ return;
+ } /* BSD_AFNUM_INET */
+ ND_PRINT((ndo, "\n\t %s, metric: %u",
+ ipaddr_string(ndo, &ni->rip_dest),
+ EXTRACT_32BITS(&ni->rip_metric)));
+}
+
+static unsigned
+rip_entry_print_v2(netdissect_options *ndo,
+ register const struct rip_netinfo *ni, const unsigned remaining)
+{
+ register u_short family;
+
+ family = EXTRACT_16BITS(&ni->rip_family);
+ if (family == 0xFFFF) { /* variable-sized authentication structures */
+ uint16_t auth_type = EXTRACT_16BITS(&ni->rip_tag);
+ if (auth_type == 2) {
+ register u_char *p = (u_char *)&ni->rip_dest;
+ u_int i = 0;
+ ND_PRINT((ndo, "\n\t Simple Text Authentication data: "));
+ for (; i < RIP_AUTHLEN; p++, i++)
+ ND_PRINT((ndo, "%c", ND_ISPRINT(*p) ? *p : '.'));
+ } else if (auth_type == 3) {
+ ND_PRINT((ndo, "\n\t Auth header:"));
+ ND_PRINT((ndo, " Packet Len %u,", EXTRACT_16BITS((uint8_t *)ni + 4)));
+ ND_PRINT((ndo, " Key-ID %u,", *((uint8_t *)ni + 6)));
+ ND_PRINT((ndo, " Auth Data Len %u,", *((uint8_t *)ni + 7)));
+ ND_PRINT((ndo, " SeqNo %u,", EXTRACT_32BITS(&ni->rip_dest_mask)));
+ ND_PRINT((ndo, " MBZ %u,", EXTRACT_32BITS(&ni->rip_router)));
+ ND_PRINT((ndo, " MBZ %u", EXTRACT_32BITS(&ni->rip_metric)));
+ } else if (auth_type == 1) {
+ ND_PRINT((ndo, "\n\t Auth trailer:"));
+ print_unknown_data(ndo, (uint8_t *)&ni->rip_dest, "\n\t ", remaining);
+ return remaining; /* AT spans till the packet end */
+ } else {
+ ND_PRINT((ndo, "\n\t Unknown (%u) Authentication data:",
+ EXTRACT_16BITS(&ni->rip_tag)));
+ print_unknown_data(ndo, (uint8_t *)&ni->rip_dest, "\n\t ", remaining);
+ }
+ } else if (family != BSD_AFNUM_INET && family != 0) {
+ ND_PRINT((ndo, "\n\t AFI %s", tok2str(bsd_af_values, "Unknown (%u)", family)));
+ print_unknown_data(ndo, (uint8_t *)&ni->rip_tag, "\n\t ", RIP_ROUTELEN-2);
+ } else { /* BSD_AFNUM_INET or AFI 0 */
+ ND_PRINT((ndo, "\n\t AFI %s, %15s/%-2d, tag 0x%04x, metric: %u, next-hop: ",
+ tok2str(bsd_af_values, "%u", family),
+ ipaddr_string(ndo, &ni->rip_dest),
+ mask2plen(EXTRACT_32BITS(&ni->rip_dest_mask)),
+ EXTRACT_16BITS(&ni->rip_tag),
+ EXTRACT_32BITS(&ni->rip_metric)));
+ if (EXTRACT_32BITS(&ni->rip_router))
+ ND_PRINT((ndo, "%s", ipaddr_string(ndo, &ni->rip_router)));
+ else
+ ND_PRINT((ndo, "self"));
+ }
+ return sizeof (*ni);
+}
+
+void
+rip_print(netdissect_options *ndo,
+ const u_char *dat, u_int length)
+{
+ register const struct rip *rp;
+ register const struct rip_netinfo *ni;
+ register u_int i, j;
+
+ if (ndo->ndo_snapend < dat) {
+ ND_PRINT((ndo, " %s", tstr));
+ return;
+ }
+ i = ndo->ndo_snapend - dat;
+ if (i > length)
+ i = length;
+ if (i < sizeof(*rp)) {
+ ND_PRINT((ndo, " %s", tstr));
+ return;
+ }
+ i -= sizeof(*rp);
+
+ rp = (struct rip *)dat;
+
+ ND_PRINT((ndo, "%sRIPv%u",
+ (ndo->ndo_vflag >= 1) ? "\n\t" : "",
+ rp->rip_vers));
+
+ switch (rp->rip_vers) {
+ case 0:
+ /*
+ * RFC 1058.
+ *
+ * XXX - RFC 1058 says
+ *
+ * 0 Datagrams whose version number is zero are to be ignored.
+ * These are from a previous version of the protocol, whose
+ * packet format was machine-specific.
+ *
+ * so perhaps we should just dump the packet, in hex.
+ */
+ print_unknown_data(ndo, (uint8_t *)&rp->rip_cmd, "\n\t", length);
+ break;
+ default:
+ /* dump version and lets see if we know the commands name*/
+ ND_PRINT((ndo, ", %s, length: %u",
+ tok2str(rip_cmd_values,
+ "unknown command (%u)",
+ rp->rip_cmd),
+ length));
+
+ if (ndo->ndo_vflag < 1)
+ return;
+
+ switch (rp->rip_cmd) {
+ case RIPCMD_REQUEST:
+ case RIPCMD_RESPONSE:
+ j = length / sizeof(*ni);
+ ND_PRINT((ndo, ", routes: %u%s", j, rp->rip_vers == 2 ? " or less" : ""));
+ ni = (struct rip_netinfo *)(rp + 1);
+ for (; i >= sizeof(*ni); ++ni) {
+ if (rp->rip_vers == 1)
+ {
+ rip_entry_print_v1(ndo, ni);
+ i -= sizeof(*ni);
+ }
+ else if (rp->rip_vers == 2)
+ i -= rip_entry_print_v2(ndo, ni, i);
+ else
+ break;
+ }
+ if (i)
+ ND_PRINT((ndo, "%s", tstr));
+ break;
+
+ case RIPCMD_TRACEOFF:
+ case RIPCMD_POLL:
+ case RIPCMD_POLLENTRY:
+ break;
+
+ case RIPCMD_TRACEON:
+ /* fall through */
+ default:
+ if (ndo->ndo_vflag <= 1) {
+ if(!print_unknown_data(ndo, (uint8_t *)rp, "\n\t", length))
+ return;
+ }
+ break;
+ }
+ /* do we want to see an additionally hexdump ? */
+ if (ndo->ndo_vflag> 1) {
+ if(!print_unknown_data(ndo, (uint8_t *)rp, "\n\t", length))
+ return;
+ }
+ }
+}
+
+
--- /dev/null
+/*
+ * Copyright (c) 1989, 1990, 1991, 1993, 1994
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-ripng.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef INET6
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+/*
+ * Copyright (C) 1995, 1996, 1997 and 1998 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.
+ */
+#define RIP6_VERSION 1
+
+#define RIP6_REQUEST 1
+#define RIP6_RESPONSE 2
+
+struct netinfo6 {
+ struct in6_addr rip6_dest;
+ uint16_t rip6_tag;
+ uint8_t rip6_plen;
+ uint8_t rip6_metric;
+};
+
+struct rip6 {
+ uint8_t rip6_cmd;
+ uint8_t rip6_vers;
+ uint8_t rip6_res1[2];
+ union {
+ struct netinfo6 ru6_nets[1];
+ char ru6_tracefile[1];
+ } rip6un;
+#define rip6_nets rip6un.ru6_nets
+#define rip6_tracefile rip6un.ru6_tracefile
+};
+
+#define HOPCNT_INFINITY6 16
+
+#if !defined(IN6_IS_ADDR_UNSPECIFIED) && !defined(_MSC_VER) /* MSVC inline */
+static int IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr *addr)
+{
+ static const struct in6_addr in6addr_any; /* :: */
+ return (memcmp(addr, &in6addr_any, sizeof(*addr)) == 0);
+}
+#endif
+
+static int
+rip6_entry_print(netdissect_options *ndo, register const struct netinfo6 *ni, int metric)
+{
+ int l;
+ l = ND_PRINT((ndo, "%s/%d", ip6addr_string(ndo, &ni->rip6_dest), ni->rip6_plen));
+ if (ni->rip6_tag)
+ l += ND_PRINT((ndo, " [%d]", EXTRACT_16BITS(&ni->rip6_tag)));
+ if (metric)
+ l += ND_PRINT((ndo, " (%d)", ni->rip6_metric));
+ return l;
+}
+
+void
+ripng_print(netdissect_options *ndo, const u_char *dat, unsigned int length)
+{
+ register const struct rip6 *rp = (struct rip6 *)dat;
+ register const struct netinfo6 *ni;
+ register u_int amt;
+ register u_int i;
+ int j;
+ int trunc;
+
+ if (ndo->ndo_snapend < dat)
+ return;
+ amt = ndo->ndo_snapend - dat;
+ i = min(length, amt);
+ if (i < (sizeof(struct rip6) - sizeof(struct netinfo6)))
+ return;
+ i -= (sizeof(struct rip6) - sizeof(struct netinfo6));
+
+ switch (rp->rip6_cmd) {
+
+ case RIP6_REQUEST:
+ j = length / sizeof(*ni);
+ if (j == 1
+ && rp->rip6_nets->rip6_metric == HOPCNT_INFINITY6
+ && IN6_IS_ADDR_UNSPECIFIED(&rp->rip6_nets->rip6_dest)) {
+ ND_PRINT((ndo, " ripng-req dump"));
+ break;
+ }
+ if (j * sizeof(*ni) != length - 4)
+ ND_PRINT((ndo, " ripng-req %d[%u]:", j, length));
+ else
+ ND_PRINT((ndo, " ripng-req %d:", j));
+ trunc = ((i / sizeof(*ni)) * sizeof(*ni) != i);
+ for (ni = rp->rip6_nets; i >= sizeof(*ni);
+ i -= sizeof(*ni), ++ni) {
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, "\n\t"));
+ else
+ ND_PRINT((ndo, " "));
+ rip6_entry_print(ndo, ni, 0);
+ }
+ break;
+ case RIP6_RESPONSE:
+ j = length / sizeof(*ni);
+ if (j * sizeof(*ni) != length - 4)
+ ND_PRINT((ndo, " ripng-resp %d[%u]:", j, length));
+ else
+ ND_PRINT((ndo, " ripng-resp %d:", j));
+ trunc = ((i / sizeof(*ni)) * sizeof(*ni) != i);
+ for (ni = rp->rip6_nets; i >= sizeof(*ni);
+ i -= sizeof(*ni), ++ni) {
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, "\n\t"));
+ else
+ ND_PRINT((ndo, " "));
+ rip6_entry_print(ndo, ni, ni->rip6_metric);
+ }
+ if (trunc)
+ ND_PRINT((ndo, "[|ripng]"));
+ break;
+ default:
+ ND_PRINT((ndo, " ripng-%d ?? %u", rp->rip6_cmd, length));
+ break;
+ }
+ if (rp->rip6_vers != RIP6_VERSION)
+ ND_PRINT((ndo, " [vers %d]", rp->rip6_vers));
+}
+#endif /* INET6 */
--- /dev/null
+/*
+ * 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 as RFC6810
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.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 session_id[2]; /* Session id */
+ 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 indentation string for a given indentation 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 (netdissect_options *ndo, 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);
+ ND_TCHECK2(*tptr, pdu_len);
+ hexdump = FALSE;
+
+ ND_PRINT((ndo, "%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);
+ ND_PRINT((ndo, "%sSession ID: 0x%04x, Serial: %u",
+ indent_string(indent+2),
+ EXTRACT_16BITS(pdu_header->u.session_id),
+ 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:
+ ND_PRINT((ndo, "%sSession ID: 0x%04x",
+ indent_string(indent+2),
+ EXTRACT_16BITS(pdu_header->u.session_id)));
+ break;
+
+ case RPKI_RTR_IPV4_PREFIX_PDU:
+ {
+ rpki_rtr_pdu_ipv4_prefix *pdu;
+
+ pdu = (rpki_rtr_pdu_ipv4_prefix *)tptr;
+ ND_PRINT((ndo, "%sIPv4 Prefix %s/%u-%u, origin-as %u, flags 0x%02x",
+ indent_string(indent+2),
+ ipaddr_string(ndo, 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;
+ ND_PRINT((ndo, "%sIPv6 Prefix %s/%u-%u, origin-as %u, flags 0x%02x",
+ indent_string(indent+2),
+ ip6addr_string(ndo, 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);
+ ND_TCHECK2(*tptr, encapsulated_pdu_length);
+ tlen = pdu_len;
+
+ error_code = EXTRACT_16BITS(pdu->pdu_header.u.error_code);
+ ND_PRINT((ndo, "%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)) {
+ ND_PRINT((ndo, "%s-----encapsulated PDU-----", indent_string(indent+4)));
+ rpki_rtr_pdu_print(ndo, 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;
+ }
+ ND_TCHECK2(*tptr, text_length);
+ if (text_length && (text_length <= tlen )) {
+ memcpy(buf, tptr, min(sizeof(buf)-1, text_length));
+ buf[min(sizeof(buf) - 1, text_length)] = '\0';
+ ND_PRINT((ndo, "%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 (ndo->ndo_vflag > 1 || (ndo->ndo_vflag && hexdump)) {
+ print_unknown_data(ndo,tptr,"\n\t ", pdu_len);
+ }
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "|trunc"));
+ return;
+}
+
+void
+rpki_rtr_print(netdissect_options *ndo, 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 (!ndo->ndo_vflag) {
+ ND_PRINT((ndo, ", RPKI-RTR"));
+ return;
+ }
+
+ while (tlen >= sizeof(rpki_rtr_pdu)) {
+
+ ND_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);
+ ND_TCHECK2(*tptr, pdu_len);
+
+ /* infinite loop check */
+ if (!pdu_type || !pdu_len) {
+ break;
+ }
+
+ if (tlen < pdu_len) {
+ goto trunc;
+ }
+
+ /*
+ * Print the PDU.
+ */
+ rpki_rtr_pdu_print(ndo, tptr, 8);
+
+ tlen -= pdu_len;
+ tptr += pdu_len;
+ }
+ return;
+ trunc:
+ ND_PRINT((ndo, "\n\t[|RPKI-RTR]"));
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 2007 - Andrey "nording" Chernyak <andrew@nording.ru>
+ *
+ * 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.
+ *
+ * Format and print Realtek Remote Control Protocol (RRCP)
+ * and Realtek Echo Protocol (RRCP-REP) packets.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-rrcp.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+#include "ether.h"
+
+#define RRCP_OPCODE_MASK 0x7F /* 0x00 = hello, 0x01 = get, 0x02 = set */
+#define RRCP_ISREPLY 0x80 /* 0 = request to switch, 0x80 = reply from switch */
+
+#define RRCP_PROTO_OFFSET 0 /* proto - 1 byte, must be 1 */
+#define RRCP_OPCODE_ISREPLY_OFFSET 1 /* opcode and isreply flag - 1 byte */
+#define RRCP_AUTHKEY_OFFSET 2 /* authorization key - 2 bytes, 0x2379 by default */
+
+/* most packets */
+#define RRCP_REG_ADDR_OFFSET 4 /* register address - 2 bytes */
+#define RRCP_REG_DATA_OFFSET 6 /* register data - 4 bytes */
+#define RRCP_COOKIE1_OFFSET 10 /* 4 bytes */
+#define RRCP_COOKIE2_OFFSET 14 /* 4 bytes */
+
+/* hello reply packets */
+#define RRCP_DOWNLINK_PORT_OFFSET 4 /* 1 byte */
+#define RRCP_UPLINK_PORT_OFFSET 5 /* 1 byte */
+#define RRCP_UPLINK_MAC_OFFSET 6 /* 6 byte MAC address */
+#define RRCP_CHIP_ID_OFFSET 12 /* 2 bytes */
+#define RRCP_VENDOR_ID_OFFSET 14 /* 4 bytes */
+
+static const struct tok proto_values[] = {
+ { 1, "RRCP" },
+ { 2, "RRCP-REP" },
+ { 0, NULL }
+};
+
+static const struct tok opcode_values[] = {
+ { 0, "hello" },
+ { 1, "get" },
+ { 2, "set" },
+ { 0, NULL }
+};
+
+/*
+ * Print RRCP requests
+ */
+void
+rrcp_print(netdissect_options *ndo,
+ register const u_char *cp,
+ u_int length _U_)
+{
+ const u_char *rrcp;
+ uint8_t rrcp_proto;
+ uint8_t rrcp_opcode;
+ register const struct ether_header *ep;
+ char proto_str[16];
+ char opcode_str[32];
+
+ ep = (const struct ether_header *)cp;
+ rrcp = cp + ETHER_HDRLEN;
+
+ ND_TCHECK(*(rrcp + RRCP_PROTO_OFFSET));
+ rrcp_proto = *(rrcp + RRCP_PROTO_OFFSET);
+ ND_TCHECK(*(rrcp + RRCP_OPCODE_ISREPLY_OFFSET));
+ rrcp_opcode = (*(rrcp + RRCP_OPCODE_ISREPLY_OFFSET)) & RRCP_OPCODE_MASK;
+ ND_PRINT((ndo, "%s > %s, %s %s",
+ etheraddr_string(ndo, ESRC(ep)),
+ etheraddr_string(ndo, EDST(ep)),
+ tok2strbuf(proto_values,"RRCP-0x%02x",rrcp_proto,proto_str,sizeof(proto_str)),
+ ((*(rrcp + RRCP_OPCODE_ISREPLY_OFFSET)) & RRCP_ISREPLY) ? "reply" : "query"));
+ if (rrcp_proto==1){
+ ND_PRINT((ndo, ": %s",
+ tok2strbuf(opcode_values,"unknown opcode (0x%02x)",rrcp_opcode,opcode_str,sizeof(opcode_str))));
+ }
+ 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_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);
+ ND_PRINT((ndo, ", auth=0x%04x",
+ EXTRACT_16BITS(rrcp + RRCP_AUTHKEY_OFFSET)));
+ }
+ if (rrcp_proto==1 && rrcp_opcode==0 &&
+ ((*(rrcp + RRCP_OPCODE_ISREPLY_OFFSET)) & RRCP_ISREPLY)){
+ ND_TCHECK2(*(rrcp + RRCP_VENDOR_ID_OFFSET), 4);
+ ND_PRINT((ndo, " downlink_port=%d, uplink_port=%d, uplink_mac=%s, vendor_id=%08x ,chip_id=%04x ",
+ *(rrcp + RRCP_DOWNLINK_PORT_OFFSET),
+ *(rrcp + RRCP_UPLINK_PORT_OFFSET),
+ etheraddr_string(ndo, rrcp + RRCP_UPLINK_MAC_OFFSET),
+ EXTRACT_32BITS(rrcp + RRCP_VENDOR_ID_OFFSET),
+ EXTRACT_16BITS(rrcp + RRCP_CHIP_ID_OFFSET)));
+ }else if (rrcp_opcode==1 || rrcp_opcode==2 || rrcp_proto==2){
+ ND_TCHECK2(*(rrcp + RRCP_COOKIE2_OFFSET), 4);
+ ND_PRINT((ndo, ", cookie=0x%08x%08x ",
+ EXTRACT_32BITS(rrcp + RRCP_COOKIE2_OFFSET),
+ EXTRACT_32BITS(rrcp + RRCP_COOKIE1_OFFSET)));
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|rrcp]"));
+}
--- /dev/null
+/*
+ * Copyright (c) 1998-2007 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-rsvp.c,v 1.7 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+#include "ethertype.h"
+#include "gmpls.h"
+#include "af.h"
+#include "signature.h"
+
+/*
+ * RFC 2205 common header
+ *
+ * 0 1 2 3
+ * +-------------+-------------+-------------+-------------+
+ * | Vers | Flags| Msg Type | RSVP Checksum |
+ * +-------------+-------------+-------------+-------------+
+ * | Send_TTL | (Reserved) | RSVP Length |
+ * +-------------+-------------+-------------+-------------+
+ *
+ */
+
+struct rsvp_common_header {
+ uint8_t version_flags;
+ uint8_t msg_type;
+ uint8_t checksum[2];
+ uint8_t ttl;
+ uint8_t reserved;
+ uint8_t length[2];
+};
+
+/*
+ * RFC2205 object header
+ *
+ *
+ * 0 1 2 3
+ * +-------------+-------------+-------------+-------------+
+ * | Length (bytes) | Class-Num | C-Type |
+ * +-------------+-------------+-------------+-------------+
+ * | |
+ * // (Object contents) //
+ * | |
+ * +-------------+-------------+-------------+-------------+
+ */
+
+struct rsvp_object_header {
+ uint8_t length[2];
+ uint8_t class_num;
+ uint8_t ctype;
+};
+
+#define RSVP_VERSION 1
+#define RSVP_EXTRACT_VERSION(x) (((x)&0xf0)>>4)
+#define RSVP_EXTRACT_FLAGS(x) ((x)&0x0f)
+
+#define RSVP_MSGTYPE_PATH 1
+#define RSVP_MSGTYPE_RESV 2
+#define RSVP_MSGTYPE_PATHERR 3
+#define RSVP_MSGTYPE_RESVERR 4
+#define RSVP_MSGTYPE_PATHTEAR 5
+#define RSVP_MSGTYPE_RESVTEAR 6
+#define RSVP_MSGTYPE_RESVCONF 7
+#define RSVP_MSGTYPE_AGGREGATE 12
+#define RSVP_MSGTYPE_ACK 13
+#define RSVP_MSGTYPE_HELLO_OLD 14 /* ancient Hellos */
+#define RSVP_MSGTYPE_SREFRESH 15
+#define RSVP_MSGTYPE_HELLO 20
+
+static const struct tok rsvp_msg_type_values[] = {
+ { RSVP_MSGTYPE_PATH, "Path" },
+ { RSVP_MSGTYPE_RESV, "Resv" },
+ { RSVP_MSGTYPE_PATHERR, "PathErr" },
+ { RSVP_MSGTYPE_RESVERR, "ResvErr" },
+ { RSVP_MSGTYPE_PATHTEAR, "PathTear" },
+ { RSVP_MSGTYPE_RESVTEAR, "ResvTear" },
+ { RSVP_MSGTYPE_RESVCONF, "ResvConf" },
+ { RSVP_MSGTYPE_AGGREGATE, "Aggregate" },
+ { RSVP_MSGTYPE_ACK, "Acknowledgement" },
+ { RSVP_MSGTYPE_HELLO_OLD, "Hello (Old)" },
+ { RSVP_MSGTYPE_SREFRESH, "Refresh" },
+ { RSVP_MSGTYPE_HELLO, "Hello" },
+ { 0, NULL}
+};
+
+static const struct tok rsvp_header_flag_values[] = {
+ { 0x01, "Refresh reduction capable" }, /* rfc2961 */
+ { 0, NULL}
+};
+
+#define RSVP_OBJ_SESSION 1 /* rfc2205 */
+#define RSVP_OBJ_RSVP_HOP 3 /* rfc2205, rfc3473 */
+#define RSVP_OBJ_INTEGRITY 4 /* rfc2747 */
+#define RSVP_OBJ_TIME_VALUES 5 /* rfc2205 */
+#define RSVP_OBJ_ERROR_SPEC 6
+#define RSVP_OBJ_SCOPE 7
+#define RSVP_OBJ_STYLE 8 /* rfc2205 */
+#define RSVP_OBJ_FLOWSPEC 9 /* rfc2215 */
+#define RSVP_OBJ_FILTERSPEC 10 /* rfc2215 */
+#define RSVP_OBJ_SENDER_TEMPLATE 11
+#define RSVP_OBJ_SENDER_TSPEC 12 /* rfc2215 */
+#define RSVP_OBJ_ADSPEC 13 /* rfc2215 */
+#define RSVP_OBJ_POLICY_DATA 14
+#define RSVP_OBJ_CONFIRM 15 /* rfc2205 */
+#define RSVP_OBJ_LABEL 16 /* rfc3209 */
+#define RSVP_OBJ_LABEL_REQ 19 /* rfc3209 */
+#define RSVP_OBJ_ERO 20 /* rfc3209 */
+#define RSVP_OBJ_RRO 21 /* rfc3209 */
+#define RSVP_OBJ_HELLO 22 /* rfc3209 */
+#define RSVP_OBJ_MESSAGE_ID 23 /* rfc2961 */
+#define RSVP_OBJ_MESSAGE_ID_ACK 24 /* rfc2961 */
+#define RSVP_OBJ_MESSAGE_ID_LIST 25 /* rfc2961 */
+#define RSVP_OBJ_RECOVERY_LABEL 34 /* rfc3473 */
+#define RSVP_OBJ_UPSTREAM_LABEL 35 /* rfc3473 */
+#define RSVP_OBJ_LABEL_SET 36 /* rfc3473 */
+#define RSVP_OBJ_PROTECTION 37 /* rfc3473 */
+#define RSVP_OBJ_S2L 50 /* rfc4875 */
+#define RSVP_OBJ_DETOUR 63 /* draft-ietf-mpls-rsvp-lsp-fastreroute-07 */
+#define RSVP_OBJ_CLASSTYPE 66 /* rfc4124 */
+#define RSVP_OBJ_CLASSTYPE_OLD 125 /* draft-ietf-tewg-diff-te-proto-07 */
+#define RSVP_OBJ_SUGGESTED_LABEL 129 /* rfc3473 */
+#define RSVP_OBJ_ACCEPT_LABEL_SET 130 /* rfc3473 */
+#define RSVP_OBJ_RESTART_CAPABILITY 131 /* rfc3473 */
+#define RSVP_OBJ_NOTIFY_REQ 195 /* rfc3473 */
+#define RSVP_OBJ_ADMIN_STATUS 196 /* rfc3473 */
+#define RSVP_OBJ_PROPERTIES 204 /* juniper proprietary */
+#define RSVP_OBJ_FASTREROUTE 205 /* draft-ietf-mpls-rsvp-lsp-fastreroute-07 */
+#define RSVP_OBJ_SESSION_ATTRIBUTE 207 /* rfc3209 */
+#define RSVP_OBJ_GENERALIZED_UNI 229 /* OIF RSVP extensions UNI 1.0 Signaling, Rel. 2 */
+#define RSVP_OBJ_CALL_ID 230 /* rfc3474 */
+#define RSVP_OBJ_CALL_OPS 236 /* rfc3474 */
+
+static const struct tok rsvp_obj_values[] = {
+ { RSVP_OBJ_SESSION, "Session" },
+ { RSVP_OBJ_RSVP_HOP, "RSVP Hop" },
+ { RSVP_OBJ_INTEGRITY, "Integrity" },
+ { RSVP_OBJ_TIME_VALUES, "Time Values" },
+ { RSVP_OBJ_ERROR_SPEC, "Error Spec" },
+ { RSVP_OBJ_SCOPE, "Scope" },
+ { RSVP_OBJ_STYLE, "Style" },
+ { RSVP_OBJ_FLOWSPEC, "Flowspec" },
+ { RSVP_OBJ_FILTERSPEC, "FilterSpec" },
+ { RSVP_OBJ_SENDER_TEMPLATE, "Sender Template" },
+ { RSVP_OBJ_SENDER_TSPEC, "Sender TSpec" },
+ { RSVP_OBJ_ADSPEC, "Adspec" },
+ { RSVP_OBJ_POLICY_DATA, "Policy Data" },
+ { RSVP_OBJ_CONFIRM, "Confirm" },
+ { RSVP_OBJ_LABEL, "Label" },
+ { RSVP_OBJ_LABEL_REQ, "Label Request" },
+ { RSVP_OBJ_ERO, "ERO" },
+ { RSVP_OBJ_RRO, "RRO" },
+ { RSVP_OBJ_HELLO, "Hello" },
+ { RSVP_OBJ_MESSAGE_ID, "Message ID" },
+ { RSVP_OBJ_MESSAGE_ID_ACK, "Message ID Ack" },
+ { RSVP_OBJ_MESSAGE_ID_LIST, "Message ID List" },
+ { RSVP_OBJ_RECOVERY_LABEL, "Recovery Label" },
+ { RSVP_OBJ_UPSTREAM_LABEL, "Upstream Label" },
+ { RSVP_OBJ_LABEL_SET, "Label Set" },
+ { RSVP_OBJ_ACCEPT_LABEL_SET, "Acceptable Label Set" },
+ { RSVP_OBJ_DETOUR, "Detour" },
+ { RSVP_OBJ_CLASSTYPE, "Class Type" },
+ { RSVP_OBJ_CLASSTYPE_OLD, "Class Type (old)" },
+ { RSVP_OBJ_SUGGESTED_LABEL, "Suggested Label" },
+ { RSVP_OBJ_PROPERTIES, "Properties" },
+ { RSVP_OBJ_FASTREROUTE, "Fast Re-Route" },
+ { RSVP_OBJ_SESSION_ATTRIBUTE, "Session Attribute" },
+ { RSVP_OBJ_GENERALIZED_UNI, "Generalized UNI" },
+ { RSVP_OBJ_CALL_ID, "Call-ID" },
+ { RSVP_OBJ_CALL_OPS, "Call Capability" },
+ { RSVP_OBJ_RESTART_CAPABILITY, "Restart Capability" },
+ { RSVP_OBJ_NOTIFY_REQ, "Notify Request" },
+ { RSVP_OBJ_PROTECTION, "Protection" },
+ { RSVP_OBJ_ADMIN_STATUS, "Administrative Status" },
+ { RSVP_OBJ_S2L, "Sub-LSP to LSP" },
+ { 0, NULL}
+};
+
+#define RSVP_CTYPE_IPV4 1
+#define RSVP_CTYPE_IPV6 2
+#define RSVP_CTYPE_TUNNEL_IPV4 7
+#define RSVP_CTYPE_TUNNEL_IPV6 8
+#define RSVP_CTYPE_UNI_IPV4 11 /* OIF RSVP extensions UNI 1.0 Signaling Rel. 2 */
+#define RSVP_CTYPE_1 1
+#define RSVP_CTYPE_2 2
+#define RSVP_CTYPE_3 3
+#define RSVP_CTYPE_4 4
+#define RSVP_CTYPE_12 12
+#define RSVP_CTYPE_13 13
+#define RSVP_CTYPE_14 14
+
+/*
+ * the ctypes are not globally unique so for
+ * translating it to strings we build a table based
+ * on objects offsetted by the ctype
+ */
+
+static const struct tok rsvp_ctype_values[] = {
+ { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV4, "IPv4" },
+ { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV6, "IPv6" },
+ { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_3, "IPv4 plus opt. TLVs" },
+ { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_4, "IPv6 plus opt. TLVs" },
+ { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV4, "IPv4" },
+ { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV6, "IPv6" },
+ { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV4, "IPv4" },
+ { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV6, "IPv6" },
+ { 256*RSVP_OBJ_TIME_VALUES+RSVP_CTYPE_1, "1" },
+ { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_1, "obsolete" },
+ { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_2, "IntServ" },
+ { 256*RSVP_OBJ_SENDER_TSPEC+RSVP_CTYPE_2, "IntServ" },
+ { 256*RSVP_OBJ_ADSPEC+RSVP_CTYPE_2, "IntServ" },
+ { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV4, "IPv4" },
+ { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV6, "IPv6" },
+ { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_3, "IPv6 Flow-label" },
+ { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
+ { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_12, "IPv4 P2MP LSP Tunnel" },
+ { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_13, "IPv6 P2MP LSP Tunnel" },
+ { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV4, "IPv4" },
+ { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV6, "IPv6" },
+ { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
+ { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_UNI_IPV4, "UNI IPv4" },
+ { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_13, "IPv4 P2MP LSP Tunnel" },
+ { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_14, "IPv6 P2MP LSP Tunnel" },
+ { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV4, "IPv4" },
+ { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV6, "IPv6" },
+ { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
+ { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_12, "IPv4 P2MP LSP Tunnel" },
+ { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_13, "IPv6 P2MP LSP Tunnel" },
+ { 256*RSVP_OBJ_MESSAGE_ID+RSVP_CTYPE_1, "1" },
+ { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_1, "Message id ack" },
+ { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_2, "Message id nack" },
+ { 256*RSVP_OBJ_MESSAGE_ID_LIST+RSVP_CTYPE_1, "1" },
+ { 256*RSVP_OBJ_STYLE+RSVP_CTYPE_1, "1" },
+ { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_1, "Hello Request" },
+ { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_2, "Hello Ack" },
+ { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_1, "without label range" },
+ { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_2, "with ATM label range" },
+ { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_3, "with FR label range" },
+ { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_4, "Generalized Label" },
+ { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_1, "Label" },
+ { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_2, "Generalized Label" },
+ { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_3, "Waveband Switching" },
+ { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_1, "Label" },
+ { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_2, "Generalized Label" },
+ { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_3, "Waveband Switching" },
+ { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_1, "Label" },
+ { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_2, "Generalized Label" },
+ { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_3, "Waveband Switching" },
+ { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_1, "Label" },
+ { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_2, "Generalized Label" },
+ { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_3, "Waveband Switching" },
+ { 256*RSVP_OBJ_ERO+RSVP_CTYPE_IPV4, "IPv4" },
+ { 256*RSVP_OBJ_RRO+RSVP_CTYPE_IPV4, "IPv4" },
+ { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV4, "IPv4" },
+ { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV6, "IPv6" },
+ { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_3, "IPv4 plus opt. TLVs" },
+ { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_4, "IPv6 plus opt. TLVs" },
+ { 256*RSVP_OBJ_RESTART_CAPABILITY+RSVP_CTYPE_1, "IPv4" },
+ { 256*RSVP_OBJ_SESSION_ATTRIBUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
+ { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, /* old style*/
+ { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_1, "1" }, /* new style */
+ { 256*RSVP_OBJ_DETOUR+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
+ { 256*RSVP_OBJ_PROPERTIES+RSVP_CTYPE_1, "1" },
+ { 256*RSVP_OBJ_ADMIN_STATUS+RSVP_CTYPE_1, "1" },
+ { 256*RSVP_OBJ_CLASSTYPE+RSVP_CTYPE_1, "1" },
+ { 256*RSVP_OBJ_CLASSTYPE_OLD+RSVP_CTYPE_1, "1" },
+ { 256*RSVP_OBJ_LABEL_SET+RSVP_CTYPE_1, "1" },
+ { 256*RSVP_OBJ_GENERALIZED_UNI+RSVP_CTYPE_1, "1" },
+ { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV4, "IPv4 sub-LSP" },
+ { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV6, "IPv6 sub-LSP" },
+ { 0, NULL}
+};
+
+struct rsvp_obj_integrity_t {
+ uint8_t flags;
+ uint8_t res;
+ uint8_t key_id[6];
+ uint8_t sequence[8];
+ uint8_t digest[16];
+};
+
+static const struct tok rsvp_obj_integrity_flag_values[] = {
+ { 0x80, "Handshake" },
+ { 0, NULL}
+};
+
+struct rsvp_obj_frr_t {
+ uint8_t setup_prio;
+ uint8_t hold_prio;
+ uint8_t hop_limit;
+ uint8_t flags;
+ uint8_t bandwidth[4];
+ uint8_t include_any[4];
+ uint8_t exclude_any[4];
+ uint8_t include_all[4];
+};
+
+
+#define RSVP_OBJ_XRO_MASK_SUBOBJ(x) ((x)&0x7f)
+#define RSVP_OBJ_XRO_MASK_LOOSE(x) ((x)&0x80)
+
+#define RSVP_OBJ_XRO_RES 0
+#define RSVP_OBJ_XRO_IPV4 1
+#define RSVP_OBJ_XRO_IPV6 2
+#define RSVP_OBJ_XRO_LABEL 3
+#define RSVP_OBJ_XRO_ASN 32
+#define RSVP_OBJ_XRO_MPLS 64
+
+static const struct tok rsvp_obj_xro_values[] = {
+ { RSVP_OBJ_XRO_RES, "Reserved" },
+ { RSVP_OBJ_XRO_IPV4, "IPv4 prefix" },
+ { RSVP_OBJ_XRO_IPV6, "IPv6 prefix" },
+ { RSVP_OBJ_XRO_LABEL, "Label" },
+ { RSVP_OBJ_XRO_ASN, "Autonomous system number" },
+ { RSVP_OBJ_XRO_MPLS, "MPLS label switched path termination" },
+ { 0, NULL}
+};
+
+/* draft-ietf-mpls-rsvp-lsp-fastreroute-07.txt */
+static const struct tok rsvp_obj_rro_flag_values[] = {
+ { 0x01, "Local protection available" },
+ { 0x02, "Local protection in use" },
+ { 0x04, "Bandwidth protection" },
+ { 0x08, "Node protection" },
+ { 0, NULL}
+};
+
+/* RFC3209 */
+static const struct tok rsvp_obj_rro_label_flag_values[] = {
+ { 0x01, "Global" },
+ { 0, NULL}
+};
+
+static const struct tok rsvp_resstyle_values[] = {
+ { 17, "Wildcard Filter" },
+ { 10, "Fixed Filter" },
+ { 18, "Shared Explicit" },
+ { 0, NULL}
+};
+
+#define RSVP_OBJ_INTSERV_GUARANTEED_SERV 2
+#define RSVP_OBJ_INTSERV_CONTROLLED_LOAD 5
+
+static const struct tok rsvp_intserv_service_type_values[] = {
+ { 1, "Default/Global Information" },
+ { RSVP_OBJ_INTSERV_GUARANTEED_SERV, "Guaranteed Service" },
+ { RSVP_OBJ_INTSERV_CONTROLLED_LOAD, "Controlled Load" },
+ { 0, NULL}
+};
+
+static const struct tok rsvp_intserv_parameter_id_values[] = {
+ { 4, "IS hop cnt" },
+ { 6, "Path b/w estimate" },
+ { 8, "Minimum path latency" },
+ { 10, "Composed MTU" },
+ { 127, "Token Bucket TSpec" },
+ { 130, "Guaranteed Service RSpec" },
+ { 133, "End-to-end composed value for C" },
+ { 134, "End-to-end composed value for D" },
+ { 135, "Since-last-reshaping point composed C" },
+ { 136, "Since-last-reshaping point composed D" },
+ { 0, NULL}
+};
+
+static const struct tok rsvp_session_attribute_flag_values[] = {
+ { 0x01, "Local Protection" },
+ { 0x02, "Label Recording" },
+ { 0x04, "SE Style" },
+ { 0x08, "Bandwidth protection" }, /* RFC4090 */
+ { 0x10, "Node protection" }, /* RFC4090 */
+ { 0, NULL}
+};
+
+static const struct tok rsvp_obj_prop_tlv_values[] = {
+ { 0x01, "Cos" },
+ { 0x02, "Metric 1" },
+ { 0x04, "Metric 2" },
+ { 0x08, "CCC Status" },
+ { 0x10, "Path Type" },
+ { 0, NULL}
+};
+
+#define RSVP_OBJ_ERROR_SPEC_CODE_ROUTING 24
+#define RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY 25
+#define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE 28
+#define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD 125
+
+static const struct tok rsvp_obj_error_code_values[] = {
+ { RSVP_OBJ_ERROR_SPEC_CODE_ROUTING, "Routing Problem" },
+ { RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY, "Notify Error" },
+ { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE, "Diffserv TE Error" },
+ { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD, "Diffserv TE Error (Old)" },
+ { 0, NULL}
+};
+
+static const struct tok rsvp_obj_error_code_routing_values[] = {
+ { 1, "Bad EXPLICIT_ROUTE object" },
+ { 2, "Bad strict node" },
+ { 3, "Bad loose node" },
+ { 4, "Bad initial subobject" },
+ { 5, "No route available toward destination" },
+ { 6, "Unacceptable label value" },
+ { 7, "RRO indicated routing loops" },
+ { 8, "non-RSVP-capable router in the path" },
+ { 9, "MPLS label allocation failure" },
+ { 10, "Unsupported L3PID" },
+ { 0, NULL}
+};
+
+static const struct tok rsvp_obj_error_code_diffserv_te_values[] = {
+ { 1, "Unexpected CT object" },
+ { 2, "Unsupported CT" },
+ { 3, "Invalid CT value" },
+ { 4, "CT/setup priority do not form a configured TE-Class" },
+ { 5, "CT/holding priority do not form a configured TE-Class" },
+ { 6, "CT/setup priority and CT/holding priority do not form a configured TE-Class" },
+ { 7, "Inconsistency between signaled PSC and signaled CT" },
+ { 8, "Inconsistency between signaled PHBs and signaled CT" },
+ { 0, NULL}
+};
+
+/* rfc3473 / rfc 3471 */
+static const struct tok rsvp_obj_admin_status_flag_values[] = {
+ { 0x80000000, "Reflect" },
+ { 0x00000004, "Testing" },
+ { 0x00000002, "Admin-down" },
+ { 0x00000001, "Delete-in-progress" },
+ { 0, NULL}
+};
+
+/* label set actions - rfc3471 */
+#define LABEL_SET_INCLUSIVE_LIST 0
+#define LABEL_SET_EXCLUSIVE_LIST 1
+#define LABEL_SET_INCLUSIVE_RANGE 2
+#define LABEL_SET_EXCLUSIVE_RANGE 3
+
+static const struct tok rsvp_obj_label_set_action_values[] = {
+ { LABEL_SET_INCLUSIVE_LIST, "Inclusive list" },
+ { LABEL_SET_EXCLUSIVE_LIST, "Exclusive list" },
+ { LABEL_SET_INCLUSIVE_RANGE, "Inclusive range" },
+ { LABEL_SET_EXCLUSIVE_RANGE, "Exclusive range" },
+ { 0, NULL}
+};
+
+/* OIF RSVP extensions UNI 1.0 Signaling, release 2 */
+#define RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS 1
+#define RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS 2
+#define RSVP_GEN_UNI_SUBOBJ_DIVERSITY 3
+#define RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL 4
+#define RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL 5
+
+static const struct tok rsvp_obj_generalized_uni_values[] = {
+ { RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS, "Source TNA address" },
+ { RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS, "Destination TNA address" },
+ { RSVP_GEN_UNI_SUBOBJ_DIVERSITY, "Diversity" },
+ { RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL, "Egress label" },
+ { RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL, "Service level" },
+ { 0, NULL}
+};
+
+/*
+ * this is a dissector for all the intserv defined
+ * specs as defined per rfc2215
+ * it is called from various rsvp objects;
+ * returns the amount of bytes being processed
+ */
+static int
+rsvp_intserv_print(netdissect_options *ndo,
+ const u_char *tptr, u_short obj_tlen)
+{
+ int parameter_id,parameter_length;
+ union {
+ float f;
+ uint32_t i;
+ } bw;
+
+ if (obj_tlen < 4)
+ return 0;
+ parameter_id = *(tptr);
+ parameter_length = EXTRACT_16BITS(tptr+2)<<2; /* convert wordcount to bytecount */
+
+ ND_PRINT((ndo, "\n\t Parameter ID: %s (%u), length: %u, Flags: [0x%02x]",
+ tok2str(rsvp_intserv_parameter_id_values,"unknown",parameter_id),
+ parameter_id,
+ parameter_length,
+ *(tptr + 1)));
+
+ if (obj_tlen < parameter_length+4)
+ return 0;
+ switch(parameter_id) { /* parameter_id */
+
+ case 4:
+ /*
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | 4 (e) | (f) | 1 (g) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IS hop cnt (32-bit unsigned integer) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+ if (parameter_length == 4)
+ ND_PRINT((ndo, "\n\t\tIS hop count: %u", EXTRACT_32BITS(tptr + 4)));
+ break;
+
+ case 6:
+ /*
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | 6 (h) | (i) | 1 (j) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Path b/w estimate (32-bit IEEE floating point number) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+ if (parameter_length == 4) {
+ bw.i = EXTRACT_32BITS(tptr+4);
+ ND_PRINT((ndo, "\n\t\tPath b/w estimate: %.10g Mbps", bw.f / 125000));
+ }
+ break;
+
+ case 8:
+ /*
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | 8 (k) | (l) | 1 (m) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Minimum path latency (32-bit integer) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+ if (parameter_length == 4) {
+ ND_PRINT((ndo, "\n\t\tMinimum path latency: "));
+ if (EXTRACT_32BITS(tptr+4) == 0xffffffff)
+ ND_PRINT((ndo, "don't care"));
+ else
+ ND_PRINT((ndo, "%u", EXTRACT_32BITS(tptr + 4)));
+ }
+ break;
+
+ case 10:
+
+ /*
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | 10 (n) | (o) | 1 (p) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Composed MTU (32-bit unsigned integer) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+ if (parameter_length == 4)
+ ND_PRINT((ndo, "\n\t\tComposed MTU: %u bytes", EXTRACT_32BITS(tptr + 4)));
+ break;
+ case 127:
+ /*
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | 127 (e) | 0 (f) | 5 (g) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Token Bucket Rate [r] (32-bit IEEE floating point number) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Token Bucket Size [b] (32-bit IEEE floating point number) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Peak Data Rate [p] (32-bit IEEE floating point number) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Minimum Policed Unit [m] (32-bit integer) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Maximum Packet Size [M] (32-bit integer) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+ if (parameter_length == 20) {
+ bw.i = EXTRACT_32BITS(tptr+4);
+ ND_PRINT((ndo, "\n\t\tToken Bucket Rate: %.10g Mbps", bw.f / 125000));
+ bw.i = EXTRACT_32BITS(tptr+8);
+ ND_PRINT((ndo, "\n\t\tToken Bucket Size: %.10g bytes", bw.f));
+ bw.i = EXTRACT_32BITS(tptr+12);
+ ND_PRINT((ndo, "\n\t\tPeak Data Rate: %.10g Mbps", bw.f / 125000));
+ ND_PRINT((ndo, "\n\t\tMinimum Policed Unit: %u bytes", EXTRACT_32BITS(tptr + 16)));
+ ND_PRINT((ndo, "\n\t\tMaximum Packet Size: %u bytes", EXTRACT_32BITS(tptr + 20)));
+ }
+ break;
+
+ case 130:
+ /*
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | 130 (h) | 0 (i) | 2 (j) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Rate [R] (32-bit IEEE floating point number) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Slack Term [S] (32-bit integer) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+ if (parameter_length == 8) {
+ bw.i = EXTRACT_32BITS(tptr+4);
+ ND_PRINT((ndo, "\n\t\tRate: %.10g Mbps", bw.f / 125000));
+ ND_PRINT((ndo, "\n\t\tSlack Term: %u", EXTRACT_32BITS(tptr + 8)));
+ }
+ break;
+
+ case 133:
+ case 134:
+ case 135:
+ case 136:
+ if (parameter_length == 4)
+ ND_PRINT((ndo, "\n\t\tValue: %u", EXTRACT_32BITS(tptr + 4)));
+ break;
+
+ default:
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, tptr + 4, "\n\t\t", parameter_length);
+ }
+ return (parameter_length+4); /* header length 4 bytes */
+}
+
+static int
+rsvp_obj_print(netdissect_options *ndo,
+ const u_char *pptr
+#ifndef HAVE_LIBCRYPTO
+_U_
+#endif
+, u_int plen
+#ifndef HAVE_LIBCRYPTO
+_U_
+#endif
+, const u_char *tptr,
+ const char *ident, u_int tlen)
+{
+ const struct rsvp_object_header *rsvp_obj_header;
+ const u_char *obj_tptr;
+ union {
+ const struct rsvp_obj_integrity_t *rsvp_obj_integrity;
+ const struct rsvp_obj_frr_t *rsvp_obj_frr;
+ } obj_ptr;
+
+ u_short rsvp_obj_len,rsvp_obj_ctype,obj_tlen,intserv_serv_tlen;
+ int hexdump,processed,padbytes,error_code,error_value,i,sigcheck;
+ union {
+ float f;
+ uint32_t i;
+ } bw;
+ uint8_t namelen;
+
+ u_int action, subchannel;
+
+ while(tlen>=sizeof(struct rsvp_object_header)) {
+ /* did we capture enough for fully decoding the object header ? */
+ ND_TCHECK2(*tptr, sizeof(struct rsvp_object_header));
+
+ rsvp_obj_header = (const struct rsvp_object_header *)tptr;
+ rsvp_obj_len=EXTRACT_16BITS(rsvp_obj_header->length);
+ rsvp_obj_ctype=rsvp_obj_header->ctype;
+
+ if(rsvp_obj_len % 4) {
+ ND_PRINT((ndo, "%sERROR: object header size %u not a multiple of 4", ident, rsvp_obj_len));
+ return -1;
+ }
+ if(rsvp_obj_len < sizeof(struct rsvp_object_header)) {
+ ND_PRINT((ndo, "%sERROR: object header too short %u < %lu", ident, rsvp_obj_len,
+ (unsigned long)sizeof(const struct rsvp_object_header)));
+ return -1;
+ }
+
+ ND_PRINT((ndo, "%s%s Object (%u) Flags: [%s",
+ ident,
+ tok2str(rsvp_obj_values,
+ "Unknown",
+ rsvp_obj_header->class_num),
+ rsvp_obj_header->class_num,
+ ((rsvp_obj_header->class_num) & 0x80) ? "ignore" : "reject"));
+
+ if (rsvp_obj_header->class_num > 128)
+ ND_PRINT((ndo, " %s",
+ ((rsvp_obj_header->class_num) & 0x40) ? "and forward" : "silently"));
+
+ ND_PRINT((ndo, " if unknown], Class-Type: %s (%u), length: %u",
+ tok2str(rsvp_ctype_values,
+ "Unknown",
+ ((rsvp_obj_header->class_num)<<8)+rsvp_obj_ctype),
+ rsvp_obj_ctype,
+ rsvp_obj_len));
+
+ if(tlen < rsvp_obj_len) {
+ ND_PRINT((ndo, "%sERROR: object goes past end of objects TLV", ident));
+ return -1;
+ }
+
+ obj_tptr=tptr+sizeof(struct rsvp_object_header);
+ obj_tlen=rsvp_obj_len-sizeof(struct rsvp_object_header);
+
+ /* did we capture enough for fully decoding the object ? */
+ if (!ND_TTEST2(*tptr, rsvp_obj_len))
+ return -1;
+ hexdump=FALSE;
+
+ switch(rsvp_obj_header->class_num) {
+ case RSVP_OBJ_SESSION:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_IPV4:
+ if (obj_tlen < 8)
+ return -1;
+ ND_PRINT((ndo, "%s IPv4 DestAddress: %s, Protocol ID: 0x%02x",
+ ident,
+ ipaddr_string(ndo, obj_tptr),
+ *(obj_tptr + sizeof(struct in_addr))));
+ ND_PRINT((ndo, "%s Flags: [0x%02x], DestPort %u",
+ ident,
+ *(obj_tptr+5),
+ EXTRACT_16BITS(obj_tptr + 6)));
+ obj_tlen-=8;
+ obj_tptr+=8;
+ break;
+#ifdef INET6
+ case RSVP_CTYPE_IPV6:
+ if (obj_tlen < 20)
+ return -1;
+ ND_PRINT((ndo, "%s IPv6 DestAddress: %s, Protocol ID: 0x%02x",
+ ident,
+ ip6addr_string(ndo, obj_tptr),
+ *(obj_tptr + sizeof(struct in6_addr))));
+ ND_PRINT((ndo, "%s Flags: [0x%02x], DestPort %u",
+ ident,
+ *(obj_tptr+sizeof(struct in6_addr)+1),
+ EXTRACT_16BITS(obj_tptr + sizeof(struct in6_addr) + 2)));
+ obj_tlen-=20;
+ obj_tptr+=20;
+ break;
+
+ case RSVP_CTYPE_TUNNEL_IPV6:
+ if (obj_tlen < 36)
+ return -1;
+ ND_PRINT((ndo, "%s IPv6 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
+ ident,
+ ip6addr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr+18),
+ ip6addr_string(ndo, obj_tptr + 20)));
+ obj_tlen-=36;
+ obj_tptr+=36;
+ break;
+
+ case RSVP_CTYPE_14: /* IPv6 p2mp LSP Tunnel */
+ if (obj_tlen < 26)
+ return -1;
+ ND_PRINT((ndo, "%s IPv6 P2MP LSP ID: 0x%08x, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
+ ident,
+ EXTRACT_32BITS(obj_tptr),
+ EXTRACT_16BITS(obj_tptr+6),
+ ip6addr_string(ndo, obj_tptr + 8)));
+ obj_tlen-=26;
+ obj_tptr+=26;
+ break;
+#endif
+ case RSVP_CTYPE_13: /* IPv4 p2mp LSP Tunnel */
+ if (obj_tlen < 12)
+ return -1;
+ ND_PRINT((ndo, "%s IPv4 P2MP LSP ID: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
+ ident,
+ ipaddr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr+6),
+ ipaddr_string(ndo, obj_tptr + 8)));
+ obj_tlen-=12;
+ obj_tptr+=12;
+ break;
+ case RSVP_CTYPE_TUNNEL_IPV4:
+ case RSVP_CTYPE_UNI_IPV4:
+ if (obj_tlen < 12)
+ return -1;
+ ND_PRINT((ndo, "%s IPv4 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
+ ident,
+ ipaddr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr+6),
+ ipaddr_string(ndo, obj_tptr + 8)));
+ obj_tlen-=12;
+ obj_tptr+=12;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_CONFIRM:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_IPV4:
+ if (obj_tlen < sizeof(struct in_addr))
+ return -1;
+ ND_PRINT((ndo, "%s IPv4 Receiver Address: %s",
+ ident,
+ ipaddr_string(ndo, obj_tptr)));
+ obj_tlen-=sizeof(struct in_addr);
+ obj_tptr+=sizeof(struct in_addr);
+ break;
+#ifdef INET6
+ case RSVP_CTYPE_IPV6:
+ if (obj_tlen < sizeof(struct in6_addr))
+ return -1;
+ ND_PRINT((ndo, "%s IPv6 Receiver Address: %s",
+ ident,
+ ip6addr_string(ndo, obj_tptr)));
+ obj_tlen-=sizeof(struct in6_addr);
+ obj_tptr+=sizeof(struct in6_addr);
+ break;
+#endif
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_NOTIFY_REQ:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_IPV4:
+ if (obj_tlen < sizeof(struct in_addr))
+ return -1;
+ ND_PRINT((ndo, "%s IPv4 Notify Node Address: %s",
+ ident,
+ ipaddr_string(ndo, obj_tptr)));
+ obj_tlen-=sizeof(struct in_addr);
+ obj_tptr+=sizeof(struct in_addr);
+ break;
+#ifdef INET6
+ case RSVP_CTYPE_IPV6:
+ if (obj_tlen < sizeof(struct in6_addr))
+ return-1;
+ ND_PRINT((ndo, "%s IPv6 Notify Node Address: %s",
+ ident,
+ ip6addr_string(ndo, obj_tptr)));
+ obj_tlen-=sizeof(struct in6_addr);
+ obj_tptr+=sizeof(struct in6_addr);
+ break;
+#endif
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_SUGGESTED_LABEL: /* fall through */
+ case RSVP_OBJ_UPSTREAM_LABEL: /* fall through */
+ case RSVP_OBJ_RECOVERY_LABEL: /* fall through */
+ case RSVP_OBJ_LABEL:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ while(obj_tlen >= 4 ) {
+ ND_PRINT((ndo, "%s Label: %u", ident, EXTRACT_32BITS(obj_tptr)));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ }
+ break;
+ case RSVP_CTYPE_2:
+ if (obj_tlen < 4)
+ return-1;
+ ND_PRINT((ndo, "%s Generalized Label: %u",
+ ident,
+ EXTRACT_32BITS(obj_tptr)));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ break;
+ case RSVP_CTYPE_3:
+ if (obj_tlen < 12)
+ return-1;
+ ND_PRINT((ndo, "%s Waveband ID: %u%s Start Label: %u, Stop Label: %u",
+ ident,
+ EXTRACT_32BITS(obj_tptr),
+ ident,
+ EXTRACT_32BITS(obj_tptr+4),
+ EXTRACT_32BITS(obj_tptr + 8)));
+ obj_tlen-=12;
+ obj_tptr+=12;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_STYLE:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ if (obj_tlen < 4)
+ return-1;
+ ND_PRINT((ndo, "%s Reservation Style: %s, Flags: [0x%02x]",
+ ident,
+ tok2str(rsvp_resstyle_values,
+ "Unknown",
+ EXTRACT_24BITS(obj_tptr+1)),
+ *(obj_tptr)));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_SENDER_TEMPLATE:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_IPV4:
+ if (obj_tlen < 8)
+ return-1;
+ ND_PRINT((ndo, "%s Source Address: %s, Source Port: %u",
+ ident,
+ ipaddr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr + 6)));
+ obj_tlen-=8;
+ obj_tptr+=8;
+ break;
+#ifdef INET6
+ case RSVP_CTYPE_IPV6:
+ if (obj_tlen < 20)
+ return-1;
+ ND_PRINT((ndo, "%s Source Address: %s, Source Port: %u",
+ ident,
+ ip6addr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr + 18)));
+ obj_tlen-=20;
+ obj_tptr+=20;
+ break;
+ case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */
+ if (obj_tlen < 40)
+ return-1;
+ ND_PRINT((ndo, "%s IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x"
+ "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
+ ident,
+ ip6addr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr+18),
+ ident,
+ ip6addr_string(ndo, obj_tptr+20),
+ EXTRACT_16BITS(obj_tptr + 38)));
+ obj_tlen-=40;
+ obj_tptr+=40;
+ break;
+#endif
+ case RSVP_CTYPE_TUNNEL_IPV4:
+ if (obj_tlen < 8)
+ return-1;
+ ND_PRINT((ndo, "%s IPv4 Tunnel Sender Address: %s, LSP-ID: 0x%04x",
+ ident,
+ ipaddr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr + 6)));
+ obj_tlen-=8;
+ obj_tptr+=8;
+ break;
+ case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */
+ if (obj_tlen < 16)
+ return-1;
+ ND_PRINT((ndo, "%s IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x"
+ "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
+ ident,
+ ipaddr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr+6),
+ ident,
+ ipaddr_string(ndo, obj_tptr+8),
+ EXTRACT_16BITS(obj_tptr + 12)));
+ obj_tlen-=16;
+ obj_tptr+=16;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_LABEL_REQ:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ while(obj_tlen >= 4 ) {
+ ND_PRINT((ndo, "%s L3 Protocol ID: %s",
+ ident,
+ tok2str(ethertype_values,
+ "Unknown Protocol (0x%04x)",
+ EXTRACT_16BITS(obj_tptr + 2))));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ }
+ break;
+ case RSVP_CTYPE_2:
+ if (obj_tlen < 12)
+ return-1;
+ ND_PRINT((ndo, "%s L3 Protocol ID: %s",
+ ident,
+ tok2str(ethertype_values,
+ "Unknown Protocol (0x%04x)",
+ EXTRACT_16BITS(obj_tptr + 2))));
+ ND_PRINT((ndo, ",%s merge capability",((*(obj_tptr + 4)) & 0x80) ? "no" : "" ));
+ ND_PRINT((ndo, "%s Minimum VPI/VCI: %u/%u",
+ ident,
+ (EXTRACT_16BITS(obj_tptr+4))&0xfff,
+ (EXTRACT_16BITS(obj_tptr + 6)) & 0xfff));
+ ND_PRINT((ndo, "%s Maximum VPI/VCI: %u/%u",
+ ident,
+ (EXTRACT_16BITS(obj_tptr+8))&0xfff,
+ (EXTRACT_16BITS(obj_tptr + 10)) & 0xfff));
+ obj_tlen-=12;
+ obj_tptr+=12;
+ break;
+ case RSVP_CTYPE_3:
+ if (obj_tlen < 12)
+ return-1;
+ ND_PRINT((ndo, "%s L3 Protocol ID: %s",
+ ident,
+ tok2str(ethertype_values,
+ "Unknown Protocol (0x%04x)",
+ EXTRACT_16BITS(obj_tptr + 2))));
+ ND_PRINT((ndo, "%s Minimum/Maximum DLCI: %u/%u, %s%s bit DLCI",
+ ident,
+ (EXTRACT_32BITS(obj_tptr+4))&0x7fffff,
+ (EXTRACT_32BITS(obj_tptr+8))&0x7fffff,
+ (((EXTRACT_16BITS(obj_tptr+4)>>7)&3) == 0 ) ? "10" : "",
+ (((EXTRACT_16BITS(obj_tptr + 4) >> 7) & 3) == 2 ) ? "23" : ""));
+ obj_tlen-=12;
+ obj_tptr+=12;
+ break;
+ case RSVP_CTYPE_4:
+ if (obj_tlen < 4)
+ return-1;
+ ND_PRINT((ndo, "%s LSP Encoding Type: %s (%u)",
+ ident,
+ tok2str(gmpls_encoding_values,
+ "Unknown",
+ *obj_tptr),
+ *obj_tptr));
+ ND_PRINT((ndo, "%s Switching Type: %s (%u), Payload ID: %s (0x%04x)",
+ ident,
+ tok2str(gmpls_switch_cap_values,
+ "Unknown",
+ *(obj_tptr+1)),
+ *(obj_tptr+1),
+ tok2str(gmpls_payload_values,
+ "Unknown",
+ EXTRACT_16BITS(obj_tptr+2)),
+ EXTRACT_16BITS(obj_tptr + 2)));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_RRO:
+ case RSVP_OBJ_ERO:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_IPV4:
+ while(obj_tlen >= 4 ) {
+ ND_PRINT((ndo, "%s Subobject Type: %s, length %u",
+ ident,
+ tok2str(rsvp_obj_xro_values,
+ "Unknown %u",
+ RSVP_OBJ_XRO_MASK_SUBOBJ(*obj_tptr)),
+ *(obj_tptr + 1)));
+
+ if (*(obj_tptr+1) == 0) { /* prevent infinite loops */
+ ND_PRINT((ndo, "%s ERROR: zero length ERO subtype", ident));
+ break;
+ }
+
+ switch(RSVP_OBJ_XRO_MASK_SUBOBJ(*obj_tptr)) {
+ case RSVP_OBJ_XRO_IPV4:
+ ND_PRINT((ndo, ", %s, %s/%u, Flags: [%s]",
+ RSVP_OBJ_XRO_MASK_LOOSE(*obj_tptr) ? "Loose" : "Strict",
+ ipaddr_string(ndo, obj_tptr+2),
+ *(obj_tptr+6),
+ bittok2str(rsvp_obj_rro_flag_values,
+ "none",
+ *(obj_tptr + 7)))); /* rfc3209 says that this field is rsvd. */
+ break;
+ case RSVP_OBJ_XRO_LABEL:
+ ND_PRINT((ndo, ", Flags: [%s] (%#x), Class-Type: %s (%u), %u",
+ bittok2str(rsvp_obj_rro_label_flag_values,
+ "none",
+ *(obj_tptr+2)),
+ *(obj_tptr+2),
+ tok2str(rsvp_ctype_values,
+ "Unknown",
+ *(obj_tptr+3) + 256*RSVP_OBJ_RRO),
+ *(obj_tptr+3),
+ EXTRACT_32BITS(obj_tptr + 4)));
+ }
+ obj_tlen-=*(obj_tptr+1);
+ obj_tptr+=*(obj_tptr+1);
+ }
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_HELLO:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ case RSVP_CTYPE_2:
+ if (obj_tlen < 8)
+ return-1;
+ ND_PRINT((ndo, "%s Source Instance: 0x%08x, Destination Instance: 0x%08x",
+ ident,
+ EXTRACT_32BITS(obj_tptr),
+ EXTRACT_32BITS(obj_tptr + 4)));
+ obj_tlen-=8;
+ obj_tptr+=8;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_RESTART_CAPABILITY:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ if (obj_tlen < 8)
+ return-1;
+ ND_PRINT((ndo, "%s Restart Time: %ums, Recovery Time: %ums",
+ ident,
+ EXTRACT_32BITS(obj_tptr),
+ EXTRACT_32BITS(obj_tptr + 4)));
+ obj_tlen-=8;
+ obj_tptr+=8;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_SESSION_ATTRIBUTE:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_TUNNEL_IPV4:
+ if (obj_tlen < 4)
+ return-1;
+ namelen = *(obj_tptr+3);
+ if (obj_tlen < 4+namelen)
+ return-1;
+ ND_PRINT((ndo, "%s Session Name: ", ident));
+ for (i = 0; i < namelen; i++)
+ safeputchar(ndo, *(obj_tptr + 4 + i));
+ ND_PRINT((ndo, "%s Setup Priority: %u, Holding Priority: %u, Flags: [%s] (%#x)",
+ ident,
+ (int)*obj_tptr,
+ (int)*(obj_tptr+1),
+ bittok2str(rsvp_session_attribute_flag_values,
+ "none",
+ *(obj_tptr+2)),
+ *(obj_tptr + 2)));
+ obj_tlen-=4+*(obj_tptr+3);
+ obj_tptr+=4+*(obj_tptr+3);
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_GENERALIZED_UNI:
+ switch(rsvp_obj_ctype) {
+ int subobj_type,af,subobj_len,total_subobj_len;
+
+ case RSVP_CTYPE_1:
+
+ if (obj_tlen < 4)
+ return-1;
+
+ /* read variable length subobjects */
+ total_subobj_len = obj_tlen;
+ while(total_subobj_len > 0) {
+ subobj_len = EXTRACT_16BITS(obj_tptr);
+ subobj_type = (EXTRACT_16BITS(obj_tptr+2))>>8;
+ af = (EXTRACT_16BITS(obj_tptr+2))&0x00FF;
+
+ ND_PRINT((ndo, "%s Subobject Type: %s (%u), AF: %s (%u), length: %u",
+ ident,
+ tok2str(rsvp_obj_generalized_uni_values, "Unknown", subobj_type),
+ subobj_type,
+ tok2str(af_values, "Unknown", af), af,
+ subobj_len));
+
+ switch(subobj_type) {
+ case RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS:
+ case RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS:
+
+ switch(af) {
+ case AFNUM_INET:
+ if (subobj_len < 8)
+ return -1;
+ ND_PRINT((ndo, "%s UNI IPv4 TNA address: %s",
+ ident, ipaddr_string(ndo, obj_tptr + 4)));
+ break;
+#ifdef INET6
+ case AFNUM_INET6:
+ if (subobj_len < 20)
+ return -1;
+ ND_PRINT((ndo, "%s UNI IPv6 TNA address: %s",
+ ident, ip6addr_string(ndo, obj_tptr + 4)));
+ break;
+#endif
+ case AFNUM_NSAP:
+ if (subobj_len) {
+ /* unless we have a TLV parser lets just hexdump */
+ hexdump=TRUE;
+ }
+ break;
+ }
+ break;
+
+ case RSVP_GEN_UNI_SUBOBJ_DIVERSITY:
+ if (subobj_len) {
+ /* unless we have a TLV parser lets just hexdump */
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL:
+ if (subobj_len < 16) {
+ return -1;
+ }
+
+ ND_PRINT((ndo, "%s U-bit: %x, Label type: %u, Logical port id: %u, Label: %u",
+ ident,
+ ((EXTRACT_32BITS(obj_tptr+4))>>31),
+ ((EXTRACT_32BITS(obj_tptr+4))&0xFF),
+ EXTRACT_32BITS(obj_tptr+8),
+ EXTRACT_32BITS(obj_tptr + 12)));
+ break;
+
+ case RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL:
+ if (subobj_len < 8) {
+ return -1;
+ }
+
+ ND_PRINT((ndo, "%s Service level: %u",
+ ident, (EXTRACT_32BITS(obj_tptr + 4)) >> 24));
+ break;
+
+ default:
+ hexdump=TRUE;
+ break;
+ }
+ total_subobj_len-=subobj_len;
+ obj_tptr+=subobj_len;
+ obj_tlen+=subobj_len;
+ }
+
+ if (total_subobj_len) {
+ /* unless we have a TLV parser lets just hexdump */
+ hexdump=TRUE;
+ }
+ break;
+
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_RSVP_HOP:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */
+ case RSVP_CTYPE_IPV4:
+ if (obj_tlen < 8)
+ return-1;
+ ND_PRINT((ndo, "%s Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
+ ident,
+ ipaddr_string(ndo, obj_tptr),
+ EXTRACT_32BITS(obj_tptr + 4)));
+ obj_tlen-=8;
+ obj_tptr+=8;
+ if (obj_tlen)
+ hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */
+ break;
+#ifdef INET6
+ case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */
+ case RSVP_CTYPE_IPV6:
+ if (obj_tlen < 20)
+ return-1;
+ ND_PRINT((ndo, "%s Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
+ ident,
+ ip6addr_string(ndo, obj_tptr),
+ EXTRACT_32BITS(obj_tptr + 16)));
+ obj_tlen-=20;
+ obj_tptr+=20;
+ hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */
+ break;
+#endif
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_TIME_VALUES:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ if (obj_tlen < 4)
+ return-1;
+ ND_PRINT((ndo, "%s Refresh Period: %ums",
+ ident,
+ EXTRACT_32BITS(obj_tptr)));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ /* those three objects do share the same semantics */
+ case RSVP_OBJ_SENDER_TSPEC:
+ case RSVP_OBJ_ADSPEC:
+ case RSVP_OBJ_FLOWSPEC:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_2:
+ if (obj_tlen < 4)
+ return-1;
+ ND_PRINT((ndo, "%s Msg-Version: %u, length: %u",
+ ident,
+ (*obj_tptr & 0xf0) >> 4,
+ EXTRACT_16BITS(obj_tptr + 2) << 2));
+ obj_tptr+=4; /* get to the start of the service header */
+ obj_tlen-=4;
+
+ while (obj_tlen >= 4) {
+ intserv_serv_tlen=EXTRACT_16BITS(obj_tptr+2)<<2;
+ ND_PRINT((ndo, "%s Service Type: %s (%u), break bit %s set, Service length: %u",
+ ident,
+ tok2str(rsvp_intserv_service_type_values,"unknown",*(obj_tptr)),
+ *(obj_tptr),
+ (*(obj_tptr+1)&0x80) ? "" : "not",
+ intserv_serv_tlen));
+
+ obj_tptr+=4; /* get to the start of the parameter list */
+ obj_tlen-=4;
+
+ while (intserv_serv_tlen>=4) {
+ processed = rsvp_intserv_print(ndo, obj_tptr, obj_tlen);
+ if (processed == 0)
+ break;
+ obj_tlen-=processed;
+ intserv_serv_tlen-=processed;
+ obj_tptr+=processed;
+ }
+ }
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_FILTERSPEC:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_IPV4:
+ if (obj_tlen < 8)
+ return-1;
+ ND_PRINT((ndo, "%s Source Address: %s, Source Port: %u",
+ ident,
+ ipaddr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr + 6)));
+ obj_tlen-=8;
+ obj_tptr+=8;
+ break;
+#ifdef INET6
+ case RSVP_CTYPE_IPV6:
+ if (obj_tlen < 20)
+ return-1;
+ ND_PRINT((ndo, "%s Source Address: %s, Source Port: %u",
+ ident,
+ ip6addr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr + 18)));
+ obj_tlen-=20;
+ obj_tptr+=20;
+ break;
+ case RSVP_CTYPE_3:
+ if (obj_tlen < 20)
+ return-1;
+ ND_PRINT((ndo, "%s Source Address: %s, Flow Label: %u",
+ ident,
+ ip6addr_string(ndo, obj_tptr),
+ EXTRACT_24BITS(obj_tptr + 17)));
+ obj_tlen-=20;
+ obj_tptr+=20;
+ break;
+ case RSVP_CTYPE_TUNNEL_IPV6:
+ if (obj_tlen < 20)
+ return-1;
+ ND_PRINT((ndo, "%s Source Address: %s, LSP-ID: 0x%04x",
+ ident,
+ ipaddr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr + 18)));
+ obj_tlen-=20;
+ obj_tptr+=20;
+ break;
+ case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */
+ if (obj_tlen < 40)
+ return-1;
+ ND_PRINT((ndo, "%s IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x"
+ "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
+ ident,
+ ip6addr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr+18),
+ ident,
+ ip6addr_string(ndo, obj_tptr+20),
+ EXTRACT_16BITS(obj_tptr + 38)));
+ obj_tlen-=40;
+ obj_tptr+=40;
+ break;
+#endif
+ case RSVP_CTYPE_TUNNEL_IPV4:
+ if (obj_tlen < 8)
+ return-1;
+ ND_PRINT((ndo, "%s Source Address: %s, LSP-ID: 0x%04x",
+ ident,
+ ipaddr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr + 6)));
+ obj_tlen-=8;
+ obj_tptr+=8;
+ break;
+ case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */
+ if (obj_tlen < 16)
+ return-1;
+ ND_PRINT((ndo, "%s IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x"
+ "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
+ ident,
+ ipaddr_string(ndo, obj_tptr),
+ EXTRACT_16BITS(obj_tptr+6),
+ ident,
+ ipaddr_string(ndo, obj_tptr+8),
+ EXTRACT_16BITS(obj_tptr + 12)));
+ obj_tlen-=16;
+ obj_tptr+=16;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_FASTREROUTE:
+ /* the differences between c-type 1 and 7 are minor */
+ obj_ptr.rsvp_obj_frr = (const struct rsvp_obj_frr_t *)obj_tptr;
+ bw.i = EXTRACT_32BITS(obj_ptr.rsvp_obj_frr->bandwidth);
+
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1: /* new style */
+ if (obj_tlen < sizeof(struct rsvp_obj_frr_t))
+ return-1;
+ ND_PRINT((ndo, "%s Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
+ ident,
+ (int)obj_ptr.rsvp_obj_frr->setup_prio,
+ (int)obj_ptr.rsvp_obj_frr->hold_prio,
+ (int)obj_ptr.rsvp_obj_frr->hop_limit,
+ bw.f * 8 / 1000000));
+ ND_PRINT((ndo, "%s Include-any: 0x%08x, Exclude-any: 0x%08x, Include-all: 0x%08x",
+ ident,
+ EXTRACT_32BITS(obj_ptr.rsvp_obj_frr->include_any),
+ EXTRACT_32BITS(obj_ptr.rsvp_obj_frr->exclude_any),
+ EXTRACT_32BITS(obj_ptr.rsvp_obj_frr->include_all)));
+ obj_tlen-=sizeof(struct rsvp_obj_frr_t);
+ obj_tptr+=sizeof(struct rsvp_obj_frr_t);
+ break;
+
+ case RSVP_CTYPE_TUNNEL_IPV4: /* old style */
+ if (obj_tlen < 16)
+ return-1;
+ ND_PRINT((ndo, "%s Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
+ ident,
+ (int)obj_ptr.rsvp_obj_frr->setup_prio,
+ (int)obj_ptr.rsvp_obj_frr->hold_prio,
+ (int)obj_ptr.rsvp_obj_frr->hop_limit,
+ bw.f * 8 / 1000000));
+ ND_PRINT((ndo, "%s Include Colors: 0x%08x, Exclude Colors: 0x%08x",
+ ident,
+ EXTRACT_32BITS(obj_ptr.rsvp_obj_frr->include_any),
+ EXTRACT_32BITS(obj_ptr.rsvp_obj_frr->exclude_any)));
+ obj_tlen-=16;
+ obj_tptr+=16;
+ break;
+
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_DETOUR:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_TUNNEL_IPV4:
+ while(obj_tlen >= 8) {
+ ND_PRINT((ndo, "%s PLR-ID: %s, Avoid-Node-ID: %s",
+ ident,
+ ipaddr_string(ndo, obj_tptr),
+ ipaddr_string(ndo, obj_tptr + 4)));
+ obj_tlen-=8;
+ obj_tptr+=8;
+ }
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_CLASSTYPE:
+ case RSVP_OBJ_CLASSTYPE_OLD: /* fall through */
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ ND_PRINT((ndo, "%s CT: %u",
+ ident,
+ EXTRACT_32BITS(obj_tptr) & 0x7));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_ERROR_SPEC:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */
+ case RSVP_CTYPE_IPV4:
+ if (obj_tlen < 8)
+ return-1;
+ error_code=*(obj_tptr+5);
+ error_value=EXTRACT_16BITS(obj_tptr+6);
+ ND_PRINT((ndo, "%s Error Node Address: %s, Flags: [0x%02x]%s Error Code: %s (%u)",
+ ident,
+ ipaddr_string(ndo, obj_tptr),
+ *(obj_tptr+4),
+ ident,
+ tok2str(rsvp_obj_error_code_values,"unknown",error_code),
+ error_code));
+ switch (error_code) {
+ case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
+ ND_PRINT((ndo, ", Error Value: %s (%u)",
+ tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
+ error_value));
+ break;
+ case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE: /* fall through */
+ case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD:
+ ND_PRINT((ndo, ", Error Value: %s (%u)",
+ tok2str(rsvp_obj_error_code_diffserv_te_values,"unknown",error_value),
+ error_value));
+ break;
+ default:
+ ND_PRINT((ndo, ", Unknown Error Value (%u)", error_value));
+ break;
+ }
+ obj_tlen-=8;
+ obj_tptr+=8;
+ break;
+#ifdef INET6
+ case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */
+ case RSVP_CTYPE_IPV6:
+ if (obj_tlen < 20)
+ return-1;
+ error_code=*(obj_tptr+17);
+ error_value=EXTRACT_16BITS(obj_tptr+18);
+ ND_PRINT((ndo, "%s Error Node Address: %s, Flags: [0x%02x]%s Error Code: %s (%u)",
+ ident,
+ ip6addr_string(ndo, obj_tptr),
+ *(obj_tptr+16),
+ ident,
+ tok2str(rsvp_obj_error_code_values,"unknown",error_code),
+ error_code));
+
+ switch (error_code) {
+ case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
+ ND_PRINT((ndo, ", Error Value: %s (%u)",
+ tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
+ error_value));
+ break;
+ default:
+ break;
+ }
+ obj_tlen-=20;
+ obj_tptr+=20;
+ break;
+#endif
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_PROPERTIES:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ if (obj_tlen < 4)
+ return-1;
+ padbytes = EXTRACT_16BITS(obj_tptr+2);
+ ND_PRINT((ndo, "%s TLV count: %u, padding bytes: %u",
+ ident,
+ EXTRACT_16BITS(obj_tptr),
+ padbytes));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ /* loop through as long there is anything longer than the TLV header (2) */
+ while(obj_tlen >= 2 + padbytes) {
+ ND_PRINT((ndo, "%s %s TLV (0x%02x), length: %u", /* length includes header */
+ ident,
+ tok2str(rsvp_obj_prop_tlv_values,"unknown",*obj_tptr),
+ *obj_tptr,
+ *(obj_tptr + 1)));
+ if (obj_tlen < *(obj_tptr+1))
+ return-1;
+ if (*(obj_tptr+1) < 2)
+ return -1;
+ print_unknown_data(ndo, obj_tptr + 2, "\n\t\t", *(obj_tptr + 1) - 2);
+ obj_tlen-=*(obj_tptr+1);
+ obj_tptr+=*(obj_tptr+1);
+ }
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_MESSAGE_ID: /* fall through */
+ case RSVP_OBJ_MESSAGE_ID_ACK: /* fall through */
+ case RSVP_OBJ_MESSAGE_ID_LIST:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ case RSVP_CTYPE_2:
+ if (obj_tlen < 8)
+ return-1;
+ ND_PRINT((ndo, "%s Flags [0x%02x], epoch: %u",
+ ident,
+ *obj_tptr,
+ EXTRACT_24BITS(obj_tptr + 1)));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ /* loop through as long there are no messages left */
+ while(obj_tlen >= 4) {
+ ND_PRINT((ndo, "%s Message-ID 0x%08x (%u)",
+ ident,
+ EXTRACT_32BITS(obj_tptr),
+ EXTRACT_32BITS(obj_tptr)));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ }
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_INTEGRITY:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ if (obj_tlen < sizeof(struct rsvp_obj_integrity_t))
+ return-1;
+ obj_ptr.rsvp_obj_integrity = (const struct rsvp_obj_integrity_t *)obj_tptr;
+ ND_PRINT((ndo, "%s Key-ID 0x%04x%08x, Sequence 0x%08x%08x, Flags [%s]",
+ ident,
+ EXTRACT_16BITS(obj_ptr.rsvp_obj_integrity->key_id),
+ EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->key_id+2),
+ EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->sequence),
+ EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->sequence+4),
+ bittok2str(rsvp_obj_integrity_flag_values,
+ "none",
+ obj_ptr.rsvp_obj_integrity->flags)));
+ ND_PRINT((ndo, "%s MD5-sum 0x%08x%08x%08x%08x ",
+ ident,
+ EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->digest),
+ EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->digest+4),
+ EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->digest+8),
+ EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->digest + 12)));
+
+#ifdef HAVE_LIBCRYPTO
+ sigcheck = signature_verify(ndo, pptr, plen, (unsigned char *)obj_ptr.\
+ rsvp_obj_integrity->digest);
+#else
+ sigcheck = CANT_CHECK_SIGNATURE;
+#endif
+ ND_PRINT((ndo, " (%s)", tok2str(signature_check_values, "Unknown", sigcheck)));
+
+ obj_tlen+=sizeof(struct rsvp_obj_integrity_t);
+ obj_tptr+=sizeof(struct rsvp_obj_integrity_t);
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_ADMIN_STATUS:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ if (obj_tlen < 4)
+ return-1;
+ ND_PRINT((ndo, "%s Flags [%s]", ident,
+ bittok2str(rsvp_obj_admin_status_flag_values, "none",
+ EXTRACT_32BITS(obj_tptr))));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_LABEL_SET:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ if (obj_tlen < 4)
+ return-1;
+ action = (EXTRACT_16BITS(obj_tptr)>>8);
+
+ ND_PRINT((ndo, "%s Action: %s (%u), Label type: %u", ident,
+ tok2str(rsvp_obj_label_set_action_values, "Unknown", action),
+ action, ((EXTRACT_32BITS(obj_tptr) & 0x7F))));
+
+ switch (action) {
+ case LABEL_SET_INCLUSIVE_RANGE:
+ case LABEL_SET_EXCLUSIVE_RANGE: /* fall through */
+
+ /* only a couple of subchannels are expected */
+ if (obj_tlen < 12)
+ return -1;
+ ND_PRINT((ndo, "%s Start range: %u, End range: %u", ident,
+ EXTRACT_32BITS(obj_tptr+4),
+ EXTRACT_32BITS(obj_tptr + 8)));
+ obj_tlen-=12;
+ obj_tptr+=12;
+ break;
+
+ default:
+ obj_tlen-=4;
+ obj_tptr+=4;
+ subchannel = 1;
+ while(obj_tlen >= 4 ) {
+ ND_PRINT((ndo, "%s Subchannel #%u: %u", ident, subchannel,
+ EXTRACT_32BITS(obj_tptr)));
+ obj_tptr+=4;
+ obj_tlen-=4;
+ subchannel++;
+ }
+ break;
+ }
+ break;
+ default:
+ hexdump=TRUE;
+ }
+
+ case RSVP_OBJ_S2L:
+ switch (rsvp_obj_ctype) {
+ case RSVP_CTYPE_IPV4:
+ if (obj_tlen < 4)
+ return-1;
+ ND_PRINT((ndo, "%s Sub-LSP destination address: %s",
+ ident, ipaddr_string(ndo, obj_tptr)));
+
+ obj_tlen-=4;
+ obj_tptr+=4;
+ break;
+#ifdef INET6
+ case RSVP_CTYPE_IPV6:
+ if (obj_tlen < 16)
+ return-1;
+ ND_PRINT((ndo, "%s Sub-LSP destination address: %s",
+ ident, ip6addr_string(ndo, obj_tptr)));
+
+ obj_tlen-=16;
+ obj_tptr+=16;
+ break;
+#endif
+ default:
+ hexdump=TRUE;
+ }
+
+ /*
+ * FIXME those are the defined objects that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+
+ case RSVP_OBJ_SCOPE:
+ case RSVP_OBJ_POLICY_DATA:
+ case RSVP_OBJ_ACCEPT_LABEL_SET:
+ case RSVP_OBJ_PROTECTION:
+ default:
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, obj_tptr, "\n\t ", obj_tlen); /* FIXME indentation */
+ break;
+ }
+ /* do we also want to see a hex dump ? */
+ if (ndo->ndo_vflag > 1 || hexdump == TRUE)
+ print_unknown_data(ndo, tptr + sizeof(struct rsvp_object_header), "\n\t ", /* FIXME indentation */
+ rsvp_obj_len - sizeof(struct rsvp_object_header));
+
+ tptr+=rsvp_obj_len;
+ tlen-=rsvp_obj_len;
+ }
+ return 0;
+trunc:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+ return -1;
+}
+
+void
+rsvp_print(netdissect_options *ndo,
+ register const u_char *pptr, register u_int len)
+{
+ struct rsvp_common_header *rsvp_com_header;
+ const u_char *tptr,*subtptr;
+ u_short plen, tlen, subtlen;
+
+ tptr=pptr;
+
+ rsvp_com_header = (struct rsvp_common_header *)pptr;
+ ND_TCHECK(*rsvp_com_header);
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags) != RSVP_VERSION) {
+ ND_PRINT((ndo, "ERROR: RSVP version %u packet not supported",
+ RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags)));
+ return;
+ }
+
+ /* in non-verbose mode just lets print the basic Message Type*/
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "RSVPv%u %s Message, length: %u",
+ RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags),
+ tok2str(rsvp_msg_type_values, "unknown (%u)",rsvp_com_header->msg_type),
+ len));
+ return;
+ }
+
+ /* ok they seem to want to know everything - lets fully decode it */
+
+ plen = tlen = EXTRACT_16BITS(rsvp_com_header->length);
+
+ ND_PRINT((ndo, "\n\tRSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
+ RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags),
+ tok2str(rsvp_msg_type_values, "unknown, type: %u",rsvp_com_header->msg_type),
+ rsvp_com_header->msg_type,
+ bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(rsvp_com_header->version_flags)),
+ tlen,
+ rsvp_com_header->ttl,
+ EXTRACT_16BITS(rsvp_com_header->checksum)));
+
+ /*
+ * Clear checksum prior to signature verification.
+ */
+ rsvp_com_header->checksum[0] = 0;
+ rsvp_com_header->checksum[1] = 0;
+
+ if (tlen < sizeof(const struct rsvp_common_header)) {
+ ND_PRINT((ndo, "ERROR: common header too short %u < %lu", tlen,
+ (unsigned long)sizeof(const struct rsvp_common_header)));
+ return;
+ }
+
+ tptr+=sizeof(const struct rsvp_common_header);
+ tlen-=sizeof(const struct rsvp_common_header);
+
+ switch(rsvp_com_header->msg_type) {
+
+ case RSVP_MSGTYPE_AGGREGATE:
+ while(tlen > 0) {
+ subtptr=tptr;
+ rsvp_com_header = (struct rsvp_common_header *)subtptr;
+ ND_TCHECK(*rsvp_com_header);
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags) != RSVP_VERSION) {
+ ND_PRINT((ndo, "ERROR: RSVP version %u packet not supported",
+ RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags)));
+ return;
+ }
+ subtlen=EXTRACT_16BITS(rsvp_com_header->length);
+
+ ND_PRINT((ndo, "\n\t RSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
+ RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags),
+ tok2str(rsvp_msg_type_values, "unknown, type: %u",rsvp_com_header->msg_type),
+ rsvp_com_header->msg_type,
+ bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(rsvp_com_header->version_flags)),
+ subtlen,
+ rsvp_com_header->ttl,
+ EXTRACT_16BITS(rsvp_com_header->checksum)));
+
+ /*
+ * Clear checksum prior to signature verification.
+ */
+ rsvp_com_header->checksum[0] = 0;
+ rsvp_com_header->checksum[1] = 0;
+
+ if (subtlen < sizeof(const struct rsvp_common_header)) {
+ ND_PRINT((ndo, "ERROR: common header too short %u < %lu", subtlen,
+ (unsigned long)sizeof(const struct rsvp_common_header)));
+ return;
+ }
+
+ if (tlen < subtlen) {
+ ND_PRINT((ndo, "ERROR: common header too large %u > %u", subtlen,
+ tlen));
+ return;
+ }
+
+ subtptr+=sizeof(const struct rsvp_common_header);
+ subtlen-=sizeof(const struct rsvp_common_header);
+
+ if (rsvp_obj_print(ndo, pptr, plen, subtptr, "\n\t ", subtlen) == -1)
+ return;
+
+ tptr+=subtlen+sizeof(const struct rsvp_common_header);
+ tlen-=subtlen+sizeof(const struct rsvp_common_header);
+ }
+
+ break;
+
+ case RSVP_MSGTYPE_PATH:
+ case RSVP_MSGTYPE_RESV:
+ case RSVP_MSGTYPE_PATHERR:
+ case RSVP_MSGTYPE_RESVERR:
+ case RSVP_MSGTYPE_PATHTEAR:
+ case RSVP_MSGTYPE_RESVTEAR:
+ case RSVP_MSGTYPE_RESVCONF:
+ case RSVP_MSGTYPE_HELLO_OLD:
+ case RSVP_MSGTYPE_HELLO:
+ case RSVP_MSGTYPE_ACK:
+ case RSVP_MSGTYPE_SREFRESH:
+ if (rsvp_obj_print(ndo, pptr, plen, tptr, "\n\t ", tlen) == -1)
+ return;
+ break;
+
+ default:
+ print_unknown_data(ndo, tptr, "\n\t ", tlen);
+ break;
+ }
+
+ return;
+trunc:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+}
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-rt6.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef INET6
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "ip6.h"
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+int
+rt6_print(netdissect_options *ndo, register const u_char *bp, const u_char *bp2 _U_)
+{
+ register const struct ip6_rthdr *dp;
+ register const struct ip6_rthdr0 *dp0;
+ register const u_char *ep;
+ int i, len;
+ register const struct in6_addr *addr;
+ const struct in6_addr *last_addr = NULL;
+
+ dp = (struct ip6_rthdr *)bp;
+ len = dp->ip6r_len;
+
+ /* 'ep' points to the end of available data. */
+ ep = ndo->ndo_snapend;
+
+ ND_TCHECK(dp->ip6r_segleft);
+
+ ND_PRINT((ndo, "srcrt (len=%d", dp->ip6r_len)); /*)*/
+ ND_PRINT((ndo, ", type=%d", dp->ip6r_type));
+ ND_PRINT((ndo, ", segleft=%d", dp->ip6r_segleft));
+
+ switch (dp->ip6r_type) {
+#ifndef IPV6_RTHDR_TYPE_0
+#define IPV6_RTHDR_TYPE_0 0
+#endif
+#ifndef IPV6_RTHDR_TYPE_2
+#define IPV6_RTHDR_TYPE_2 2
+#endif
+ case IPV6_RTHDR_TYPE_0:
+ case IPV6_RTHDR_TYPE_2: /* Mobile IPv6 ID-20 */
+ dp0 = (struct ip6_rthdr0 *)dp;
+
+ ND_TCHECK(dp0->ip6r0_reserved);
+ if (dp0->ip6r0_reserved || ndo->ndo_vflag) {
+ ND_PRINT((ndo, ", rsv=0x%0x",
+ EXTRACT_32BITS(&dp0->ip6r0_reserved)));
+ }
+
+ if (len % 2 == 1)
+ goto trunc;
+ len >>= 1;
+ addr = &dp0->ip6r0_addr[0];
+ for (i = 0; i < len; i++) {
+ if ((u_char *)(addr + 1) > ep)
+ goto trunc;
+
+ ND_PRINT((ndo, ", [%d]%s", i, ip6addr_string(ndo, addr)));
+ last_addr = addr;
+ addr++;
+ }
+ /*
+ * the destination address used in the pseudo-header is that of the final
+ * destination : the last address of the routing header
+ */
+ if (last_addr != NULL) {
+ struct ip6_hdr *ip6 = (struct ip6_hdr *)bp2;
+ UNALIGNED_MEMCPY(&ip6->ip6_dst, last_addr, sizeof (struct in6_addr));
+ }
+ /*(*/
+ ND_PRINT((ndo, ") "));
+ return((dp0->ip6r0_len + 1) << 3);
+ break;
+ default:
+ goto trunc;
+ break;
+ }
+
+ trunc:
+ ND_PRINT((ndo, "[|srcrt]"));
+ return -1;
+}
+#endif /* INET6 */
--- /dev/null
+/*
+ * 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.
+ */
+
+#ifndef lint
+static const char rcsid[] _U_ =
+ "@(#) Header";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "interface.h"
+#include "extract.h"
+
+static const char *rtspcmds[] = {
+ "DESCRIBE",
+ "ANNOUNCE",
+ "GET_PARAMETER",
+ "OPTIONS",
+ "PAUSE",
+ "PLAY",
+ "RECORD",
+ "REDIRECT",
+ "SETUP",
+ "SET_PARAMETER",
+ "TEARDOWN",
+ NULL
+};
+
+void
+rtsp_print(netdissect_options *ndo, const u_char *pptr, u_int len)
+{
+ txtproto_print(ndo, pptr, len, "rtsp", rtspcmds, RESP_CODE_SECOND_TOKEN);
+}
--- /dev/null
+/*
+ * Copyright: (c) 2000 United States Government as represented by the
+ * Secretary of the Navy. 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. The names of the authors 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.
+ */
+/*
+ * This code unmangles RX packets. RX is the mutant form of RPC that AFS
+ * uses to communicate between clients and servers.
+ *
+ * In this code, I mainly concern myself with decoding the AFS calls, not
+ * with the guts of RX, per se.
+ *
+ * Bah. If I never look at rx_packet.h again, it will be too soon.
+ *
+ * Ken Hornstein <kenh@cmf.nrl.navy.mil>
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-rx.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#include "ip.h"
+
+#define FS_RX_PORT 7000
+#define CB_RX_PORT 7001
+#define PROT_RX_PORT 7002
+#define VLDB_RX_PORT 7003
+#define KAUTH_RX_PORT 7004
+#define VOL_RX_PORT 7005
+#define ERROR_RX_PORT 7006 /* Doesn't seem to be used */
+#define BOS_RX_PORT 7007
+
+#define AFSNAMEMAX 256
+#define AFSOPAQUEMAX 1024
+#define PRNAMEMAX 64
+#define VLNAMEMAX 65
+#define KANAMEMAX 64
+#define BOSNAMEMAX 256
+
+#define PRSFS_READ 1 /* Read files */
+#define PRSFS_WRITE 2 /* Write files */
+#define PRSFS_INSERT 4 /* Insert files into a directory */
+#define PRSFS_LOOKUP 8 /* Lookup files into a directory */
+#define PRSFS_DELETE 16 /* Delete files */
+#define PRSFS_LOCK 32 /* Lock files */
+#define PRSFS_ADMINISTER 64 /* Change ACL's */
+
+struct rx_header {
+ uint32_t epoch;
+ uint32_t cid;
+ uint32_t callNumber;
+ uint32_t seq;
+ uint32_t serial;
+ uint8_t type;
+#define RX_PACKET_TYPE_DATA 1
+#define RX_PACKET_TYPE_ACK 2
+#define RX_PACKET_TYPE_BUSY 3
+#define RX_PACKET_TYPE_ABORT 4
+#define RX_PACKET_TYPE_ACKALL 5
+#define RX_PACKET_TYPE_CHALLENGE 6
+#define RX_PACKET_TYPE_RESPONSE 7
+#define RX_PACKET_TYPE_DEBUG 8
+#define RX_PACKET_TYPE_PARAMS 9
+#define RX_PACKET_TYPE_VERSION 13
+ uint8_t flags;
+#define RX_CLIENT_INITIATED 1
+#define RX_REQUEST_ACK 2
+#define RX_LAST_PACKET 4
+#define RX_MORE_PACKETS 8
+#define RX_FREE_PACKET 16
+#define RX_SLOW_START_OK 32
+#define RX_JUMBO_PACKET 32
+ uint8_t userStatus;
+ uint8_t securityIndex;
+ uint16_t spare; /* How clever: even though the AFS */
+ uint16_t serviceId; /* header files indicate that the */
+}; /* serviceId is first, it's really */
+ /* encoded _after_ the spare field */
+ /* I wasted a day figuring that out! */
+
+#define NUM_RX_FLAGS 7
+
+#define RX_MAXACKS 255
+
+struct rx_ackPacket {
+ uint16_t bufferSpace; /* Number of packet buffers available */
+ uint16_t maxSkew; /* Max diff between ack'd packet and */
+ /* highest packet received */
+ uint32_t firstPacket; /* The first packet in ack list */
+ uint32_t previousPacket; /* Previous packet recv'd (obsolete) */
+ uint32_t serial; /* # of packet that prompted the ack */
+ uint8_t reason; /* Reason for acknowledgement */
+ uint8_t nAcks; /* Number of acknowledgements */
+ uint8_t acks[RX_MAXACKS]; /* Up to RX_MAXACKS acknowledgements */
+};
+
+/*
+ * Values for the acks array
+ */
+
+#define RX_ACK_TYPE_NACK 0 /* Don't have this packet */
+#define RX_ACK_TYPE_ACK 1 /* I have this packet */
+
+static const struct tok rx_types[] = {
+ { RX_PACKET_TYPE_DATA, "data" },
+ { RX_PACKET_TYPE_ACK, "ack" },
+ { RX_PACKET_TYPE_BUSY, "busy" },
+ { RX_PACKET_TYPE_ABORT, "abort" },
+ { RX_PACKET_TYPE_ACKALL, "ackall" },
+ { RX_PACKET_TYPE_CHALLENGE, "challenge" },
+ { RX_PACKET_TYPE_RESPONSE, "response" },
+ { RX_PACKET_TYPE_DEBUG, "debug" },
+ { RX_PACKET_TYPE_PARAMS, "params" },
+ { RX_PACKET_TYPE_VERSION, "version" },
+ { 0, NULL },
+};
+
+static const struct double_tok {
+ int flag; /* Rx flag */
+ int packetType; /* Packet type */
+ const char *s; /* Flag string */
+} rx_flags[] = {
+ { RX_CLIENT_INITIATED, 0, "client-init" },
+ { RX_REQUEST_ACK, 0, "req-ack" },
+ { RX_LAST_PACKET, 0, "last-pckt" },
+ { RX_MORE_PACKETS, 0, "more-pckts" },
+ { RX_FREE_PACKET, 0, "free-pckt" },
+ { RX_SLOW_START_OK, RX_PACKET_TYPE_ACK, "slow-start" },
+ { RX_JUMBO_PACKET, RX_PACKET_TYPE_DATA, "jumbogram" }
+};
+
+static const struct tok fs_req[] = {
+ { 130, "fetch-data" },
+ { 131, "fetch-acl" },
+ { 132, "fetch-status" },
+ { 133, "store-data" },
+ { 134, "store-acl" },
+ { 135, "store-status" },
+ { 136, "remove-file" },
+ { 137, "create-file" },
+ { 138, "rename" },
+ { 139, "symlink" },
+ { 140, "link" },
+ { 141, "makedir" },
+ { 142, "rmdir" },
+ { 143, "oldsetlock" },
+ { 144, "oldextlock" },
+ { 145, "oldrellock" },
+ { 146, "get-stats" },
+ { 147, "give-cbs" },
+ { 148, "get-vlinfo" },
+ { 149, "get-vlstats" },
+ { 150, "set-vlstats" },
+ { 151, "get-rootvl" },
+ { 152, "check-token" },
+ { 153, "get-time" },
+ { 154, "nget-vlinfo" },
+ { 155, "bulk-stat" },
+ { 156, "setlock" },
+ { 157, "extlock" },
+ { 158, "rellock" },
+ { 159, "xstat-ver" },
+ { 160, "get-xstat" },
+ { 161, "dfs-lookup" },
+ { 162, "dfs-flushcps" },
+ { 163, "dfs-symlink" },
+ { 220, "residency" },
+ { 65536, "inline-bulk-status" },
+ { 65537, "fetch-data-64" },
+ { 65538, "store-data-64" },
+ { 65539, "give-up-all-cbs" },
+ { 65540, "get-caps" },
+ { 65541, "cb-rx-conn-addr" },
+ { 0, NULL },
+};
+
+static const struct tok cb_req[] = {
+ { 204, "callback" },
+ { 205, "initcb" },
+ { 206, "probe" },
+ { 207, "getlock" },
+ { 208, "getce" },
+ { 209, "xstatver" },
+ { 210, "getxstat" },
+ { 211, "initcb2" },
+ { 212, "whoareyou" },
+ { 213, "initcb3" },
+ { 214, "probeuuid" },
+ { 215, "getsrvprefs" },
+ { 216, "getcellservdb" },
+ { 217, "getlocalcell" },
+ { 218, "getcacheconf" },
+ { 65536, "getce64" },
+ { 65537, "getcellbynum" },
+ { 65538, "tellmeaboutyourself" },
+ { 0, NULL },
+};
+
+static const struct tok pt_req[] = {
+ { 500, "new-user" },
+ { 501, "where-is-it" },
+ { 502, "dump-entry" },
+ { 503, "add-to-group" },
+ { 504, "name-to-id" },
+ { 505, "id-to-name" },
+ { 506, "delete" },
+ { 507, "remove-from-group" },
+ { 508, "get-cps" },
+ { 509, "new-entry" },
+ { 510, "list-max" },
+ { 511, "set-max" },
+ { 512, "list-entry" },
+ { 513, "change-entry" },
+ { 514, "list-elements" },
+ { 515, "same-mbr-of" },
+ { 516, "set-fld-sentry" },
+ { 517, "list-owned" },
+ { 518, "get-cps2" },
+ { 519, "get-host-cps" },
+ { 520, "update-entry" },
+ { 521, "list-entries" },
+ { 530, "list-super-groups" },
+ { 0, NULL },
+};
+
+static const struct tok vldb_req[] = {
+ { 501, "create-entry" },
+ { 502, "delete-entry" },
+ { 503, "get-entry-by-id" },
+ { 504, "get-entry-by-name" },
+ { 505, "get-new-volume-id" },
+ { 506, "replace-entry" },
+ { 507, "update-entry" },
+ { 508, "setlock" },
+ { 509, "releaselock" },
+ { 510, "list-entry" },
+ { 511, "list-attrib" },
+ { 512, "linked-list" },
+ { 513, "get-stats" },
+ { 514, "probe" },
+ { 515, "get-addrs" },
+ { 516, "change-addr" },
+ { 517, "create-entry-n" },
+ { 518, "get-entry-by-id-n" },
+ { 519, "get-entry-by-name-n" },
+ { 520, "replace-entry-n" },
+ { 521, "list-entry-n" },
+ { 522, "list-attrib-n" },
+ { 523, "linked-list-n" },
+ { 524, "update-entry-by-name" },
+ { 525, "create-entry-u" },
+ { 526, "get-entry-by-id-u" },
+ { 527, "get-entry-by-name-u" },
+ { 528, "replace-entry-u" },
+ { 529, "list-entry-u" },
+ { 530, "list-attrib-u" },
+ { 531, "linked-list-u" },
+ { 532, "regaddr" },
+ { 533, "get-addrs-u" },
+ { 534, "list-attrib-n2" },
+ { 0, NULL },
+};
+
+static const struct tok kauth_req[] = {
+ { 1, "auth-old" },
+ { 21, "authenticate" },
+ { 22, "authenticate-v2" },
+ { 2, "change-pw" },
+ { 3, "get-ticket-old" },
+ { 23, "get-ticket" },
+ { 4, "set-pw" },
+ { 5, "set-fields" },
+ { 6, "create-user" },
+ { 7, "delete-user" },
+ { 8, "get-entry" },
+ { 9, "list-entry" },
+ { 10, "get-stats" },
+ { 11, "debug" },
+ { 12, "get-pw" },
+ { 13, "get-random-key" },
+ { 14, "unlock" },
+ { 15, "lock-status" },
+ { 0, NULL },
+};
+
+static const struct tok vol_req[] = {
+ { 100, "create-volume" },
+ { 101, "delete-volume" },
+ { 102, "restore" },
+ { 103, "forward" },
+ { 104, "end-trans" },
+ { 105, "clone" },
+ { 106, "set-flags" },
+ { 107, "get-flags" },
+ { 108, "trans-create" },
+ { 109, "dump" },
+ { 110, "get-nth-volume" },
+ { 111, "set-forwarding" },
+ { 112, "get-name" },
+ { 113, "get-status" },
+ { 114, "sig-restore" },
+ { 115, "list-partitions" },
+ { 116, "list-volumes" },
+ { 117, "set-id-types" },
+ { 118, "monitor" },
+ { 119, "partition-info" },
+ { 120, "reclone" },
+ { 121, "list-one-volume" },
+ { 122, "nuke" },
+ { 123, "set-date" },
+ { 124, "x-list-volumes" },
+ { 125, "x-list-one-volume" },
+ { 126, "set-info" },
+ { 127, "x-list-partitions" },
+ { 128, "forward-multiple" },
+ { 65536, "convert-ro" },
+ { 65537, "get-size" },
+ { 65538, "dump-v2" },
+ { 0, NULL },
+};
+
+static const struct tok bos_req[] = {
+ { 80, "create-bnode" },
+ { 81, "delete-bnode" },
+ { 82, "set-status" },
+ { 83, "get-status" },
+ { 84, "enumerate-instance" },
+ { 85, "get-instance-info" },
+ { 86, "get-instance-parm" },
+ { 87, "add-superuser" },
+ { 88, "delete-superuser" },
+ { 89, "list-superusers" },
+ { 90, "list-keys" },
+ { 91, "add-key" },
+ { 92, "delete-key" },
+ { 93, "set-cell-name" },
+ { 94, "get-cell-name" },
+ { 95, "get-cell-host" },
+ { 96, "add-cell-host" },
+ { 97, "delete-cell-host" },
+ { 98, "set-t-status" },
+ { 99, "shutdown-all" },
+ { 100, "restart-all" },
+ { 101, "startup-all" },
+ { 102, "set-noauth-flag" },
+ { 103, "re-bozo" },
+ { 104, "restart" },
+ { 105, "start-bozo-install" },
+ { 106, "uninstall" },
+ { 107, "get-dates" },
+ { 108, "exec" },
+ { 109, "prune" },
+ { 110, "set-restart-time" },
+ { 111, "get-restart-time" },
+ { 112, "start-bozo-log" },
+ { 113, "wait-all" },
+ { 114, "get-instance-strings" },
+ { 115, "get-restricted" },
+ { 116, "set-restricted" },
+ { 0, NULL },
+};
+
+static const struct tok ubik_req[] = {
+ { 10000, "vote-beacon" },
+ { 10001, "vote-debug-old" },
+ { 10002, "vote-sdebug-old" },
+ { 10003, "vote-getsyncsite" },
+ { 10004, "vote-debug" },
+ { 10005, "vote-sdebug" },
+ { 10006, "vote-xdebug" },
+ { 10007, "vote-xsdebug" },
+ { 20000, "disk-begin" },
+ { 20001, "disk-commit" },
+ { 20002, "disk-lock" },
+ { 20003, "disk-write" },
+ { 20004, "disk-getversion" },
+ { 20005, "disk-getfile" },
+ { 20006, "disk-sendfile" },
+ { 20007, "disk-abort" },
+ { 20008, "disk-releaselocks" },
+ { 20009, "disk-truncate" },
+ { 20010, "disk-probe" },
+ { 20011, "disk-writev" },
+ { 20012, "disk-interfaceaddr" },
+ { 20013, "disk-setversion" },
+ { 0, NULL },
+};
+
+#define VOTE_LOW 10000
+#define VOTE_HIGH 10007
+#define DISK_LOW 20000
+#define DISK_HIGH 20013
+
+static const struct tok cb_types[] = {
+ { 1, "exclusive" },
+ { 2, "shared" },
+ { 3, "dropped" },
+ { 0, NULL },
+};
+
+static const struct tok ubik_lock_types[] = {
+ { 1, "read" },
+ { 2, "write" },
+ { 3, "wait" },
+ { 0, NULL },
+};
+
+static const char *voltype[] = { "read-write", "read-only", "backup" };
+
+static const struct tok afs_fs_errors[] = {
+ { 101, "salvage volume" },
+ { 102, "no such vnode" },
+ { 103, "no such volume" },
+ { 104, "volume exist" },
+ { 105, "no service" },
+ { 106, "volume offline" },
+ { 107, "voline online" },
+ { 108, "diskfull" },
+ { 109, "diskquota exceeded" },
+ { 110, "volume busy" },
+ { 111, "volume moved" },
+ { 112, "AFS IO error" },
+ { 0xffffff9c, "restarting fileserver" }, /* -100, sic! */
+ { 0, NULL }
+};
+
+/*
+ * Reasons for acknowledging a packet
+ */
+
+static const struct tok rx_ack_reasons[] = {
+ { 1, "ack requested" },
+ { 2, "duplicate packet" },
+ { 3, "out of sequence" },
+ { 4, "exceeds window" },
+ { 5, "no buffer space" },
+ { 6, "ping" },
+ { 7, "ping response" },
+ { 8, "delay" },
+ { 9, "idle" },
+ { 0, NULL },
+};
+
+/*
+ * Cache entries we keep around so we can figure out the RX opcode
+ * numbers for replies. This allows us to make sense of RX reply packets.
+ */
+
+struct rx_cache_entry {
+ uint32_t callnum; /* Call number (net order) */
+ struct in_addr client; /* client IP address (net order) */
+ struct in_addr server; /* server IP address (net order) */
+ int dport; /* server port (host order) */
+ u_short serviceId; /* Service identifier (net order) */
+ uint32_t opcode; /* RX opcode (host order) */
+};
+
+#define RX_CACHE_SIZE 64
+
+static struct rx_cache_entry rx_cache[RX_CACHE_SIZE];
+
+static int rx_cache_next = 0;
+static int rx_cache_hint = 0;
+static void rx_cache_insert(netdissect_options *, const u_char *, const struct ip *, int);
+static int rx_cache_find(const struct rx_header *, const struct ip *,
+ int, int32_t *);
+
+static void fs_print(netdissect_options *, const u_char *, int);
+static void fs_reply_print(netdissect_options *, const u_char *, int, int32_t);
+static void acl_print(netdissect_options *, u_char *, int, u_char *);
+static void cb_print(netdissect_options *, const u_char *, int);
+static void cb_reply_print(netdissect_options *, const u_char *, int, int32_t);
+static void prot_print(netdissect_options *, const u_char *, int);
+static void prot_reply_print(netdissect_options *, const u_char *, int, int32_t);
+static void vldb_print(netdissect_options *, const u_char *, int);
+static void vldb_reply_print(netdissect_options *, const u_char *, int, int32_t);
+static void kauth_print(netdissect_options *, const u_char *, int);
+static void kauth_reply_print(netdissect_options *, const u_char *, int, int32_t);
+static void vol_print(netdissect_options *, const u_char *, int);
+static void vol_reply_print(netdissect_options *, const u_char *, int, int32_t);
+static void bos_print(netdissect_options *, const u_char *, int);
+static void bos_reply_print(netdissect_options *, const u_char *, int, int32_t);
+static void ubik_print(netdissect_options *, const u_char *);
+static void ubik_reply_print(netdissect_options *, const u_char *, int, int32_t);
+
+static void rx_ack_print(netdissect_options *, const u_char *, int);
+
+static int is_ubik(uint32_t);
+
+/*
+ * Handle the rx-level packet. See if we know what port it's going to so
+ * we can peek at the afs call inside
+ */
+
+void
+rx_print(netdissect_options *ndo,
+ register const u_char *bp, int length, int sport, int dport,
+ u_char *bp2)
+{
+ register struct rx_header *rxh;
+ int i;
+ int32_t opcode;
+
+ if (ndo->ndo_snapend - bp < (int)sizeof (struct rx_header)) {
+ ND_PRINT((ndo, " [|rx] (%d)", length));
+ return;
+ }
+
+ rxh = (struct rx_header *) bp;
+
+ ND_PRINT((ndo, " rx %s", tok2str(rx_types, "type %d", rxh->type)));
+
+ if (ndo->ndo_vflag) {
+ int firstflag = 0;
+
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, " cid %08x call# %d",
+ (int) EXTRACT_32BITS(&rxh->cid),
+ (int) EXTRACT_32BITS(&rxh->callNumber)));
+
+ ND_PRINT((ndo, " seq %d ser %d",
+ (int) EXTRACT_32BITS(&rxh->seq),
+ (int) EXTRACT_32BITS(&rxh->serial)));
+
+ if (ndo->ndo_vflag > 2)
+ ND_PRINT((ndo, " secindex %d serviceid %hu",
+ (int) rxh->securityIndex,
+ EXTRACT_16BITS(&rxh->serviceId)));
+
+ if (ndo->ndo_vflag > 1)
+ for (i = 0; i < NUM_RX_FLAGS; i++) {
+ if (rxh->flags & rx_flags[i].flag &&
+ (!rx_flags[i].packetType ||
+ rxh->type == rx_flags[i].packetType)) {
+ if (!firstflag) {
+ firstflag = 1;
+ ND_PRINT((ndo, " "));
+ } else {
+ ND_PRINT((ndo, ","));
+ }
+ ND_PRINT((ndo, "<%s>", rx_flags[i].s));
+ }
+ }
+ }
+
+ /*
+ * Try to handle AFS calls that we know about. Check the destination
+ * port and make sure it's a data packet. Also, make sure the
+ * seq number is 1 (because otherwise it's a continuation packet,
+ * and we can't interpret that). Also, seems that reply packets
+ * do not have the client-init flag set, so we check for that
+ * as well.
+ */
+
+ if (rxh->type == RX_PACKET_TYPE_DATA &&
+ EXTRACT_32BITS(&rxh->seq) == 1 &&
+ rxh->flags & RX_CLIENT_INITIATED) {
+
+ /*
+ * Insert this call into the call cache table, so we
+ * have a chance to print out replies
+ */
+
+ rx_cache_insert(ndo, bp, (const struct ip *) bp2, dport);
+
+ switch (dport) {
+ case FS_RX_PORT: /* AFS file service */
+ fs_print(ndo, bp, length);
+ break;
+ case CB_RX_PORT: /* AFS callback service */
+ cb_print(ndo, bp, length);
+ break;
+ case PROT_RX_PORT: /* AFS protection service */
+ prot_print(ndo, bp, length);
+ break;
+ case VLDB_RX_PORT: /* AFS VLDB service */
+ vldb_print(ndo, bp, length);
+ break;
+ case KAUTH_RX_PORT: /* AFS Kerberos auth service */
+ kauth_print(ndo, bp, length);
+ break;
+ case VOL_RX_PORT: /* AFS Volume service */
+ vol_print(ndo, bp, length);
+ break;
+ case BOS_RX_PORT: /* AFS BOS service */
+ bos_print(ndo, bp, length);
+ break;
+ default:
+ ;
+ }
+
+ /*
+ * If it's a reply (client-init is _not_ set, but seq is one)
+ * then look it up in the cache. If we find it, call the reply
+ * printing functions Note that we handle abort packets here,
+ * because printing out the return code can be useful at times.
+ */
+
+ } else if (((rxh->type == RX_PACKET_TYPE_DATA &&
+ EXTRACT_32BITS(&rxh->seq) == 1) ||
+ rxh->type == RX_PACKET_TYPE_ABORT) &&
+ (rxh->flags & RX_CLIENT_INITIATED) == 0 &&
+ rx_cache_find(rxh, (const struct ip *) bp2,
+ sport, &opcode)) {
+
+ switch (sport) {
+ case FS_RX_PORT: /* AFS file service */
+ fs_reply_print(ndo, bp, length, opcode);
+ break;
+ case CB_RX_PORT: /* AFS callback service */
+ cb_reply_print(ndo, bp, length, opcode);
+ break;
+ case PROT_RX_PORT: /* AFS PT service */
+ prot_reply_print(ndo, bp, length, opcode);
+ break;
+ case VLDB_RX_PORT: /* AFS VLDB service */
+ vldb_reply_print(ndo, bp, length, opcode);
+ break;
+ case KAUTH_RX_PORT: /* AFS Kerberos auth service */
+ kauth_reply_print(ndo, bp, length, opcode);
+ break;
+ case VOL_RX_PORT: /* AFS Volume service */
+ vol_reply_print(ndo, bp, length, opcode);
+ break;
+ case BOS_RX_PORT: /* AFS BOS service */
+ bos_reply_print(ndo, bp, length, opcode);
+ break;
+ default:
+ ;
+ }
+
+ /*
+ * If it's an RX ack packet, then use the appropriate ack decoding
+ * function (there isn't any service-specific information in the
+ * ack packet, so we can use one for all AFS services)
+ */
+
+ } else if (rxh->type == RX_PACKET_TYPE_ACK)
+ rx_ack_print(ndo, bp, length);
+
+
+ ND_PRINT((ndo, " (%d)", length));
+}
+
+/*
+ * Insert an entry into the cache. Taken from print-nfs.c
+ */
+
+static void
+rx_cache_insert(netdissect_options *ndo,
+ const u_char *bp, const struct ip *ip, int dport)
+{
+ struct rx_cache_entry *rxent;
+ const struct rx_header *rxh = (const struct rx_header *) bp;
+
+ if (ndo->ndo_snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t)))
+ return;
+
+ rxent = &rx_cache[rx_cache_next];
+
+ if (++rx_cache_next >= RX_CACHE_SIZE)
+ rx_cache_next = 0;
+
+ rxent->callnum = rxh->callNumber;
+ rxent->client = ip->ip_src;
+ rxent->server = ip->ip_dst;
+ rxent->dport = dport;
+ rxent->serviceId = rxh->serviceId;
+ rxent->opcode = EXTRACT_32BITS(bp + sizeof(struct rx_header));
+}
+
+/*
+ * Lookup an entry in the cache. Also taken from print-nfs.c
+ *
+ * Note that because this is a reply, we're looking at the _source_
+ * port.
+ */
+
+static int
+rx_cache_find(const struct rx_header *rxh, const struct ip *ip, int sport,
+ int32_t *opcode)
+{
+ int i;
+ struct rx_cache_entry *rxent;
+ uint32_t clip = ip->ip_dst.s_addr;
+ uint32_t sip = ip->ip_src.s_addr;
+
+ /* Start the search where we last left off */
+
+ i = rx_cache_hint;
+ do {
+ rxent = &rx_cache[i];
+ if (rxent->callnum == rxh->callNumber &&
+ rxent->client.s_addr == clip &&
+ rxent->server.s_addr == sip &&
+ rxent->serviceId == rxh->serviceId &&
+ rxent->dport == sport) {
+
+ /* We got a match! */
+
+ rx_cache_hint = i;
+ *opcode = rxent->opcode;
+ return(1);
+ }
+ if (++i >= RX_CACHE_SIZE)
+ i = 0;
+ } while (i != rx_cache_hint);
+
+ /* Our search failed */
+ return(0);
+}
+
+/*
+ * These extrememly grody macros handle the printing of various AFS stuff.
+ */
+
+#define FIDOUT() { unsigned long n1, n2, n3; \
+ ND_TCHECK2(bp[0], sizeof(int32_t) * 3); \
+ n1 = EXTRACT_32BITS(bp); \
+ bp += sizeof(int32_t); \
+ n2 = EXTRACT_32BITS(bp); \
+ bp += sizeof(int32_t); \
+ n3 = EXTRACT_32BITS(bp); \
+ bp += sizeof(int32_t); \
+ ND_PRINT((ndo, " fid %d/%d/%d", (int) n1, (int) n2, (int) n3)); \
+ }
+
+#define STROUT(MAX) { unsigned int i; \
+ ND_TCHECK2(bp[0], sizeof(int32_t)); \
+ i = EXTRACT_32BITS(bp); \
+ if (i > (MAX)) \
+ goto trunc; \
+ bp += sizeof(int32_t); \
+ ND_PRINT((ndo, " \"")); \
+ if (fn_printn(ndo, bp, i, ndo->ndo_snapend)) \
+ goto trunc; \
+ ND_PRINT((ndo, "\"")); \
+ bp += ((i + sizeof(int32_t) - 1) / sizeof(int32_t)) * sizeof(int32_t); \
+ }
+
+#define INTOUT() { int i; \
+ ND_TCHECK2(bp[0], sizeof(int32_t)); \
+ i = (int) EXTRACT_32BITS(bp); \
+ bp += sizeof(int32_t); \
+ ND_PRINT((ndo, " %d", i)); \
+ }
+
+#define UINTOUT() { unsigned long i; \
+ ND_TCHECK2(bp[0], sizeof(int32_t)); \
+ i = EXTRACT_32BITS(bp); \
+ bp += sizeof(int32_t); \
+ ND_PRINT((ndo, " %lu", i)); \
+ }
+
+#define UINT64OUT() { uint64_t i; \
+ ND_TCHECK2(bp[0], sizeof(uint64_t)); \
+ i = EXTRACT_64BITS(bp); \
+ bp += sizeof(uint64_t); \
+ ND_PRINT((ndo, " %" PRIu64, i)); \
+ }
+
+#define DATEOUT() { time_t t; struct tm *tm; char str[256]; \
+ ND_TCHECK2(bp[0], sizeof(int32_t)); \
+ t = (time_t) EXTRACT_32BITS(bp); \
+ bp += sizeof(int32_t); \
+ tm = localtime(&t); \
+ strftime(str, 256, "%Y/%m/%d %T", tm); \
+ ND_PRINT((ndo, " %s", str)); \
+ }
+
+#define STOREATTROUT() { unsigned long mask, i; \
+ ND_TCHECK2(bp[0], (sizeof(int32_t)*6)); \
+ mask = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \
+ if (mask) ND_PRINT((ndo, " StoreStatus")); \
+ if (mask & 1) { ND_PRINT((ndo, " date")); DATEOUT(); } \
+ else bp += sizeof(int32_t); \
+ i = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \
+ if (mask & 2) ND_PRINT((ndo, " owner %lu", i)); \
+ i = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \
+ if (mask & 4) ND_PRINT((ndo, " group %lu", i)); \
+ i = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \
+ if (mask & 8) ND_PRINT((ndo, " mode %lo", i & 07777)); \
+ i = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \
+ if (mask & 16) ND_PRINT((ndo, " segsize %lu", i)); \
+ /* undocumented in 3.3 docu */ \
+ if (mask & 1024) ND_PRINT((ndo, " fsync")); \
+ }
+
+#define UBIK_VERSIONOUT() {int32_t epoch; int32_t counter; \
+ ND_TCHECK2(bp[0], sizeof(int32_t) * 2); \
+ epoch = EXTRACT_32BITS(bp); \
+ bp += sizeof(int32_t); \
+ counter = EXTRACT_32BITS(bp); \
+ bp += sizeof(int32_t); \
+ ND_PRINT((ndo, " %d.%d", epoch, counter)); \
+ }
+
+#define AFSUUIDOUT() {uint32_t temp; int i; \
+ ND_TCHECK2(bp[0], 11*sizeof(uint32_t)); \
+ temp = EXTRACT_32BITS(bp); \
+ bp += sizeof(uint32_t); \
+ ND_PRINT((ndo, " %08x", temp)); \
+ temp = EXTRACT_32BITS(bp); \
+ bp += sizeof(uint32_t); \
+ ND_PRINT((ndo, "%04x", temp)); \
+ temp = EXTRACT_32BITS(bp); \
+ bp += sizeof(uint32_t); \
+ ND_PRINT((ndo, "%04x", temp)); \
+ for (i = 0; i < 8; i++) { \
+ temp = EXTRACT_32BITS(bp); \
+ bp += sizeof(uint32_t); \
+ ND_PRINT((ndo, "%02x", (unsigned char) temp)); \
+ } \
+ }
+
+/*
+ * This is the sickest one of all
+ */
+
+#define VECOUT(MAX) { u_char *sp; \
+ u_char s[AFSNAMEMAX]; \
+ int k; \
+ if ((MAX) + 1 > sizeof(s)) \
+ goto trunc; \
+ ND_TCHECK2(bp[0], (MAX) * sizeof(int32_t)); \
+ sp = s; \
+ for (k = 0; k < (MAX); k++) { \
+ *sp++ = (u_char) EXTRACT_32BITS(bp); \
+ bp += sizeof(int32_t); \
+ } \
+ s[(MAX)] = '\0'; \
+ ND_PRINT((ndo, " \"")); \
+ fn_print(ndo, s, NULL); \
+ ND_PRINT((ndo, "\"")); \
+ }
+
+#define DESTSERVEROUT() { unsigned long n1, n2, n3; \
+ ND_TCHECK2(bp[0], sizeof(int32_t) * 3); \
+ n1 = EXTRACT_32BITS(bp); \
+ bp += sizeof(int32_t); \
+ n2 = EXTRACT_32BITS(bp); \
+ bp += sizeof(int32_t); \
+ n3 = EXTRACT_32BITS(bp); \
+ bp += sizeof(int32_t); \
+ ND_PRINT((ndo, " server %d:%d:%d", (int) n1, (int) n2, (int) n3)); \
+ }
+
+/*
+ * Handle calls to the AFS file service (fs)
+ */
+
+static void
+fs_print(netdissect_options *ndo,
+ register const u_char *bp, int length)
+{
+ int fs_op;
+ unsigned long i;
+
+ if (length <= (int)sizeof(struct rx_header))
+ return;
+
+ if (ndo->ndo_snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
+ goto trunc;
+ }
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from fsint/afsint.xg
+ */
+
+ fs_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
+
+ ND_PRINT((ndo, " fs call %s", tok2str(fs_req, "op#%d", fs_op)));
+
+ /*
+ * Print out arguments to some of the AFS calls. This stuff is
+ * all from afsint.xg
+ */
+
+ bp += sizeof(struct rx_header) + 4;
+
+ /*
+ * Sigh. This is gross. Ritchie forgive me.
+ */
+
+ switch (fs_op) {
+ case 130: /* Fetch data */
+ FIDOUT();
+ ND_PRINT((ndo, " offset"));
+ UINTOUT();
+ ND_PRINT((ndo, " length"));
+ UINTOUT();
+ break;
+ case 131: /* Fetch ACL */
+ case 132: /* Fetch Status */
+ case 143: /* Old set lock */
+ case 144: /* Old extend lock */
+ case 145: /* Old release lock */
+ case 156: /* Set lock */
+ case 157: /* Extend lock */
+ case 158: /* Release lock */
+ FIDOUT();
+ break;
+ case 135: /* Store status */
+ FIDOUT();
+ STOREATTROUT();
+ break;
+ case 133: /* Store data */
+ FIDOUT();
+ STOREATTROUT();
+ ND_PRINT((ndo, " offset"));
+ UINTOUT();
+ ND_PRINT((ndo, " length"));
+ UINTOUT();
+ ND_PRINT((ndo, " flen"));
+ UINTOUT();
+ break;
+ case 134: /* Store ACL */
+ {
+ char a[AFSOPAQUEMAX+1];
+ FIDOUT();
+ ND_TCHECK2(bp[0], 4);
+ i = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ ND_TCHECK2(bp[0], i);
+ i = min(AFSOPAQUEMAX, i);
+ strncpy(a, (char *) bp, i);
+ a[i] = '\0';
+ acl_print(ndo, (u_char *) a, sizeof(a), (u_char *) a + i);
+ break;
+ }
+ case 137: /* Create file */
+ case 141: /* MakeDir */
+ FIDOUT();
+ STROUT(AFSNAMEMAX);
+ STOREATTROUT();
+ break;
+ case 136: /* Remove file */
+ case 142: /* Remove directory */
+ FIDOUT();
+ STROUT(AFSNAMEMAX);
+ break;
+ case 138: /* Rename file */
+ ND_PRINT((ndo, " old"));
+ FIDOUT();
+ STROUT(AFSNAMEMAX);
+ ND_PRINT((ndo, " new"));
+ FIDOUT();
+ STROUT(AFSNAMEMAX);
+ break;
+ case 139: /* Symlink */
+ FIDOUT();
+ STROUT(AFSNAMEMAX);
+ ND_PRINT((ndo, " link to"));
+ STROUT(AFSNAMEMAX);
+ break;
+ case 140: /* Link */
+ FIDOUT();
+ STROUT(AFSNAMEMAX);
+ ND_PRINT((ndo, " link to"));
+ FIDOUT();
+ break;
+ case 148: /* Get volume info */
+ STROUT(AFSNAMEMAX);
+ break;
+ case 149: /* Get volume stats */
+ case 150: /* Set volume stats */
+ ND_PRINT((ndo, " volid"));
+ UINTOUT();
+ break;
+ case 154: /* New get volume info */
+ ND_PRINT((ndo, " volname"));
+ STROUT(AFSNAMEMAX);
+ break;
+ case 155: /* Bulk stat */
+ case 65536: /* Inline bulk stat */
+ {
+ unsigned long j;
+ ND_TCHECK2(bp[0], 4);
+ j = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+
+ for (i = 0; i < j; i++) {
+ FIDOUT();
+ if (i != j - 1)
+ ND_PRINT((ndo, ","));
+ }
+ if (j == 0)
+ ND_PRINT((ndo, " <none!>"));
+ }
+ case 65537: /* Fetch data 64 */
+ FIDOUT();
+ ND_PRINT((ndo, " offset"));
+ UINT64OUT();
+ ND_PRINT((ndo, " length"));
+ UINT64OUT();
+ break;
+ case 65538: /* Store data 64 */
+ FIDOUT();
+ STOREATTROUT();
+ ND_PRINT((ndo, " offset"));
+ UINT64OUT();
+ ND_PRINT((ndo, " length"));
+ UINT64OUT();
+ ND_PRINT((ndo, " flen"));
+ UINT64OUT();
+ break;
+ case 65541: /* CallBack rx conn address */
+ ND_PRINT((ndo, " addr"));
+ UINTOUT();
+ default:
+ ;
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|fs]"));
+}
+
+/*
+ * Handle replies to the AFS file service
+ */
+
+static void
+fs_reply_print(netdissect_options *ndo,
+ register const u_char *bp, int length, int32_t opcode)
+{
+ unsigned long i;
+ struct rx_header *rxh;
+
+ if (length <= (int)sizeof(struct rx_header))
+ return;
+
+ rxh = (struct rx_header *) bp;
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from fsint/afsint.xg
+ */
+
+ ND_PRINT((ndo, " fs reply %s", tok2str(fs_req, "op#%d", opcode)));
+
+ bp += sizeof(struct rx_header);
+
+ /*
+ * If it was a data packet, interpret the response
+ */
+
+ if (rxh->type == RX_PACKET_TYPE_DATA) {
+ switch (opcode) {
+ case 131: /* Fetch ACL */
+ {
+ char a[AFSOPAQUEMAX+1];
+ ND_TCHECK2(bp[0], 4);
+ i = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ ND_TCHECK2(bp[0], i);
+ i = min(AFSOPAQUEMAX, i);
+ strncpy(a, (char *) bp, i);
+ a[i] = '\0';
+ acl_print(ndo, (u_char *) a, sizeof(a), (u_char *) a + i);
+ break;
+ }
+ case 137: /* Create file */
+ case 141: /* MakeDir */
+ ND_PRINT((ndo, " new"));
+ FIDOUT();
+ break;
+ case 151: /* Get root volume */
+ ND_PRINT((ndo, " root volume"));
+ STROUT(AFSNAMEMAX);
+ break;
+ case 153: /* Get time */
+ DATEOUT();
+ break;
+ default:
+ ;
+ }
+ } else if (rxh->type == RX_PACKET_TYPE_ABORT) {
+ int i;
+
+ /*
+ * Otherwise, just print out the return code
+ */
+ ND_TCHECK2(bp[0], sizeof(int32_t));
+ i = (int) EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+
+ ND_PRINT((ndo, " error %s", tok2str(afs_fs_errors, "#%d", i)));
+ } else {
+ ND_PRINT((ndo, " strange fs reply of type %d", rxh->type));
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|fs]"));
+}
+
+/*
+ * Print out an AFS ACL string. An AFS ACL is a string that has the
+ * following format:
+ *
+ * <positive> <negative>
+ * <uid1> <aclbits1>
+ * ....
+ *
+ * "positive" and "negative" are integers which contain the number of
+ * positive and negative ACL's in the string. The uid/aclbits pair are
+ * ASCII strings containing the UID/PTS record and and a ascii number
+ * representing a logical OR of all the ACL permission bits
+ */
+
+static void
+acl_print(netdissect_options *ndo,
+ u_char *s, int maxsize, u_char *end)
+{
+ int pos, neg, acl;
+ int n, i;
+ char *user;
+ char fmt[1024];
+
+ if ((user = (char *)malloc(maxsize)) == NULL)
+ return;
+
+ if (sscanf((char *) s, "%d %d\n%n", &pos, &neg, &n) != 2)
+ goto finish;
+
+ s += n;
+
+ if (s > end)
+ goto finish;
+
+ /*
+ * This wacky order preserves the order used by the "fs" command
+ */
+
+#define ACLOUT(acl) \
+ ND_PRINT((ndo, "%s%s%s%s%s%s%s", \
+ acl & PRSFS_READ ? "r" : "", \
+ acl & PRSFS_LOOKUP ? "l" : "", \
+ acl & PRSFS_INSERT ? "i" : "", \
+ acl & PRSFS_DELETE ? "d" : "", \
+ acl & PRSFS_WRITE ? "w" : "", \
+ acl & PRSFS_LOCK ? "k" : "", \
+ acl & PRSFS_ADMINISTER ? "a" : ""));
+
+ for (i = 0; i < pos; i++) {
+ snprintf(fmt, sizeof(fmt), "%%%ds %%d\n%%n", maxsize - 1);
+ if (sscanf((char *) s, fmt, user, &acl, &n) != 2)
+ goto finish;
+ s += n;
+ ND_PRINT((ndo, " +{"));
+ fn_print(ndo, (u_char *)user, NULL);
+ ND_PRINT((ndo, " "));
+ ACLOUT(acl);
+ ND_PRINT((ndo, "}"));
+ if (s > end)
+ goto finish;
+ }
+
+ for (i = 0; i < neg; i++) {
+ snprintf(fmt, sizeof(fmt), "%%%ds %%d\n%%n", maxsize - 1);
+ if (sscanf((char *) s, fmt, user, &acl, &n) != 2)
+ goto finish;
+ s += n;
+ ND_PRINT((ndo, " -{"));
+ fn_print(ndo, (u_char *)user, NULL);
+ ND_PRINT((ndo, " "));
+ ACLOUT(acl);
+ ND_PRINT((ndo, "}"));
+ if (s > end)
+ goto finish;
+ }
+
+finish:
+ free(user);
+ return;
+}
+
+#undef ACLOUT
+
+/*
+ * Handle calls to the AFS callback service
+ */
+
+static void
+cb_print(netdissect_options *ndo,
+ register const u_char *bp, int length)
+{
+ int cb_op;
+ unsigned long i;
+
+ if (length <= (int)sizeof(struct rx_header))
+ return;
+
+ if (ndo->ndo_snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
+ goto trunc;
+ }
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from fsint/afscbint.xg
+ */
+
+ cb_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
+
+ ND_PRINT((ndo, " cb call %s", tok2str(cb_req, "op#%d", cb_op)));
+
+ bp += sizeof(struct rx_header) + 4;
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from fsint/afscbint.xg
+ */
+
+ switch (cb_op) {
+ case 204: /* Callback */
+ {
+ unsigned long j, t;
+ ND_TCHECK2(bp[0], 4);
+ j = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+
+ for (i = 0; i < j; i++) {
+ FIDOUT();
+ if (i != j - 1)
+ ND_PRINT((ndo, ","));
+ }
+
+ if (j == 0)
+ ND_PRINT((ndo, " <none!>"));
+
+ j = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+
+ if (j != 0)
+ ND_PRINT((ndo, ";"));
+
+ for (i = 0; i < j; i++) {
+ ND_PRINT((ndo, " ver"));
+ INTOUT();
+ ND_PRINT((ndo, " expires"));
+ DATEOUT();
+ ND_TCHECK2(bp[0], 4);
+ t = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ tok2str(cb_types, "type %d", t);
+ }
+ }
+ case 214: {
+ ND_PRINT((ndo, " afsuuid"));
+ AFSUUIDOUT();
+ break;
+ }
+ default:
+ ;
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|cb]"));
+}
+
+/*
+ * Handle replies to the AFS Callback Service
+ */
+
+static void
+cb_reply_print(netdissect_options *ndo,
+ register const u_char *bp, int length, int32_t opcode)
+{
+ struct rx_header *rxh;
+
+ if (length <= (int)sizeof(struct rx_header))
+ return;
+
+ rxh = (struct rx_header *) bp;
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from fsint/afscbint.xg
+ */
+
+ ND_PRINT((ndo, " cb reply %s", tok2str(cb_req, "op#%d", opcode)));
+
+ bp += sizeof(struct rx_header);
+
+ /*
+ * If it was a data packet, interpret the response.
+ */
+
+ if (rxh->type == RX_PACKET_TYPE_DATA)
+ switch (opcode) {
+ case 213: /* InitCallBackState3 */
+ AFSUUIDOUT();
+ break;
+ default:
+ ;
+ }
+ else {
+ /*
+ * Otherwise, just print out the return code
+ */
+ ND_PRINT((ndo, " errcode"));
+ INTOUT();
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|cb]"));
+}
+
+/*
+ * Handle calls to the AFS protection database server
+ */
+
+static void
+prot_print(netdissect_options *ndo,
+ register const u_char *bp, int length)
+{
+ unsigned long i;
+ int pt_op;
+
+ if (length <= (int)sizeof(struct rx_header))
+ return;
+
+ if (ndo->ndo_snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
+ goto trunc;
+ }
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from ptserver/ptint.xg
+ */
+
+ pt_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
+
+ ND_PRINT((ndo, " pt"));
+
+ if (is_ubik(pt_op)) {
+ ubik_print(ndo, bp);
+ return;
+ }
+
+ ND_PRINT((ndo, " call %s", tok2str(pt_req, "op#%d", pt_op)));
+
+ /*
+ * Decode some of the arguments to the PT calls
+ */
+
+ bp += sizeof(struct rx_header) + 4;
+
+ switch (pt_op) {
+ case 500: /* I New User */
+ STROUT(PRNAMEMAX);
+ ND_PRINT((ndo, " id"));
+ INTOUT();
+ ND_PRINT((ndo, " oldid"));
+ INTOUT();
+ break;
+ case 501: /* Where is it */
+ case 506: /* Delete */
+ case 508: /* Get CPS */
+ case 512: /* List entry */
+ case 514: /* List elements */
+ case 517: /* List owned */
+ case 518: /* Get CPS2 */
+ case 519: /* Get host CPS */
+ case 530: /* List super groups */
+ ND_PRINT((ndo, " id"));
+ INTOUT();
+ break;
+ case 502: /* Dump entry */
+ ND_PRINT((ndo, " pos"));
+ INTOUT();
+ break;
+ case 503: /* Add to group */
+ case 507: /* Remove from group */
+ case 515: /* Is a member of? */
+ ND_PRINT((ndo, " uid"));
+ INTOUT();
+ ND_PRINT((ndo, " gid"));
+ INTOUT();
+ break;
+ case 504: /* Name to ID */
+ {
+ unsigned long j;
+ ND_TCHECK2(bp[0], 4);
+ j = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+
+ /*
+ * Who designed this chicken-shit protocol?
+ *
+ * Each character is stored as a 32-bit
+ * integer!
+ */
+
+ for (i = 0; i < j; i++) {
+ VECOUT(PRNAMEMAX);
+ }
+ if (j == 0)
+ ND_PRINT((ndo, " <none!>"));
+ }
+ break;
+ case 505: /* Id to name */
+ {
+ unsigned long j;
+ ND_PRINT((ndo, " ids:"));
+ ND_TCHECK2(bp[0], 4);
+ i = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ for (j = 0; j < i; j++)
+ INTOUT();
+ if (j == 0)
+ ND_PRINT((ndo, " <none!>"));
+ }
+ break;
+ case 509: /* New entry */
+ STROUT(PRNAMEMAX);
+ ND_PRINT((ndo, " flag"));
+ INTOUT();
+ ND_PRINT((ndo, " oid"));
+ INTOUT();
+ break;
+ case 511: /* Set max */
+ ND_PRINT((ndo, " id"));
+ INTOUT();
+ ND_PRINT((ndo, " gflag"));
+ INTOUT();
+ break;
+ case 513: /* Change entry */
+ ND_PRINT((ndo, " id"));
+ INTOUT();
+ STROUT(PRNAMEMAX);
+ ND_PRINT((ndo, " oldid"));
+ INTOUT();
+ ND_PRINT((ndo, " newid"));
+ INTOUT();
+ break;
+ case 520: /* Update entry */
+ ND_PRINT((ndo, " id"));
+ INTOUT();
+ STROUT(PRNAMEMAX);
+ break;
+ default:
+ ;
+ }
+
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|pt]"));
+}
+
+/*
+ * Handle replies to the AFS protection service
+ */
+
+static void
+prot_reply_print(netdissect_options *ndo,
+ register const u_char *bp, int length, int32_t opcode)
+{
+ struct rx_header *rxh;
+ unsigned long i;
+
+ if (length < (int)sizeof(struct rx_header))
+ return;
+
+ rxh = (struct rx_header *) bp;
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from ptserver/ptint.xg. Check to see if it's a
+ * Ubik call, however.
+ */
+
+ ND_PRINT((ndo, " pt"));
+
+ if (is_ubik(opcode)) {
+ ubik_reply_print(ndo, bp, length, opcode);
+ return;
+ }
+
+ ND_PRINT((ndo, " reply %s", tok2str(pt_req, "op#%d", opcode)));
+
+ bp += sizeof(struct rx_header);
+
+ /*
+ * If it was a data packet, interpret the response
+ */
+
+ if (rxh->type == RX_PACKET_TYPE_DATA)
+ switch (opcode) {
+ case 504: /* Name to ID */
+ {
+ unsigned long j;
+ ND_PRINT((ndo, " ids:"));
+ ND_TCHECK2(bp[0], 4);
+ i = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ for (j = 0; j < i; j++)
+ INTOUT();
+ if (j == 0)
+ ND_PRINT((ndo, " <none!>"));
+ }
+ break;
+ case 505: /* ID to name */
+ {
+ unsigned long j;
+ ND_TCHECK2(bp[0], 4);
+ j = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+
+ /*
+ * Who designed this chicken-shit protocol?
+ *
+ * Each character is stored as a 32-bit
+ * integer!
+ */
+
+ for (i = 0; i < j; i++) {
+ VECOUT(PRNAMEMAX);
+ }
+ if (j == 0)
+ ND_PRINT((ndo, " <none!>"));
+ }
+ break;
+ case 508: /* Get CPS */
+ case 514: /* List elements */
+ case 517: /* List owned */
+ case 518: /* Get CPS2 */
+ case 519: /* Get host CPS */
+ {
+ unsigned long j;
+ ND_TCHECK2(bp[0], 4);
+ j = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ for (i = 0; i < j; i++) {
+ INTOUT();
+ }
+ if (j == 0)
+ ND_PRINT((ndo, " <none!>"));
+ }
+ break;
+ case 510: /* List max */
+ ND_PRINT((ndo, " maxuid"));
+ INTOUT();
+ ND_PRINT((ndo, " maxgid"));
+ INTOUT();
+ break;
+ default:
+ ;
+ }
+ else {
+ /*
+ * Otherwise, just print out the return code
+ */
+ ND_PRINT((ndo, " errcode"));
+ INTOUT();
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|pt]"));
+}
+
+/*
+ * Handle calls to the AFS volume location database service
+ */
+
+static void
+vldb_print(netdissect_options *ndo,
+ register const u_char *bp, int length)
+{
+ int vldb_op;
+ unsigned long i;
+
+ if (length <= (int)sizeof(struct rx_header))
+ return;
+
+ if (ndo->ndo_snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
+ goto trunc;
+ }
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from vlserver/vldbint.xg
+ */
+
+ vldb_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
+
+ ND_PRINT((ndo, " vldb"));
+
+ if (is_ubik(vldb_op)) {
+ ubik_print(ndo, bp);
+ return;
+ }
+ ND_PRINT((ndo, " call %s", tok2str(vldb_req, "op#%d", vldb_op)));
+
+ /*
+ * Decode some of the arguments to the VLDB calls
+ */
+
+ bp += sizeof(struct rx_header) + 4;
+
+ switch (vldb_op) {
+ case 501: /* Create new volume */
+ case 517: /* Create entry N */
+ VECOUT(VLNAMEMAX);
+ break;
+ case 502: /* Delete entry */
+ case 503: /* Get entry by ID */
+ case 507: /* Update entry */
+ case 508: /* Set lock */
+ case 509: /* Release lock */
+ case 518: /* Get entry by ID N */
+ ND_PRINT((ndo, " volid"));
+ INTOUT();
+ ND_TCHECK2(bp[0], sizeof(int32_t));
+ i = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ if (i <= 2)
+ ND_PRINT((ndo, " type %s", voltype[i]));
+ break;
+ case 504: /* Get entry by name */
+ case 519: /* Get entry by name N */
+ case 524: /* Update entry by name */
+ case 527: /* Get entry by name U */
+ STROUT(VLNAMEMAX);
+ break;
+ case 505: /* Get new vol id */
+ ND_PRINT((ndo, " bump"));
+ INTOUT();
+ break;
+ case 506: /* Replace entry */
+ case 520: /* Replace entry N */
+ ND_PRINT((ndo, " volid"));
+ INTOUT();
+ ND_TCHECK2(bp[0], sizeof(int32_t));
+ i = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ if (i <= 2)
+ ND_PRINT((ndo, " type %s", voltype[i]));
+ VECOUT(VLNAMEMAX);
+ break;
+ case 510: /* List entry */
+ case 521: /* List entry N */
+ ND_PRINT((ndo, " index"));
+ INTOUT();
+ break;
+ default:
+ ;
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|vldb]"));
+}
+
+/*
+ * Handle replies to the AFS volume location database service
+ */
+
+static void
+vldb_reply_print(netdissect_options *ndo,
+ register const u_char *bp, int length, int32_t opcode)
+{
+ struct rx_header *rxh;
+ unsigned long i;
+
+ if (length < (int)sizeof(struct rx_header))
+ return;
+
+ rxh = (struct rx_header *) bp;
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from vlserver/vldbint.xg. Check to see if it's a
+ * Ubik call, however.
+ */
+
+ ND_PRINT((ndo, " vldb"));
+
+ if (is_ubik(opcode)) {
+ ubik_reply_print(ndo, bp, length, opcode);
+ return;
+ }
+
+ ND_PRINT((ndo, " reply %s", tok2str(vldb_req, "op#%d", opcode)));
+
+ bp += sizeof(struct rx_header);
+
+ /*
+ * If it was a data packet, interpret the response
+ */
+
+ if (rxh->type == RX_PACKET_TYPE_DATA)
+ switch (opcode) {
+ case 510: /* List entry */
+ ND_PRINT((ndo, " count"));
+ INTOUT();
+ ND_PRINT((ndo, " nextindex"));
+ INTOUT();
+ case 503: /* Get entry by id */
+ case 504: /* Get entry by name */
+ { unsigned long nservers, j;
+ VECOUT(VLNAMEMAX);
+ ND_TCHECK2(bp[0], sizeof(int32_t));
+ bp += sizeof(int32_t);
+ ND_PRINT((ndo, " numservers"));
+ ND_TCHECK2(bp[0], sizeof(int32_t));
+ nservers = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ ND_PRINT((ndo, " %lu", nservers));
+ ND_PRINT((ndo, " servers"));
+ for (i = 0; i < 8; i++) {
+ ND_TCHECK2(bp[0], sizeof(int32_t));
+ if (i < nservers)
+ ND_PRINT((ndo, " %s",
+ intoa(((struct in_addr *) bp)->s_addr)));
+ bp += sizeof(int32_t);
+ }
+ ND_PRINT((ndo, " partitions"));
+ for (i = 0; i < 8; i++) {
+ ND_TCHECK2(bp[0], sizeof(int32_t));
+ j = EXTRACT_32BITS(bp);
+ if (i < nservers && j <= 26)
+ ND_PRINT((ndo, " %c", 'a' + (int)j));
+ else if (i < nservers)
+ ND_PRINT((ndo, " %lu", j));
+ bp += sizeof(int32_t);
+ }
+ ND_TCHECK2(bp[0], 8 * sizeof(int32_t));
+ bp += 8 * sizeof(int32_t);
+ ND_PRINT((ndo, " rwvol"));
+ UINTOUT();
+ ND_PRINT((ndo, " rovol"));
+ UINTOUT();
+ ND_PRINT((ndo, " backup"));
+ UINTOUT();
+ }
+ break;
+ case 505: /* Get new volume ID */
+ ND_PRINT((ndo, " newvol"));
+ UINTOUT();
+ break;
+ case 521: /* List entry */
+ case 529: /* List entry U */
+ ND_PRINT((ndo, " count"));
+ INTOUT();
+ ND_PRINT((ndo, " nextindex"));
+ INTOUT();
+ case 518: /* Get entry by ID N */
+ case 519: /* Get entry by name N */
+ { unsigned long nservers, j;
+ VECOUT(VLNAMEMAX);
+ ND_PRINT((ndo, " numservers"));
+ ND_TCHECK2(bp[0], sizeof(int32_t));
+ nservers = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ ND_PRINT((ndo, " %lu", nservers));
+ ND_PRINT((ndo, " servers"));
+ for (i = 0; i < 13; i++) {
+ ND_TCHECK2(bp[0], sizeof(int32_t));
+ if (i < nservers)
+ ND_PRINT((ndo, " %s",
+ intoa(((struct in_addr *) bp)->s_addr)));
+ bp += sizeof(int32_t);
+ }
+ ND_PRINT((ndo, " partitions"));
+ for (i = 0; i < 13; i++) {
+ ND_TCHECK2(bp[0], sizeof(int32_t));
+ j = EXTRACT_32BITS(bp);
+ if (i < nservers && j <= 26)
+ ND_PRINT((ndo, " %c", 'a' + (int)j));
+ else if (i < nservers)
+ ND_PRINT((ndo, " %lu", j));
+ bp += sizeof(int32_t);
+ }
+ ND_TCHECK2(bp[0], 13 * sizeof(int32_t));
+ bp += 13 * sizeof(int32_t);
+ ND_PRINT((ndo, " rwvol"));
+ UINTOUT();
+ ND_PRINT((ndo, " rovol"));
+ UINTOUT();
+ ND_PRINT((ndo, " backup"));
+ UINTOUT();
+ }
+ break;
+ case 526: /* Get entry by ID U */
+ case 527: /* Get entry by name U */
+ { unsigned long nservers, j;
+ VECOUT(VLNAMEMAX);
+ ND_PRINT((ndo, " numservers"));
+ ND_TCHECK2(bp[0], sizeof(int32_t));
+ nservers = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ ND_PRINT((ndo, " %lu", nservers));
+ ND_PRINT((ndo, " servers"));
+ for (i = 0; i < 13; i++) {
+ if (i < nservers) {
+ ND_PRINT((ndo, " afsuuid"));
+ AFSUUIDOUT();
+ } else {
+ ND_TCHECK2(bp[0], 44);
+ bp += 44;
+ }
+ }
+ ND_TCHECK2(bp[0], 4 * 13);
+ bp += 4 * 13;
+ ND_PRINT((ndo, " partitions"));
+ for (i = 0; i < 13; i++) {
+ ND_TCHECK2(bp[0], sizeof(int32_t));
+ j = EXTRACT_32BITS(bp);
+ if (i < nservers && j <= 26)
+ ND_PRINT((ndo, " %c", 'a' + (int)j));
+ else if (i < nservers)
+ ND_PRINT((ndo, " %lu", j));
+ bp += sizeof(int32_t);
+ }
+ ND_TCHECK2(bp[0], 13 * sizeof(int32_t));
+ bp += 13 * sizeof(int32_t);
+ ND_PRINT((ndo, " rwvol"));
+ UINTOUT();
+ ND_PRINT((ndo, " rovol"));
+ UINTOUT();
+ ND_PRINT((ndo, " backup"));
+ UINTOUT();
+ }
+ default:
+ ;
+ }
+
+ else {
+ /*
+ * Otherwise, just print out the return code
+ */
+ ND_PRINT((ndo, " errcode"));
+ INTOUT();
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|vldb]"));
+}
+
+/*
+ * Handle calls to the AFS Kerberos Authentication service
+ */
+
+static void
+kauth_print(netdissect_options *ndo,
+ register const u_char *bp, int length)
+{
+ int kauth_op;
+
+ if (length <= (int)sizeof(struct rx_header))
+ return;
+
+ if (ndo->ndo_snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
+ goto trunc;
+ }
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from kauth/kauth.rg
+ */
+
+ kauth_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
+
+ ND_PRINT((ndo, " kauth"));
+
+ if (is_ubik(kauth_op)) {
+ ubik_print(ndo, bp);
+ return;
+ }
+
+
+ ND_PRINT((ndo, " call %s", tok2str(kauth_req, "op#%d", kauth_op)));
+
+ /*
+ * Decode some of the arguments to the KA calls
+ */
+
+ bp += sizeof(struct rx_header) + 4;
+
+ switch (kauth_op) {
+ case 1: /* Authenticate old */;
+ case 21: /* Authenticate */
+ case 22: /* Authenticate-V2 */
+ case 2: /* Change PW */
+ case 5: /* Set fields */
+ case 6: /* Create user */
+ case 7: /* Delete user */
+ case 8: /* Get entry */
+ case 14: /* Unlock */
+ case 15: /* Lock status */
+ ND_PRINT((ndo, " principal"));
+ STROUT(KANAMEMAX);
+ STROUT(KANAMEMAX);
+ break;
+ case 3: /* GetTicket-old */
+ case 23: /* GetTicket */
+ {
+ int i;
+ ND_PRINT((ndo, " kvno"));
+ INTOUT();
+ ND_PRINT((ndo, " domain"));
+ STROUT(KANAMEMAX);
+ ND_TCHECK2(bp[0], sizeof(int32_t));
+ i = (int) EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ ND_TCHECK2(bp[0], i);
+ bp += i;
+ ND_PRINT((ndo, " principal"));
+ STROUT(KANAMEMAX);
+ STROUT(KANAMEMAX);
+ break;
+ }
+ case 4: /* Set Password */
+ ND_PRINT((ndo, " principal"));
+ STROUT(KANAMEMAX);
+ STROUT(KANAMEMAX);
+ ND_PRINT((ndo, " kvno"));
+ INTOUT();
+ break;
+ case 12: /* Get password */
+ ND_PRINT((ndo, " name"));
+ STROUT(KANAMEMAX);
+ break;
+ default:
+ ;
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|kauth]"));
+}
+
+/*
+ * Handle replies to the AFS Kerberos Authentication Service
+ */
+
+static void
+kauth_reply_print(netdissect_options *ndo,
+ register const u_char *bp, int length, int32_t opcode)
+{
+ struct rx_header *rxh;
+
+ if (length <= (int)sizeof(struct rx_header))
+ return;
+
+ rxh = (struct rx_header *) bp;
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from kauth/kauth.rg
+ */
+
+ ND_PRINT((ndo, " kauth"));
+
+ if (is_ubik(opcode)) {
+ ubik_reply_print(ndo, bp, length, opcode);
+ return;
+ }
+
+ ND_PRINT((ndo, " reply %s", tok2str(kauth_req, "op#%d", opcode)));
+
+ bp += sizeof(struct rx_header);
+
+ /*
+ * If it was a data packet, interpret the response.
+ */
+
+ if (rxh->type == RX_PACKET_TYPE_DATA)
+ /* Well, no, not really. Leave this for later */
+ ;
+ else {
+ /*
+ * Otherwise, just print out the return code
+ */
+ ND_PRINT((ndo, " errcode"));
+ INTOUT();
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|kauth]"));
+}
+
+/*
+ * Handle calls to the AFS Volume location service
+ */
+
+static void
+vol_print(netdissect_options *ndo,
+ register const u_char *bp, int length)
+{
+ int vol_op;
+
+ if (length <= (int)sizeof(struct rx_header))
+ return;
+
+ if (ndo->ndo_snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
+ goto trunc;
+ }
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from volser/volint.xg
+ */
+
+ vol_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
+
+ ND_PRINT((ndo, " vol call %s", tok2str(vol_req, "op#%d", vol_op)));
+
+ bp += sizeof(struct rx_header) + 4;
+
+ switch (vol_op) {
+ case 100: /* Create volume */
+ ND_PRINT((ndo, " partition"));
+ UINTOUT();
+ ND_PRINT((ndo, " name"));
+ STROUT(AFSNAMEMAX);
+ ND_PRINT((ndo, " type"));
+ UINTOUT();
+ ND_PRINT((ndo, " parent"));
+ UINTOUT();
+ break;
+ case 101: /* Delete volume */
+ case 107: /* Get flags */
+ ND_PRINT((ndo, " trans"));
+ UINTOUT();
+ break;
+ case 102: /* Restore */
+ ND_PRINT((ndo, " totrans"));
+ UINTOUT();
+ ND_PRINT((ndo, " flags"));
+ UINTOUT();
+ break;
+ case 103: /* Forward */
+ ND_PRINT((ndo, " fromtrans"));
+ UINTOUT();
+ ND_PRINT((ndo, " fromdate"));
+ DATEOUT();
+ DESTSERVEROUT();
+ ND_PRINT((ndo, " desttrans"));
+ INTOUT();
+ break;
+ case 104: /* End trans */
+ ND_PRINT((ndo, " trans"));
+ UINTOUT();
+ break;
+ case 105: /* Clone */
+ ND_PRINT((ndo, " trans"));
+ UINTOUT();
+ ND_PRINT((ndo, " purgevol"));
+ UINTOUT();
+ ND_PRINT((ndo, " newtype"));
+ UINTOUT();
+ ND_PRINT((ndo, " newname"));
+ STROUT(AFSNAMEMAX);
+ break;
+ case 106: /* Set flags */
+ ND_PRINT((ndo, " trans"));
+ UINTOUT();
+ ND_PRINT((ndo, " flags"));
+ UINTOUT();
+ break;
+ case 108: /* Trans create */
+ ND_PRINT((ndo, " vol"));
+ UINTOUT();
+ ND_PRINT((ndo, " partition"));
+ UINTOUT();
+ ND_PRINT((ndo, " flags"));
+ UINTOUT();
+ break;
+ case 109: /* Dump */
+ case 655537: /* Get size */
+ ND_PRINT((ndo, " fromtrans"));
+ UINTOUT();
+ ND_PRINT((ndo, " fromdate"));
+ DATEOUT();
+ break;
+ case 110: /* Get n-th volume */
+ ND_PRINT((ndo, " index"));
+ UINTOUT();
+ break;
+ case 111: /* Set forwarding */
+ ND_PRINT((ndo, " tid"));
+ UINTOUT();
+ ND_PRINT((ndo, " newsite"));
+ UINTOUT();
+ break;
+ case 112: /* Get name */
+ case 113: /* Get status */
+ ND_PRINT((ndo, " tid"));
+ break;
+ case 114: /* Signal restore */
+ ND_PRINT((ndo, " name"));
+ STROUT(AFSNAMEMAX);
+ ND_PRINT((ndo, " type"));
+ UINTOUT();
+ ND_PRINT((ndo, " pid"));
+ UINTOUT();
+ ND_PRINT((ndo, " cloneid"));
+ UINTOUT();
+ break;
+ case 116: /* List volumes */
+ ND_PRINT((ndo, " partition"));
+ UINTOUT();
+ ND_PRINT((ndo, " flags"));
+ UINTOUT();
+ break;
+ case 117: /* Set id types */
+ ND_PRINT((ndo, " tid"));
+ UINTOUT();
+ ND_PRINT((ndo, " name"));
+ STROUT(AFSNAMEMAX);
+ ND_PRINT((ndo, " type"));
+ UINTOUT();
+ ND_PRINT((ndo, " pid"));
+ UINTOUT();
+ ND_PRINT((ndo, " clone"));
+ UINTOUT();
+ ND_PRINT((ndo, " backup"));
+ UINTOUT();
+ break;
+ case 119: /* Partition info */
+ ND_PRINT((ndo, " name"));
+ STROUT(AFSNAMEMAX);
+ break;
+ case 120: /* Reclone */
+ ND_PRINT((ndo, " tid"));
+ UINTOUT();
+ break;
+ case 121: /* List one volume */
+ case 122: /* Nuke volume */
+ case 124: /* Extended List volumes */
+ case 125: /* Extended List one volume */
+ case 65536: /* Convert RO to RW volume */
+ ND_PRINT((ndo, " partid"));
+ UINTOUT();
+ ND_PRINT((ndo, " volid"));
+ UINTOUT();
+ break;
+ case 123: /* Set date */
+ ND_PRINT((ndo, " tid"));
+ UINTOUT();
+ ND_PRINT((ndo, " date"));
+ DATEOUT();
+ break;
+ case 126: /* Set info */
+ ND_PRINT((ndo, " tid"));
+ UINTOUT();
+ break;
+ case 128: /* Forward multiple */
+ ND_PRINT((ndo, " fromtrans"));
+ UINTOUT();
+ ND_PRINT((ndo, " fromdate"));
+ DATEOUT();
+ {
+ unsigned long i, j;
+ ND_TCHECK2(bp[0], 4);
+ j = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ for (i = 0; i < j; i++) {
+ DESTSERVEROUT();
+ if (i != j - 1)
+ ND_PRINT((ndo, ","));
+ }
+ if (j == 0)
+ ND_PRINT((ndo, " <none!>"));
+ }
+ break;
+ case 65538: /* Dump version 2 */
+ ND_PRINT((ndo, " fromtrans"));
+ UINTOUT();
+ ND_PRINT((ndo, " fromdate"));
+ DATEOUT();
+ ND_PRINT((ndo, " flags"));
+ UINTOUT();
+ break;
+ default:
+ ;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|vol]"));
+}
+
+/*
+ * Handle replies to the AFS Volume Service
+ */
+
+static void
+vol_reply_print(netdissect_options *ndo,
+ register const u_char *bp, int length, int32_t opcode)
+{
+ struct rx_header *rxh;
+
+ if (length <= (int)sizeof(struct rx_header))
+ return;
+
+ rxh = (struct rx_header *) bp;
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from volser/volint.xg
+ */
+
+ ND_PRINT((ndo, " vol reply %s", tok2str(vol_req, "op#%d", opcode)));
+
+ bp += sizeof(struct rx_header);
+
+ /*
+ * If it was a data packet, interpret the response.
+ */
+
+ if (rxh->type == RX_PACKET_TYPE_DATA) {
+ switch (opcode) {
+ case 100: /* Create volume */
+ ND_PRINT((ndo, " volid"));
+ UINTOUT();
+ ND_PRINT((ndo, " trans"));
+ UINTOUT();
+ break;
+ case 104: /* End transaction */
+ UINTOUT();
+ break;
+ case 105: /* Clone */
+ ND_PRINT((ndo, " newvol"));
+ UINTOUT();
+ break;
+ case 107: /* Get flags */
+ UINTOUT();
+ break;
+ case 108: /* Transaction create */
+ ND_PRINT((ndo, " trans"));
+ UINTOUT();
+ break;
+ case 110: /* Get n-th volume */
+ ND_PRINT((ndo, " volume"));
+ UINTOUT();
+ ND_PRINT((ndo, " partition"));
+ UINTOUT();
+ break;
+ case 112: /* Get name */
+ STROUT(AFSNAMEMAX);
+ break;
+ case 113: /* Get status */
+ ND_PRINT((ndo, " volid"));
+ UINTOUT();
+ ND_PRINT((ndo, " nextuniq"));
+ UINTOUT();
+ ND_PRINT((ndo, " type"));
+ UINTOUT();
+ ND_PRINT((ndo, " parentid"));
+ UINTOUT();
+ ND_PRINT((ndo, " clone"));
+ UINTOUT();
+ ND_PRINT((ndo, " backup"));
+ UINTOUT();
+ ND_PRINT((ndo, " restore"));
+ UINTOUT();
+ ND_PRINT((ndo, " maxquota"));
+ UINTOUT();
+ ND_PRINT((ndo, " minquota"));
+ UINTOUT();
+ ND_PRINT((ndo, " owner"));
+ UINTOUT();
+ ND_PRINT((ndo, " create"));
+ DATEOUT();
+ ND_PRINT((ndo, " access"));
+ DATEOUT();
+ ND_PRINT((ndo, " update"));
+ DATEOUT();
+ ND_PRINT((ndo, " expire"));
+ DATEOUT();
+ ND_PRINT((ndo, " backup"));
+ DATEOUT();
+ ND_PRINT((ndo, " copy"));
+ DATEOUT();
+ break;
+ case 115: /* Old list partitions */
+ break;
+ case 116: /* List volumes */
+ case 121: /* List one volume */
+ {
+ unsigned long i, j;
+ ND_TCHECK2(bp[0], 4);
+ j = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ for (i = 0; i < j; i++) {
+ ND_PRINT((ndo, " name"));
+ VECOUT(32);
+ ND_PRINT((ndo, " volid"));
+ UINTOUT();
+ ND_PRINT((ndo, " type"));
+ bp += sizeof(int32_t) * 21;
+ if (i != j - 1)
+ ND_PRINT((ndo, ","));
+ }
+ if (j == 0)
+ ND_PRINT((ndo, " <none!>"));
+ }
+ break;
+
+
+ default:
+ ;
+ }
+ } else {
+ /*
+ * Otherwise, just print out the return code
+ */
+ ND_PRINT((ndo, " errcode"));
+ INTOUT();
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|vol]"));
+}
+
+/*
+ * Handle calls to the AFS BOS service
+ */
+
+static void
+bos_print(netdissect_options *ndo,
+ register const u_char *bp, int length)
+{
+ int bos_op;
+
+ if (length <= (int)sizeof(struct rx_header))
+ return;
+
+ if (ndo->ndo_snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
+ goto trunc;
+ }
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from bozo/bosint.xg
+ */
+
+ bos_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
+
+ ND_PRINT((ndo, " bos call %s", tok2str(bos_req, "op#%d", bos_op)));
+
+ /*
+ * Decode some of the arguments to the BOS calls
+ */
+
+ bp += sizeof(struct rx_header) + 4;
+
+ switch (bos_op) {
+ case 80: /* Create B node */
+ ND_PRINT((ndo, " type"));
+ STROUT(BOSNAMEMAX);
+ ND_PRINT((ndo, " instance"));
+ STROUT(BOSNAMEMAX);
+ break;
+ case 81: /* Delete B node */
+ case 83: /* Get status */
+ case 85: /* Get instance info */
+ case 87: /* Add super user */
+ case 88: /* Delete super user */
+ case 93: /* Set cell name */
+ case 96: /* Add cell host */
+ case 97: /* Delete cell host */
+ case 104: /* Restart */
+ case 106: /* Uninstall */
+ case 108: /* Exec */
+ case 112: /* Getlog */
+ case 114: /* Get instance strings */
+ STROUT(BOSNAMEMAX);
+ break;
+ case 82: /* Set status */
+ case 98: /* Set T status */
+ STROUT(BOSNAMEMAX);
+ ND_PRINT((ndo, " status"));
+ INTOUT();
+ break;
+ case 86: /* Get instance parm */
+ STROUT(BOSNAMEMAX);
+ ND_PRINT((ndo, " num"));
+ INTOUT();
+ break;
+ case 84: /* Enumerate instance */
+ case 89: /* List super users */
+ case 90: /* List keys */
+ case 91: /* Add key */
+ case 92: /* Delete key */
+ case 95: /* Get cell host */
+ INTOUT();
+ break;
+ case 105: /* Install */
+ STROUT(BOSNAMEMAX);
+ ND_PRINT((ndo, " size"));
+ INTOUT();
+ ND_PRINT((ndo, " flags"));
+ INTOUT();
+ ND_PRINT((ndo, " date"));
+ INTOUT();
+ break;
+ default:
+ ;
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|bos]"));
+}
+
+/*
+ * Handle replies to the AFS BOS Service
+ */
+
+static void
+bos_reply_print(netdissect_options *ndo,
+ register const u_char *bp, int length, int32_t opcode)
+{
+ struct rx_header *rxh;
+
+ if (length <= (int)sizeof(struct rx_header))
+ return;
+
+ rxh = (struct rx_header *) bp;
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from volser/volint.xg
+ */
+
+ ND_PRINT((ndo, " bos reply %s", tok2str(bos_req, "op#%d", opcode)));
+
+ bp += sizeof(struct rx_header);
+
+ /*
+ * If it was a data packet, interpret the response.
+ */
+
+ if (rxh->type == RX_PACKET_TYPE_DATA)
+ /* Well, no, not really. Leave this for later */
+ ;
+ else {
+ /*
+ * Otherwise, just print out the return code
+ */
+ ND_PRINT((ndo, " errcode"));
+ INTOUT();
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|bos]"));
+}
+
+/*
+ * Check to see if this is a Ubik opcode.
+ */
+
+static int
+is_ubik(uint32_t opcode)
+{
+ if ((opcode >= VOTE_LOW && opcode <= VOTE_HIGH) ||
+ (opcode >= DISK_LOW && opcode <= DISK_HIGH))
+ return(1);
+ else
+ return(0);
+}
+
+/*
+ * Handle Ubik opcodes to any one of the replicated database services
+ */
+
+static void
+ubik_print(netdissect_options *ndo,
+ register const u_char *bp)
+{
+ int ubik_op;
+ int32_t temp;
+
+ /*
+ * Print out the afs call we're invoking. The table used here was
+ * gleaned from ubik/ubik_int.xg
+ */
+
+ ubik_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
+
+ ND_PRINT((ndo, " ubik call %s", tok2str(ubik_req, "op#%d", ubik_op)));
+
+ /*
+ * Decode some of the arguments to the Ubik calls
+ */
+
+ bp += sizeof(struct rx_header) + 4;
+
+ switch (ubik_op) {
+ case 10000: /* Beacon */
+ ND_TCHECK2(bp[0], 4);
+ temp = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ ND_PRINT((ndo, " syncsite %s", temp ? "yes" : "no"));
+ ND_PRINT((ndo, " votestart"));
+ DATEOUT();
+ ND_PRINT((ndo, " dbversion"));
+ UBIK_VERSIONOUT();
+ ND_PRINT((ndo, " tid"));
+ UBIK_VERSIONOUT();
+ break;
+ case 10003: /* Get sync site */
+ ND_PRINT((ndo, " site"));
+ UINTOUT();
+ break;
+ case 20000: /* Begin */
+ case 20001: /* Commit */
+ case 20007: /* Abort */
+ case 20008: /* Release locks */
+ case 20010: /* Writev */
+ ND_PRINT((ndo, " tid"));
+ UBIK_VERSIONOUT();
+ break;
+ case 20002: /* Lock */
+ ND_PRINT((ndo, " tid"));
+ UBIK_VERSIONOUT();
+ ND_PRINT((ndo, " file"));
+ INTOUT();
+ ND_PRINT((ndo, " pos"));
+ INTOUT();
+ ND_PRINT((ndo, " length"));
+ INTOUT();
+ temp = EXTRACT_32BITS(bp);
+ bp += sizeof(int32_t);
+ tok2str(ubik_lock_types, "type %d", temp);
+ break;
+ case 20003: /* Write */
+ ND_PRINT((ndo, " tid"));
+ UBIK_VERSIONOUT();
+ ND_PRINT((ndo, " file"));
+ INTOUT();
+ ND_PRINT((ndo, " pos"));
+ INTOUT();
+ break;
+ case 20005: /* Get file */
+ ND_PRINT((ndo, " file"));
+ INTOUT();
+ break;
+ case 20006: /* Send file */
+ ND_PRINT((ndo, " file"));
+ INTOUT();
+ ND_PRINT((ndo, " length"));
+ INTOUT();
+ ND_PRINT((ndo, " dbversion"));
+ UBIK_VERSIONOUT();
+ break;
+ case 20009: /* Truncate */
+ ND_PRINT((ndo, " tid"));
+ UBIK_VERSIONOUT();
+ ND_PRINT((ndo, " file"));
+ INTOUT();
+ ND_PRINT((ndo, " length"));
+ INTOUT();
+ break;
+ case 20012: /* Set version */
+ ND_PRINT((ndo, " tid"));
+ UBIK_VERSIONOUT();
+ ND_PRINT((ndo, " oldversion"));
+ UBIK_VERSIONOUT();
+ ND_PRINT((ndo, " newversion"));
+ UBIK_VERSIONOUT();
+ break;
+ default:
+ ;
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|ubik]"));
+}
+
+/*
+ * Handle Ubik replies to any one of the replicated database services
+ */
+
+static void
+ubik_reply_print(netdissect_options *ndo,
+ register const u_char *bp, int length, int32_t opcode)
+{
+ struct rx_header *rxh;
+
+ if (length < (int)sizeof(struct rx_header))
+ return;
+
+ rxh = (struct rx_header *) bp;
+
+ /*
+ * Print out the ubik call we're invoking. This table was gleaned
+ * from ubik/ubik_int.xg
+ */
+
+ ND_PRINT((ndo, " ubik reply %s", tok2str(ubik_req, "op#%d", opcode)));
+
+ bp += sizeof(struct rx_header);
+
+ /*
+ * If it was a data packet, print out the arguments to the Ubik calls
+ */
+
+ if (rxh->type == RX_PACKET_TYPE_DATA)
+ switch (opcode) {
+ case 10000: /* Beacon */
+ ND_PRINT((ndo, " vote no"));
+ break;
+ case 20004: /* Get version */
+ ND_PRINT((ndo, " dbversion"));
+ UBIK_VERSIONOUT();
+ break;
+ default:
+ ;
+ }
+
+ /*
+ * Otherwise, print out "yes" it it was a beacon packet (because
+ * that's how yes votes are returned, go figure), otherwise
+ * just print out the error code.
+ */
+
+ else
+ switch (opcode) {
+ case 10000: /* Beacon */
+ ND_PRINT((ndo, " vote yes until"));
+ DATEOUT();
+ break;
+ default:
+ ND_PRINT((ndo, " errcode"));
+ INTOUT();
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|ubik]"));
+}
+
+/*
+ * Handle RX ACK packets.
+ */
+
+static void
+rx_ack_print(netdissect_options *ndo,
+ register const u_char *bp, int length)
+{
+ struct rx_ackPacket *rxa;
+ int i, start, last;
+ uint32_t firstPacket;
+
+ if (length < (int)sizeof(struct rx_header))
+ return;
+
+ bp += sizeof(struct rx_header);
+
+ /*
+ * This may seem a little odd .... the rx_ackPacket structure
+ * contains an array of individual packet acknowledgements
+ * (used for selective ack/nack), but since it's variable in size,
+ * we don't want to truncate based on the size of the whole
+ * rx_ackPacket structure.
+ */
+
+ ND_TCHECK2(bp[0], sizeof(struct rx_ackPacket) - RX_MAXACKS);
+
+ rxa = (struct rx_ackPacket *) bp;
+ bp += (sizeof(struct rx_ackPacket) - RX_MAXACKS);
+
+ /*
+ * Print out a few useful things from the ack packet structure
+ */
+
+ if (ndo->ndo_vflag > 2)
+ ND_PRINT((ndo, " bufspace %d maxskew %d",
+ (int) EXTRACT_16BITS(&rxa->bufferSpace),
+ (int) EXTRACT_16BITS(&rxa->maxSkew)));
+
+ firstPacket = EXTRACT_32BITS(&rxa->firstPacket);
+ ND_PRINT((ndo, " first %d serial %d reason %s",
+ firstPacket, EXTRACT_32BITS(&rxa->serial),
+ tok2str(rx_ack_reasons, "#%d", (int) rxa->reason)));
+
+ /*
+ * Okay, now we print out the ack array. The way _this_ works
+ * is that we start at "first", and step through the ack array.
+ * If we have a contiguous range of acks/nacks, try to
+ * collapse them into a range.
+ *
+ * If you're really clever, you might have noticed that this
+ * doesn't seem quite correct. Specifically, due to structure
+ * padding, sizeof(struct rx_ackPacket) - RX_MAXACKS won't actually
+ * yield the start of the ack array (because RX_MAXACKS is 255
+ * and the structure will likely get padded to a 2 or 4 byte
+ * boundary). However, this is the way it's implemented inside
+ * of AFS - the start of the extra fields are at
+ * sizeof(struct rx_ackPacket) - RX_MAXACKS + nAcks, which _isn't_
+ * the exact start of the ack array. Sigh. That's why we aren't
+ * using bp, but instead use rxa->acks[]. But nAcks gets added
+ * to bp after this, so bp ends up at the right spot. Go figure.
+ */
+
+ if (rxa->nAcks != 0) {
+
+ ND_TCHECK2(bp[0], rxa->nAcks);
+
+ /*
+ * Sigh, this is gross, but it seems to work to collapse
+ * ranges correctly.
+ */
+
+ for (i = 0, start = last = -2; i < rxa->nAcks; i++)
+ if (rxa->acks[i] == RX_ACK_TYPE_ACK) {
+
+ /*
+ * I figured this deserved _some_ explanation.
+ * First, print "acked" and the packet seq
+ * number if this is the first time we've
+ * seen an acked packet.
+ */
+
+ if (last == -2) {
+ ND_PRINT((ndo, " acked %d", firstPacket + i));
+ start = i;
+ }
+
+ /*
+ * Otherwise, if there is a skip in
+ * the range (such as an nacked packet in
+ * the middle of some acked packets),
+ * then print the current packet number
+ * seperated from the last number by
+ * a comma.
+ */
+
+ else if (last != i - 1) {
+ ND_PRINT((ndo, ",%d", firstPacket + i));
+ start = i;
+ }
+
+ /*
+ * We always set last to the value of
+ * the last ack we saw. Conversely, start
+ * is set to the value of the first ack
+ * we saw in a range.
+ */
+
+ last = i;
+
+ /*
+ * Okay, this bit a code gets executed when
+ * we hit a nack ... in _this_ case we
+ * want to print out the range of packets
+ * that were acked, so we need to print
+ * the _previous_ packet number seperated
+ * from the first by a dash (-). Since we
+ * already printed the first packet above,
+ * just print the final packet. Don't
+ * do this if there will be a single-length
+ * range.
+ */
+ } else if (last == i - 1 && start != last)
+ ND_PRINT((ndo, "-%d", firstPacket + i - 1));
+
+ /*
+ * So, what's going on here? We ran off the end of the
+ * ack list, and if we got a range we need to finish it up.
+ * So we need to determine if the last packet in the list
+ * was an ack (if so, then last will be set to it) and
+ * we need to see if the last range didn't start with the
+ * last packet (because if it _did_, then that would mean
+ * that the packet number has already been printed and
+ * we don't need to print it again).
+ */
+
+ if (last == i - 1 && start != last)
+ ND_PRINT((ndo, "-%d", firstPacket + i - 1));
+
+ /*
+ * Same as above, just without comments
+ */
+
+ for (i = 0, start = last = -2; i < rxa->nAcks; i++)
+ if (rxa->acks[i] == RX_ACK_TYPE_NACK) {
+ if (last == -2) {
+ ND_PRINT((ndo, " nacked %d", firstPacket + i));
+ start = i;
+ } else if (last != i - 1) {
+ ND_PRINT((ndo, ",%d", firstPacket + i));
+ start = i;
+ }
+ last = i;
+ } else if (last == i - 1 && start != last)
+ ND_PRINT((ndo, "-%d", firstPacket + i - 1));
+
+ if (last == i - 1 && start != last)
+ ND_PRINT((ndo, "-%d", firstPacket + i - 1));
+
+ bp += rxa->nAcks;
+ }
+
+
+ /*
+ * These are optional fields; depending on your version of AFS,
+ * you may or may not see them
+ */
+
+#define TRUNCRET(n) if (ndo->ndo_snapend - bp + 1 <= n) return;
+
+ if (ndo->ndo_vflag > 1) {
+ TRUNCRET(4);
+ ND_PRINT((ndo, " ifmtu"));
+ INTOUT();
+
+ TRUNCRET(4);
+ ND_PRINT((ndo, " maxmtu"));
+ INTOUT();
+
+ TRUNCRET(4);
+ ND_PRINT((ndo, " rwind"));
+ INTOUT();
+
+ TRUNCRET(4);
+ ND_PRINT((ndo, " maxpackets"));
+ INTOUT();
+ }
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, " [|ack]"));
+}
+#undef TRUNCRET
--- /dev/null
+/*
+ * Copyright (c) 2001 Protocol Engineering Lab, University of Delaware
+ *
+ * Jerry Heinz <gheinz@astro.temple.edu>
+ * John Fiore <jfiore@joda.cis.temple.edu>
+ * Armando L. Caro Jr. <acaro@cis.udel.edu>
+ *
+ * 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 of the Laboratory 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-sctp.c,v 1.6 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
+#include "ip.h"
+#ifdef INET6
+#include "ip6.h"
+#endif
+
+/* Definitions from:
+ *
+ * SCTP reference Implementation Copyright (C) 1999 Cisco And Motorola
+ *
+ * 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 Cisco nor of Motorola 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.
+ *
+ * This file is part of the SCTP reference Implementation
+ *
+ *
+ * Please send any bug reports or fixes you make to one of the following email
+ * addresses:
+ *
+ * rstewar1@email.mot.com
+ * kmorneau@cisco.com
+ * qxie1@email.mot.com
+ *
+ * Any bugs reported given to us we will try to fix... any fixes shared will
+ * be incorperated into the next SCTP release.
+ */
+
+/* The valid defines for all message
+ * types know to SCTP. 0 is reserved
+ */
+#define SCTP_DATA 0x00
+#define SCTP_INITIATION 0x01
+#define SCTP_INITIATION_ACK 0x02
+#define SCTP_SELECTIVE_ACK 0x03
+#define SCTP_HEARTBEAT_REQUEST 0x04
+#define SCTP_HEARTBEAT_ACK 0x05
+#define SCTP_ABORT_ASSOCIATION 0x06
+#define SCTP_SHUTDOWN 0x07
+#define SCTP_SHUTDOWN_ACK 0x08
+#define SCTP_OPERATION_ERR 0x09
+#define SCTP_COOKIE_ECHO 0x0a
+#define SCTP_COOKIE_ACK 0x0b
+#define SCTP_ECN_ECHO 0x0c
+#define SCTP_ECN_CWR 0x0d
+#define SCTP_SHUTDOWN_COMPLETE 0x0e
+#define SCTP_FORWARD_CUM_TSN 0xc0
+#define SCTP_RELIABLE_CNTL 0xc1
+#define SCTP_RELIABLE_CNTL_ACK 0xc2
+
+static const struct tok sctp_chunkid_str[] = {
+ { SCTP_DATA, "DATA" },
+ { SCTP_INITIATION, "INIT" },
+ { SCTP_INITIATION_ACK, "INIT ACK" },
+ { SCTP_SELECTIVE_ACK, "SACK" },
+ { SCTP_HEARTBEAT_REQUEST, "HB REQ" },
+ { SCTP_HEARTBEAT_ACK, "HB ACK" },
+ { SCTP_ABORT_ASSOCIATION, "ABORT" },
+ { SCTP_SHUTDOWN, "SHUTDOWN" },
+ { SCTP_SHUTDOWN_ACK, "SHUTDOWN ACK" },
+ { SCTP_OPERATION_ERR, "OP ERR" },
+ { SCTP_COOKIE_ECHO, "COOKIE ECHO" },
+ { SCTP_COOKIE_ACK, "COOKIE ACK" },
+ { SCTP_ECN_ECHO, "ECN ECHO" },
+ { SCTP_ECN_CWR, "ECN CWR" },
+ { SCTP_SHUTDOWN_COMPLETE, "SHUTDOWN COMPLETE" },
+ { SCTP_FORWARD_CUM_TSN, "FOR CUM TSN" },
+ { SCTP_RELIABLE_CNTL, "REL CTRL" },
+ { SCTP_RELIABLE_CNTL_ACK, "REL CTRL ACK" },
+ { 0, NULL }
+};
+
+/* Data Chuck Specific Flags */
+#define SCTP_DATA_FRAG_MASK 0x03
+#define SCTP_DATA_MIDDLE_FRAG 0x00
+#define SCTP_DATA_LAST_FRAG 0x01
+#define SCTP_DATA_FIRST_FRAG 0x02
+#define SCTP_DATA_NOT_FRAG 0x03
+#define SCTP_DATA_UNORDERED 0x04
+
+#define SCTP_ADDRMAX 60
+
+#define CHAN_HP 6704
+#define CHAN_MP 6705
+#define CHAN_LP 6706
+
+/* the sctp common header */
+
+struct sctpHeader{
+ uint16_t source;
+ uint16_t destination;
+ uint32_t verificationTag;
+ uint32_t adler32;
+};
+
+/* various descriptor parsers */
+
+struct sctpChunkDesc{
+ uint8_t chunkID;
+ uint8_t chunkFlg;
+ uint16_t chunkLength;
+};
+
+struct sctpParamDesc{
+ uint16_t paramType;
+ uint16_t paramLength;
+};
+
+
+struct sctpRelChunkDesc{
+ struct sctpChunkDesc chk;
+ uint32_t serialNumber;
+};
+
+struct sctpVendorSpecificParam {
+ struct sctpParamDesc p; /* type must be 0xfffe */
+ uint32_t vendorId; /* vendor ID from RFC 1700 */
+ uint16_t vendorSpecificType;
+ uint16_t vendorSpecificLen;
+};
+
+
+/* Structures for the control parts */
+
+
+
+/* Sctp association init request/ack */
+
+/* this is used for init ack, too */
+struct sctpInitiation{
+ uint32_t initTag; /* tag of mine */
+ uint32_t rcvWindowCredit; /* rwnd */
+ uint16_t NumPreopenStreams; /* OS */
+ uint16_t MaxInboundStreams; /* MIS */
+ uint32_t initialTSN;
+ /* optional param's follow in sctpParamDesc form */
+};
+
+struct sctpV4IpAddress{
+ struct sctpParamDesc p; /* type is set to SCTP_IPV4_PARAM_TYPE, len=10 */
+ uint32_t ipAddress;
+};
+
+
+struct sctpV6IpAddress{
+ struct sctpParamDesc p; /* type is set to SCTP_IPV6_PARAM_TYPE, len=22 */
+ uint8_t ipAddress[16];
+};
+
+struct sctpDNSName{
+ struct sctpParamDesc param;
+ uint8_t name[1];
+};
+
+
+struct sctpCookiePreserve{
+ struct sctpParamDesc p; /* type is set to SCTP_COOKIE_PRESERVE, len=8 */
+ uint32_t extraTime;
+};
+
+
+struct sctpTimeStamp{
+ uint32_t ts_sec;
+ uint32_t ts_usec;
+};
+
+/* wire structure of my cookie */
+struct cookieMessage{
+ uint32_t TieTag_curTag; /* copied from assoc if present */
+ uint32_t TieTag_hisTag; /* copied from assoc if present */
+ int32_t cookieLife; /* life I will award this cookie */
+ struct sctpTimeStamp timeEnteringState; /* the time I built cookie */
+ struct sctpInitiation initAckISent; /* the INIT-ACK that I sent to my peer */
+ uint32_t addressWhereISent[4]; /* I make this 4 ints so I get 128bits for future */
+ int32_t addrtype; /* address type */
+ uint16_t locScope; /* V6 local scope flag */
+ uint16_t siteScope; /* V6 site scope flag */
+ /* at the end is tacked on the INIT chunk sent in
+ * its entirety and of course our
+ * signature.
+ */
+};
+
+
+/* this guy is for use when
+ * I have a initiate message gloming the
+ * things together.
+
+ */
+struct sctpUnifiedInit{
+ struct sctpChunkDesc uh;
+ struct sctpInitiation initm;
+};
+
+struct sctpSendableInit{
+ struct sctpHeader mh;
+ struct sctpUnifiedInit msg;
+};
+
+
+/* Selective Acknowledgement
+ * has the following structure with
+ * a optional ammount of trailing int's
+ * on the last part (based on the numberOfDesc
+ * field).
+ */
+
+struct sctpSelectiveAck{
+ uint32_t highestConseqTSN;
+ uint32_t updatedRwnd;
+ uint16_t numberOfdesc;
+ uint16_t numDupTsns;
+};
+
+struct sctpSelectiveFrag{
+ uint16_t fragmentStart;
+ uint16_t fragmentEnd;
+};
+
+
+struct sctpUnifiedSack{
+ struct sctpChunkDesc uh;
+ struct sctpSelectiveAck sack;
+};
+
+/* for both RTT request/response the
+ * following is sent
+ */
+
+struct sctpHBrequest {
+ uint32_t time_value_1;
+ uint32_t time_value_2;
+};
+
+/* here is what I read and respond with to. */
+struct sctpHBunified{
+ struct sctpChunkDesc hdr;
+ struct sctpParamDesc hb;
+};
+
+
+/* here is what I send */
+struct sctpHBsender{
+ struct sctpChunkDesc hdr;
+ struct sctpParamDesc hb;
+ struct sctpHBrequest rtt;
+ int8_t addrFmt[SCTP_ADDRMAX];
+ uint16_t userreq;
+};
+
+
+
+/* for the abort and shutdown ACK
+ * we must carry the init tag in the common header. Just the
+ * common header is all that is needed with a chunk descriptor.
+ */
+struct sctpUnifiedAbort{
+ struct sctpChunkDesc uh;
+};
+
+struct sctpUnifiedAbortLight{
+ struct sctpHeader mh;
+ struct sctpChunkDesc uh;
+};
+
+struct sctpUnifiedAbortHeavy{
+ struct sctpHeader mh;
+ struct sctpChunkDesc uh;
+ uint16_t causeCode;
+ uint16_t causeLen;
+};
+
+/* For the graceful shutdown we must carry
+ * the tag (in common header) and the highest consequitive acking value
+ */
+struct sctpShutdown {
+ uint32_t TSN_Seen;
+};
+
+struct sctpUnifiedShutdown{
+ struct sctpChunkDesc uh;
+ struct sctpShutdown shut;
+};
+
+/* in the unified message we add the trailing
+ * stream id since it is the only message
+ * that is defined as a operation error.
+ */
+struct sctpOpErrorCause{
+ uint16_t cause;
+ uint16_t causeLen;
+};
+
+struct sctpUnifiedOpError{
+ struct sctpChunkDesc uh;
+ struct sctpOpErrorCause c;
+};
+
+struct sctpUnifiedStreamError{
+ struct sctpHeader mh;
+ struct sctpChunkDesc uh;
+ struct sctpOpErrorCause c;
+ uint16_t strmNum;
+ uint16_t reserved;
+};
+
+struct staleCookieMsg{
+ struct sctpHeader mh;
+ struct sctpChunkDesc uh;
+ struct sctpOpErrorCause c;
+ uint32_t moretime;
+};
+
+/* the following is used in all sends
+ * where nothing is needed except the
+ * chunk/type i.e. shutdownAck Abort */
+
+struct sctpUnifiedSingleMsg{
+ struct sctpHeader mh;
+ struct sctpChunkDesc uh;
+};
+
+struct sctpDataPart{
+ uint32_t TSN;
+ uint16_t streamId;
+ uint16_t sequence;
+ uint32_t payloadtype;
+};
+
+struct sctpUnifiedDatagram{
+ struct sctpChunkDesc uh;
+ struct sctpDataPart dp;
+};
+
+struct sctpECN_echo{
+ struct sctpChunkDesc uh;
+ uint32_t Lowest_TSN;
+};
+
+
+struct sctpCWR{
+ struct sctpChunkDesc uh;
+ uint32_t TSN_reduced_at;
+};
+
+static const struct tok ForCES_channels[] = {
+ { CHAN_HP, "ForCES HP" },
+ { CHAN_MP, "ForCES MP" },
+ { CHAN_LP, "ForCES LP" },
+ { 0, NULL }
+};
+
+/* data chunk's payload protocol identifiers */
+
+#define SCTP_PPID_IUA 1
+#define SCTP_PPID_M2UA 2
+#define SCTP_PPID_M3UA 3
+#define SCTP_PPID_SUA 4
+#define SCTP_PPID_M2PA 5
+#define SCTP_PPID_V5UA 6
+#define SCTP_PPID_H248 7
+#define SCTP_PPID_BICC 8
+#define SCTP_PPID_TALI 9
+#define SCTP_PPID_DUA 10
+#define SCTP_PPID_ASAP 11
+#define SCTP_PPID_ENRP 12
+#define SCTP_PPID_H323 13
+#define SCTP_PPID_QIPC 14
+#define SCTP_PPID_SIMCO 15
+#define SCTP_PPID_DDPSC 16
+#define SCTP_PPID_DDPSSC 17
+#define SCTP_PPID_S1AP 18
+#define SCTP_PPID_RUA 19
+#define SCTP_PPID_HNBAP 20
+#define SCTP_PPID_FORCES_HP 21
+#define SCTP_PPID_FORCES_MP 22
+#define SCTP_PPID_FORCES_LP 23
+#define SCTP_PPID_SBC_AP 24
+#define SCTP_PPID_NBAP 25
+/* 26 */
+#define SCTP_PPID_X2AP 27
+
+static const struct tok PayloadProto_idents[] = {
+ { SCTP_PPID_IUA, "ISDN Q.921" },
+ { SCTP_PPID_M2UA, "M2UA" },
+ { SCTP_PPID_M3UA, "M3UA" },
+ { SCTP_PPID_SUA, "SUA" },
+ { SCTP_PPID_M2PA, "M2PA" },
+ { SCTP_PPID_V5UA, "V5.2" },
+ { SCTP_PPID_H248, "H.248" },
+ { SCTP_PPID_BICC, "BICC" },
+ { SCTP_PPID_TALI, "TALI" },
+ { SCTP_PPID_DUA, "DUA" },
+ { SCTP_PPID_ASAP, "ASAP" },
+ { SCTP_PPID_ENRP, "ENRP" },
+ { SCTP_PPID_H323, "H.323" },
+ { SCTP_PPID_QIPC, "Q.IPC" },
+ { SCTP_PPID_SIMCO, "SIMCO" },
+ { SCTP_PPID_DDPSC, "DDPSC" },
+ { SCTP_PPID_DDPSSC, "DDPSSC" },
+ { SCTP_PPID_S1AP, "S1AP" },
+ { SCTP_PPID_RUA, "RUA" },
+ { SCTP_PPID_HNBAP, "HNBAP" },
+ { SCTP_PPID_FORCES_HP, "ForCES HP" },
+ { SCTP_PPID_FORCES_MP, "ForCES MP" },
+ { SCTP_PPID_FORCES_LP, "ForCES LP" },
+ { SCTP_PPID_SBC_AP, "SBc-AP" },
+ { SCTP_PPID_NBAP, "NBAP" },
+ /* 26 */
+ { SCTP_PPID_X2AP, "X2AP" },
+ { 0, NULL }
+};
+
+
+static inline int isForCES_port(u_short Port)
+{
+ if (Port == CHAN_HP)
+ return 1;
+ if (Port == CHAN_MP)
+ return 1;
+ if (Port == CHAN_LP)
+ return 1;
+
+ return 0;
+}
+
+void sctp_print(netdissect_options *ndo,
+ const u_char *bp, /* beginning of sctp packet */
+ const u_char *bp2, /* beginning of enclosing */
+ u_int sctpPacketLength) /* ip packet */
+{
+ const struct sctpHeader *sctpPktHdr;
+ const struct ip *ip;
+#ifdef INET6
+ const struct ip6_hdr *ip6;
+#endif
+ const void *endPacketPtr;
+ u_short sourcePort, destPort;
+ int chunkCount;
+ const struct sctpChunkDesc *chunkDescPtr;
+ const void *nextChunk;
+ const char *sep;
+ int isforces = 0;
+
+
+ sctpPktHdr = (const struct sctpHeader*) bp;
+ endPacketPtr = (const u_char*)sctpPktHdr+sctpPacketLength;
+
+ if( (u_long) endPacketPtr > (u_long) ndo->ndo_snapend)
+ endPacketPtr = (const void *) ndo->ndo_snapend;
+ ip = (struct ip *)bp2;
+#ifdef INET6
+ if (IP_V(ip) == 6)
+ ip6 = (const struct ip6_hdr *)bp2;
+ else
+ ip6 = NULL;
+#endif /*INET6*/
+ ND_TCHECK(*sctpPktHdr);
+
+ if (sctpPacketLength < sizeof(struct sctpHeader))
+ {
+ ND_PRINT((ndo, "truncated-sctp - %ld bytes missing!",
+ (long)sctpPacketLength-sizeof(struct sctpHeader)));
+ return;
+ }
+
+ /* sctpPacketLength -= sizeof(struct sctpHeader); packet length */
+ /* is now only as long as the payload */
+
+ sourcePort = EXTRACT_16BITS(&sctpPktHdr->source);
+ destPort = EXTRACT_16BITS(&sctpPktHdr->destination);
+
+#ifdef INET6
+ if (ip6) {
+ ND_PRINT((ndo, "%s.%d > %s.%d: sctp",
+ ip6addr_string(ndo, &ip6->ip6_src),
+ sourcePort,
+ ip6addr_string(ndo, &ip6->ip6_dst),
+ destPort));
+ } else
+#endif /*INET6*/
+ {
+ ND_PRINT((ndo, "%s.%d > %s.%d: sctp",
+ ipaddr_string(ndo, &ip->ip_src),
+ sourcePort,
+ ipaddr_string(ndo, &ip->ip_dst),
+ destPort));
+ }
+
+ if (isForCES_port(sourcePort)) {
+ ND_PRINT((ndo, "[%s]", tok2str(ForCES_channels, NULL, sourcePort)));
+ isforces = 1;
+ }
+ if (isForCES_port(destPort)) {
+ ND_PRINT((ndo, "[%s]", tok2str(ForCES_channels, NULL, destPort)));
+ isforces = 1;
+ }
+
+ if (ndo->ndo_vflag >= 2)
+ sep = "\n\t";
+ else
+ sep = " (";
+ /* cycle through all chunks, printing information on each one */
+ for (chunkCount = 0,
+ chunkDescPtr = (const struct sctpChunkDesc *)
+ ((const u_char*) sctpPktHdr + sizeof(struct sctpHeader));
+ chunkDescPtr != NULL &&
+ ( (const void *)
+ ((const u_char *) chunkDescPtr + sizeof(struct sctpChunkDesc))
+ <= endPacketPtr);
+
+ chunkDescPtr = (const struct sctpChunkDesc *) nextChunk, chunkCount++)
+ {
+ uint16_t chunkLength;
+ const u_char *chunkEnd;
+ uint16_t align;
+
+ ND_TCHECK(*chunkDescPtr);
+ chunkLength = EXTRACT_16BITS(&chunkDescPtr->chunkLength);
+ if (chunkLength < sizeof(*chunkDescPtr)) {
+ ND_PRINT((ndo, "%s%d) [Bad chunk length %u]", sep, chunkCount+1, chunkLength));
+ break;
+ }
+
+ ND_TCHECK2(*((uint8_t *)chunkDescPtr), chunkLength);
+ chunkEnd = ((const u_char*)chunkDescPtr + chunkLength);
+
+ align=chunkLength % 4;
+ if (align != 0)
+ align = 4 - align;
+
+ nextChunk = (const void *) (chunkEnd + align);
+
+ ND_PRINT((ndo, "%s%d) ", sep, chunkCount+1));
+ ND_PRINT((ndo, "[%s] ", tok2str(sctp_chunkid_str, "Unknown chunk type: 0x%x",
+ chunkDescPtr->chunkID)));
+ switch (chunkDescPtr->chunkID)
+ {
+ case SCTP_DATA :
+ {
+ const struct sctpDataPart *dataHdrPtr;
+ uint32_t ppid;
+ const u_char *payloadPtr;
+ u_int payload_size;
+
+ if ((chunkDescPtr->chunkFlg & SCTP_DATA_UNORDERED)
+ == SCTP_DATA_UNORDERED)
+ ND_PRINT((ndo, "(U)"));
+
+ if ((chunkDescPtr->chunkFlg & SCTP_DATA_FIRST_FRAG)
+ == SCTP_DATA_FIRST_FRAG)
+ ND_PRINT((ndo, "(B)"));
+
+ if ((chunkDescPtr->chunkFlg & SCTP_DATA_LAST_FRAG)
+ == SCTP_DATA_LAST_FRAG)
+ ND_PRINT((ndo, "(E)"));
+
+ if( ((chunkDescPtr->chunkFlg & SCTP_DATA_UNORDERED)
+ == SCTP_DATA_UNORDERED)
+ ||
+ ((chunkDescPtr->chunkFlg & SCTP_DATA_FIRST_FRAG)
+ == SCTP_DATA_FIRST_FRAG)
+ ||
+ ((chunkDescPtr->chunkFlg & SCTP_DATA_LAST_FRAG)
+ == SCTP_DATA_LAST_FRAG) )
+ ND_PRINT((ndo, " "));
+
+ dataHdrPtr=(const struct sctpDataPart*)(chunkDescPtr+1);
+
+ ppid = EXTRACT_32BITS(&dataHdrPtr->payloadtype);
+ ND_PRINT((ndo, "[TSN: %u] ", EXTRACT_32BITS(&dataHdrPtr->TSN)));
+ ND_PRINT((ndo, "[SID: %u] ", EXTRACT_16BITS(&dataHdrPtr->streamId)));
+ ND_PRINT((ndo, "[SSEQ %u] ", EXTRACT_16BITS(&dataHdrPtr->sequence)));
+ ND_PRINT((ndo, "[PPID %s] ",
+ tok2str(PayloadProto_idents, "0x%x", ppid)));
+
+ if (!isforces) {
+ isforces = (ppid == SCTP_PPID_FORCES_HP) ||
+ (ppid == SCTP_PPID_FORCES_MP) ||
+ (ppid == SCTP_PPID_FORCES_LP);
+ }
+
+ payloadPtr = (const u_char *) (dataHdrPtr + 1);
+ if (EXTRACT_16BITS(&chunkDescPtr->chunkLength) <
+ sizeof(struct sctpDataPart) + sizeof(struct sctpChunkDesc) + 1) {
+ ND_PRINT((ndo, "bogus chunk length %u]", EXTRACT_16BITS(&chunkDescPtr->chunkLength)));
+ return;
+ }
+
+ payload_size = EXTRACT_16BITS(&chunkDescPtr->chunkLength) -
+ (sizeof(struct sctpDataPart) + sizeof(struct sctpChunkDesc));
+
+ if (isforces) {
+ forces_print(ndo, payloadPtr, payload_size);
+ } else if (ndo->ndo_vflag >= 2) { /* if verbose output is specified */
+ /* at the command line */
+ switch (ppid) {
+ case SCTP_PPID_M3UA :
+ m3ua_print(ndo, payloadPtr, payload_size);
+ break;
+ default:
+ ND_PRINT((ndo, "[Payload"));
+ if (!ndo->ndo_suppress_default_print) {
+ ND_PRINT((ndo, ":"));
+ ND_DEFAULTPRINT(payloadPtr, payload_size);
+ }
+ ND_PRINT((ndo, "]"));
+ break;
+ }
+ }
+ break;
+ }
+ case SCTP_INITIATION :
+ {
+ const struct sctpInitiation *init;
+
+ init=(const struct sctpInitiation*)(chunkDescPtr+1);
+ ND_PRINT((ndo, "[init tag: %u] ", EXTRACT_32BITS(&init->initTag)));
+ ND_PRINT((ndo, "[rwnd: %u] ", EXTRACT_32BITS(&init->rcvWindowCredit)));
+ ND_PRINT((ndo, "[OS: %u] ", EXTRACT_16BITS(&init->NumPreopenStreams)));
+ ND_PRINT((ndo, "[MIS: %u] ", EXTRACT_16BITS(&init->MaxInboundStreams)));
+ ND_PRINT((ndo, "[init TSN: %u] ", EXTRACT_32BITS(&init->initialTSN)));
+
+#if(0) /* ALC you can add code for optional params here */
+ if( (init+1) < chunkEnd )
+ ND_PRINT((ndo, " @@@@@ UNFINISHED @@@@@@%s\n",
+ "Optional params present, but not printed."));
+#endif
+ break;
+ }
+ case SCTP_INITIATION_ACK :
+ {
+ const struct sctpInitiation *init;
+
+ init=(const struct sctpInitiation*)(chunkDescPtr+1);
+ ND_PRINT((ndo, "[init tag: %u] ", EXTRACT_32BITS(&init->initTag)));
+ ND_PRINT((ndo, "[rwnd: %u] ", EXTRACT_32BITS(&init->rcvWindowCredit)));
+ ND_PRINT((ndo, "[OS: %u] ", EXTRACT_16BITS(&init->NumPreopenStreams)));
+ ND_PRINT((ndo, "[MIS: %u] ", EXTRACT_16BITS(&init->MaxInboundStreams)));
+ ND_PRINT((ndo, "[init TSN: %u] ", EXTRACT_32BITS(&init->initialTSN)));
+
+#if(0) /* ALC you can add code for optional params here */
+ if( (init+1) < chunkEnd )
+ ND_PRINT((ndo, " @@@@@ UNFINISHED @@@@@@%s\n",
+ "Optional params present, but not printed."));
+#endif
+ break;
+ }
+ case SCTP_SELECTIVE_ACK:
+ {
+ const struct sctpSelectiveAck *sack;
+ const struct sctpSelectiveFrag *frag;
+ int fragNo, tsnNo;
+ const u_char *dupTSN;
+
+ sack=(const struct sctpSelectiveAck*)(chunkDescPtr+1);
+ ND_PRINT((ndo, "[cum ack %u] ", EXTRACT_32BITS(&sack->highestConseqTSN)));
+ ND_PRINT((ndo, "[a_rwnd %u] ", EXTRACT_32BITS(&sack->updatedRwnd)));
+ ND_PRINT((ndo, "[#gap acks %u] ", EXTRACT_16BITS(&sack->numberOfdesc)));
+ ND_PRINT((ndo, "[#dup tsns %u] ", EXTRACT_16BITS(&sack->numDupTsns)));
+
+
+ /* print gaps */
+ for (frag = ( (const struct sctpSelectiveFrag *)
+ ((const struct sctpSelectiveAck *) sack+1)),
+ fragNo=0;
+ (const void *)frag < nextChunk && fragNo < EXTRACT_16BITS(&sack->numberOfdesc);
+ frag++, fragNo++)
+ ND_PRINT((ndo, "\n\t\t[gap ack block #%d: start = %u, end = %u] ",
+ fragNo+1,
+ EXTRACT_32BITS(&sack->highestConseqTSN) + EXTRACT_16BITS(&frag->fragmentStart),
+ EXTRACT_32BITS(&sack->highestConseqTSN) + EXTRACT_16BITS(&frag->fragmentEnd)));
+
+
+ /* print duplicate TSNs */
+ for (dupTSN = (const u_char *)frag, tsnNo=0;
+ (const void *) dupTSN < nextChunk && tsnNo<EXTRACT_16BITS(&sack->numDupTsns);
+ dupTSN += 4, tsnNo++)
+ ND_PRINT((ndo, "\n\t\t[dup TSN #%u: %u] ", tsnNo+1,
+ EXTRACT_32BITS(dupTSN)));
+
+ break;
+ }
+ }
+
+ if (ndo->ndo_vflag < 2)
+ sep = ", (";
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|sctp]"));
+}
--- /dev/null
+/*
+ * Copyright (c) 1998-2007 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.
+ *
+ * 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>
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-sflow.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+/*
+ * sFlow datagram
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Sflow version (2,4,5) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IP version (1 for IPv4 | 2 for IPv6) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IP Address AGENT (4 or 16 bytes) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Sub agent ID |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Datagram sequence number |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Switch uptime in ms |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | num samples in datagram |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ */
+
+struct sflow_datagram_t {
+ uint8_t version[4];
+ uint8_t ip_version[4];
+ uint8_t agent[4];
+ uint8_t agent_id[4];
+ uint8_t seqnum[4];
+ uint8_t uptime[4];
+ uint8_t samples[4];
+};
+
+struct sflow_sample_header {
+ uint8_t format[4];
+ uint8_t len[4];
+};
+
+#define SFLOW_FLOW_SAMPLE 1
+#define SFLOW_COUNTER_SAMPLE 2
+#define SFLOW_EXPANDED_FLOW_SAMPLE 3
+#define SFLOW_EXPANDED_COUNTER_SAMPLE 4
+
+static const struct tok sflow_format_values[] = {
+ { SFLOW_FLOW_SAMPLE, "flow sample" },
+ { SFLOW_COUNTER_SAMPLE, "counter sample" },
+ { SFLOW_EXPANDED_FLOW_SAMPLE, "expanded flow sample" },
+ { SFLOW_EXPANDED_COUNTER_SAMPLE, "expanded counter sample" },
+ { 0, NULL}
+};
+
+struct sflow_flow_sample_t {
+ uint8_t seqnum[4];
+ uint8_t typesource[4];
+ uint8_t rate[4];
+ uint8_t pool[4];
+ uint8_t drops[4];
+ uint8_t in_interface[4];
+ uint8_t out_interface[4];
+ uint8_t records[4];
+
+};
+
+struct sflow_expanded_flow_sample_t {
+ uint8_t seqnum[4];
+ uint8_t type[4];
+ uint8_t index[4];
+ uint8_t rate[4];
+ uint8_t pool[4];
+ uint8_t drops[4];
+ uint8_t in_interface_format[4];
+ uint8_t in_interface_value[4];
+ uint8_t out_interface_format[4];
+ uint8_t out_interface_value[4];
+ uint8_t records[4];
+};
+
+#define SFLOW_FLOW_RAW_PACKET 1
+#define SFLOW_FLOW_ETHERNET_FRAME 2
+#define SFLOW_FLOW_IPV4_DATA 3
+#define SFLOW_FLOW_IPV6_DATA 4
+#define SFLOW_FLOW_EXTENDED_SWITCH_DATA 1001
+#define SFLOW_FLOW_EXTENDED_ROUTER_DATA 1002
+#define SFLOW_FLOW_EXTENDED_GATEWAY_DATA 1003
+#define SFLOW_FLOW_EXTENDED_USER_DATA 1004
+#define SFLOW_FLOW_EXTENDED_URL_DATA 1005
+#define SFLOW_FLOW_EXTENDED_MPLS_DATA 1006
+#define SFLOW_FLOW_EXTENDED_NAT_DATA 1007
+#define SFLOW_FLOW_EXTENDED_MPLS_TUNNEL 1008
+#define SFLOW_FLOW_EXTENDED_MPLS_VC 1009
+#define SFLOW_FLOW_EXTENDED_MPLS_FEC 1010
+#define SFLOW_FLOW_EXTENDED_MPLS_LVP_FEC 1011
+#define SFLOW_FLOW_EXTENDED_VLAN_TUNNEL 1012
+
+static const struct tok sflow_flow_type_values[] = {
+ { SFLOW_FLOW_RAW_PACKET, "Raw packet"},
+ { SFLOW_FLOW_ETHERNET_FRAME, "Ethernet frame"},
+ { SFLOW_FLOW_IPV4_DATA, "IPv4 Data"},
+ { SFLOW_FLOW_IPV6_DATA, "IPv6 Data"},
+ { SFLOW_FLOW_EXTENDED_SWITCH_DATA, "Extended Switch data"},
+ { SFLOW_FLOW_EXTENDED_ROUTER_DATA, "Extended Router data"},
+ { SFLOW_FLOW_EXTENDED_GATEWAY_DATA, "Extended Gateway data"},
+ { SFLOW_FLOW_EXTENDED_USER_DATA, "Extended User data"},
+ { SFLOW_FLOW_EXTENDED_URL_DATA, "Extended URL data"},
+ { SFLOW_FLOW_EXTENDED_MPLS_DATA, "Extended MPLS data"},
+ { SFLOW_FLOW_EXTENDED_NAT_DATA, "Extended NAT data"},
+ { SFLOW_FLOW_EXTENDED_MPLS_TUNNEL, "Extended MPLS tunnel"},
+ { SFLOW_FLOW_EXTENDED_MPLS_VC, "Extended MPLS VC"},
+ { SFLOW_FLOW_EXTENDED_MPLS_FEC, "Extended MPLS FEC"},
+ { SFLOW_FLOW_EXTENDED_MPLS_LVP_FEC, "Extended MPLS LVP FEC"},
+ { SFLOW_FLOW_EXTENDED_VLAN_TUNNEL, "Extended VLAN Tunnel"},
+ { 0, NULL}
+};
+
+#define SFLOW_HEADER_PROTOCOL_ETHERNET 1
+#define SFLOW_HEADER_PROTOCOL_IPV4 11
+#define SFLOW_HEADER_PROTOCOL_IPV6 12
+
+static const struct tok sflow_flow_raw_protocol_values[] = {
+ { SFLOW_HEADER_PROTOCOL_ETHERNET, "Ethernet"},
+ { SFLOW_HEADER_PROTOCOL_IPV4, "IPv4"},
+ { SFLOW_HEADER_PROTOCOL_IPV6, "IPv6"},
+ { 0, NULL}
+};
+
+struct sflow_expanded_flow_raw_t {
+ uint8_t protocol[4];
+ uint8_t length[4];
+ uint8_t stripped_bytes[4];
+ uint8_t header_size[4];
+};
+
+struct sflow_ethernet_frame_t {
+ uint8_t length[4];
+ uint8_t src_mac[8];
+ uint8_t dst_mac[8];
+ uint8_t type[4];
+};
+
+struct sflow_extended_switch_data_t {
+ uint8_t src_vlan[4];
+ uint8_t src_pri[4];
+ uint8_t dst_vlan[4];
+ uint8_t dst_pri[4];
+};
+
+struct sflow_counter_record_t {
+ uint8_t format[4];
+ uint8_t length[4];
+};
+
+struct sflow_flow_record_t {
+ uint8_t format[4];
+ uint8_t length[4];
+};
+
+struct sflow_counter_sample_t {
+ uint8_t seqnum[4];
+ uint8_t typesource[4];
+ uint8_t records[4];
+};
+
+struct sflow_expanded_counter_sample_t {
+ uint8_t seqnum[4];
+ uint8_t type[4];
+ uint8_t index[4];
+ uint8_t records[4];
+};
+
+#define SFLOW_COUNTER_GENERIC 1
+#define SFLOW_COUNTER_ETHERNET 2
+#define SFLOW_COUNTER_TOKEN_RING 3
+#define SFLOW_COUNTER_BASEVG 4
+#define SFLOW_COUNTER_VLAN 5
+#define SFLOW_COUNTER_PROCESSOR 1001
+
+static const struct tok sflow_counter_type_values[] = {
+ { SFLOW_COUNTER_GENERIC, "Generic counter"},
+ { SFLOW_COUNTER_ETHERNET, "Ethernet counter"},
+ { SFLOW_COUNTER_TOKEN_RING, "Token ring counter"},
+ { SFLOW_COUNTER_BASEVG, "100 BaseVG counter"},
+ { SFLOW_COUNTER_VLAN, "Vlan counter"},
+ { SFLOW_COUNTER_PROCESSOR, "Processor counter"},
+ { 0, NULL}
+};
+
+#define SFLOW_IFACE_DIRECTION_UNKNOWN 0
+#define SFLOW_IFACE_DIRECTION_FULLDUPLEX 1
+#define SFLOW_IFACE_DIRECTION_HALFDUPLEX 2
+#define SFLOW_IFACE_DIRECTION_IN 3
+#define SFLOW_IFACE_DIRECTION_OUT 4
+
+static const struct tok sflow_iface_direction_values[] = {
+ { SFLOW_IFACE_DIRECTION_UNKNOWN, "unknown"},
+ { SFLOW_IFACE_DIRECTION_FULLDUPLEX, "full-duplex"},
+ { SFLOW_IFACE_DIRECTION_HALFDUPLEX, "half-duplex"},
+ { SFLOW_IFACE_DIRECTION_IN, "in"},
+ { SFLOW_IFACE_DIRECTION_OUT, "out"},
+ { 0, NULL}
+};
+
+struct sflow_generic_counter_t {
+ uint8_t ifindex[4];
+ uint8_t iftype[4];
+ uint8_t ifspeed[8];
+ uint8_t ifdirection[4];
+ uint8_t ifstatus[4];
+ uint8_t ifinoctets[8];
+ uint8_t ifinunicastpkts[4];
+ uint8_t ifinmulticastpkts[4];
+ uint8_t ifinbroadcastpkts[4];
+ uint8_t ifindiscards[4];
+ uint8_t ifinerrors[4];
+ uint8_t ifinunkownprotos[4];
+ uint8_t ifoutoctets[8];
+ uint8_t ifoutunicastpkts[4];
+ uint8_t ifoutmulticastpkts[4];
+ uint8_t ifoutbroadcastpkts[4];
+ uint8_t ifoutdiscards[4];
+ uint8_t ifouterrors[4];
+ uint8_t ifpromiscmode[4];
+};
+
+struct sflow_ethernet_counter_t {
+ uint8_t alignerrors[4];
+ uint8_t fcserrors[4];
+ uint8_t single_collision_frames[4];
+ uint8_t multiple_collision_frames[4];
+ uint8_t test_errors[4];
+ uint8_t deferred_transmissions[4];
+ uint8_t late_collisions[4];
+ uint8_t excessive_collisions[4];
+ uint8_t mac_transmit_errors[4];
+ uint8_t carrier_sense_errors[4];
+ uint8_t frame_too_longs[4];
+ uint8_t mac_receive_errors[4];
+ uint8_t symbol_errors[4];
+};
+
+struct sflow_100basevg_counter_t {
+ uint8_t in_highpriority_frames[4];
+ uint8_t in_highpriority_octets[8];
+ uint8_t in_normpriority_frames[4];
+ uint8_t in_normpriority_octets[8];
+ uint8_t in_ipmerrors[4];
+ uint8_t in_oversized[4];
+ uint8_t in_data_errors[4];
+ uint8_t in_null_addressed_frames[4];
+ uint8_t out_highpriority_frames[4];
+ uint8_t out_highpriority_octets[8];
+ uint8_t transitioninto_frames[4];
+ uint8_t hc_in_highpriority_octets[8];
+ uint8_t hc_in_normpriority_octets[8];
+ uint8_t hc_out_highpriority_octets[8];
+};
+
+struct sflow_vlan_counter_t {
+ uint8_t vlan_id[4];
+ uint8_t octets[8];
+ uint8_t unicast_pkt[4];
+ uint8_t multicast_pkt[4];
+ uint8_t broadcast_pkt[4];
+ uint8_t discards[4];
+};
+
+static int
+print_sflow_counter_generic(netdissect_options *ndo,
+ 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;
+ ND_PRINT((ndo, "\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))));
+ ND_PRINT((ndo, "\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"));
+ ND_PRINT((ndo, "\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)));
+ ND_PRINT((ndo, "\n\t In errors %u, unknown protos %u",
+ EXTRACT_32BITS(sflow_gen_counter->ifinerrors),
+ EXTRACT_32BITS(sflow_gen_counter->ifinunkownprotos)));
+ ND_PRINT((ndo, "\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)));
+ ND_PRINT((ndo, "\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(netdissect_options *ndo,
+ 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;
+ ND_PRINT((ndo, "\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)));
+ ND_PRINT((ndo, "\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)));
+ ND_PRINT((ndo, "\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(netdissect_options *ndo _U_,
+ const u_char *pointer _U_, u_int len _U_)
+{
+ return 0;
+}
+
+static int
+print_sflow_counter_basevg(netdissect_options *ndo,
+ 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;
+ ND_PRINT((ndo, "\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)));
+ ND_PRINT((ndo, "\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)));
+ ND_PRINT((ndo, "\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)));
+ ND_PRINT((ndo, "\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)));
+ ND_PRINT((ndo, "\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(netdissect_options *ndo,
+ 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;
+ ND_PRINT((ndo, "\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 {
+ uint8_t five_sec_util[4];
+ uint8_t one_min_util[4];
+ uint8_t five_min_util[4];
+ uint8_t total_memory[8];
+ uint8_t free_memory[8];
+};
+
+static int
+print_sflow_counter_processor(netdissect_options *ndo,
+ 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;
+ ND_PRINT((ndo, "\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(netdissect_options *ndo,
+ 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);
+ ND_PRINT((ndo, "\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(ndo, tptr, tlen))
+ return 1;
+ break;
+ case SFLOW_COUNTER_ETHERNET:
+ if (print_sflow_counter_ethernet(ndo, tptr, tlen))
+ return 1;
+ break;
+ case SFLOW_COUNTER_TOKEN_RING:
+ if (print_sflow_counter_token_ring(ndo, tptr,tlen))
+ return 1;
+ break;
+ case SFLOW_COUNTER_BASEVG:
+ if (print_sflow_counter_basevg(ndo, tptr, tlen))
+ return 1;
+ break;
+ case SFLOW_COUNTER_VLAN:
+ if (print_sflow_counter_vlan(ndo, tptr, tlen))
+ return 1;
+ break;
+ case SFLOW_COUNTER_PROCESSOR:
+ if (print_sflow_counter_processor(ndo, tptr, tlen))
+ return 1;
+ break;
+ default:
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, tptr, "\n\t\t", counter_len);
+ break;
+ }
+ }
+ tptr += counter_len;
+ tlen -= counter_len;
+ nrecords--;
+
+ }
+
+ return 0;
+}
+
+static int
+sflow_print_counter_sample(netdissect_options *ndo,
+ 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;
+
+ ND_PRINT((ndo, " seqnum %u, type %u, idx %u, records %u",
+ EXTRACT_32BITS(sflow_counter_sample->seqnum),
+ type,
+ index,
+ nrecords));
+
+ return sflow_print_counter_records(ndo, pointer + sizeof(struct sflow_counter_sample_t),
+ len - sizeof(struct sflow_counter_sample_t),
+ nrecords);
+
+}
+
+static int
+sflow_print_expanded_counter_sample(netdissect_options *ndo,
+ 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);
+
+ ND_PRINT((ndo, " 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(ndo, pointer + sizeof(struct sflow_expanded_counter_sample_t),
+ len - sizeof(struct sflow_expanded_counter_sample_t),
+ nrecords);
+
+}
+
+static int
+print_sflow_raw_packet(netdissect_options *ndo,
+ 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;
+ ND_PRINT((ndo, "\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(netdissect_options *ndo,
+ 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;
+
+ ND_PRINT((ndo, "\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(netdissect_options *ndo,
+ 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;
+ ND_PRINT((ndo, "\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(netdissect_options *ndo,
+ 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);
+ ND_PRINT((ndo, "\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(ndo, tptr, tlen))
+ return 1;
+ break;
+ case SFLOW_FLOW_EXTENDED_SWITCH_DATA:
+ if (print_sflow_extended_switch_data(ndo, tptr, tlen))
+ return 1;
+ break;
+ case SFLOW_FLOW_ETHERNET_FRAME:
+ if (print_sflow_ethernet_frame(ndo, 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 (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, tptr, "\n\t\t", flow_len);
+ break;
+ }
+ }
+ tptr += flow_len;
+ tlen -= flow_len;
+ nrecords--;
+
+ }
+
+ return 0;
+}
+
+static int
+sflow_print_flow_sample(netdissect_options *ndo,
+ 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;
+
+ ND_PRINT((ndo, " 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(ndo, pointer + sizeof(struct sflow_flow_sample_t),
+ len - sizeof(struct sflow_flow_sample_t),
+ nrecords);
+
+}
+
+static int
+sflow_print_expanded_flow_sample(netdissect_options *ndo,
+ 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);
+
+ ND_PRINT((ndo, " 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(ndo, pointer + sizeof(struct sflow_expanded_flow_sample_t),
+ len - sizeof(struct sflow_expanded_flow_sample_t),
+ nrecords);
+
+}
+
+void
+sflow_print(netdissect_options *ndo,
+ const u_char *pptr, u_int len)
+{
+ const struct sflow_datagram_t *sflow_datagram;
+ const struct sflow_sample_header *sflow_sample;
+
+ const u_char *tptr;
+ u_int tlen;
+ uint32_t sflow_sample_type, sflow_sample_len;
+ uint32_t nsamples;
+
+
+ tptr = pptr;
+ tlen = len;
+ sflow_datagram = (const struct sflow_datagram_t *)pptr;
+ ND_TCHECK(*sflow_datagram);
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (EXTRACT_32BITS(sflow_datagram->version) != 5) {
+ ND_PRINT((ndo, "sFlow version %u packet not supported",
+ EXTRACT_32BITS(sflow_datagram->version)));
+ return;
+ }
+
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "sFlowv%u, %s agent %s, agent-id %u, length %u",
+ EXTRACT_32BITS(sflow_datagram->version),
+ EXTRACT_32BITS(sflow_datagram->ip_version) == 1 ? "IPv4" : "IPv6",
+ ipaddr_string(ndo, sflow_datagram->agent),
+ EXTRACT_32BITS(sflow_datagram->agent_id),
+ len));
+ return;
+ }
+
+ /* ok they seem to want to know everything - lets fully decode it */
+ nsamples=EXTRACT_32BITS(sflow_datagram->samples);
+ ND_PRINT((ndo, "sFlowv%u, %s agent %s, agent-id %u, seqnum %u, uptime %u, samples %u, length %u",
+ EXTRACT_32BITS(sflow_datagram->version),
+ EXTRACT_32BITS(sflow_datagram->ip_version) == 1 ? "IPv4" : "IPv6",
+ ipaddr_string(ndo, sflow_datagram->agent),
+ EXTRACT_32BITS(sflow_datagram->agent_id),
+ EXTRACT_32BITS(sflow_datagram->seqnum),
+ EXTRACT_32BITS(sflow_datagram->uptime),
+ nsamples,
+ len));
+
+ /* skip Common header */
+ tptr += sizeof(const struct sflow_datagram_t);
+ tlen -= sizeof(const struct sflow_datagram_t);
+
+ while (nsamples > 0 && tlen > 0) {
+ sflow_sample = (const struct sflow_sample_header *)tptr;
+ ND_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);
+
+ ND_PRINT((ndo, "\n\t%s (%u), length %u,",
+ tok2str(sflow_format_values, "Unknown", sflow_sample_type),
+ sflow_sample_type,
+ sflow_sample_len));
+
+ /* basic sanity check */
+ if (sflow_sample_type == 0 || sflow_sample_len ==0) {
+ return;
+ }
+
+ if (tlen < sflow_sample_len)
+ goto trunc;
+
+ /* did we capture enough for fully decoding the sample ? */
+ ND_TCHECK2(*tptr, sflow_sample_len);
+
+ switch(sflow_sample_type) {
+ case SFLOW_FLOW_SAMPLE:
+ if (sflow_print_flow_sample(ndo, tptr, tlen))
+ goto trunc;
+ break;
+
+ case SFLOW_COUNTER_SAMPLE:
+ if (sflow_print_counter_sample(ndo, tptr,tlen))
+ goto trunc;
+ break;
+
+ case SFLOW_EXPANDED_FLOW_SAMPLE:
+ if (sflow_print_expanded_flow_sample(ndo, tptr, tlen))
+ goto trunc;
+ break;
+
+ case SFLOW_EXPANDED_COUNTER_SAMPLE:
+ if (sflow_print_expanded_counter_sample(ndo, tptr,tlen))
+ goto trunc;
+ break;
+
+ default:
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, tptr, "\n\t ", sflow_sample_len);
+ break;
+ }
+ tptr += sflow_sample_len;
+ tlen -= sflow_sample_len;
+ nsamples--;
+ }
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "[|SFLOW]"));
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ * Turned into common "text protocol" code, which this uses, by
+ * Guy Harris.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-sip.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+static const char *sipcmds[] = {
+ "ACK",
+ "BYE",
+ "CANCEL",
+ "DO",
+ "INFO",
+ "INVITE",
+ "MESSAGE",
+ "NOTIFY",
+ "OPTIONS",
+ "PRACK",
+ "QAUTH",
+ "REFER",
+ "REGISTER",
+ "SPRACK",
+ "SUBSCRIBE",
+ "UPDATE",
+ "PUBLISH",
+ NULL
+};
+
+void
+sip_print(netdissect_options *ndo, const u_char *pptr, u_int len)
+{
+ txtproto_print(ndo, pptr, len, "sip", sipcmds, RESP_CODE_SECOND_TOKEN);
+}
--- /dev/null
+/*
+ * Copyright (c) 1989, 1990, 1991, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-sl.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h" /* must come after interface.h */
+
+#include "ip.h"
+#include "tcp.h"
+#include "slcompress.h"
+
+/*
+ * definitions of the pseudo- link-level header attached to slip
+ * packets grabbed by the packet filter (bpf) traffic monitor.
+ */
+#define SLIP_HDRLEN 16
+
+#define SLX_DIR 0
+#define SLX_CHDR 1
+#define CHDR_LEN 15
+
+#define SLIPDIR_IN 0
+#define SLIPDIR_OUT 1
+
+static const char tstr[] = "[|slip]";
+
+static u_int lastlen[2][256];
+static u_int lastconn = 255;
+
+static void sliplink_print(netdissect_options *, const u_char *, const struct ip *, u_int);
+static void compressed_sl_print(netdissect_options *, const u_char *, const struct ip *, u_int, int);
+
+u_int
+sl_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, const u_char *p)
+{
+ register u_int caplen = h->caplen;
+ register u_int length = h->len;
+ register const struct ip *ip;
+
+ if (caplen < SLIP_HDRLEN || length < SLIP_HDRLEN) {
+ ND_PRINT((ndo, "%s", tstr));
+ return (caplen);
+ }
+
+ length -= SLIP_HDRLEN;
+
+ ip = (struct ip *)(p + SLIP_HDRLEN);
+
+ if (ndo->ndo_eflag)
+ sliplink_print(ndo, p, ip, length);
+
+ switch (IP_V(ip)) {
+ case 4:
+ ip_print(ndo, (u_char *)ip, length);
+ break;
+ case 6:
+ ip6_print(ndo, (u_char *)ip, length);
+ break;
+ default:
+ ND_PRINT((ndo, "ip v%d", IP_V(ip)));
+ }
+
+ return (SLIP_HDRLEN);
+}
+
+u_int
+sl_bsdos_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, const u_char *p)
+{
+ register u_int caplen = h->caplen;
+ register u_int length = h->len;
+ register const struct ip *ip;
+
+ if (caplen < SLIP_HDRLEN) {
+ ND_PRINT((ndo, "%s", tstr));
+ return (caplen);
+ }
+
+ length -= SLIP_HDRLEN;
+
+ ip = (struct ip *)(p + SLIP_HDRLEN);
+
+#ifdef notdef
+ if (ndo->ndo_eflag)
+ sliplink_print(ndo, p, ip, length);
+#endif
+
+ ip_print(ndo, (u_char *)ip, length);
+
+ return (SLIP_HDRLEN);
+}
+
+static void
+sliplink_print(netdissect_options *ndo,
+ register const u_char *p, register const struct ip *ip,
+ register u_int length)
+{
+ int dir;
+ u_int hlen;
+
+ dir = p[SLX_DIR];
+ ND_PRINT((ndo, dir == SLIPDIR_IN ? "I " : "O "));
+
+ if (ndo->ndo_nflag) {
+ /* XXX just dump the header */
+ register int i;
+
+ for (i = SLX_CHDR; i < SLX_CHDR + CHDR_LEN - 1; ++i)
+ ND_PRINT((ndo, "%02x.", p[i]));
+ ND_PRINT((ndo, "%02x: ", p[SLX_CHDR + CHDR_LEN - 1]));
+ return;
+ }
+ switch (p[SLX_CHDR] & 0xf0) {
+
+ case TYPE_IP:
+ ND_PRINT((ndo, "ip %d: ", length + SLIP_HDRLEN));
+ break;
+
+ case TYPE_UNCOMPRESSED_TCP:
+ /*
+ * The connection id is stored in the IP protocol field.
+ * Get it from the link layer since sl_uncompress_tcp()
+ * has restored the IP header copy to IPPROTO_TCP.
+ */
+ lastconn = ((struct ip *)&p[SLX_CHDR])->ip_p;
+ hlen = IP_HL(ip);
+ hlen += TH_OFF((struct tcphdr *)&((int *)ip)[hlen]);
+ lastlen[dir][lastconn] = length - (hlen << 2);
+ ND_PRINT((ndo, "utcp %d: ", lastconn));
+ break;
+
+ default:
+ if (p[SLX_CHDR] & TYPE_COMPRESSED_TCP) {
+ compressed_sl_print(ndo, &p[SLX_CHDR], ip,
+ length, dir);
+ ND_PRINT((ndo, ": "));
+ } else
+ ND_PRINT((ndo, "slip-%d!: ", p[SLX_CHDR]));
+ }
+}
+
+static const u_char *
+print_sl_change(netdissect_options *ndo,
+ const char *str, register const u_char *cp)
+{
+ register u_int i;
+
+ if ((i = *cp++) == 0) {
+ i = EXTRACT_16BITS(cp);
+ cp += 2;
+ }
+ ND_PRINT((ndo, " %s%d", str, i));
+ return (cp);
+}
+
+static const u_char *
+print_sl_winchange(netdissect_options *ndo,
+ register const u_char *cp)
+{
+ register short i;
+
+ if ((i = *cp++) == 0) {
+ i = EXTRACT_16BITS(cp);
+ cp += 2;
+ }
+ if (i >= 0)
+ ND_PRINT((ndo, " W+%d", i));
+ else
+ ND_PRINT((ndo, " W%d", i));
+ return (cp);
+}
+
+static void
+compressed_sl_print(netdissect_options *ndo,
+ const u_char *chdr, const struct ip *ip,
+ u_int length, int dir)
+{
+ register const u_char *cp = chdr;
+ register u_int flags, hlen;
+
+ flags = *cp++;
+ if (flags & NEW_C) {
+ lastconn = *cp++;
+ ND_PRINT((ndo, "ctcp %d", lastconn));
+ } else
+ ND_PRINT((ndo, "ctcp *"));
+
+ /* skip tcp checksum */
+ cp += 2;
+
+ switch (flags & SPECIALS_MASK) {
+ case SPECIAL_I:
+ ND_PRINT((ndo, " *SA+%d", lastlen[dir][lastconn]));
+ break;
+
+ case SPECIAL_D:
+ ND_PRINT((ndo, " *S+%d", lastlen[dir][lastconn]));
+ break;
+
+ default:
+ if (flags & NEW_U)
+ cp = print_sl_change(ndo, "U=", cp);
+ if (flags & NEW_W)
+ cp = print_sl_winchange(ndo, cp);
+ if (flags & NEW_A)
+ cp = print_sl_change(ndo, "A+", cp);
+ if (flags & NEW_S)
+ cp = print_sl_change(ndo, "S+", cp);
+ break;
+ }
+ if (flags & NEW_I)
+ cp = print_sl_change(ndo, "I+", cp);
+
+ /*
+ * 'hlen' is the length of the uncompressed TCP/IP header (in words).
+ * 'cp - chdr' is the length of the compressed header.
+ * 'length - hlen' is the amount of data in the packet.
+ */
+ hlen = IP_HL(ip);
+ hlen += TH_OFF((struct tcphdr *)&((int32_t *)ip)[hlen]);
+ lastlen[dir][lastconn] = length - (hlen << 2);
+ ND_PRINT((ndo, " %d (%ld)", lastlen[dir][lastconn], (long)(cp - chdr)));
+}
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-sll.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "ethertype.h"
+#include "extract.h"
+
+#include "ether.h"
+
+/*
+ * For captures on Linux cooked sockets, we construct a fake header
+ * that includes:
+ *
+ * a 2-byte "packet type" which is one of:
+ *
+ * LINUX_SLL_HOST packet was sent to us
+ * LINUX_SLL_BROADCAST packet was broadcast
+ * LINUX_SLL_MULTICAST packet was multicast
+ * LINUX_SLL_OTHERHOST packet was sent to somebody else
+ * LINUX_SLL_OUTGOING packet was sent *by* us;
+ *
+ * a 2-byte Ethernet protocol field;
+ *
+ * a 2-byte link-layer type;
+ *
+ * a 2-byte link-layer address length;
+ *
+ * an 8-byte source link-layer address, whose actual length is
+ * specified by the previous value.
+ *
+ * All fields except for the link-layer address are in network byte order.
+ *
+ * DO NOT change the layout of this structure, or change any of the
+ * LINUX_SLL_ values below. If you must change the link-layer header
+ * for a "cooked" Linux capture, introduce a new DLT_ type (ask
+ * "tcpdump-workers@lists.tcpdump.org" for one, so that you don't give it
+ * a value that collides with a value already being used), and use the
+ * new header in captures of that type, so that programs that can
+ * handle DLT_LINUX_SLL captures will continue to handle them correctly
+ * without any change, and so that capture files with different headers
+ * can be told apart and programs that read them can dissect the
+ * packets in them.
+ *
+ * This structure, and the #defines below, must be the same in the
+ * libpcap and tcpdump versions of "sll.h".
+ */
+
+/*
+ * A DLT_LINUX_SLL fake link-layer header.
+ */
+#define SLL_HDR_LEN 16 /* total header length */
+#define SLL_ADDRLEN 8 /* length of address field */
+
+struct sll_header {
+ uint16_t sll_pkttype; /* packet type */
+ uint16_t sll_hatype; /* link-layer address type */
+ uint16_t sll_halen; /* link-layer address length */
+ uint8_t sll_addr[SLL_ADDRLEN]; /* link-layer address */
+ uint16_t sll_protocol; /* protocol */
+};
+
+/*
+ * The LINUX_SLL_ values for "sll_pkttype"; these correspond to the
+ * PACKET_ values on Linux, but are defined here so that they're
+ * available even on systems other than Linux, and so that they
+ * don't change even if the PACKET_ values change.
+ */
+#define LINUX_SLL_HOST 0
+#define LINUX_SLL_BROADCAST 1
+#define LINUX_SLL_MULTICAST 2
+#define LINUX_SLL_OTHERHOST 3
+#define LINUX_SLL_OUTGOING 4
+
+/*
+ * The LINUX_SLL_ values for "sll_protocol"; these correspond to the
+ * ETH_P_ values on Linux, but are defined here so that they're
+ * available even on systems other than Linux. We assume, for now,
+ * that the ETH_P_ values won't change in Linux; if they do, then:
+ *
+ * if we don't translate them in "pcap-linux.c", capture files
+ * won't necessarily be readable if captured on a system that
+ * defines ETH_P_ values that don't match these values;
+ *
+ * if we do translate them in "pcap-linux.c", that makes life
+ * unpleasant for the BPF code generator, as the values you test
+ * for in the kernel aren't the values that you test for when
+ * reading a capture file, so the fixup code run on BPF programs
+ * handed to the kernel ends up having to do more work.
+ *
+ * Add other values here as necessary, for handling packet types that
+ * might show up on non-Ethernet, non-802.x networks. (Not all the ones
+ * in the Linux "if_ether.h" will, I suspect, actually show up in
+ * captures.)
+ */
+#define LINUX_SLL_P_802_3 0x0001 /* Novell 802.3 frames without 802.2 LLC header */
+#define LINUX_SLL_P_802_2 0x0004 /* 802.2 frames (not D/I/X Ethernet) */
+
+static const struct tok sll_pkttype_values[] = {
+ { LINUX_SLL_HOST, "In" },
+ { LINUX_SLL_BROADCAST, "B" },
+ { LINUX_SLL_MULTICAST, "M" },
+ { LINUX_SLL_OTHERHOST, "P" },
+ { LINUX_SLL_OUTGOING, "Out" },
+ { 0, NULL}
+};
+
+static inline void
+sll_print(netdissect_options *ndo, register const struct sll_header *sllp, u_int length)
+{
+ u_short ether_type;
+
+ ND_PRINT((ndo, "%3s ",tok2str(sll_pkttype_values,"?",EXTRACT_16BITS(&sllp->sll_pkttype))));
+
+ /*
+ * XXX - check the link-layer address type value?
+ * For now, we just assume 6 means Ethernet.
+ * XXX - print others as strings of hex?
+ */
+ if (EXTRACT_16BITS(&sllp->sll_halen) == 6)
+ ND_PRINT((ndo, "%s ", etheraddr_string(ndo, sllp->sll_addr)));
+
+ if (!ndo->ndo_qflag) {
+ ether_type = EXTRACT_16BITS(&sllp->sll_protocol);
+
+ if (ether_type <= ETHERMTU) {
+ /*
+ * Not an Ethernet type; what type is it?
+ */
+ switch (ether_type) {
+
+ case LINUX_SLL_P_802_3:
+ /*
+ * Ethernet_802.3 IPX frame.
+ */
+ ND_PRINT((ndo, "802.3"));
+ break;
+
+ case LINUX_SLL_P_802_2:
+ /*
+ * 802.2.
+ */
+ ND_PRINT((ndo, "802.2"));
+ break;
+
+ default:
+ /*
+ * What is it?
+ */
+ ND_PRINT((ndo, "ethertype Unknown (0x%04x)",
+ ether_type));
+ break;
+ }
+ } else {
+ ND_PRINT((ndo, "ethertype %s (0x%04x)",
+ tok2str(ethertype_values, "Unknown", ether_type),
+ ether_type));
+ }
+ ND_PRINT((ndo, ", length %u: ", length));
+ }
+}
+
+/*
+ * This is the top level routine of the printer. 'p' points to the
+ * Linux "cooked capture" 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
+sll_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int caplen = h->caplen;
+ u_int length = h->len;
+ register const struct sll_header *sllp;
+ u_short ether_type;
+ u_short extracted_ethertype;
+
+ if (caplen < SLL_HDR_LEN) {
+ /*
+ * XXX - this "can't happen" because "pcap-linux.c" always
+ * adds this many bytes of header to every packet in a
+ * cooked socket capture.
+ */
+ ND_PRINT((ndo, "[|sll]"));
+ return (caplen);
+ }
+
+ sllp = (const struct sll_header *)p;
+
+ if (ndo->ndo_eflag)
+ sll_print(ndo, sllp, length);
+
+ /*
+ * Go past the cooked-mode header.
+ */
+ length -= SLL_HDR_LEN;
+ caplen -= SLL_HDR_LEN;
+ p += SLL_HDR_LEN;
+
+ ether_type = EXTRACT_16BITS(&sllp->sll_protocol);
+
+recurse:
+ /*
+ * Is it (gag) an 802.3 encapsulation, or some non-Ethernet
+ * packet type?
+ */
+ if (ether_type <= ETHERMTU) {
+ /*
+ * Yes - what type is it?
+ */
+ switch (ether_type) {
+
+ case LINUX_SLL_P_802_3:
+ /*
+ * Ethernet_802.3 IPX frame.
+ */
+ ipx_print(ndo, p, length);
+ break;
+
+ case LINUX_SLL_P_802_2:
+ /*
+ * 802.2.
+ * Try to print the LLC-layer header & higher layers.
+ */
+ if (llc_print(ndo, p, length, caplen, NULL, NULL,
+ &extracted_ethertype) == 0)
+ goto unknown; /* unknown LLC type */
+ break;
+
+ default:
+ extracted_ethertype = 0;
+ /*FALLTHROUGH*/
+
+ unknown:
+ /* ether_type not known, print raw packet */
+ if (!ndo->ndo_eflag)
+ sll_print(ndo, sllp, length + SLL_HDR_LEN);
+ if (extracted_ethertype) {
+ ND_PRINT((ndo, "(LLC %s) ",
+ etherproto_string(htons(extracted_ethertype))));
+ }
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ break;
+ }
+ } else if (ether_type == ETHERTYPE_8021Q) {
+ /*
+ * Print VLAN information, and then go back and process
+ * the enclosed type field.
+ */
+ if (caplen < 4 || length < 4) {
+ ND_PRINT((ndo, "[|vlan]"));
+ return (SLL_HDR_LEN);
+ }
+ if (ndo->ndo_eflag) {
+ uint16_t tag = EXTRACT_16BITS(p);
+
+ ND_PRINT((ndo, "%s, ", ieee8021q_tci_string(tag)));
+ }
+
+ ether_type = EXTRACT_16BITS(p + 2);
+ if (ether_type <= ETHERMTU)
+ ether_type = LINUX_SLL_P_802_2;
+ if (!ndo->ndo_qflag) {
+ ND_PRINT((ndo, "ethertype %s, ",
+ tok2str(ethertype_values, "Unknown", ether_type)));
+ }
+ p += 4;
+ length -= 4;
+ caplen -= 4;
+ goto recurse;
+ } else {
+ if (ethertype_print(ndo, ether_type, p, length, caplen) == 0) {
+ /* ether_type not known, print raw packet */
+ if (!ndo->ndo_eflag)
+ sll_print(ndo, sllp, length + SLL_HDR_LEN);
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+ }
+
+ return (SLL_HDR_LEN);
+}
--- /dev/null
+/*
+ * Copyright (c) 1998-2006 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 IEEE "slow protocols" LACP, MARKER as per 802.3ad
+ * OAM as per 802.3ah
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-slow.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+#include "ether.h"
+#include "oui.h"
+
+struct slow_common_header_t {
+ uint8_t proto_subtype;
+ uint8_t version;
+};
+
+#define SLOW_PROTO_LACP 1
+#define SLOW_PROTO_MARKER 2
+#define SLOW_PROTO_OAM 3
+
+#define LACP_VERSION 1
+#define MARKER_VERSION 1
+
+static const struct tok slow_proto_values[] = {
+ { SLOW_PROTO_LACP, "LACP" },
+ { SLOW_PROTO_MARKER, "MARKER" },
+ { SLOW_PROTO_OAM, "OAM" },
+ { 0, NULL}
+};
+
+static const struct tok slow_oam_flag_values[] = {
+ { 0x0001, "Link Fault" },
+ { 0x0002, "Dying Gasp" },
+ { 0x0004, "Critical Event" },
+ { 0x0008, "Local Evaluating" },
+ { 0x0010, "Local Stable" },
+ { 0x0020, "Remote Evaluating" },
+ { 0x0040, "Remote Stable" },
+ { 0, NULL}
+};
+
+#define SLOW_OAM_CODE_INFO 0x00
+#define SLOW_OAM_CODE_EVENT_NOTIF 0x01
+#define SLOW_OAM_CODE_VAR_REQUEST 0x02
+#define SLOW_OAM_CODE_VAR_RESPONSE 0x03
+#define SLOW_OAM_CODE_LOOPBACK_CTRL 0x04
+#define SLOW_OAM_CODE_PRIVATE 0xfe
+
+static const struct tok slow_oam_code_values[] = {
+ { SLOW_OAM_CODE_INFO, "Information" },
+ { SLOW_OAM_CODE_EVENT_NOTIF, "Event Notification" },
+ { SLOW_OAM_CODE_VAR_REQUEST, "Variable Request" },
+ { SLOW_OAM_CODE_VAR_RESPONSE, "Variable Response" },
+ { SLOW_OAM_CODE_LOOPBACK_CTRL, "Loopback Control" },
+ { SLOW_OAM_CODE_PRIVATE, "Vendor Private" },
+ { 0, NULL}
+};
+
+struct slow_oam_info_t {
+ uint8_t info_type;
+ uint8_t info_length;
+ uint8_t oam_version;
+ uint8_t revision[2];
+ uint8_t state;
+ uint8_t oam_config;
+ uint8_t oam_pdu_config[2];
+ uint8_t oui[3];
+ uint8_t vendor_private[4];
+};
+
+#define SLOW_OAM_INFO_TYPE_END_OF_TLV 0x00
+#define SLOW_OAM_INFO_TYPE_LOCAL 0x01
+#define SLOW_OAM_INFO_TYPE_REMOTE 0x02
+#define SLOW_OAM_INFO_TYPE_ORG_SPECIFIC 0xfe
+
+static const struct tok slow_oam_info_type_values[] = {
+ { SLOW_OAM_INFO_TYPE_END_OF_TLV, "End of TLV marker" },
+ { SLOW_OAM_INFO_TYPE_LOCAL, "Local" },
+ { SLOW_OAM_INFO_TYPE_REMOTE, "Remote" },
+ { SLOW_OAM_INFO_TYPE_ORG_SPECIFIC, "Organization specific" },
+ { 0, NULL}
+};
+
+#define OAM_INFO_TYPE_PARSER_MASK 0x3
+static const struct tok slow_oam_info_type_state_parser_values[] = {
+ { 0x00, "forwarding" },
+ { 0x01, "looping back" },
+ { 0x02, "discarding" },
+ { 0x03, "reserved" },
+ { 0, NULL}
+};
+
+#define OAM_INFO_TYPE_MUX_MASK 0x4
+static const struct tok slow_oam_info_type_state_mux_values[] = {
+ { 0x00, "forwarding" },
+ { 0x04, "discarding" },
+ { 0, NULL}
+};
+
+static const struct tok slow_oam_info_type_oam_config_values[] = {
+ { 0x01, "Active" },
+ { 0x02, "Unidirectional" },
+ { 0x04, "Remote-Loopback" },
+ { 0x08, "Link-Events" },
+ { 0x10, "Variable-Retrieval" },
+ { 0, NULL}
+};
+
+/* 11 Bits */
+#define OAM_INFO_TYPE_PDU_SIZE_MASK 0x7ff
+
+#define SLOW_OAM_LINK_EVENT_END_OF_TLV 0x00
+#define SLOW_OAM_LINK_EVENT_ERR_SYM_PER 0x01
+#define SLOW_OAM_LINK_EVENT_ERR_FRM 0x02
+#define SLOW_OAM_LINK_EVENT_ERR_FRM_PER 0x03
+#define SLOW_OAM_LINK_EVENT_ERR_FRM_SUMM 0x04
+#define SLOW_OAM_LINK_EVENT_ORG_SPECIFIC 0xfe
+
+static const struct tok slow_oam_link_event_values[] = {
+ { SLOW_OAM_LINK_EVENT_END_OF_TLV, "End of TLV marker" },
+ { SLOW_OAM_LINK_EVENT_ERR_SYM_PER, "Errored Symbol Period Event" },
+ { SLOW_OAM_LINK_EVENT_ERR_FRM, "Errored Frame Event" },
+ { SLOW_OAM_LINK_EVENT_ERR_FRM_PER, "Errored Frame Period Event" },
+ { SLOW_OAM_LINK_EVENT_ERR_FRM_SUMM, "Errored Frame Seconds Summary Event" },
+ { SLOW_OAM_LINK_EVENT_ORG_SPECIFIC, "Organization specific" },
+ { 0, NULL}
+};
+
+struct slow_oam_link_event_t {
+ uint8_t event_type;
+ uint8_t event_length;
+ uint8_t time_stamp[2];
+ uint8_t window[8];
+ uint8_t threshold[8];
+ uint8_t errors[8];
+ uint8_t errors_running_total[8];
+ uint8_t event_running_total[4];
+};
+
+struct slow_oam_variablerequest_t {
+ uint8_t branch;
+ uint8_t leaf[2];
+};
+
+struct slow_oam_variableresponse_t {
+ uint8_t branch;
+ uint8_t leaf[2];
+ uint8_t length;
+};
+
+struct slow_oam_loopbackctrl_t {
+ uint8_t command;
+};
+
+static const struct tok slow_oam_loopbackctrl_cmd_values[] = {
+ { 0x01, "Enable OAM Remote Loopback" },
+ { 0x02, "Disable OAM Remote Loopback" },
+ { 0, NULL}
+};
+
+struct tlv_header_t {
+ uint8_t type;
+ uint8_t length;
+};
+
+#define LACP_TLV_TERMINATOR 0x00
+#define LACP_TLV_ACTOR_INFO 0x01
+#define LACP_TLV_PARTNER_INFO 0x02
+#define LACP_TLV_COLLECTOR_INFO 0x03
+
+#define MARKER_TLV_TERMINATOR 0x00
+#define MARKER_TLV_MARKER_INFO 0x01
+
+static const struct tok slow_tlv_values[] = {
+ { (SLOW_PROTO_LACP << 8) + LACP_TLV_TERMINATOR, "Terminator"},
+ { (SLOW_PROTO_LACP << 8) + LACP_TLV_ACTOR_INFO, "Actor Information"},
+ { (SLOW_PROTO_LACP << 8) + LACP_TLV_PARTNER_INFO, "Partner Information"},
+ { (SLOW_PROTO_LACP << 8) + LACP_TLV_COLLECTOR_INFO, "Collector Information"},
+
+ { (SLOW_PROTO_MARKER << 8) + MARKER_TLV_TERMINATOR, "Terminator"},
+ { (SLOW_PROTO_MARKER << 8) + MARKER_TLV_MARKER_INFO, "Marker Information"},
+ { 0, NULL}
+};
+
+struct lacp_tlv_actor_partner_info_t {
+ uint8_t sys_pri[2];
+ uint8_t sys[ETHER_ADDR_LEN];
+ uint8_t key[2];
+ uint8_t port_pri[2];
+ uint8_t port[2];
+ uint8_t state;
+ uint8_t pad[3];
+};
+
+static const struct tok lacp_tlv_actor_partner_info_state_values[] = {
+ { 0x01, "Activity"},
+ { 0x02, "Timeout"},
+ { 0x04, "Aggregation"},
+ { 0x08, "Synchronization"},
+ { 0x10, "Collecting"},
+ { 0x20, "Distributing"},
+ { 0x40, "Default"},
+ { 0x80, "Expired"},
+ { 0, NULL}
+};
+
+struct lacp_tlv_collector_info_t {
+ uint8_t max_delay[2];
+ uint8_t pad[12];
+};
+
+struct marker_tlv_marker_info_t {
+ uint8_t req_port[2];
+ uint8_t req_sys[ETHER_ADDR_LEN];
+ uint8_t req_trans_id[4];
+ uint8_t pad[2];
+};
+
+struct lacp_marker_tlv_terminator_t {
+ uint8_t pad[50];
+};
+
+static void slow_marker_lacp_print(netdissect_options *, register const u_char *, register u_int);
+static void slow_oam_print(netdissect_options *, register const u_char *, register u_int);
+
+const struct slow_common_header_t *slow_com_header;
+
+void
+slow_print(netdissect_options *ndo,
+ register const u_char *pptr, register u_int len)
+{
+ int print_version;
+
+ slow_com_header = (const struct slow_common_header_t *)pptr;
+ ND_TCHECK(*slow_com_header);
+
+ /*
+ * Sanity checking of the header.
+ */
+ switch (slow_com_header->proto_subtype) {
+ case SLOW_PROTO_LACP:
+ if (slow_com_header->version != LACP_VERSION) {
+ ND_PRINT((ndo, "LACP version %u packet not supported",slow_com_header->version));
+ return;
+ }
+ print_version = 1;
+ break;
+
+ case SLOW_PROTO_MARKER:
+ if (slow_com_header->version != MARKER_VERSION) {
+ ND_PRINT((ndo, "MARKER version %u packet not supported",slow_com_header->version));
+ return;
+ }
+ print_version = 1;
+ break;
+
+ case SLOW_PROTO_OAM: /* fall through */
+ print_version = 0;
+ break;
+
+ default:
+ /* print basic information and exit */
+ print_version = -1;
+ break;
+ }
+
+ if (print_version) {
+ ND_PRINT((ndo, "%sv%u, length %u",
+ tok2str(slow_proto_values, "unknown (%u)",slow_com_header->proto_subtype),
+ slow_com_header->version,
+ len));
+ } else {
+ /* some slow protos don't have a version number in the header */
+ ND_PRINT((ndo, "%s, length %u",
+ tok2str(slow_proto_values, "unknown (%u)",slow_com_header->proto_subtype),
+ len));
+ }
+
+ /* unrecognized subtype */
+ if (print_version == -1) {
+ print_unknown_data(ndo, pptr, "\n\t", len);
+ return;
+ }
+
+ if (!ndo->ndo_vflag)
+ return;
+
+ switch (slow_com_header->proto_subtype) {
+ default: /* should not happen */
+ break;
+
+ case SLOW_PROTO_OAM:
+ /* skip proto_subtype */
+ slow_oam_print(ndo, pptr+1, len-1);
+ break;
+
+ case SLOW_PROTO_LACP: /* LACP and MARKER share the same semantics */
+ case SLOW_PROTO_MARKER:
+ /* skip slow_common_header */
+ len -= sizeof(const struct slow_common_header_t);
+ pptr += sizeof(const struct slow_common_header_t);
+ slow_marker_lacp_print(ndo, pptr, len);
+ break;
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+}
+
+static void
+slow_marker_lacp_print(netdissect_options *ndo,
+ register const u_char *tptr, register u_int tlen)
+{
+ const struct tlv_header_t *tlv_header;
+ const u_char *tlv_tptr;
+ u_int tlv_len, tlv_tlen;
+
+ union {
+ const struct lacp_marker_tlv_terminator_t *lacp_marker_tlv_terminator;
+ const struct lacp_tlv_actor_partner_info_t *lacp_tlv_actor_partner_info;
+ const struct lacp_tlv_collector_info_t *lacp_tlv_collector_info;
+ const struct marker_tlv_marker_info_t *marker_tlv_marker_info;
+ } tlv_ptr;
+
+ while(tlen>0) {
+ /* did we capture enough for fully decoding the tlv header ? */
+ ND_TCHECK2(*tptr, sizeof(struct tlv_header_t));
+ tlv_header = (const struct tlv_header_t *)tptr;
+ tlv_len = tlv_header->length;
+
+ ND_PRINT((ndo, "\n\t%s TLV (0x%02x), length %u",
+ tok2str(slow_tlv_values,
+ "Unknown",
+ (slow_com_header->proto_subtype << 8) + tlv_header->type),
+ tlv_header->type,
+ tlv_len));
+
+ if ((tlv_len < sizeof(struct tlv_header_t) ||
+ tlv_len > tlen) &&
+ tlv_header->type != LACP_TLV_TERMINATOR &&
+ tlv_header->type != MARKER_TLV_TERMINATOR) {
+ ND_PRINT((ndo, "\n\t-----trailing data-----"));
+ print_unknown_data(ndo, tptr+sizeof(struct tlv_header_t), "\n\t ", tlen);
+ return;
+ }
+
+ tlv_tptr=tptr+sizeof(struct tlv_header_t);
+ tlv_tlen=tlv_len-sizeof(struct tlv_header_t);
+
+ /* did we capture enough for fully decoding the tlv ? */
+ ND_TCHECK2(*tptr, tlv_len);
+
+ switch((slow_com_header->proto_subtype << 8) + tlv_header->type) {
+
+ /* those two TLVs have the same structure -> fall through */
+ case ((SLOW_PROTO_LACP << 8) + LACP_TLV_ACTOR_INFO):
+ case ((SLOW_PROTO_LACP << 8) + LACP_TLV_PARTNER_INFO):
+ tlv_ptr.lacp_tlv_actor_partner_info = (const struct lacp_tlv_actor_partner_info_t *)tlv_tptr;
+
+ ND_PRINT((ndo, "\n\t System %s, System Priority %u, Key %u" \
+ ", Port %u, Port Priority %u\n\t State Flags [%s]",
+ etheraddr_string(ndo, tlv_ptr.lacp_tlv_actor_partner_info->sys),
+ EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->sys_pri),
+ EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->key),
+ EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->port),
+ EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->port_pri),
+ bittok2str(lacp_tlv_actor_partner_info_state_values,
+ "none",
+ tlv_ptr.lacp_tlv_actor_partner_info->state)));
+
+ break;
+
+ case ((SLOW_PROTO_LACP << 8) + LACP_TLV_COLLECTOR_INFO):
+ tlv_ptr.lacp_tlv_collector_info = (const struct lacp_tlv_collector_info_t *)tlv_tptr;
+
+ ND_PRINT((ndo, "\n\t Max Delay %u",
+ EXTRACT_16BITS(tlv_ptr.lacp_tlv_collector_info->max_delay)));
+
+ break;
+
+ case ((SLOW_PROTO_MARKER << 8) + MARKER_TLV_MARKER_INFO):
+ tlv_ptr.marker_tlv_marker_info = (const struct marker_tlv_marker_info_t *)tlv_tptr;
+
+ ND_PRINT((ndo, "\n\t Request System %s, Request Port %u, Request Transaction ID 0x%08x",
+ etheraddr_string(ndo, tlv_ptr.marker_tlv_marker_info->req_sys),
+ EXTRACT_16BITS(tlv_ptr.marker_tlv_marker_info->req_port),
+ EXTRACT_32BITS(tlv_ptr.marker_tlv_marker_info->req_trans_id)));
+
+ break;
+
+ /* those two TLVs have the same structure -> fall through */
+ case ((SLOW_PROTO_LACP << 8) + LACP_TLV_TERMINATOR):
+ case ((SLOW_PROTO_MARKER << 8) + LACP_TLV_TERMINATOR):
+ tlv_ptr.lacp_marker_tlv_terminator = (const struct lacp_marker_tlv_terminator_t *)tlv_tptr;
+ if (tlv_len == 0) {
+ tlv_len = sizeof(tlv_ptr.lacp_marker_tlv_terminator->pad) +
+ sizeof(struct tlv_header_t);
+ /* tell the user that we modified the length field */
+ if (ndo->ndo_vflag>1)
+ ND_PRINT((ndo, " (=%u)", tlv_len));
+ /* we have messed around with the length field - now we need to check
+ * again if there are enough bytes on the wire for the hexdump */
+ ND_TCHECK2(tlv_ptr.lacp_marker_tlv_terminator->pad[0],
+ sizeof(tlv_ptr.lacp_marker_tlv_terminator->pad));
+ }
+
+ break;
+
+ default:
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, tlv_tptr, "\n\t ", tlv_tlen);
+ break;
+ }
+ /* do we want to see an additional hexdump ? */
+ if (ndo->ndo_vflag > 1) {
+ print_unknown_data(ndo, tptr+sizeof(struct tlv_header_t), "\n\t ",
+ tlv_len-sizeof(struct tlv_header_t));
+ }
+
+ tptr+=tlv_len;
+ tlen-=tlv_len;
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
+}
+
+static void
+slow_oam_print(netdissect_options *ndo,
+ register const u_char *tptr, register u_int tlen)
+{
+ u_int hexdump;
+
+ struct slow_oam_common_header_t {
+ uint8_t flags[2];
+ uint8_t code;
+ };
+
+ struct slow_oam_tlv_header_t {
+ uint8_t type;
+ uint8_t length;
+ };
+
+ union {
+ const struct slow_oam_common_header_t *slow_oam_common_header;
+ const struct slow_oam_tlv_header_t *slow_oam_tlv_header;
+ } ptr;
+
+ union {
+ const struct slow_oam_info_t *slow_oam_info;
+ const struct slow_oam_link_event_t *slow_oam_link_event;
+ const struct slow_oam_variablerequest_t *slow_oam_variablerequest;
+ const struct slow_oam_variableresponse_t *slow_oam_variableresponse;
+ const struct slow_oam_loopbackctrl_t *slow_oam_loopbackctrl;
+ } tlv;
+
+ ptr.slow_oam_common_header = (struct slow_oam_common_header_t *)tptr;
+ tptr += sizeof(struct slow_oam_common_header_t);
+ tlen -= sizeof(struct slow_oam_common_header_t);
+
+ ND_PRINT((ndo, "\n\tCode %s OAM PDU, Flags [%s]",
+ tok2str(slow_oam_code_values, "Unknown (%u)", ptr.slow_oam_common_header->code),
+ bittok2str(slow_oam_flag_values,
+ "none",
+ EXTRACT_16BITS(&ptr.slow_oam_common_header->flags))));
+
+ switch (ptr.slow_oam_common_header->code) {
+ case SLOW_OAM_CODE_INFO:
+ while (tlen > 0) {
+ ptr.slow_oam_tlv_header = (const struct slow_oam_tlv_header_t *)tptr;
+ ND_PRINT((ndo, "\n\t %s Information Type (%u), length %u",
+ tok2str(slow_oam_info_type_values, "Reserved",
+ ptr.slow_oam_tlv_header->type),
+ ptr.slow_oam_tlv_header->type,
+ ptr.slow_oam_tlv_header->length));
+
+ hexdump = FALSE;
+ switch (ptr.slow_oam_tlv_header->type) {
+ case SLOW_OAM_INFO_TYPE_END_OF_TLV:
+ if (ptr.slow_oam_tlv_header->length != 0) {
+ ND_PRINT((ndo, "\n\t ERROR: illegal length - should be 0"));
+ }
+ return;
+
+ case SLOW_OAM_INFO_TYPE_LOCAL: /* identical format - fall through */
+ case SLOW_OAM_INFO_TYPE_REMOTE:
+ tlv.slow_oam_info = (const struct slow_oam_info_t *)tptr;
+
+ if (tlv.slow_oam_info->info_length !=
+ sizeof(struct slow_oam_info_t)) {
+ ND_PRINT((ndo, "\n\t ERROR: illegal length - should be %lu",
+ (unsigned long) sizeof(struct slow_oam_info_t)));
+ return;
+ }
+
+ ND_PRINT((ndo, "\n\t OAM-Version %u, Revision %u",
+ tlv.slow_oam_info->oam_version,
+ EXTRACT_16BITS(&tlv.slow_oam_info->revision)));
+
+ ND_PRINT((ndo, "\n\t State-Parser-Action %s, State-MUX-Action %s",
+ tok2str(slow_oam_info_type_state_parser_values, "Reserved",
+ tlv.slow_oam_info->state & OAM_INFO_TYPE_PARSER_MASK),
+ tok2str(slow_oam_info_type_state_mux_values, "Reserved",
+ tlv.slow_oam_info->state & OAM_INFO_TYPE_MUX_MASK)));
+ ND_PRINT((ndo, "\n\t OAM-Config Flags [%s], OAM-PDU-Config max-PDU size %u",
+ bittok2str(slow_oam_info_type_oam_config_values, "none",
+ tlv.slow_oam_info->oam_config),
+ EXTRACT_16BITS(&tlv.slow_oam_info->oam_pdu_config) &
+ OAM_INFO_TYPE_PDU_SIZE_MASK));
+ ND_PRINT((ndo, "\n\t OUI %s (0x%06x), Vendor-Private 0x%08x",
+ tok2str(oui_values, "Unknown",
+ EXTRACT_24BITS(&tlv.slow_oam_info->oui)),
+ EXTRACT_24BITS(&tlv.slow_oam_info->oui),
+ EXTRACT_32BITS(&tlv.slow_oam_info->vendor_private)));
+ break;
+
+ case SLOW_OAM_INFO_TYPE_ORG_SPECIFIC:
+ hexdump = TRUE;
+ break;
+
+ default:
+ hexdump = TRUE;
+ break;
+ }
+
+ /* infinite loop check */
+ if (!ptr.slow_oam_tlv_header->length) {
+ return;
+ }
+
+ /* do we also want to see a hex dump ? */
+ if (ndo->ndo_vflag > 1 || hexdump==TRUE) {
+ print_unknown_data(ndo, tptr, "\n\t ",
+ ptr.slow_oam_tlv_header->length);
+ }
+
+ tlen -= ptr.slow_oam_tlv_header->length;
+ tptr += ptr.slow_oam_tlv_header->length;
+ }
+ break;
+
+ case SLOW_OAM_CODE_EVENT_NOTIF:
+ while (tlen > 0) {
+ ptr.slow_oam_tlv_header = (const struct slow_oam_tlv_header_t *)tptr;
+ ND_PRINT((ndo, "\n\t %s Link Event Type (%u), length %u",
+ tok2str(slow_oam_link_event_values, "Reserved",
+ ptr.slow_oam_tlv_header->type),
+ ptr.slow_oam_tlv_header->type,
+ ptr.slow_oam_tlv_header->length));
+
+ hexdump = FALSE;
+ switch (ptr.slow_oam_tlv_header->type) {
+ case SLOW_OAM_LINK_EVENT_END_OF_TLV:
+ if (ptr.slow_oam_tlv_header->length != 0) {
+ ND_PRINT((ndo, "\n\t ERROR: illegal length - should be 0"));
+ }
+ return;
+
+ case SLOW_OAM_LINK_EVENT_ERR_SYM_PER: /* identical format - fall through */
+ case SLOW_OAM_LINK_EVENT_ERR_FRM:
+ case SLOW_OAM_LINK_EVENT_ERR_FRM_PER:
+ case SLOW_OAM_LINK_EVENT_ERR_FRM_SUMM:
+ tlv.slow_oam_link_event = (const struct slow_oam_link_event_t *)tptr;
+
+ if (tlv.slow_oam_link_event->event_length !=
+ sizeof(struct slow_oam_link_event_t)) {
+ ND_PRINT((ndo, "\n\t ERROR: illegal length - should be %lu",
+ (unsigned long) sizeof(struct slow_oam_link_event_t)));
+ return;
+ }
+
+ ND_PRINT((ndo, "\n\t Timestamp %u ms, Errored Window %" PRIu64
+ "\n\t Errored Threshold %" PRIu64
+ "\n\t Errors %" PRIu64
+ "\n\t Error Running Total %" PRIu64
+ "\n\t Event Running Total %u",
+ EXTRACT_16BITS(&tlv.slow_oam_link_event->time_stamp)*100,
+ EXTRACT_64BITS(&tlv.slow_oam_link_event->window),
+ EXTRACT_64BITS(&tlv.slow_oam_link_event->threshold),
+ EXTRACT_64BITS(&tlv.slow_oam_link_event->errors),
+ EXTRACT_64BITS(&tlv.slow_oam_link_event->errors_running_total),
+ EXTRACT_32BITS(&tlv.slow_oam_link_event->event_running_total)));
+ break;
+
+ case SLOW_OAM_LINK_EVENT_ORG_SPECIFIC:
+ hexdump = TRUE;
+ break;
+
+ default:
+ hexdump = TRUE;
+ break;
+ }
+
+ /* infinite loop check */
+ if (!ptr.slow_oam_tlv_header->length) {
+ return;
+ }
+
+ /* do we also want to see a hex dump ? */
+ if (ndo->ndo_vflag > 1 || hexdump==TRUE) {
+ print_unknown_data(ndo, tptr, "\n\t ",
+ ptr.slow_oam_tlv_header->length);
+ }
+
+ tlen -= ptr.slow_oam_tlv_header->length;
+ tptr += ptr.slow_oam_tlv_header->length;
+ }
+ break;
+
+ case SLOW_OAM_CODE_LOOPBACK_CTRL:
+ tlv.slow_oam_loopbackctrl = (const struct slow_oam_loopbackctrl_t *)tptr;
+ ND_PRINT((ndo, "\n\t Command %s (%u)",
+ tok2str(slow_oam_loopbackctrl_cmd_values,
+ "Unknown",
+ tlv.slow_oam_loopbackctrl->command),
+ tlv.slow_oam_loopbackctrl->command));
+ tptr ++;
+ tlen --;
+ break;
+
+ /*
+ * FIXME those are the defined codes that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+ case SLOW_OAM_CODE_VAR_REQUEST:
+ case SLOW_OAM_CODE_VAR_RESPONSE:
+ case SLOW_OAM_CODE_PRIVATE:
+ default:
+ if (ndo->ndo_vflag <= 1) {
+ print_unknown_data(ndo, tptr, "\n\t ", tlen);
+ }
+ break;
+ }
+ return;
+}
--- /dev/null
+/*
+ * Copyright (C) Andrew Tridgell 1995-1999
+ *
+ * This software may be distributed either under the terms of the
+ * BSD-style license that accompanies tcpdump or the GNU GPL version 2
+ * or later
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-smb.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "smb.h"
+
+static const char tstr[] = "[|SMB]";
+
+static int request = 0;
+static int unicodestr = 0;
+
+const u_char *startbuf = NULL;
+
+struct smbdescript {
+ const char *req_f1;
+ const char *req_f2;
+ const char *rep_f1;
+ const char *rep_f2;
+ void (*fn)(netdissect_options *, const u_char *, const u_char *, const u_char *, const u_char *);
+};
+
+struct smbdescriptint {
+ const char *req_f1;
+ const char *req_f2;
+ const char *rep_f1;
+ const char *rep_f2;
+ void (*fn)(netdissect_options *, const u_char *, const u_char *, int, int);
+};
+
+struct smbfns
+{
+ int id;
+ const char *name;
+ int flags;
+ struct smbdescript descript;
+};
+
+struct smbfnsint
+{
+ int id;
+ const char *name;
+ int flags;
+ struct smbdescriptint descript;
+};
+
+#define DEFDESCRIPT { NULL, NULL, NULL, NULL, NULL }
+
+#define FLG_CHAIN (1 << 0)
+
+static const struct smbfns *
+smbfind(int id, const struct smbfns *list)
+{
+ int sindex;
+
+ for (sindex = 0; list[sindex].name; sindex++)
+ if (list[sindex].id == id)
+ return(&list[sindex]);
+
+ return(&list[0]);
+}
+
+static const struct smbfnsint *
+smbfindint(int id, const struct smbfnsint *list)
+{
+ int sindex;
+
+ for (sindex = 0; list[sindex].name; sindex++)
+ if (list[sindex].id == id)
+ return(&list[sindex]);
+
+ return(&list[0]);
+}
+
+static void
+trans2_findfirst(netdissect_options *ndo,
+ const u_char *param, const u_char *data, int pcnt, int dcnt)
+{
+ const char *fmt;
+
+ if (request)
+ fmt = "Attribute=[A]\nSearchCount=[d]\nFlags=[w]\nLevel=[dP4]\nFile=[S]\n";
+ else
+ fmt = "Handle=[w]\nCount=[d]\nEOS=[w]\nEoffset=[d]\nLastNameOfs=[w]\n";
+
+ smb_fdata(ndo, param, fmt, param + pcnt, unicodestr);
+ if (dcnt) {
+ ND_PRINT((ndo, "data:\n"));
+ print_data(ndo, data, dcnt);
+ }
+}
+
+static void
+trans2_qfsinfo(netdissect_options *ndo,
+ const u_char *param, const u_char *data, int pcnt, int dcnt)
+{
+ static int level = 0;
+ const char *fmt="";
+
+ if (request) {
+ ND_TCHECK2(*param, 2);
+ level = EXTRACT_LE_16BITS(param);
+ fmt = "InfoLevel=[d]\n";
+ smb_fdata(ndo, param, fmt, param + pcnt, unicodestr);
+ } else {
+ switch (level) {
+ case 1:
+ fmt = "idFileSystem=[W]\nSectorUnit=[D]\nUnit=[D]\nAvail=[D]\nSectorSize=[d]\n";
+ break;
+ case 2:
+ fmt = "CreationTime=[T2]VolNameLength=[lb]\nVolumeLabel=[c]\n";
+ break;
+ case 0x105:
+ fmt = "Capabilities=[W]\nMaxFileLen=[D]\nVolNameLen=[lD]\nVolume=[C]\n";
+ break;
+ default:
+ fmt = "UnknownLevel\n";
+ break;
+ }
+ smb_fdata(ndo, data, fmt, data + dcnt, unicodestr);
+ }
+ if (dcnt) {
+ ND_PRINT((ndo, "data:\n"));
+ print_data(ndo, data, dcnt);
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static const struct smbfnsint trans2_fns[] = {
+ { 0, "TRANSACT2_OPEN", 0,
+ { "Flags2=[w]\nMode=[w]\nSearchAttrib=[A]\nAttrib=[A]\nTime=[T2]\nOFun=[w]\nSize=[D]\nRes=([w, w, w, w, w])\nPath=[S]",
+ NULL,
+ "Handle=[d]\nAttrib=[A]\nTime=[T2]\nSize=[D]\nAccess=[w]\nType=[w]\nState=[w]\nAction=[w]\nInode=[W]\nOffErr=[d]\n|EALength=[d]\n",
+ NULL, NULL }},
+ { 1, "TRANSACT2_FINDFIRST", 0,
+ { NULL, NULL, NULL, NULL, trans2_findfirst }},
+ { 2, "TRANSACT2_FINDNEXT", 0, DEFDESCRIPT },
+ { 3, "TRANSACT2_QFSINFO", 0,
+ { NULL, NULL, NULL, NULL, trans2_qfsinfo }},
+ { 4, "TRANSACT2_SETFSINFO", 0, DEFDESCRIPT },
+ { 5, "TRANSACT2_QPATHINFO", 0, DEFDESCRIPT },
+ { 6, "TRANSACT2_SETPATHINFO", 0, DEFDESCRIPT },
+ { 7, "TRANSACT2_QFILEINFO", 0, DEFDESCRIPT },
+ { 8, "TRANSACT2_SETFILEINFO", 0, DEFDESCRIPT },
+ { 9, "TRANSACT2_FSCTL", 0, DEFDESCRIPT },
+ { 10, "TRANSACT2_IOCTL", 0, DEFDESCRIPT },
+ { 11, "TRANSACT2_FINDNOTIFYFIRST", 0, DEFDESCRIPT },
+ { 12, "TRANSACT2_FINDNOTIFYNEXT", 0, DEFDESCRIPT },
+ { 13, "TRANSACT2_MKDIR", 0, DEFDESCRIPT },
+ { -1, NULL, 0, DEFDESCRIPT }
+};
+
+
+static void
+print_trans2(netdissect_options *ndo,
+ const u_char *words, const u_char *dat, const u_char *buf, const u_char *maxbuf)
+{
+ u_int bcc;
+ static const struct smbfnsint *fn = &trans2_fns[0];
+ const u_char *data, *param;
+ const u_char *w = words + 1;
+ const char *f1 = NULL, *f2 = NULL;
+ int pcnt, dcnt;
+
+ ND_TCHECK(words[0]);
+ if (request) {
+ ND_TCHECK2(w[14 * 2], 2);
+ pcnt = EXTRACT_LE_16BITS(w + 9 * 2);
+ param = buf + EXTRACT_LE_16BITS(w + 10 * 2);
+ dcnt = EXTRACT_LE_16BITS(w + 11 * 2);
+ data = buf + EXTRACT_LE_16BITS(w + 12 * 2);
+ fn = smbfindint(EXTRACT_LE_16BITS(w + 14 * 2), trans2_fns);
+ } else {
+ if (words[0] == 0) {
+ ND_PRINT((ndo, "%s\n", fn->name));
+ ND_PRINT((ndo, "Trans2Interim\n"));
+ return;
+ }
+ ND_TCHECK2(w[7 * 2], 2);
+ pcnt = EXTRACT_LE_16BITS(w + 3 * 2);
+ param = buf + EXTRACT_LE_16BITS(w + 4 * 2);
+ dcnt = EXTRACT_LE_16BITS(w + 6 * 2);
+ data = buf + EXTRACT_LE_16BITS(w + 7 * 2);
+ }
+
+ ND_PRINT((ndo, "%s param_length=%d data_length=%d\n", fn->name, pcnt, dcnt));
+
+ if (request) {
+ if (words[0] == 8) {
+ smb_fdata(ndo, words + 1,
+ "Trans2Secondary\nTotParam=[d]\nTotData=[d]\nParamCnt=[d]\nParamOff=[d]\nParamDisp=[d]\nDataCnt=[d]\nDataOff=[d]\nDataDisp=[d]\nHandle=[d]\n",
+ maxbuf, unicodestr);
+ return;
+ } else {
+ smb_fdata(ndo, words + 1,
+ "TotParam=[d]\nTotData=[d]\nMaxParam=[d]\nMaxData=[d]\nMaxSetup=[b][P1]\nFlags=[w]\nTimeOut=[D]\nRes1=[w]\nParamCnt=[d]\nParamOff=[d]\nDataCnt=[d]\nDataOff=[d]\nSetupCnt=[b][P1]\n",
+ words + 1 + 14 * 2, unicodestr);
+ }
+ f1 = fn->descript.req_f1;
+ f2 = fn->descript.req_f2;
+ } else {
+ smb_fdata(ndo, words + 1,
+ "TotParam=[d]\nTotData=[d]\nRes1=[w]\nParamCnt=[d]\nParamOff=[d]\nParamDisp[d]\nDataCnt=[d]\nDataOff=[d]\nDataDisp=[d]\nSetupCnt=[b][P1]\n",
+ words + 1 + 10 * 2, unicodestr);
+ f1 = fn->descript.rep_f1;
+ f2 = fn->descript.rep_f2;
+ }
+
+ ND_TCHECK2(*dat, 2);
+ bcc = EXTRACT_LE_16BITS(dat);
+ ND_PRINT((ndo, "smb_bcc=%u\n", bcc));
+ if (fn->descript.fn)
+ (*fn->descript.fn)(ndo, param, data, pcnt, dcnt);
+ else {
+ smb_fdata(ndo, param, f1 ? f1 : "Parameters=\n", param + pcnt, unicodestr);
+ smb_fdata(ndo, data, f2 ? f2 : "Data=\n", data + dcnt, unicodestr);
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+print_browse(netdissect_options *ndo,
+ const u_char *param, int paramlen, const u_char *data, int datalen)
+{
+ const u_char *maxbuf = data + datalen;
+ int command;
+
+ ND_TCHECK(data[0]);
+ command = data[0];
+
+ smb_fdata(ndo, param, "BROWSE PACKET\n|Param ", param+paramlen, unicodestr);
+
+ switch (command) {
+ case 0xF:
+ data = smb_fdata(ndo, data,
+ "BROWSE PACKET:\nType=[B] (LocalMasterAnnouncement)\nUpdateCount=[w]\nRes1=[B]\nAnnounceInterval=[d]\nName=[n2]\nMajorVersion=[B]\nMinorVersion=[B]\nServerType=[W]\nElectionVersion=[w]\nBrowserConstant=[w]\n",
+ maxbuf, unicodestr);
+ break;
+
+ case 0x1:
+ data = smb_fdata(ndo, data,
+ "BROWSE PACKET:\nType=[B] (HostAnnouncement)\nUpdateCount=[w]\nRes1=[B]\nAnnounceInterval=[d]\nName=[n2]\nMajorVersion=[B]\nMinorVersion=[B]\nServerType=[W]\nElectionVersion=[w]\nBrowserConstant=[w]\n",
+ maxbuf, unicodestr);
+ break;
+
+ case 0x2:
+ data = smb_fdata(ndo, data,
+ "BROWSE PACKET:\nType=[B] (AnnouncementRequest)\nFlags=[B]\nReplySystemName=[S]\n",
+ maxbuf, unicodestr);
+ break;
+
+ case 0xc:
+ data = smb_fdata(ndo, data,
+ "BROWSE PACKET:\nType=[B] (WorkgroupAnnouncement)\nUpdateCount=[w]\nRes1=[B]\nAnnounceInterval=[d]\nName=[n2]\nMajorVersion=[B]\nMinorVersion=[B]\nServerType=[W]\nCommentPointer=[W]\nServerName=[S]\n",
+ maxbuf, unicodestr);
+ break;
+
+ case 0x8:
+ data = smb_fdata(ndo, data,
+ "BROWSE PACKET:\nType=[B] (ElectionFrame)\nElectionVersion=[B]\nOSSummary=[W]\nUptime=[(W, W)]\nServerName=[S]\n",
+ maxbuf, unicodestr);
+ break;
+
+ case 0xb:
+ data = smb_fdata(ndo, data,
+ "BROWSE PACKET:\nType=[B] (BecomeBackupBrowser)\nName=[S]\n",
+ maxbuf, unicodestr);
+ break;
+
+ case 0x9:
+ data = smb_fdata(ndo, data,
+ "BROWSE PACKET:\nType=[B] (GetBackupList)\nListCount?=[B]\nToken=[W]\n",
+ maxbuf, unicodestr);
+ break;
+
+ case 0xa:
+ data = smb_fdata(ndo, data,
+ "BROWSE PACKET:\nType=[B] (BackupListResponse)\nServerCount?=[B]\nToken=[W]\n*Name=[S]\n",
+ maxbuf, unicodestr);
+ break;
+
+ case 0xd:
+ data = smb_fdata(ndo, data,
+ "BROWSE PACKET:\nType=[B] (MasterAnnouncement)\nMasterName=[S]\n",
+ maxbuf, unicodestr);
+ break;
+
+ case 0xe:
+ data = smb_fdata(ndo, data,
+ "BROWSE PACKET:\nType=[B] (ResetBrowser)\nOptions=[B]\n", maxbuf, unicodestr);
+ break;
+
+ default:
+ data = smb_fdata(ndo, data, "Unknown Browser Frame ", maxbuf, unicodestr);
+ break;
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+
+static void
+print_ipc(netdissect_options *ndo,
+ const u_char *param, int paramlen, const u_char *data, int datalen)
+{
+ if (paramlen)
+ smb_fdata(ndo, param, "Command=[w]\nStr1=[S]\nStr2=[S]\n", param + paramlen,
+ unicodestr);
+ if (datalen)
+ smb_fdata(ndo, data, "IPC ", data + datalen, unicodestr);
+}
+
+
+static void
+print_trans(netdissect_options *ndo,
+ const u_char *words, const u_char *data1, const u_char *buf, const u_char *maxbuf)
+{
+ u_int bcc;
+ const char *f1, *f2, *f3, *f4;
+ const u_char *data, *param;
+ const u_char *w = words + 1;
+ int datalen, paramlen;
+
+ if (request) {
+ ND_TCHECK2(w[12 * 2], 2);
+ paramlen = EXTRACT_LE_16BITS(w + 9 * 2);
+ param = buf + EXTRACT_LE_16BITS(w + 10 * 2);
+ datalen = EXTRACT_LE_16BITS(w + 11 * 2);
+ data = buf + EXTRACT_LE_16BITS(w + 12 * 2);
+ f1 = "TotParamCnt=[d] \nTotDataCnt=[d] \nMaxParmCnt=[d] \nMaxDataCnt=[d]\nMaxSCnt=[d] \nTransFlags=[w] \nRes1=[w] \nRes2=[w] \nRes3=[w]\nParamCnt=[d] \nParamOff=[d] \nDataCnt=[d] \nDataOff=[d] \nSUCnt=[d]\n";
+ f2 = "|Name=[S]\n";
+ f3 = "|Param ";
+ f4 = "|Data ";
+ } else {
+ ND_TCHECK2(w[7 * 2], 2);
+ paramlen = EXTRACT_LE_16BITS(w + 3 * 2);
+ param = buf + EXTRACT_LE_16BITS(w + 4 * 2);
+ datalen = EXTRACT_LE_16BITS(w + 6 * 2);
+ data = buf + EXTRACT_LE_16BITS(w + 7 * 2);
+ f1 = "TotParamCnt=[d] \nTotDataCnt=[d] \nRes1=[d]\nParamCnt=[d] \nParamOff=[d] \nRes2=[d] \nDataCnt=[d] \nDataOff=[d] \nRes3=[d]\nLsetup=[d]\n";
+ f2 = "|Unknown ";
+ f3 = "|Param ";
+ f4 = "|Data ";
+ }
+
+ smb_fdata(ndo, words + 1, f1, min(words + 1 + 2 * words[0], maxbuf),
+ unicodestr);
+
+ ND_TCHECK2(*data1, 2);
+ bcc = EXTRACT_LE_16BITS(data1);
+ ND_PRINT((ndo, "smb_bcc=%u\n", bcc));
+ if (bcc > 0) {
+ smb_fdata(ndo, data1 + 2, f2, maxbuf - (paramlen + datalen), unicodestr);
+
+ if (strcmp((const char *)(data1 + 2), "\\MAILSLOT\\BROWSE") == 0) {
+ print_browse(ndo, param, paramlen, data, datalen);
+ return;
+ }
+
+ if (strcmp((const char *)(data1 + 2), "\\PIPE\\LANMAN") == 0) {
+ print_ipc(ndo, param, paramlen, data, datalen);
+ return;
+ }
+
+ if (paramlen)
+ smb_fdata(ndo, param, f3, min(param + paramlen, maxbuf), unicodestr);
+ if (datalen)
+ smb_fdata(ndo, data, f4, min(data + datalen, maxbuf), unicodestr);
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+
+static void
+print_negprot(netdissect_options *ndo,
+ const u_char *words, const u_char *data, const u_char *buf _U_, const u_char *maxbuf)
+{
+ u_int wct, bcc;
+ const char *f1 = NULL, *f2 = NULL;
+
+ ND_TCHECK(words[0]);
+ wct = words[0];
+ if (request)
+ f2 = "*|Dialect=[Y]\n";
+ else {
+ if (wct == 1)
+ f1 = "Core Protocol\nDialectIndex=[d]";
+ else if (wct == 17)
+ f1 = "NT1 Protocol\nDialectIndex=[d]\nSecMode=[B]\nMaxMux=[d]\nNumVcs=[d]\nMaxBuffer=[D]\nRawSize=[D]\nSessionKey=[W]\nCapabilities=[W]\nServerTime=[T3]TimeZone=[d]\nCryptKey=";
+ else if (wct == 13)
+ f1 = "Coreplus/Lanman1/Lanman2 Protocol\nDialectIndex=[d]\nSecMode=[w]\nMaxXMit=[d]\nMaxMux=[d]\nMaxVcs=[d]\nBlkMode=[w]\nSessionKey=[W]\nServerTime=[T1]TimeZone=[d]\nRes=[W]\nCryptKey=";
+ }
+
+ if (f1)
+ smb_fdata(ndo, words + 1, f1, min(words + 1 + wct * 2, maxbuf),
+ unicodestr);
+ else
+ print_data(ndo, words + 1, min(wct * 2, PTR_DIFF(maxbuf, words + 1)));
+
+ ND_TCHECK2(*data, 2);
+ bcc = EXTRACT_LE_16BITS(data);
+ ND_PRINT((ndo, "smb_bcc=%u\n", bcc));
+ if (bcc > 0) {
+ if (f2)
+ smb_fdata(ndo, data + 2, f2, min(data + 2 + EXTRACT_LE_16BITS(data),
+ maxbuf), unicodestr);
+ else
+ print_data(ndo, data + 2, min(EXTRACT_LE_16BITS(data), PTR_DIFF(maxbuf, data + 2)));
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+print_sesssetup(netdissect_options *ndo,
+ const u_char *words, const u_char *data, const u_char *buf _U_, const u_char *maxbuf)
+{
+ u_int wct, bcc;
+ const char *f1 = NULL, *f2 = NULL;
+
+ ND_TCHECK(words[0]);
+ wct = words[0];
+ if (request) {
+ if (wct == 10)
+ f1 = "Com2=[w]\nOff2=[d]\nBufSize=[d]\nMpxMax=[d]\nVcNum=[d]\nSessionKey=[W]\nPassLen=[d]\nCryptLen=[d]\nCryptOff=[d]\nPass&Name=\n";
+ else
+ f1 = "Com2=[B]\nRes1=[B]\nOff2=[d]\nMaxBuffer=[d]\nMaxMpx=[d]\nVcNumber=[d]\nSessionKey=[W]\nCaseInsensitivePasswordLength=[d]\nCaseSensitivePasswordLength=[d]\nRes=[W]\nCapabilities=[W]\nPass1&Pass2&Account&Domain&OS&LanMan=\n";
+ } else {
+ if (wct == 3) {
+ f1 = "Com2=[w]\nOff2=[d]\nAction=[w]\n";
+ } else if (wct == 13) {
+ f1 = "Com2=[B]\nRes=[B]\nOff2=[d]\nAction=[w]\n";
+ f2 = "NativeOS=[S]\nNativeLanMan=[S]\nPrimaryDomain=[S]\n";
+ }
+ }
+
+ if (f1)
+ smb_fdata(ndo, words + 1, f1, min(words + 1 + wct * 2, maxbuf),
+ unicodestr);
+ else
+ print_data(ndo, words + 1, min(wct * 2, PTR_DIFF(maxbuf, words + 1)));
+
+ ND_TCHECK2(*data, 2);
+ bcc = EXTRACT_LE_16BITS(data);
+ ND_PRINT((ndo, "smb_bcc=%u\n", bcc));
+ if (bcc > 0) {
+ if (f2)
+ smb_fdata(ndo, data + 2, f2, min(data + 2 + EXTRACT_LE_16BITS(data),
+ maxbuf), unicodestr);
+ else
+ print_data(ndo, data + 2, min(EXTRACT_LE_16BITS(data), PTR_DIFF(maxbuf, data + 2)));
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+print_lockingandx(netdissect_options *ndo,
+ const u_char *words, const u_char *data, const u_char *buf _U_, const u_char *maxbuf)
+{
+ u_int wct, bcc;
+ const u_char *maxwords;
+ const char *f1 = NULL, *f2 = NULL;
+
+ ND_TCHECK(words[0]);
+ wct = words[0];
+ if (request) {
+ f1 = "Com2=[w]\nOff2=[d]\nHandle=[d]\nLockType=[w]\nTimeOut=[D]\nUnlockCount=[d]\nLockCount=[d]\n";
+ ND_TCHECK(words[7]);
+ if (words[7] & 0x10)
+ f2 = "*Process=[d]\n[P2]Offset=[M]\nLength=[M]\n";
+ else
+ f2 = "*Process=[d]\nOffset=[D]\nLength=[D]\n";
+ } else {
+ f1 = "Com2=[w]\nOff2=[d]\n";
+ }
+
+ maxwords = min(words + 1 + wct * 2, maxbuf);
+ if (wct)
+ smb_fdata(ndo, words + 1, f1, maxwords, unicodestr);
+
+ ND_TCHECK2(*data, 2);
+ bcc = EXTRACT_LE_16BITS(data);
+ ND_PRINT((ndo, "smb_bcc=%u\n", bcc));
+ if (bcc > 0) {
+ if (f2)
+ smb_fdata(ndo, data + 2, f2, min(data + 2 + EXTRACT_LE_16BITS(data),
+ maxbuf), unicodestr);
+ else
+ print_data(ndo, data + 2, min(EXTRACT_LE_16BITS(data), PTR_DIFF(maxbuf, data + 2)));
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+
+static const struct smbfns smb_fns[] = {
+ { -1, "SMBunknown", 0, DEFDESCRIPT },
+
+ { SMBtcon, "SMBtcon", 0,
+ { NULL, "Path=[Z]\nPassword=[Z]\nDevice=[Z]\n",
+ "MaxXmit=[d]\nTreeId=[d]\n", NULL,
+ NULL } },
+
+ { SMBtdis, "SMBtdis", 0, DEFDESCRIPT },
+ { SMBexit, "SMBexit", 0, DEFDESCRIPT },
+ { SMBioctl, "SMBioctl", 0, DEFDESCRIPT },
+
+ { SMBecho, "SMBecho", 0,
+ { "ReverbCount=[d]\n", NULL,
+ "SequenceNum=[d]\n", NULL,
+ NULL } },
+
+ { SMBulogoffX, "SMBulogoffX", FLG_CHAIN, DEFDESCRIPT },
+
+ { SMBgetatr, "SMBgetatr", 0,
+ { NULL, "Path=[Z]\n",
+ "Attribute=[A]\nTime=[T2]Size=[D]\nRes=([w,w,w,w,w])\n", NULL,
+ NULL } },
+
+ { SMBsetatr, "SMBsetatr", 0,
+ { "Attribute=[A]\nTime=[T2]Res=([w,w,w,w,w])\n", "Path=[Z]\n",
+ NULL, NULL, NULL } },
+
+ { SMBchkpth, "SMBchkpth", 0,
+ { NULL, "Path=[Z]\n", NULL, NULL, NULL } },
+
+ { SMBsearch, "SMBsearch", 0,
+ { "Count=[d]\nAttrib=[A]\n",
+ "Path=[Z]\nBlkType=[B]\nBlkLen=[d]\n|Res1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\n",
+ "Count=[d]\n",
+ "BlkType=[B]\nBlkLen=[d]\n*\nRes1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\nAttrib=[a]\nTime=[T1]Size=[D]\nName=[s13]\n",
+ NULL } },
+
+ { SMBopen, "SMBopen", 0,
+ { "Mode=[w]\nAttribute=[A]\n", "Path=[Z]\n",
+ "Handle=[d]\nOAttrib=[A]\nTime=[T2]Size=[D]\nAccess=[w]\n",
+ NULL, NULL } },
+
+ { SMBcreate, "SMBcreate", 0,
+ { "Attrib=[A]\nTime=[T2]", "Path=[Z]\n", "Handle=[d]\n", NULL, NULL } },
+
+ { SMBmknew, "SMBmknew", 0,
+ { "Attrib=[A]\nTime=[T2]", "Path=[Z]\n", "Handle=[d]\n", NULL, NULL } },
+
+ { SMBunlink, "SMBunlink", 0,
+ { "Attrib=[A]\n", "Path=[Z]\n", NULL, NULL, NULL } },
+
+ { SMBread, "SMBread", 0,
+ { "Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n", NULL,
+ "Count=[d]\nRes=([w,w,w,w])\n", NULL, NULL } },
+
+ { SMBwrite, "SMBwrite", 0,
+ { "Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n", NULL,
+ "Count=[d]\n", NULL, NULL } },
+
+ { SMBclose, "SMBclose", 0,
+ { "Handle=[d]\nTime=[T2]", NULL, NULL, NULL, NULL } },
+
+ { SMBmkdir, "SMBmkdir", 0,
+ { NULL, "Path=[Z]\n", NULL, NULL, NULL } },
+
+ { SMBrmdir, "SMBrmdir", 0,
+ { NULL, "Path=[Z]\n", NULL, NULL, NULL } },
+
+ { SMBdskattr, "SMBdskattr", 0,
+ { NULL, NULL,
+ "TotalUnits=[d]\nBlocksPerUnit=[d]\nBlockSize=[d]\nFreeUnits=[d]\nMedia=[w]\n",
+ NULL, NULL } },
+
+ { SMBmv, "SMBmv", 0,
+ { "Attrib=[A]\n", "OldPath=[Z]\nNewPath=[Z]\n", NULL, NULL, NULL } },
+
+ /*
+ * this is a Pathworks specific call, allowing the
+ * changing of the root path
+ */
+ { pSETDIR, "SMBsetdir", 0, { NULL, "Path=[Z]\n", NULL, NULL, NULL } },
+
+ { SMBlseek, "SMBlseek", 0,
+ { "Handle=[d]\nMode=[w]\nOffset=[D]\n", "Offset=[D]\n", NULL, NULL, NULL } },
+
+ { SMBflush, "SMBflush", 0, { "Handle=[d]\n", NULL, NULL, NULL, NULL } },
+
+ { SMBsplopen, "SMBsplopen", 0,
+ { "SetupLen=[d]\nMode=[w]\n", "Ident=[Z]\n", "Handle=[d]\n",
+ NULL, NULL } },
+
+ { SMBsplclose, "SMBsplclose", 0,
+ { "Handle=[d]\n", NULL, NULL, NULL, NULL } },
+
+ { SMBsplretq, "SMBsplretq", 0,
+ { "MaxCount=[d]\nStartIndex=[d]\n", NULL,
+ "Count=[d]\nIndex=[d]\n",
+ "*Time=[T2]Status=[B]\nJobID=[d]\nSize=[D]\nRes=[B]Name=[s16]\n",
+ NULL } },
+
+ { SMBsplwr, "SMBsplwr", 0,
+ { "Handle=[d]\n", NULL, NULL, NULL, NULL } },
+
+ { SMBlock, "SMBlock", 0,
+ { "Handle=[d]\nCount=[D]\nOffset=[D]\n", NULL, NULL, NULL, NULL } },
+
+ { SMBunlock, "SMBunlock", 0,
+ { "Handle=[d]\nCount=[D]\nOffset=[D]\n", NULL, NULL, NULL, NULL } },
+
+ /* CORE+ PROTOCOL FOLLOWS */
+
+ { SMBreadbraw, "SMBreadbraw", 0,
+ { "Handle=[d]\nOffset=[D]\nMaxCount=[d]\nMinCount=[d]\nTimeOut=[D]\nRes=[d]\n",
+ NULL, NULL, NULL, NULL } },
+
+ { SMBwritebraw, "SMBwritebraw", 0,
+ { "Handle=[d]\nTotalCount=[d]\nRes=[w]\nOffset=[D]\nTimeOut=[D]\nWMode=[w]\nRes2=[W]\n|DataSize=[d]\nDataOff=[d]\n",
+ NULL, "WriteRawAck", NULL, NULL } },
+
+ { SMBwritec, "SMBwritec", 0,
+ { NULL, NULL, "Count=[d]\n", NULL, NULL } },
+
+ { SMBwriteclose, "SMBwriteclose", 0,
+ { "Handle=[d]\nCount=[d]\nOffset=[D]\nTime=[T2]Res=([w,w,w,w,w,w])",
+ NULL, "Count=[d]\n", NULL, NULL } },
+
+ { SMBlockread, "SMBlockread", 0,
+ { "Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n", NULL,
+ "Count=[d]\nRes=([w,w,w,w])\n", NULL, NULL } },
+
+ { SMBwriteunlock, "SMBwriteunlock", 0,
+ { "Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n", NULL,
+ "Count=[d]\n", NULL, NULL } },
+
+ { SMBreadBmpx, "SMBreadBmpx", 0,
+ { "Handle=[d]\nOffset=[D]\nMaxCount=[d]\nMinCount=[d]\nTimeOut=[D]\nRes=[w]\n",
+ NULL,
+ "Offset=[D]\nTotCount=[d]\nRemaining=[d]\nRes=([w,w])\nDataSize=[d]\nDataOff=[d]\n",
+ NULL, NULL } },
+
+ { SMBwriteBmpx, "SMBwriteBmpx", 0,
+ { "Handle=[d]\nTotCount=[d]\nRes=[w]\nOffset=[D]\nTimeOut=[D]\nWMode=[w]\nRes2=[W]\nDataSize=[d]\nDataOff=[d]\n", NULL,
+ "Remaining=[d]\n", NULL, NULL } },
+
+ { SMBwriteBs, "SMBwriteBs", 0,
+ { "Handle=[d]\nTotCount=[d]\nOffset=[D]\nRes=[W]\nDataSize=[d]\nDataOff=[d]\n",
+ NULL, "Count=[d]\n", NULL, NULL } },
+
+ { SMBsetattrE, "SMBsetattrE", 0,
+ { "Handle=[d]\nCreationTime=[T2]AccessTime=[T2]ModifyTime=[T2]", NULL,
+ NULL, NULL, NULL } },
+
+ { SMBgetattrE, "SMBgetattrE", 0,
+ { "Handle=[d]\n", NULL,
+ "CreationTime=[T2]AccessTime=[T2]ModifyTime=[T2]Size=[D]\nAllocSize=[D]\nAttribute=[A]\n",
+ NULL, NULL } },
+
+ { SMBtranss, "SMBtranss", 0, DEFDESCRIPT },
+ { SMBioctls, "SMBioctls", 0, DEFDESCRIPT },
+
+ { SMBcopy, "SMBcopy", 0,
+ { "TreeID2=[d]\nOFun=[w]\nFlags=[w]\n", "Path=[S]\nNewPath=[S]\n",
+ "CopyCount=[d]\n", "|ErrStr=[S]\n", NULL } },
+
+ { SMBmove, "SMBmove", 0,
+ { "TreeID2=[d]\nOFun=[w]\nFlags=[w]\n", "Path=[S]\nNewPath=[S]\n",
+ "MoveCount=[d]\n", "|ErrStr=[S]\n", NULL } },
+
+ { SMBopenX, "SMBopenX", FLG_CHAIN,
+ { "Com2=[w]\nOff2=[d]\nFlags=[w]\nMode=[w]\nSearchAttrib=[A]\nAttrib=[A]\nTime=[T2]OFun=[w]\nSize=[D]\nTimeOut=[D]\nRes=[W]\n",
+ "Path=[S]\n",
+ "Com2=[w]\nOff2=[d]\nHandle=[d]\nAttrib=[A]\nTime=[T2]Size=[D]\nAccess=[w]\nType=[w]\nState=[w]\nAction=[w]\nFileID=[W]\nRes=[w]\n",
+ NULL, NULL } },
+
+ { SMBreadX, "SMBreadX", FLG_CHAIN,
+ { "Com2=[w]\nOff2=[d]\nHandle=[d]\nOffset=[D]\nMaxCount=[d]\nMinCount=[d]\nTimeOut=[D]\nCountLeft=[d]\n",
+ NULL,
+ "Com2=[w]\nOff2=[d]\nRemaining=[d]\nRes=[W]\nDataSize=[d]\nDataOff=[d]\nRes=([w,w,w,w])\n",
+ NULL, NULL } },
+
+ { SMBwriteX, "SMBwriteX", FLG_CHAIN,
+ { "Com2=[w]\nOff2=[d]\nHandle=[d]\nOffset=[D]\nTimeOut=[D]\nWMode=[w]\nCountLeft=[d]\nRes=[w]\nDataSize=[d]\nDataOff=[d]\n",
+ NULL,
+ "Com2=[w]\nOff2=[d]\nCount=[d]\nRemaining=[d]\nRes=[W]\n",
+ NULL, NULL } },
+
+ { SMBffirst, "SMBffirst", 0,
+ { "Count=[d]\nAttrib=[A]\n",
+ "Path=[Z]\nBlkType=[B]\nBlkLen=[d]\n|Res1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\n",
+ "Count=[d]\n",
+ "BlkType=[B]\nBlkLen=[d]\n*\nRes1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\nAttrib=[a]\nTime=[T1]Size=[D]\nName=[s13]\n",
+ NULL } },
+
+ { SMBfunique, "SMBfunique", 0,
+ { "Count=[d]\nAttrib=[A]\n",
+ "Path=[Z]\nBlkType=[B]\nBlkLen=[d]\n|Res1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\n",
+ "Count=[d]\n",
+ "BlkType=[B]\nBlkLen=[d]\n*\nRes1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\nAttrib=[a]\nTime=[T1]Size=[D]\nName=[s13]\n",
+ NULL } },
+
+ { SMBfclose, "SMBfclose", 0,
+ { "Count=[d]\nAttrib=[A]\n",
+ "Path=[Z]\nBlkType=[B]\nBlkLen=[d]\n|Res1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\n",
+ "Count=[d]\n",
+ "BlkType=[B]\nBlkLen=[d]\n*\nRes1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\nAttrib=[a]\nTime=[T1]Size=[D]\nName=[s13]\n",
+ NULL } },
+
+ { SMBfindnclose, "SMBfindnclose", 0,
+ { "Handle=[d]\n", NULL, NULL, NULL, NULL } },
+
+ { SMBfindclose, "SMBfindclose", 0,
+ { "Handle=[d]\n", NULL, NULL, NULL, NULL } },
+
+ { SMBsends, "SMBsends", 0,
+ { NULL, "Source=[Z]\nDest=[Z]\n", NULL, NULL, NULL } },
+
+ { SMBsendstrt, "SMBsendstrt", 0,
+ { NULL, "Source=[Z]\nDest=[Z]\n", "GroupID=[d]\n", NULL, NULL } },
+
+ { SMBsendend, "SMBsendend", 0,
+ { "GroupID=[d]\n", NULL, NULL, NULL, NULL } },
+
+ { SMBsendtxt, "SMBsendtxt", 0,
+ { "GroupID=[d]\n", NULL, NULL, NULL, NULL } },
+
+ { SMBsendb, "SMBsendb", 0,
+ { NULL, "Source=[Z]\nDest=[Z]\n", NULL, NULL, NULL } },
+
+ { SMBfwdname, "SMBfwdname", 0, DEFDESCRIPT },
+ { SMBcancelf, "SMBcancelf", 0, DEFDESCRIPT },
+ { SMBgetmac, "SMBgetmac", 0, DEFDESCRIPT },
+
+ { SMBnegprot, "SMBnegprot", 0,
+ { NULL, NULL, NULL, NULL, print_negprot } },
+
+ { SMBsesssetupX, "SMBsesssetupX", FLG_CHAIN,
+ { NULL, NULL, NULL, NULL, print_sesssetup } },
+
+ { SMBtconX, "SMBtconX", FLG_CHAIN,
+ { "Com2=[w]\nOff2=[d]\nFlags=[w]\nPassLen=[d]\nPasswd&Path&Device=\n",
+ NULL, "Com2=[w]\nOff2=[d]\n", "ServiceType=[R]\n", NULL } },
+
+ { SMBlockingX, "SMBlockingX", FLG_CHAIN,
+ { NULL, NULL, NULL, NULL, print_lockingandx } },
+
+ { SMBtrans2, "SMBtrans2", 0, { NULL, NULL, NULL, NULL, print_trans2 } },
+
+ { SMBtranss2, "SMBtranss2", 0, DEFDESCRIPT },
+ { SMBctemp, "SMBctemp", 0, DEFDESCRIPT },
+ { SMBreadBs, "SMBreadBs", 0, DEFDESCRIPT },
+ { SMBtrans, "SMBtrans", 0, { NULL, NULL, NULL, NULL, print_trans } },
+
+ { SMBnttrans, "SMBnttrans", 0, DEFDESCRIPT },
+ { SMBnttranss, "SMBnttranss", 0, DEFDESCRIPT },
+
+ { SMBntcreateX, "SMBntcreateX", FLG_CHAIN,
+ { "Com2=[w]\nOff2=[d]\nRes=[b]\nNameLen=[ld]\nFlags=[W]\nRootDirectoryFid=[D]\nAccessMask=[W]\nAllocationSize=[L]\nExtFileAttributes=[W]\nShareAccess=[W]\nCreateDisposition=[W]\nCreateOptions=[W]\nImpersonationLevel=[W]\nSecurityFlags=[b]\n",
+ "Path=[C]\n",
+ "Com2=[w]\nOff2=[d]\nOplockLevel=[b]\nFid=[d]\nCreateAction=[W]\nCreateTime=[T3]LastAccessTime=[T3]LastWriteTime=[T3]ChangeTime=[T3]ExtFileAttributes=[W]\nAllocationSize=[L]\nEndOfFile=[L]\nFileType=[w]\nDeviceState=[w]\nDirectory=[b]\n",
+ NULL, NULL } },
+
+ { SMBntcancel, "SMBntcancel", 0, DEFDESCRIPT },
+
+ { -1, NULL, 0, DEFDESCRIPT }
+};
+
+
+/*
+ * print a SMB message
+ */
+static void
+print_smb(netdissect_options *ndo,
+ const u_char *buf, const u_char *maxbuf)
+{
+ uint16_t flags2;
+ int nterrcodes;
+ int command;
+ uint32_t nterror;
+ const u_char *words, *maxwords, *data;
+ const struct smbfns *fn;
+ const char *fmt_smbheader =
+ "[P4]SMB Command = [B]\nError class = [BP1]\nError code = [d]\nFlags1 = [B]\nFlags2 = [B][P13]\nTree ID = [d]\nProc ID = [d]\nUID = [d]\nMID = [d]\nWord Count = [b]\n";
+ int smboffset;
+
+ ND_TCHECK(buf[9]);
+ request = (buf[9] & 0x80) ? 0 : 1;
+ flags2 = EXTRACT_LE_16BITS(&buf[10]);
+ unicodestr = flags2 & 0x8000;
+ nterrcodes = flags2 & 0x4000;
+ startbuf = buf;
+
+ command = buf[4];
+
+ fn = smbfind(command, smb_fns);
+
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, "\n"));
+
+ ND_PRINT((ndo, "SMB PACKET: %s (%s)\n", fn->name, request ? "REQUEST" : "REPLY"));
+
+ if (ndo->ndo_vflag < 2)
+ return;
+
+ /* print out the header */
+ smb_fdata(ndo, buf, fmt_smbheader, buf + 33, unicodestr);
+
+ if (nterrcodes) {
+ nterror = EXTRACT_LE_32BITS(&buf[5]);
+ if (nterror)
+ ND_PRINT((ndo, "NTError = %s\n", nt_errstr(nterror)));
+ } else {
+ if (buf[5])
+ ND_PRINT((ndo, "SMBError = %s\n", smb_errstr(buf[5], EXTRACT_LE_16BITS(&buf[7]))));
+ }
+
+ smboffset = 32;
+
+ for (;;) {
+ const char *f1, *f2;
+ int wct;
+ u_int bcc;
+ int newsmboffset;
+
+ words = buf + smboffset;
+ ND_TCHECK(words[0]);
+ wct = words[0];
+ data = words + 1 + wct * 2;
+ maxwords = min(data, maxbuf);
+
+ if (request) {
+ f1 = fn->descript.req_f1;
+ f2 = fn->descript.req_f2;
+ } else {
+ f1 = fn->descript.rep_f1;
+ f2 = fn->descript.rep_f2;
+ }
+
+ if (fn->descript.fn)
+ (*fn->descript.fn)(ndo, words, data, buf, maxbuf);
+ else {
+ if (wct) {
+ if (f1)
+ smb_fdata(ndo, words + 1, f1, words + 1 + wct * 2, unicodestr);
+ else {
+ int i;
+ int v;
+
+ for (i = 0; &words[1 + 2 * i] < maxwords; i++) {
+ ND_TCHECK2(words[1 + 2 * i], 2);
+ v = EXTRACT_LE_16BITS(words + 1 + 2 * i);
+ ND_PRINT((ndo, "smb_vwv[%d]=%d (0x%X)\n", i, v, v));
+ }
+ }
+ }
+
+ ND_TCHECK2(*data, 2);
+ bcc = EXTRACT_LE_16BITS(data);
+ ND_PRINT((ndo, "smb_bcc=%u\n", bcc));
+ if (f2) {
+ if (bcc > 0)
+ smb_fdata(ndo, data + 2, f2, data + 2 + bcc, unicodestr);
+ } else {
+ if (bcc > 0) {
+ ND_PRINT((ndo, "smb_buf[]=\n"));
+ print_data(ndo, data + 2, min(bcc, PTR_DIFF(maxbuf, data + 2)));
+ }
+ }
+ }
+
+ if ((fn->flags & FLG_CHAIN) == 0)
+ break;
+ if (wct == 0)
+ break;
+ ND_TCHECK(words[1]);
+ command = words[1];
+ if (command == 0xFF)
+ break;
+ ND_TCHECK2(words[3], 2);
+ newsmboffset = EXTRACT_LE_16BITS(words + 3);
+
+ fn = smbfind(command, smb_fns);
+
+ ND_PRINT((ndo, "\nSMB PACKET: %s (%s) (CHAINED)\n",
+ fn->name, request ? "REQUEST" : "REPLY"));
+ if (newsmboffset <= smboffset) {
+ ND_PRINT((ndo, "Bad andX offset: %u <= %u\n", newsmboffset, smboffset));
+ break;
+ }
+ smboffset = newsmboffset;
+ }
+
+ ND_PRINT((ndo, "\n"));
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+
+/*
+ * print a NBT packet received across tcp on port 139
+ */
+void
+nbt_tcp_print(netdissect_options *ndo,
+ const u_char *data, int length)
+{
+ int caplen;
+ int type;
+ u_int nbt_len;
+ const u_char *maxbuf;
+
+ if (length < 4)
+ goto trunc;
+ if (ndo->ndo_snapend < data)
+ goto trunc;
+ caplen = ndo->ndo_snapend - data;
+ if (caplen < 4)
+ goto trunc;
+ maxbuf = data + caplen;
+ type = data[0];
+ nbt_len = EXTRACT_16BITS(data + 2);
+ length -= 4;
+ caplen -= 4;
+
+ startbuf = data;
+
+ if (ndo->ndo_vflag < 2) {
+ ND_PRINT((ndo, " NBT Session Packet: "));
+ switch (type) {
+ case 0x00:
+ ND_PRINT((ndo, "Session Message"));
+ break;
+
+ case 0x81:
+ ND_PRINT((ndo, "Session Request"));
+ break;
+
+ case 0x82:
+ ND_PRINT((ndo, "Session Granted"));
+ break;
+
+ case 0x83:
+ {
+ int ecode;
+
+ if (nbt_len < 4)
+ goto trunc;
+ if (length < 4)
+ goto trunc;
+ if (caplen < 4)
+ goto trunc;
+ ecode = data[4];
+
+ ND_PRINT((ndo, "Session Reject, "));
+ switch (ecode) {
+ case 0x80:
+ ND_PRINT((ndo, "Not listening on called name"));
+ break;
+ case 0x81:
+ ND_PRINT((ndo, "Not listening for calling name"));
+ break;
+ case 0x82:
+ ND_PRINT((ndo, "Called name not present"));
+ break;
+ case 0x83:
+ ND_PRINT((ndo, "Called name present, but insufficient resources"));
+ break;
+ default:
+ ND_PRINT((ndo, "Unspecified error 0x%X", ecode));
+ break;
+ }
+ }
+ break;
+
+ case 0x85:
+ ND_PRINT((ndo, "Session Keepalive"));
+ break;
+
+ default:
+ data = smb_fdata(ndo, data, "Unknown packet type [rB]", maxbuf, 0);
+ break;
+ }
+ } else {
+ ND_PRINT((ndo, "\n>>> NBT Session Packet\n"));
+ switch (type) {
+ case 0x00:
+ data = smb_fdata(ndo, data, "[P1]NBT Session Message\nFlags=[B]\nLength=[rd]\n",
+ data + 4, 0);
+ if (data == NULL)
+ break;
+ if (nbt_len >= 4 && caplen >= 4 && memcmp(data,"\377SMB",4) == 0) {
+ if ((int)nbt_len > caplen) {
+ if ((int)nbt_len > length)
+ ND_PRINT((ndo, "WARNING: Packet is continued in later TCP segments\n"));
+ else
+ ND_PRINT((ndo, "WARNING: Short packet. Try increasing the snap length by %d\n",
+ nbt_len - caplen));
+ }
+ print_smb(ndo, data, maxbuf > data + nbt_len ? data + nbt_len : maxbuf);
+ } else
+ ND_PRINT((ndo, "Session packet:(raw data or continuation?)\n"));
+ break;
+
+ case 0x81:
+ data = smb_fdata(ndo, data,
+ "[P1]NBT Session Request\nFlags=[B]\nLength=[rd]\nDestination=[n1]\nSource=[n1]\n",
+ maxbuf, 0);
+ break;
+
+ case 0x82:
+ data = smb_fdata(ndo, data, "[P1]NBT Session Granted\nFlags=[B]\nLength=[rd]\n", maxbuf, 0);
+ break;
+
+ case 0x83:
+ {
+ const u_char *origdata;
+ int ecode;
+
+ origdata = data;
+ data = smb_fdata(ndo, data, "[P1]NBT SessionReject\nFlags=[B]\nLength=[rd]\nReason=[B]\n",
+ maxbuf, 0);
+ if (data == NULL)
+ break;
+ if (nbt_len >= 1 && caplen >= 1) {
+ ecode = origdata[4];
+ switch (ecode) {
+ case 0x80:
+ ND_PRINT((ndo, "Not listening on called name\n"));
+ break;
+ case 0x81:
+ ND_PRINT((ndo, "Not listening for calling name\n"));
+ break;
+ case 0x82:
+ ND_PRINT((ndo, "Called name not present\n"));
+ break;
+ case 0x83:
+ ND_PRINT((ndo, "Called name present, but insufficient resources\n"));
+ break;
+ default:
+ ND_PRINT((ndo, "Unspecified error 0x%X\n", ecode));
+ break;
+ }
+ }
+ }
+ break;
+
+ case 0x85:
+ data = smb_fdata(ndo, data, "[P1]NBT Session Keepalive\nFlags=[B]\nLength=[rd]\n", maxbuf, 0);
+ break;
+
+ default:
+ data = smb_fdata(ndo, data, "NBT - Unknown packet type\nType=[B]\n", maxbuf, 0);
+ break;
+ }
+ ND_PRINT((ndo, "\n"));
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static const struct tok opcode_str[] = {
+ { 0, "QUERY" },
+ { 5, "REGISTRATION" },
+ { 6, "RELEASE" },
+ { 7, "WACK" },
+ { 8, "REFRESH(8)" },
+ { 9, "REFRESH" },
+ { 15, "MULTIHOMED REGISTRATION" },
+ { 0, NULL }
+};
+
+/*
+ * print a NBT packet received across udp on port 137
+ */
+void
+nbt_udp137_print(netdissect_options *ndo,
+ const u_char *data, int length)
+{
+ const u_char *maxbuf = data + length;
+ int name_trn_id, response, opcode, nm_flags, rcode;
+ int qdcount, ancount, nscount, arcount;
+ const u_char *p;
+ int total, i;
+
+ ND_TCHECK2(data[10], 2);
+ name_trn_id = EXTRACT_16BITS(data);
+ response = (data[2] >> 7);
+ opcode = (data[2] >> 3) & 0xF;
+ nm_flags = ((data[2] & 0x7) << 4) + (data[3] >> 4);
+ rcode = data[3] & 0xF;
+ qdcount = EXTRACT_16BITS(data + 4);
+ ancount = EXTRACT_16BITS(data + 6);
+ nscount = EXTRACT_16BITS(data + 8);
+ arcount = EXTRACT_16BITS(data + 10);
+ startbuf = data;
+
+ if (maxbuf <= data)
+ return;
+
+ if (ndo->ndo_vflag > 1)
+ ND_PRINT((ndo, "\n>>> "));
+
+ ND_PRINT((ndo, "NBT UDP PACKET(137): %s", tok2str(opcode_str, "OPUNKNOWN", opcode)));
+ if (response) {
+ ND_PRINT((ndo, "; %s", rcode ? "NEGATIVE" : "POSITIVE"));
+ }
+ ND_PRINT((ndo, "; %s; %s", response ? "RESPONSE" : "REQUEST",
+ (nm_flags & 1) ? "BROADCAST" : "UNICAST"));
+
+ if (ndo->ndo_vflag < 2)
+ return;
+
+ ND_PRINT((ndo, "\nTrnID=0x%X\nOpCode=%d\nNmFlags=0x%X\nRcode=%d\nQueryCount=%d\nAnswerCount=%d\nAuthorityCount=%d\nAddressRecCount=%d\n",
+ name_trn_id, opcode, nm_flags, rcode, qdcount, ancount, nscount,
+ arcount));
+
+ p = data + 12;
+
+ total = ancount + nscount + arcount;
+
+ if (qdcount > 100 || total > 100) {
+ ND_PRINT((ndo, "Corrupt packet??\n"));
+ return;
+ }
+
+ if (qdcount) {
+ ND_PRINT((ndo, "QuestionRecords:\n"));
+ for (i = 0; i < qdcount; i++) {
+ p = smb_fdata(ndo, p,
+ "|Name=[n1]\nQuestionType=[rw]\nQuestionClass=[rw]\n#",
+ maxbuf, 0);
+ if (p == NULL)
+ goto out;
+ }
+ }
+
+ if (total) {
+ ND_PRINT((ndo, "\nResourceRecords:\n"));
+ for (i = 0; i < total; i++) {
+ int rdlen;
+ int restype;
+
+ p = smb_fdata(ndo, p, "Name=[n1]\n#", maxbuf, 0);
+ if (p == NULL)
+ goto out;
+ restype = EXTRACT_16BITS(p);
+ p = smb_fdata(ndo, p, "ResType=[rw]\nResClass=[rw]\nTTL=[rD]\n", p + 8, 0);
+ if (p == NULL)
+ goto out;
+ rdlen = EXTRACT_16BITS(p);
+ ND_PRINT((ndo, "ResourceLength=%d\nResourceData=\n", rdlen));
+ p += 2;
+ if (rdlen == 6) {
+ p = smb_fdata(ndo, p, "AddrType=[rw]\nAddress=[b.b.b.b]\n", p + rdlen, 0);
+ if (p == NULL)
+ goto out;
+ } else {
+ if (restype == 0x21) {
+ int numnames;
+
+ ND_TCHECK(*p);
+ numnames = p[0];
+ p = smb_fdata(ndo, p, "NumNames=[B]\n", p + 1, 0);
+ if (p == NULL)
+ goto out;
+ while (numnames--) {
+ p = smb_fdata(ndo, p, "Name=[n2]\t#", maxbuf, 0);
+ if (p == NULL)
+ goto out;
+ ND_TCHECK(*p);
+ if (p[0] & 0x80)
+ ND_PRINT((ndo, "<GROUP> "));
+ switch (p[0] & 0x60) {
+ case 0x00: ND_PRINT((ndo, "B ")); break;
+ case 0x20: ND_PRINT((ndo, "P ")); break;
+ case 0x40: ND_PRINT((ndo, "M ")); break;
+ case 0x60: ND_PRINT((ndo, "_ ")); break;
+ }
+ if (p[0] & 0x10)
+ ND_PRINT((ndo, "<DEREGISTERING> "));
+ if (p[0] & 0x08)
+ ND_PRINT((ndo, "<CONFLICT> "));
+ if (p[0] & 0x04)
+ ND_PRINT((ndo, "<ACTIVE> "));
+ if (p[0] & 0x02)
+ ND_PRINT((ndo, "<PERMANENT> "));
+ ND_PRINT((ndo, "\n"));
+ p += 2;
+ }
+ } else {
+ print_data(ndo, p, min(rdlen, length - (p - data)));
+ p += rdlen;
+ }
+ }
+ }
+ }
+
+ if (p < maxbuf)
+ smb_fdata(ndo, p, "AdditionalData:\n", maxbuf, 0);
+
+out:
+ ND_PRINT((ndo, "\n"));
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/*
+ * Print an SMB-over-TCP packet received across tcp on port 445
+ */
+void
+smb_tcp_print(netdissect_options *ndo,
+ const u_char * data, int length)
+{
+ int caplen;
+ u_int smb_len;
+ const u_char *maxbuf;
+
+ if (length < 4)
+ goto trunc;
+ if (ndo->ndo_snapend < data)
+ goto trunc;
+ caplen = ndo->ndo_snapend - data;
+ if (caplen < 4)
+ goto trunc;
+ maxbuf = data + caplen;
+ smb_len = EXTRACT_24BITS(data + 1);
+ length -= 4;
+ caplen -= 4;
+
+ startbuf = data;
+ data += 4;
+
+ if (smb_len >= 4 && caplen >= 4 && memcmp(data,"\377SMB",4) == 0) {
+ if ((int)smb_len > caplen) {
+ if ((int)smb_len > length)
+ ND_PRINT((ndo, " WARNING: Packet is continued in later TCP segments\n"));
+ else
+ ND_PRINT((ndo, " WARNING: Short packet. Try increasing the snap length by %d\n",
+ smb_len - caplen));
+ } else
+ ND_PRINT((ndo, " "));
+ print_smb(ndo, data, maxbuf > data + smb_len ? data + smb_len : maxbuf);
+ } else
+ ND_PRINT((ndo, " SMB-over-TCP packet:(raw data or continuation?)\n"));
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/*
+ * print a NBT packet received across udp on port 138
+ */
+void
+nbt_udp138_print(netdissect_options *ndo,
+ const u_char *data, int length)
+{
+ const u_char *maxbuf = data + length;
+
+ if (maxbuf > ndo->ndo_snapend)
+ maxbuf = ndo->ndo_snapend;
+ if (maxbuf <= data)
+ return;
+ startbuf = data;
+
+ if (ndo->ndo_vflag < 2) {
+ ND_PRINT((ndo, "NBT UDP PACKET(138)"));
+ return;
+ }
+
+ data = smb_fdata(ndo, data,
+ "\n>>> NBT UDP PACKET(138) Res=[rw] ID=[rw] IP=[b.b.b.b] Port=[rd] Length=[rd] Res2=[rw]\nSourceName=[n1]\nDestName=[n1]\n#",
+ maxbuf, 0);
+
+ if (data != NULL) {
+ /* If there isn't enough data for "\377SMB", don't check for it. */
+ if (&data[3] >= maxbuf)
+ goto out;
+
+ if (memcmp(data, "\377SMB",4) == 0)
+ print_smb(ndo, data, maxbuf);
+ }
+out:
+ ND_PRINT((ndo, "\n"));
+}
+
+
+/*
+ print netbeui frames
+*/
+struct nbf_strings {
+ const char *name;
+ const char *nonverbose;
+ const char *verbose;
+} nbf_strings[0x20] = {
+ { "Add Group Name Query", ", [P23]Name to add=[n2]#",
+ "[P5]ResponseCorrelator=[w]\n[P16]Name to add=[n2]\n" },
+ { "Add Name Query", ", [P23]Name to add=[n2]#",
+ "[P5]ResponseCorrelator=[w]\n[P16]Name to add=[n2]\n" },
+ { "Name In Conflict", NULL, NULL },
+ { "Status Query", NULL, NULL },
+ { NULL, NULL, NULL }, /* not used */
+ { NULL, NULL, NULL }, /* not used */
+ { NULL, NULL, NULL }, /* not used */
+ { "Terminate Trace", NULL, NULL },
+ { "Datagram", NULL,
+ "[P7]Destination=[n2]\nSource=[n2]\n" },
+ { "Broadcast Datagram", NULL,
+ "[P7]Destination=[n2]\nSource=[n2]\n" },
+ { "Name Query", ", [P7]Name=[n2]#",
+ "[P1]SessionNumber=[B]\nNameType=[B][P2]\nResponseCorrelator=[w]\nName=[n2]\nName of sender=[n2]\n" },
+ { NULL, NULL, NULL }, /* not used */
+ { NULL, NULL, NULL }, /* not used */
+ { "Add Name Response", ", [P1]GroupName=[w] [P4]Destination=[n2] Source=[n2]#",
+ "AddNameInProcess=[B]\nGroupName=[w]\nTransmitCorrelator=[w][P2]\nDestination=[n2]\nSource=[n2]\n" },
+ { "Name Recognized", NULL,
+ "[P1]Data2=[w]\nTransmitCorrelator=[w]\nResponseCorelator=[w]\nDestination=[n2]\nSource=[n2]\n" },
+ { "Status Response", NULL, NULL },
+ { NULL, NULL, NULL }, /* not used */
+ { NULL, NULL, NULL }, /* not used */
+ { NULL, NULL, NULL }, /* not used */
+ { "Terminate Trace", NULL, NULL },
+ { "Data Ack", NULL,
+ "[P3]TransmitCorrelator=[w][P2]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
+ { "Data First/Middle", NULL,
+ "Flags=[{RECEIVE_CONTINUE|NO_ACK||PIGGYBACK_ACK_INCLUDED|}]\nResyncIndicator=[w][P2]\nResponseCorelator=[w]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
+ { "Data Only/Last", NULL,
+ "Flags=[{|NO_ACK|PIGGYBACK_ACK_ALLOWED|PIGGYBACK_ACK_INCLUDED|}]\nResyncIndicator=[w][P2]\nResponseCorelator=[w]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
+ { "Session Confirm", NULL,
+ "Data1=[B]\nData2=[w]\nTransmitCorrelator=[w]\nResponseCorelator=[w]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
+ { "Session End", NULL,
+ "[P1]Data2=[w][P4]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
+ { "Session Initialize", NULL,
+ "Data1=[B]\nData2=[w]\nTransmitCorrelator=[w]\nResponseCorelator=[w]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
+ { "No Receive", NULL,
+ "Flags=[{|SEND_NO_ACK}]\nDataBytesAccepted=[b][P4]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
+ { "Receive Outstanding", NULL,
+ "[P1]DataBytesAccepted=[b][P4]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
+ { "Receive Continue", NULL,
+ "[P2]TransmitCorrelator=[w]\n[P2]RemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
+ { NULL, NULL, NULL }, /* not used */
+ { NULL, NULL, NULL }, /* not used */
+ { "Session Alive", NULL, NULL }
+};
+
+void
+netbeui_print(netdissect_options *ndo,
+ u_short control, const u_char *data, int length)
+{
+ const u_char *maxbuf = data + length;
+ int len;
+ int command;
+ const u_char *data2;
+ int is_truncated = 0;
+
+ if (maxbuf > ndo->ndo_snapend)
+ maxbuf = ndo->ndo_snapend;
+ ND_TCHECK(data[4]);
+ len = EXTRACT_LE_16BITS(data);
+ command = data[4];
+ data2 = data + len;
+ if (data2 >= maxbuf) {
+ data2 = maxbuf;
+ is_truncated = 1;
+ }
+
+ startbuf = data;
+
+ if (ndo->ndo_vflag < 2) {
+ ND_PRINT((ndo, "NBF Packet: "));
+ data = smb_fdata(ndo, data, "[P5]#", maxbuf, 0);
+ } else {
+ ND_PRINT((ndo, "\n>>> NBF Packet\nType=0x%X ", control));
+ data = smb_fdata(ndo, data, "Length=[d] Signature=[w] Command=[B]\n#", maxbuf, 0);
+ }
+ if (data == NULL)
+ goto out;
+
+ if (command > 0x1f || nbf_strings[command].name == NULL) {
+ if (ndo->ndo_vflag < 2)
+ data = smb_fdata(ndo, data, "Unknown NBF Command#", data2, 0);
+ else
+ data = smb_fdata(ndo, data, "Unknown NBF Command\n", data2, 0);
+ } else {
+ if (ndo->ndo_vflag < 2) {
+ ND_PRINT((ndo, "%s", nbf_strings[command].name));
+ if (nbf_strings[command].nonverbose != NULL)
+ data = smb_fdata(ndo, data, nbf_strings[command].nonverbose, data2, 0);
+ } else {
+ ND_PRINT((ndo, "%s:\n", nbf_strings[command].name));
+ if (nbf_strings[command].verbose != NULL)
+ data = smb_fdata(ndo, data, nbf_strings[command].verbose, data2, 0);
+ else
+ ND_PRINT((ndo, "\n"));
+ }
+ }
+
+ if (ndo->ndo_vflag < 2)
+ return;
+
+ if (data == NULL)
+ goto out;
+
+ if (is_truncated) {
+ /* data2 was past the end of the buffer */
+ goto out;
+ }
+
+ /* If this isn't a command that would contain an SMB message, quit. */
+ if (command != 0x08 && command != 0x09 && command != 0x15 &&
+ command != 0x16)
+ goto out;
+
+ /* If there isn't enough data for "\377SMB", don't look for it. */
+ if (&data2[3] >= maxbuf)
+ goto out;
+
+ if (memcmp(data2, "\377SMB",4) == 0)
+ print_smb(ndo, data2, maxbuf);
+ else {
+ int i;
+ for (i = 0; i < 128; i++) {
+ if (&data2[i + 3] >= maxbuf)
+ break;
+ if (memcmp(&data2[i], "\377SMB", 4) == 0) {
+ ND_PRINT((ndo, "found SMB packet at %d\n", i));
+ print_smb(ndo, &data2[i], maxbuf);
+ break;
+ }
+ }
+ }
+
+out:
+ ND_PRINT((ndo, "\n"));
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+
+/*
+ * print IPX-Netbios frames
+ */
+void
+ipx_netbios_print(netdissect_options *ndo,
+ const u_char *data, u_int length)
+{
+ /*
+ * this is a hack till I work out how to parse the rest of the
+ * NetBIOS-over-IPX stuff
+ */
+ int i;
+ const u_char *maxbuf;
+
+ maxbuf = data + length;
+ /* Don't go past the end of the captured data in the packet. */
+ if (maxbuf > ndo->ndo_snapend)
+ maxbuf = ndo->ndo_snapend;
+ startbuf = data;
+ for (i = 0; i < 128; i++) {
+ if (&data[i + 4] > maxbuf)
+ break;
+ if (memcmp(&data[i], "\377SMB", 4) == 0) {
+ smb_fdata(ndo, data, "\n>>> IPX transport ", &data[i], 0);
+ print_smb(ndo, &data[i], maxbuf);
+ ND_PRINT((ndo, "\n"));
+ break;
+ }
+ }
+ if (i == 128)
+ smb_fdata(ndo, data, "\n>>> Unknown IPX ", maxbuf, 0);
+}
--- /dev/null
+/*
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "netdissect.h"
+#include "extract.h"
+
+void
+smtp_print(netdissect_options *ndo, const u_char *pptr, u_int len)
+{
+ txtproto_print(ndo, pptr, len, "smtp", NULL, 0);
+}
--- /dev/null
+/*
+ * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997
+ * John Robert LoVerso. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ *
+ *
+ * This implementation has been influenced by the CMU SNMP release,
+ * by Steve Waldbusser. However, this shares no code with that system.
+ * Additional ASN.1 insight gained from Marshall T. Rose's _The_Open_Book_.
+ * Earlier forms of this implementation were derived and/or inspired by an
+ * awk script originally written by C. Philip Wood of LANL (but later
+ * heavily modified by John Robert LoVerso). The copyright notice for
+ * that work is preserved below, even though it may not rightly apply
+ * to this file.
+ *
+ * Support for SNMPv2c/SNMPv3 and the ability to link the module against
+ * the libsmi was added by J. Schoenwaelder, Copyright (c) 1999.
+ *
+ * This started out as a very simple program, but the incremental decoding
+ * (into the BE structure) complicated things.
+ *
+ # Los Alamos National Laboratory
+ #
+ # Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997
+ # This software was produced under a U.S. Government contract
+ # (W-7405-ENG-36) by Los Alamos National Laboratory, which is
+ # operated by the University of California for the U.S. Department
+ # of Energy. The U.S. Government is licensed to use, reproduce,
+ # and distribute this software. Permission is granted to the
+ # public to copy and use this software without charge, provided
+ # that this Notice and any statement of authorship are reproduced
+ # on all copies. Neither the Government nor the University makes
+ # any warranty, express or implied, or assumes any liability or
+ # responsibility for the use of this software.
+ # @(#)snmp.awk.x 1.1 (LANL) 1/15/90
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-snmp.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#ifdef USE_LIBSMI
+#include <smi.h>
+#endif
+
+#include "interface.h"
+
+#undef OPAQUE /* defined in <wingdi.h> */
+
+static const char tstr[] = "[|snmp]";
+
+/*
+ * Universal ASN.1 types
+ * (we only care about the tag values for those allowed in the Internet SMI)
+ */
+static const char *Universal[] = {
+ "U-0",
+ "Boolean",
+ "Integer",
+#define INTEGER 2
+ "Bitstring",
+ "String",
+#define STRING 4
+ "Null",
+#define ASN_NULL 5
+ "ObjID",
+#define OBJECTID 6
+ "ObjectDes",
+ "U-8","U-9","U-10","U-11", /* 8-11 */
+ "U-12","U-13","U-14","U-15", /* 12-15 */
+ "Sequence",
+#define SEQUENCE 16
+ "Set"
+};
+
+/*
+ * Application-wide ASN.1 types from the Internet SMI and their tags
+ */
+static const char *Application[] = {
+ "IpAddress",
+#define IPADDR 0
+ "Counter",
+#define COUNTER 1
+ "Gauge",
+#define GAUGE 2
+ "TimeTicks",
+#define TIMETICKS 3
+ "Opaque",
+#define OPAQUE 4
+ "C-5",
+ "Counter64"
+#define COUNTER64 6
+};
+
+/*
+ * Context-specific ASN.1 types for the SNMP PDUs and their tags
+ */
+static const char *Context[] = {
+ "GetRequest",
+#define GETREQ 0
+ "GetNextRequest",
+#define GETNEXTREQ 1
+ "GetResponse",
+#define GETRESP 2
+ "SetRequest",
+#define SETREQ 3
+ "Trap",
+#define TRAP 4
+ "GetBulk",
+#define GETBULKREQ 5
+ "Inform",
+#define INFORMREQ 6
+ "V2Trap",
+#define V2TRAP 7
+ "Report"
+#define REPORT 8
+};
+
+#define NOTIFY_CLASS(x) (x == TRAP || x == V2TRAP || x == INFORMREQ)
+#define READ_CLASS(x) (x == GETREQ || x == GETNEXTREQ || x == GETBULKREQ)
+#define WRITE_CLASS(x) (x == SETREQ)
+#define RESPONSE_CLASS(x) (x == GETRESP)
+#define INTERNAL_CLASS(x) (x == REPORT)
+
+/*
+ * Context-specific ASN.1 types for the SNMP Exceptions and their tags
+ */
+static const char *Exceptions[] = {
+ "noSuchObject",
+#define NOSUCHOBJECT 0
+ "noSuchInstance",
+#define NOSUCHINSTANCE 1
+ "endOfMibView",
+#define ENDOFMIBVIEW 2
+};
+
+/*
+ * Private ASN.1 types
+ * The Internet SMI does not specify any
+ */
+static const char *Private[] = {
+ "P-0"
+};
+
+/*
+ * error-status values for any SNMP PDU
+ */
+static const char *ErrorStatus[] = {
+ "noError",
+ "tooBig",
+ "noSuchName",
+ "badValue",
+ "readOnly",
+ "genErr",
+ "noAccess",
+ "wrongType",
+ "wrongLength",
+ "wrongEncoding",
+ "wrongValue",
+ "noCreation",
+ "inconsistentValue",
+ "resourceUnavailable",
+ "commitFailed",
+ "undoFailed",
+ "authorizationError",
+ "notWritable",
+ "inconsistentName"
+};
+#define DECODE_ErrorStatus(e) \
+ ( e >= 0 && (size_t)e < sizeof(ErrorStatus)/sizeof(ErrorStatus[0]) \
+ ? ErrorStatus[e] \
+ : (snprintf(errbuf, sizeof(errbuf), "err=%u", e), errbuf))
+
+/*
+ * generic-trap values in the SNMP Trap-PDU
+ */
+static const char *GenericTrap[] = {
+ "coldStart",
+ "warmStart",
+ "linkDown",
+ "linkUp",
+ "authenticationFailure",
+ "egpNeighborLoss",
+ "enterpriseSpecific"
+#define GT_ENTERPRISE 6
+};
+#define DECODE_GenericTrap(t) \
+ ( t >= 0 && (size_t)t < sizeof(GenericTrap)/sizeof(GenericTrap[0]) \
+ ? GenericTrap[t] \
+ : (snprintf(buf, sizeof(buf), "gt=%d", t), buf))
+
+/*
+ * ASN.1 type class table
+ * Ties together the preceding Universal, Application, Context, and Private
+ * type definitions.
+ */
+#define defineCLASS(x) { "x", x, sizeof(x)/sizeof(x[0]) } /* not ANSI-C */
+static const struct {
+ const char *name;
+ const char **Id;
+ int numIDs;
+ } Class[] = {
+ defineCLASS(Universal),
+#define UNIVERSAL 0
+ defineCLASS(Application),
+#define APPLICATION 1
+ defineCLASS(Context),
+#define CONTEXT 2
+ defineCLASS(Private),
+#define PRIVATE 3
+ defineCLASS(Exceptions),
+#define EXCEPTIONS 4
+};
+
+/*
+ * defined forms for ASN.1 types
+ */
+static const char *Form[] = {
+ "Primitive",
+#define PRIMITIVE 0
+ "Constructed",
+#define CONSTRUCTED 1
+};
+
+/*
+ * A structure for the OID tree for the compiled-in MIB.
+ * This is stored as a general-order tree.
+ */
+struct obj {
+ const char *desc; /* name of object */
+ u_char oid; /* sub-id following parent */
+ u_char type; /* object type (unused) */
+ struct obj *child, *next; /* child and next sibling pointers */
+} *objp = NULL;
+
+/*
+ * Include the compiled in SNMP MIB. "mib.h" is produced by feeding
+ * RFC-1156 format files into "makemib". "mib.h" MUST define at least
+ * a value for `mibroot'.
+ *
+ * In particular, this is gross, as this is including initialized structures,
+ * and by right shouldn't be an "include" file.
+ */
+#include "mib.h"
+
+/*
+ * This defines a list of OIDs which will be abbreviated on output.
+ * Currently, this includes the prefixes for the Internet MIB, the
+ * private enterprises tree, and the experimental tree.
+ */
+static const struct obj_abrev {
+ const char *prefix; /* prefix for this abrev */
+ struct obj *node; /* pointer into object table */
+ const char *oid; /* ASN.1 encoded OID */
+} obj_abrev_list[] = {
+#ifndef NO_ABREV_MIB
+ /* .iso.org.dod.internet.mgmt.mib */
+ { "", &_mib_obj, "\53\6\1\2\1" },
+#endif
+#ifndef NO_ABREV_ENTER
+ /* .iso.org.dod.internet.private.enterprises */
+ { "E:", &_enterprises_obj, "\53\6\1\4\1" },
+#endif
+#ifndef NO_ABREV_EXPERI
+ /* .iso.org.dod.internet.experimental */
+ { "X:", &_experimental_obj, "\53\6\1\3" },
+#endif
+#ifndef NO_ABBREV_SNMPMODS
+ /* .iso.org.dod.internet.snmpV2.snmpModules */
+ { "S:", &_snmpModules_obj, "\53\6\1\6\3" },
+#endif
+ { 0,0,0 }
+};
+
+/*
+ * This is used in the OID print routine to walk down the object tree
+ * rooted at `mibroot'.
+ */
+#define OBJ_PRINT(o, suppressdot) \
+{ \
+ if (objp) { \
+ do { \
+ if ((o) == objp->oid) \
+ break; \
+ } while ((objp = objp->next) != NULL); \
+ } \
+ if (objp) { \
+ ND_PRINT((ndo, suppressdot?"%s":".%s", objp->desc)); \
+ objp = objp->child; \
+ } else \
+ ND_PRINT((ndo, suppressdot?"%u":".%u", (o))); \
+}
+
+/*
+ * This is the definition for the Any-Data-Type storage used purely for
+ * temporary internal representation while decoding an ASN.1 data stream.
+ */
+struct be {
+ uint32_t asnlen;
+ union {
+ caddr_t raw;
+ int32_t integer;
+ uint32_t uns;
+ const u_char *str;
+ struct {
+ uint32_t high;
+ uint32_t low;
+ } uns64;
+ } data;
+ u_short id;
+ u_char form, class; /* tag info */
+ u_char type;
+#define BE_ANY 255
+#define BE_NONE 0
+#define BE_NULL 1
+#define BE_OCTET 2
+#define BE_OID 3
+#define BE_INT 4
+#define BE_UNS 5
+#define BE_STR 6
+#define BE_SEQ 7
+#define BE_INETADDR 8
+#define BE_PDU 9
+#define BE_UNS64 10
+#define BE_NOSUCHOBJECT 128
+#define BE_NOSUCHINST 129
+#define BE_ENDOFMIBVIEW 130
+};
+
+/*
+ * SNMP versions recognized by this module
+ */
+static const char *SnmpVersion[] = {
+ "SNMPv1",
+#define SNMP_VERSION_1 0
+ "SNMPv2c",
+#define SNMP_VERSION_2 1
+ "SNMPv2u",
+#define SNMP_VERSION_2U 2
+ "SNMPv3"
+#define SNMP_VERSION_3 3
+};
+
+/*
+ * Defaults for SNMP PDU components
+ */
+#define DEF_COMMUNITY "public"
+
+/*
+ * constants for ASN.1 decoding
+ */
+#define OIDMUX 40
+#define ASNLEN_INETADDR 4
+#define ASN_SHIFT7 7
+#define ASN_SHIFT8 8
+#define ASN_BIT8 0x80
+#define ASN_LONGLEN 0x80
+
+#define ASN_ID_BITS 0x1f
+#define ASN_FORM_BITS 0x20
+#define ASN_FORM_SHIFT 5
+#define ASN_CLASS_BITS 0xc0
+#define ASN_CLASS_SHIFT 6
+
+#define ASN_ID_EXT 0x1f /* extension ID in tag field */
+
+/*
+ * This decodes the next ASN.1 object in the stream pointed to by "p"
+ * (and of real-length "len") and stores the intermediate data in the
+ * provided BE object.
+ *
+ * This returns -l if it fails (i.e., the ASN.1 stream is not valid).
+ * O/w, this returns the number of bytes parsed from "p".
+ */
+static int
+asn1_parse(netdissect_options *ndo,
+ register const u_char *p, u_int len, struct be *elem)
+{
+ u_char form, class, id;
+ int i, hdr;
+
+ elem->asnlen = 0;
+ elem->type = BE_ANY;
+ if (len < 1) {
+ ND_PRINT((ndo, "[nothing to parse]"));
+ return -1;
+ }
+ ND_TCHECK(*p);
+
+ /*
+ * it would be nice to use a bit field, but you can't depend on them.
+ * +---+---+---+---+---+---+---+---+
+ * + class |frm| id |
+ * +---+---+---+---+---+---+---+---+
+ * 7 6 5 4 3 2 1 0
+ */
+ id = *p & ASN_ID_BITS; /* lower 5 bits, range 00-1f */
+#ifdef notdef
+ form = (*p & 0xe0) >> 5; /* move upper 3 bits to lower 3 */
+ class = form >> 1; /* bits 7&6 -> bits 1&0, range 0-3 */
+ form &= 0x1; /* bit 5 -> bit 0, range 0-1 */
+#else
+ form = (u_char)(*p & ASN_FORM_BITS) >> ASN_FORM_SHIFT;
+ class = (u_char)(*p & ASN_CLASS_BITS) >> ASN_CLASS_SHIFT;
+#endif
+ elem->form = form;
+ elem->class = class;
+ elem->id = id;
+ p++; len--; hdr = 1;
+ /* extended tag field */
+ if (id == ASN_ID_EXT) {
+ /*
+ * The ID follows, as a sequence of octets with the
+ * 8th bit set and the remaining 7 bits being
+ * the next 7 bits of the value, terminated with
+ * an octet with the 8th bit not set.
+ *
+ * First, assemble all the octets with the 8th
+ * bit set. XXX - this doesn't handle a value
+ * that won't fit in 32 bits.
+ */
+ for (id = 0; *p & ASN_BIT8; len--, hdr++, p++) {
+ if (len < 1) {
+ ND_PRINT((ndo, "[Xtagfield?]"));
+ return -1;
+ }
+ ND_TCHECK(*p);
+ id = (id << 7) | (*p & ~ASN_BIT8);
+ }
+ if (len < 1) {
+ ND_PRINT((ndo, "[Xtagfield?]"));
+ return -1;
+ }
+ ND_TCHECK(*p);
+ elem->id = id = (id << 7) | *p;
+ --len;
+ ++hdr;
+ ++p;
+ }
+ if (len < 1) {
+ ND_PRINT((ndo, "[no asnlen]"));
+ return -1;
+ }
+ ND_TCHECK(*p);
+ elem->asnlen = *p;
+ p++; len--; hdr++;
+ if (elem->asnlen & ASN_BIT8) {
+ uint32_t noct = elem->asnlen % ASN_BIT8;
+ elem->asnlen = 0;
+ if (len < noct) {
+ ND_PRINT((ndo, "[asnlen? %d<%d]", len, noct));
+ return -1;
+ }
+ ND_TCHECK2(*p, noct);
+ for (; noct-- > 0; len--, hdr++)
+ elem->asnlen = (elem->asnlen << ASN_SHIFT8) | *p++;
+ }
+ if (len < elem->asnlen) {
+ ND_PRINT((ndo, "[len%d<asnlen%u]", len, elem->asnlen));
+ return -1;
+ }
+ if (form >= sizeof(Form)/sizeof(Form[0])) {
+ ND_PRINT((ndo, "[form?%d]", form));
+ return -1;
+ }
+ if (class >= sizeof(Class)/sizeof(Class[0])) {
+ ND_PRINT((ndo, "[class?%c/%d]", *Form[form], class));
+ return -1;
+ }
+ if ((int)id >= Class[class].numIDs) {
+ ND_PRINT((ndo, "[id?%c/%s/%d]", *Form[form], Class[class].name, id));
+ return -1;
+ }
+
+ switch (form) {
+ case PRIMITIVE:
+ switch (class) {
+ case UNIVERSAL:
+ switch (id) {
+ case STRING:
+ elem->type = BE_STR;
+ elem->data.str = p;
+ break;
+
+ case INTEGER: {
+ register int32_t data;
+ elem->type = BE_INT;
+ data = 0;
+
+ ND_TCHECK2(*p, elem->asnlen);
+ if (*p & ASN_BIT8) /* negative */
+ data = -1;
+ for (i = elem->asnlen; i-- > 0; p++)
+ data = (data << ASN_SHIFT8) | *p;
+ elem->data.integer = data;
+ break;
+ }
+
+ case OBJECTID:
+ elem->type = BE_OID;
+ elem->data.raw = (caddr_t)p;
+ break;
+
+ case ASN_NULL:
+ elem->type = BE_NULL;
+ elem->data.raw = NULL;
+ break;
+
+ default:
+ elem->type = BE_OCTET;
+ elem->data.raw = (caddr_t)p;
+ ND_PRINT((ndo, "[P/U/%s]", Class[class].Id[id]));
+ break;
+ }
+ break;
+
+ case APPLICATION:
+ switch (id) {
+ case IPADDR:
+ elem->type = BE_INETADDR;
+ elem->data.raw = (caddr_t)p;
+ break;
+
+ case COUNTER:
+ case GAUGE:
+ case TIMETICKS: {
+ register uint32_t data;
+ ND_TCHECK2(*p, elem->asnlen);
+ elem->type = BE_UNS;
+ data = 0;
+ for (i = elem->asnlen; i-- > 0; p++)
+ data = (data << 8) + *p;
+ elem->data.uns = data;
+ break;
+ }
+
+ case COUNTER64: {
+ register uint32_t high, low;
+ ND_TCHECK2(*p, elem->asnlen);
+ elem->type = BE_UNS64;
+ high = 0, low = 0;
+ for (i = elem->asnlen; i-- > 0; p++) {
+ high = (high << 8) |
+ ((low & 0xFF000000) >> 24);
+ low = (low << 8) | *p;
+ }
+ elem->data.uns64.high = high;
+ elem->data.uns64.low = low;
+ break;
+ }
+
+ default:
+ elem->type = BE_OCTET;
+ elem->data.raw = (caddr_t)p;
+ ND_PRINT((ndo, "[P/A/%s]",
+ Class[class].Id[id]));
+ break;
+ }
+ break;
+
+ case CONTEXT:
+ switch (id) {
+ case NOSUCHOBJECT:
+ elem->type = BE_NOSUCHOBJECT;
+ elem->data.raw = NULL;
+ break;
+
+ case NOSUCHINSTANCE:
+ elem->type = BE_NOSUCHINST;
+ elem->data.raw = NULL;
+ break;
+
+ case ENDOFMIBVIEW:
+ elem->type = BE_ENDOFMIBVIEW;
+ elem->data.raw = NULL;
+ break;
+ }
+ break;
+
+ default:
+ ND_PRINT((ndo, "[P/%s/%s]", Class[class].name, Class[class].Id[id]));
+ ND_TCHECK2(*p, elem->asnlen);
+ elem->type = BE_OCTET;
+ elem->data.raw = (caddr_t)p;
+ break;
+ }
+ break;
+
+ case CONSTRUCTED:
+ switch (class) {
+ case UNIVERSAL:
+ switch (id) {
+ case SEQUENCE:
+ elem->type = BE_SEQ;
+ elem->data.raw = (caddr_t)p;
+ break;
+
+ default:
+ elem->type = BE_OCTET;
+ elem->data.raw = (caddr_t)p;
+ ND_PRINT((ndo, "C/U/%s", Class[class].Id[id]));
+ break;
+ }
+ break;
+
+ case CONTEXT:
+ elem->type = BE_PDU;
+ elem->data.raw = (caddr_t)p;
+ break;
+
+ default:
+ elem->type = BE_OCTET;
+ elem->data.raw = (caddr_t)p;
+ ND_PRINT((ndo, "C/%s/%s", Class[class].name, Class[class].Id[id]));
+ break;
+ }
+ break;
+ }
+ p += elem->asnlen;
+ len -= elem->asnlen;
+ return elem->asnlen + hdr;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+/*
+ * Display the ASN.1 object represented by the BE object.
+ * This used to be an integral part of asn1_parse() before the intermediate
+ * BE form was added.
+ */
+static int
+asn1_print(netdissect_options *ndo,
+ struct be *elem)
+{
+ u_char *p = (u_char *)elem->data.raw;
+ uint32_t asnlen = elem->asnlen;
+ uint32_t i;
+
+ switch (elem->type) {
+
+ case BE_OCTET:
+ ND_TCHECK2(*p, asnlen);
+ for (i = asnlen; i-- > 0; p++)
+ ND_PRINT((ndo, "_%.2x", *p));
+ break;
+
+ case BE_NULL:
+ break;
+
+ case BE_OID: {
+ int o = 0, first = -1, i = asnlen;
+
+ if (!ndo->ndo_sflag && !ndo->ndo_nflag && asnlen > 2) {
+ const struct obj_abrev *a = &obj_abrev_list[0];
+ size_t a_len = strlen(a->oid);
+ for (; a->node; a++) {
+ ND_TCHECK2(*p, a_len);
+ if (memcmp(a->oid, (char *)p, a_len) == 0) {
+ objp = a->node->child;
+ i -= strlen(a->oid);
+ p += strlen(a->oid);
+ ND_PRINT((ndo, "%s", a->prefix));
+ first = 1;
+ break;
+ }
+ }
+ }
+
+ for (; !ndo->ndo_sflag && i-- > 0; p++) {
+ ND_TCHECK(*p);
+ o = (o << ASN_SHIFT7) + (*p & ~ASN_BIT8);
+ if (*p & ASN_LONGLEN)
+ continue;
+
+ /*
+ * first subitem encodes two items with 1st*OIDMUX+2nd
+ * (see X.690:1997 clause 8.19 for the details)
+ */
+ if (first < 0) {
+ int s;
+ if (!ndo->ndo_nflag)
+ objp = mibroot;
+ first = 0;
+ s = o / OIDMUX;
+ if (s > 2) s = 2;
+ OBJ_PRINT(s, first);
+ o -= s * OIDMUX;
+ }
+ OBJ_PRINT(o, first);
+ if (--first < 0)
+ first = 0;
+ o = 0;
+ }
+ break;
+ }
+
+ case BE_INT:
+ ND_PRINT((ndo, "%d", elem->data.integer));
+ break;
+
+ case BE_UNS:
+ ND_PRINT((ndo, "%u", elem->data.uns));
+ break;
+
+ case BE_UNS64: { /* idea borrowed from by Marshall Rose */
+ double d;
+ int j, carry;
+ char *cpf, *cpl, last[6], first[30];
+ if (elem->data.uns64.high == 0) {
+ ND_PRINT((ndo, "%u", elem->data.uns64.low));
+ break;
+ }
+ d = elem->data.uns64.high * 4294967296.0; /* 2^32 */
+ if (elem->data.uns64.high <= 0x1fffff) {
+ d += elem->data.uns64.low;
+#if 0 /*is looks illegal, but what is the intention?*/
+ ND_PRINT((ndo, "%.f", d));
+#else
+ ND_PRINT((ndo, "%f", d));
+#endif
+ break;
+ }
+ d += (elem->data.uns64.low & 0xfffff000);
+#if 0 /*is looks illegal, but what is the intention?*/
+ snprintf(first, sizeof(first), "%.f", d);
+#else
+ snprintf(first, sizeof(first), "%f", d);
+#endif
+ snprintf(last, sizeof(last), "%5.5d",
+ elem->data.uns64.low & 0xfff);
+ for (carry = 0, cpf = first+strlen(first)-1, cpl = last+4;
+ cpl >= last;
+ cpf--, cpl--) {
+ j = carry + (*cpf - '0') + (*cpl - '0');
+ if (j > 9) {
+ j -= 10;
+ carry = 1;
+ } else {
+ carry = 0;
+ }
+ *cpf = j + '0';
+ }
+ ND_PRINT((ndo, "%s", first));
+ break;
+ }
+
+ case BE_STR: {
+ register int printable = 1, first = 1;
+ const u_char *p = elem->data.str;
+ ND_TCHECK2(*p, asnlen);
+ for (i = asnlen; printable && i-- > 0; p++)
+ printable = ND_ISPRINT(*p);
+ p = elem->data.str;
+ if (printable) {
+ ND_PRINT((ndo, "\""));
+ if (fn_printn(ndo, p, asnlen, ndo->ndo_snapend)) {
+ ND_PRINT((ndo, "\""));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "\""));
+ } else
+ for (i = asnlen; i-- > 0; p++) {
+ ND_PRINT((ndo, first ? "%.2x" : "_%.2x", *p));
+ first = 0;
+ }
+ break;
+ }
+
+ case BE_SEQ:
+ ND_PRINT((ndo, "Seq(%u)", elem->asnlen));
+ break;
+
+ case BE_INETADDR:
+ if (asnlen != ASNLEN_INETADDR)
+ ND_PRINT((ndo, "[inetaddr len!=%d]", ASNLEN_INETADDR));
+ ND_TCHECK2(*p, asnlen);
+ for (i = asnlen; i-- != 0; p++) {
+ ND_PRINT((ndo, (i == asnlen-1) ? "%u" : ".%u", *p));
+ }
+ break;
+
+ case BE_NOSUCHOBJECT:
+ case BE_NOSUCHINST:
+ case BE_ENDOFMIBVIEW:
+ ND_PRINT((ndo, "[%s]", Class[EXCEPTIONS].Id[elem->id]));
+ break;
+
+ case BE_PDU:
+ ND_PRINT((ndo, "%s(%u)", Class[CONTEXT].Id[elem->id], elem->asnlen));
+ break;
+
+ case BE_ANY:
+ ND_PRINT((ndo, "[BE_ANY!?]"));
+ break;
+
+ default:
+ ND_PRINT((ndo, "[be!?]"));
+ break;
+ }
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+#ifdef notdef
+/*
+ * This is a brute force ASN.1 printer: recurses to dump an entire structure.
+ * This will work for any ASN.1 stream, not just an SNMP PDU.
+ *
+ * By adding newlines and spaces at the correct places, this would print in
+ * Rose-Normal-Form.
+ *
+ * This is not currently used.
+ */
+static void
+asn1_decode(u_char *p, u_int length)
+{
+ struct be elem;
+ int i = 0;
+
+ while (i >= 0 && length > 0) {
+ i = asn1_parse(ndo, p, length, &elem);
+ if (i >= 0) {
+ ND_PRINT((ndo, " "));
+ if (asn1_print(ndo, &elem) < 0)
+ return;
+ if (elem.type == BE_SEQ || elem.type == BE_PDU) {
+ ND_PRINT((ndo, " {"));
+ asn1_decode(elem.data.raw, elem.asnlen);
+ ND_PRINT((ndo, " }"));
+ }
+ length -= i;
+ p += i;
+ }
+ }
+}
+#endif
+
+#ifdef USE_LIBSMI
+
+struct smi2be {
+ SmiBasetype basetype;
+ int be;
+};
+
+static const struct smi2be smi2betab[] = {
+ { SMI_BASETYPE_INTEGER32, BE_INT },
+ { SMI_BASETYPE_OCTETSTRING, BE_STR },
+ { SMI_BASETYPE_OCTETSTRING, BE_INETADDR },
+ { SMI_BASETYPE_OBJECTIDENTIFIER, BE_OID },
+ { SMI_BASETYPE_UNSIGNED32, BE_UNS },
+ { SMI_BASETYPE_INTEGER64, BE_NONE },
+ { SMI_BASETYPE_UNSIGNED64, BE_UNS64 },
+ { SMI_BASETYPE_FLOAT32, BE_NONE },
+ { SMI_BASETYPE_FLOAT64, BE_NONE },
+ { SMI_BASETYPE_FLOAT128, BE_NONE },
+ { SMI_BASETYPE_ENUM, BE_INT },
+ { SMI_BASETYPE_BITS, BE_STR },
+ { SMI_BASETYPE_UNKNOWN, BE_NONE }
+};
+
+static int
+smi_decode_oid(netdissect_options *ndo,
+ struct be *elem, unsigned int *oid,
+ unsigned int oidsize, unsigned int *oidlen)
+{
+ u_char *p = (u_char *)elem->data.raw;
+ uint32_t asnlen = elem->asnlen;
+ int o = 0, first = -1, i = asnlen;
+ unsigned int firstval;
+
+ for (*oidlen = 0; ndo->ndo_sflag && i-- > 0; p++) {
+ ND_TCHECK(*p);
+ o = (o << ASN_SHIFT7) + (*p & ~ASN_BIT8);
+ if (*p & ASN_LONGLEN)
+ continue;
+
+ /*
+ * first subitem encodes two items with 1st*OIDMUX+2nd
+ * (see X.690:1997 clause 8.19 for the details)
+ */
+ if (first < 0) {
+ first = 0;
+ firstval = o / OIDMUX;
+ if (firstval > 2) firstval = 2;
+ o -= firstval * OIDMUX;
+ if (*oidlen < oidsize) {
+ oid[(*oidlen)++] = firstval;
+ }
+ }
+ if (*oidlen < oidsize) {
+ oid[(*oidlen)++] = o;
+ }
+ o = 0;
+ }
+ return 0;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return -1;
+}
+
+static int smi_check_type(SmiBasetype basetype, int be)
+{
+ int i;
+
+ for (i = 0; smi2betab[i].basetype != SMI_BASETYPE_UNKNOWN; i++) {
+ if (smi2betab[i].basetype == basetype && smi2betab[i].be == be) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static int smi_check_a_range(SmiType *smiType, SmiRange *smiRange,
+ struct be *elem)
+{
+ int ok = 1;
+
+ switch (smiType->basetype) {
+ case SMI_BASETYPE_OBJECTIDENTIFIER:
+ case SMI_BASETYPE_OCTETSTRING:
+ if (smiRange->minValue.value.unsigned32
+ == smiRange->maxValue.value.unsigned32) {
+ ok = (elem->asnlen == smiRange->minValue.value.unsigned32);
+ } else {
+ ok = (elem->asnlen >= smiRange->minValue.value.unsigned32
+ && elem->asnlen <= smiRange->maxValue.value.unsigned32);
+ }
+ break;
+
+ case SMI_BASETYPE_INTEGER32:
+ ok = (elem->data.integer >= smiRange->minValue.value.integer32
+ && elem->data.integer <= smiRange->maxValue.value.integer32);
+ break;
+
+ case SMI_BASETYPE_UNSIGNED32:
+ ok = (elem->data.uns >= smiRange->minValue.value.unsigned32
+ && elem->data.uns <= smiRange->maxValue.value.unsigned32);
+ break;
+
+ case SMI_BASETYPE_UNSIGNED64:
+ /* XXX */
+ break;
+
+ /* case SMI_BASETYPE_INTEGER64: SMIng */
+ /* case SMI_BASETYPE_FLOAT32: SMIng */
+ /* case SMI_BASETYPE_FLOAT64: SMIng */
+ /* case SMI_BASETYPE_FLOAT128: SMIng */
+
+ case SMI_BASETYPE_ENUM:
+ case SMI_BASETYPE_BITS:
+ case SMI_BASETYPE_UNKNOWN:
+ ok = 1;
+ break;
+
+ default:
+ ok = 0;
+ break;
+ }
+
+ return ok;
+}
+
+static int smi_check_range(SmiType *smiType, struct be *elem)
+{
+ SmiRange *smiRange;
+ int ok = 1;
+
+ for (smiRange = smiGetFirstRange(smiType);
+ smiRange;
+ smiRange = smiGetNextRange(smiRange)) {
+
+ ok = smi_check_a_range(smiType, smiRange, elem);
+
+ if (ok) {
+ break;
+ }
+ }
+
+ if (ok) {
+ SmiType *parentType;
+ parentType = smiGetParentType(smiType);
+ if (parentType) {
+ ok = smi_check_range(parentType, elem);
+ }
+ }
+
+ return ok;
+}
+
+static SmiNode *
+smi_print_variable(netdissect_options *ndo,
+ struct be *elem, int *status)
+{
+ unsigned int oid[128], oidlen;
+ SmiNode *smiNode = NULL;
+ unsigned int i;
+
+ *status = smi_decode_oid(ndo, elem, oid, sizeof(oid) / sizeof(unsigned int),
+ &oidlen);
+ if (*status < 0)
+ return NULL;
+ smiNode = smiGetNodeByOID(oidlen, oid);
+ if (! smiNode) {
+ *status = asn1_print(ndo, elem);
+ return NULL;
+ }
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "%s::", smiGetNodeModule(smiNode)->name));
+ }
+ ND_PRINT((ndo, "%s", smiNode->name));
+ if (smiNode->oidlen < oidlen) {
+ for (i = smiNode->oidlen; i < oidlen; i++) {
+ ND_PRINT((ndo, ".%u", oid[i]));
+ }
+ }
+ *status = 0;
+ return smiNode;
+}
+
+static int
+smi_print_value(netdissect_options *ndo,
+ SmiNode *smiNode, u_char pduid, struct be *elem)
+{
+ unsigned int i, oid[128], oidlen;
+ SmiType *smiType;
+ SmiNamedNumber *nn;
+ int done = 0;
+
+ if (! smiNode || ! (smiNode->nodekind
+ & (SMI_NODEKIND_SCALAR | SMI_NODEKIND_COLUMN))) {
+ return asn1_print(ndo, elem);
+ }
+
+ if (elem->type == BE_NOSUCHOBJECT
+ || elem->type == BE_NOSUCHINST
+ || elem->type == BE_ENDOFMIBVIEW) {
+ return asn1_print(ndo, elem);
+ }
+
+ if (NOTIFY_CLASS(pduid) && smiNode->access < SMI_ACCESS_NOTIFY) {
+ ND_PRINT((ndo, "[notNotifyable]"));
+ }
+
+ if (READ_CLASS(pduid) && smiNode->access < SMI_ACCESS_READ_ONLY) {
+ ND_PRINT((ndo, "[notReadable]"));
+ }
+
+ if (WRITE_CLASS(pduid) && smiNode->access < SMI_ACCESS_READ_WRITE) {
+ ND_PRINT((ndo, "[notWritable]"));
+ }
+
+ if (RESPONSE_CLASS(pduid)
+ && smiNode->access == SMI_ACCESS_NOT_ACCESSIBLE) {
+ ND_PRINT((ndo, "[noAccess]"));
+ }
+
+ smiType = smiGetNodeType(smiNode);
+ if (! smiType) {
+ return asn1_print(ndo, elem);
+ }
+
+ if (! smi_check_type(smiType->basetype, elem->type)) {
+ ND_PRINT((ndo, "[wrongType]"));
+ }
+
+ if (! smi_check_range(smiType, elem)) {
+ ND_PRINT((ndo, "[outOfRange]"));
+ }
+
+ /* resolve bits to named bits */
+
+ /* check whether instance identifier is valid */
+
+ /* apply display hints (integer, octetstring) */
+
+ /* convert instance identifier to index type values */
+
+ switch (elem->type) {
+ case BE_OID:
+ if (smiType->basetype == SMI_BASETYPE_BITS) {
+ /* print bit labels */
+ } else {
+ smi_decode_oid(ndo, elem, oid,
+ sizeof(oid)/sizeof(unsigned int),
+ &oidlen);
+ smiNode = smiGetNodeByOID(oidlen, oid);
+ if (smiNode) {
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "%s::", smiGetNodeModule(smiNode)->name));
+ }
+ ND_PRINT((ndo, "%s", smiNode->name));
+ if (smiNode->oidlen < oidlen) {
+ for (i = smiNode->oidlen;
+ i < oidlen; i++) {
+ ND_PRINT((ndo, ".%u", oid[i]));
+ }
+ }
+ done++;
+ }
+ }
+ break;
+
+ case BE_INT:
+ if (smiType->basetype == SMI_BASETYPE_ENUM) {
+ for (nn = smiGetFirstNamedNumber(smiType);
+ nn;
+ nn = smiGetNextNamedNumber(nn)) {
+ if (nn->value.value.integer32
+ == elem->data.integer) {
+ ND_PRINT((ndo, "%s", nn->name));
+ ND_PRINT((ndo, "(%d)", elem->data.integer));
+ done++;
+ break;
+ }
+ }
+ }
+ break;
+ }
+
+ if (! done) {
+ return asn1_print(ndo, elem);
+ }
+ return 0;
+}
+#endif
+
+/*
+ * General SNMP header
+ * SEQUENCE {
+ * version INTEGER {version-1(0)},
+ * community OCTET STRING,
+ * data ANY -- PDUs
+ * }
+ * PDUs for all but Trap: (see rfc1157 from page 15 on)
+ * SEQUENCE {
+ * request-id INTEGER,
+ * error-status INTEGER,
+ * error-index INTEGER,
+ * varbindlist SEQUENCE OF
+ * SEQUENCE {
+ * name ObjectName,
+ * value ObjectValue
+ * }
+ * }
+ * PDU for Trap:
+ * SEQUENCE {
+ * enterprise OBJECT IDENTIFIER,
+ * agent-addr NetworkAddress,
+ * generic-trap INTEGER,
+ * specific-trap INTEGER,
+ * time-stamp TimeTicks,
+ * varbindlist SEQUENCE OF
+ * SEQUENCE {
+ * name ObjectName,
+ * value ObjectValue
+ * }
+ * }
+ */
+
+/*
+ * Decode SNMP varBind
+ */
+static void
+varbind_print(netdissect_options *ndo,
+ u_char pduid, const u_char *np, u_int length)
+{
+ struct be elem;
+ int count = 0, ind;
+#ifdef USE_LIBSMI
+ SmiNode *smiNode = NULL;
+#endif
+ int status;
+
+ /* Sequence of varBind */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_SEQ) {
+ ND_PRINT((ndo, "[!SEQ of varbind]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ if ((u_int)count < length)
+ ND_PRINT((ndo, "[%d extra after SEQ of varbind]", length - count));
+ /* descend */
+ length = elem.asnlen;
+ np = (u_char *)elem.data.raw;
+
+ for (ind = 1; length > 0; ind++) {
+ const u_char *vbend;
+ u_int vblength;
+
+ ND_PRINT((ndo, " "));
+
+ /* Sequence */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_SEQ) {
+ ND_PRINT((ndo, "[!varbind]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ vbend = np + count;
+ vblength = length - count;
+ /* descend */
+ length = elem.asnlen;
+ np = (u_char *)elem.data.raw;
+
+ /* objName (OID) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_OID) {
+ ND_PRINT((ndo, "[objName!=OID]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+#ifdef USE_LIBSMI
+ smiNode = smi_print_variable(ndo, &elem, &status);
+#else
+ status = asn1_print(ndo, &elem);
+#endif
+ if (status < 0)
+ return;
+ length -= count;
+ np += count;
+
+ if (pduid != GETREQ && pduid != GETNEXTREQ
+ && pduid != GETBULKREQ)
+ ND_PRINT((ndo, "="));
+
+ /* objVal (ANY) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (pduid == GETREQ || pduid == GETNEXTREQ
+ || pduid == GETBULKREQ) {
+ if (elem.type != BE_NULL) {
+ ND_PRINT((ndo, "[objVal!=NULL]"));
+ if (asn1_print(ndo, &elem) < 0)
+ return;
+ }
+ } else {
+ if (elem.type != BE_NULL) {
+#ifdef USE_LIBSMI
+ status = smi_print_value(ndo, smiNode, pduid, &elem);
+#else
+ status = asn1_print(ndo, &elem);
+#endif
+ }
+ if (status < 0)
+ return;
+ }
+ length = vblength;
+ np = vbend;
+ }
+}
+
+/*
+ * Decode SNMP PDUs: GetRequest, GetNextRequest, GetResponse, SetRequest,
+ * GetBulk, Inform, V2Trap, and Report
+ */
+static void
+snmppdu_print(netdissect_options *ndo,
+ u_short pduid, const u_char *np, u_int length)
+{
+ struct be elem;
+ int count = 0, error;
+
+ /* reqId (Integer) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_INT) {
+ ND_PRINT((ndo, "[reqId!=INT]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "R=%d ", elem.data.integer));
+ length -= count;
+ np += count;
+
+ /* errorStatus (Integer) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_INT) {
+ ND_PRINT((ndo, "[errorStatus!=INT]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ error = 0;
+ if ((pduid == GETREQ || pduid == GETNEXTREQ || pduid == SETREQ
+ || pduid == INFORMREQ || pduid == V2TRAP || pduid == REPORT)
+ && elem.data.integer != 0) {
+ char errbuf[20];
+ ND_PRINT((ndo, "[errorStatus(%s)!=0]",
+ DECODE_ErrorStatus(elem.data.integer)));
+ } else if (pduid == GETBULKREQ) {
+ ND_PRINT((ndo, " N=%d", elem.data.integer));
+ } else if (elem.data.integer != 0) {
+ char errbuf[20];
+ ND_PRINT((ndo, " %s", DECODE_ErrorStatus(elem.data.integer)));
+ error = elem.data.integer;
+ }
+ length -= count;
+ np += count;
+
+ /* errorIndex (Integer) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_INT) {
+ ND_PRINT((ndo, "[errorIndex!=INT]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ if ((pduid == GETREQ || pduid == GETNEXTREQ || pduid == SETREQ
+ || pduid == INFORMREQ || pduid == V2TRAP || pduid == REPORT)
+ && elem.data.integer != 0)
+ ND_PRINT((ndo, "[errorIndex(%d)!=0]", elem.data.integer));
+ else if (pduid == GETBULKREQ)
+ ND_PRINT((ndo, " M=%d", elem.data.integer));
+ else if (elem.data.integer != 0) {
+ if (!error)
+ ND_PRINT((ndo, "[errorIndex(%d) w/o errorStatus]", elem.data.integer));
+ else {
+ ND_PRINT((ndo, "@%d", elem.data.integer));
+ error = elem.data.integer;
+ }
+ } else if (error) {
+ ND_PRINT((ndo, "[errorIndex==0]"));
+ error = 0;
+ }
+ length -= count;
+ np += count;
+
+ varbind_print(ndo, pduid, np, length);
+ return;
+}
+
+/*
+ * Decode SNMP Trap PDU
+ */
+static void
+trappdu_print(netdissect_options *ndo,
+ const u_char *np, u_int length)
+{
+ struct be elem;
+ int count = 0, generic;
+
+ ND_PRINT((ndo, " "));
+
+ /* enterprise (oid) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_OID) {
+ ND_PRINT((ndo, "[enterprise!=OID]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ if (asn1_print(ndo, &elem) < 0)
+ return;
+ length -= count;
+ np += count;
+
+ ND_PRINT((ndo, " "));
+
+ /* agent-addr (inetaddr) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_INETADDR) {
+ ND_PRINT((ndo, "[agent-addr!=INETADDR]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ if (asn1_print(ndo, &elem) < 0)
+ return;
+ length -= count;
+ np += count;
+
+ /* generic-trap (Integer) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_INT) {
+ ND_PRINT((ndo, "[generic-trap!=INT]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ generic = elem.data.integer;
+ {
+ char buf[20];
+ ND_PRINT((ndo, " %s", DECODE_GenericTrap(generic)));
+ }
+ length -= count;
+ np += count;
+
+ /* specific-trap (Integer) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_INT) {
+ ND_PRINT((ndo, "[specific-trap!=INT]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ if (generic != GT_ENTERPRISE) {
+ if (elem.data.integer != 0)
+ ND_PRINT((ndo, "[specific-trap(%d)!=0]", elem.data.integer));
+ } else
+ ND_PRINT((ndo, " s=%d", elem.data.integer));
+ length -= count;
+ np += count;
+
+ ND_PRINT((ndo, " "));
+
+ /* time-stamp (TimeTicks) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_UNS) { /* XXX */
+ ND_PRINT((ndo, "[time-stamp!=TIMETICKS]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ if (asn1_print(ndo, &elem) < 0)
+ return;
+ length -= count;
+ np += count;
+
+ varbind_print(ndo, TRAP, np, length);
+ return;
+}
+
+/*
+ * Decode arbitrary SNMP PDUs.
+ */
+static void
+pdu_print(netdissect_options *ndo,
+ const u_char *np, u_int length, int version)
+{
+ struct be pdu;
+ int count = 0;
+
+ /* PDU (Context) */
+ if ((count = asn1_parse(ndo, np, length, &pdu)) < 0)
+ return;
+ if (pdu.type != BE_PDU) {
+ ND_PRINT((ndo, "[no PDU]"));
+ return;
+ }
+ if ((u_int)count < length)
+ ND_PRINT((ndo, "[%d extra after PDU]", length - count));
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "{ "));
+ }
+ if (asn1_print(ndo, &pdu) < 0)
+ return;
+ ND_PRINT((ndo, " "));
+ /* descend into PDU */
+ length = pdu.asnlen;
+ np = (u_char *)pdu.data.raw;
+
+ if (version == SNMP_VERSION_1 &&
+ (pdu.id == GETBULKREQ || pdu.id == INFORMREQ ||
+ pdu.id == V2TRAP || pdu.id == REPORT)) {
+ ND_PRINT((ndo, "[v2 PDU in v1 message]"));
+ return;
+ }
+
+ if (version == SNMP_VERSION_2 && pdu.id == TRAP) {
+ ND_PRINT((ndo, "[v1 PDU in v2 message]"));
+ return;
+ }
+
+ switch (pdu.id) {
+ case TRAP:
+ trappdu_print(ndo, np, length);
+ break;
+ case GETREQ:
+ case GETNEXTREQ:
+ case GETRESP:
+ case SETREQ:
+ case GETBULKREQ:
+ case INFORMREQ:
+ case V2TRAP:
+ case REPORT:
+ snmppdu_print(ndo, pdu.id, np, length);
+ break;
+ }
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, " } "));
+ }
+}
+
+/*
+ * Decode a scoped SNMP PDU.
+ */
+static void
+scopedpdu_print(netdissect_options *ndo,
+ const u_char *np, u_int length, int version)
+{
+ struct be elem;
+ int i, count = 0;
+
+ /* Sequence */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_SEQ) {
+ ND_PRINT((ndo, "[!scoped PDU]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ length = elem.asnlen;
+ np = (u_char *)elem.data.raw;
+
+ /* contextEngineID (OCTET STRING) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_STR) {
+ ND_PRINT((ndo, "[contextEngineID!=STR]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ length -= count;
+ np += count;
+
+ ND_PRINT((ndo, "E= "));
+ for (i = 0; i < (int)elem.asnlen; i++) {
+ ND_PRINT((ndo, "0x%02X", elem.data.str[i]));
+ }
+ ND_PRINT((ndo, " "));
+
+ /* contextName (OCTET STRING) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_STR) {
+ ND_PRINT((ndo, "[contextName!=STR]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ length -= count;
+ np += count;
+
+ ND_PRINT((ndo, "C=%.*s ", (int)elem.asnlen, elem.data.str));
+
+ pdu_print(ndo, np, length, version);
+}
+
+/*
+ * Decode SNMP Community Header (SNMPv1 and SNMPv2c)
+ */
+static void
+community_print(netdissect_options *ndo,
+ const u_char *np, u_int length, int version)
+{
+ struct be elem;
+ int count = 0;
+
+ /* Community (String) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_STR) {
+ ND_PRINT((ndo, "[comm!=STR]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ /* default community */
+ if (!(elem.asnlen == sizeof(DEF_COMMUNITY) - 1 &&
+ strncmp((char *)elem.data.str, DEF_COMMUNITY,
+ sizeof(DEF_COMMUNITY) - 1) == 0))
+ /* ! "public" */
+ ND_PRINT((ndo, "C=%.*s ", (int)elem.asnlen, elem.data.str));
+ length -= count;
+ np += count;
+
+ pdu_print(ndo, np, length, version);
+}
+
+/*
+ * Decode SNMPv3 User-based Security Message Header (SNMPv3)
+ */
+static void
+usm_print(netdissect_options *ndo,
+ const u_char *np, u_int length)
+{
+ struct be elem;
+ int count = 0;
+
+ /* Sequence */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_SEQ) {
+ ND_PRINT((ndo, "[!usm]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ length = elem.asnlen;
+ np = (u_char *)elem.data.raw;
+
+ /* msgAuthoritativeEngineID (OCTET STRING) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_STR) {
+ ND_PRINT((ndo, "[msgAuthoritativeEngineID!=STR]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ length -= count;
+ np += count;
+
+ /* msgAuthoritativeEngineBoots (INTEGER) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_INT) {
+ ND_PRINT((ndo, "[msgAuthoritativeEngineBoots!=INT]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "B=%d ", elem.data.integer));
+ length -= count;
+ np += count;
+
+ /* msgAuthoritativeEngineTime (INTEGER) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_INT) {
+ ND_PRINT((ndo, "[msgAuthoritativeEngineTime!=INT]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "T=%d ", elem.data.integer));
+ length -= count;
+ np += count;
+
+ /* msgUserName (OCTET STRING) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_STR) {
+ ND_PRINT((ndo, "[msgUserName!=STR]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ length -= count;
+ np += count;
+
+ ND_PRINT((ndo, "U=%.*s ", (int)elem.asnlen, elem.data.str));
+
+ /* msgAuthenticationParameters (OCTET STRING) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_STR) {
+ ND_PRINT((ndo, "[msgAuthenticationParameters!=STR]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ length -= count;
+ np += count;
+
+ /* msgPrivacyParameters (OCTET STRING) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_STR) {
+ ND_PRINT((ndo, "[msgPrivacyParameters!=STR]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ length -= count;
+ np += count;
+
+ if ((u_int)count < length)
+ ND_PRINT((ndo, "[%d extra after usm SEQ]", length - count));
+}
+
+/*
+ * Decode SNMPv3 Message Header (SNMPv3)
+ */
+static void
+v3msg_print(netdissect_options *ndo,
+ const u_char *np, u_int length)
+{
+ struct be elem;
+ int count = 0;
+ u_char flags;
+ int model;
+ const u_char *xnp = np;
+ int xlength = length;
+
+ /* Sequence */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_SEQ) {
+ ND_PRINT((ndo, "[!message]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ length = elem.asnlen;
+ np = (u_char *)elem.data.raw;
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "{ "));
+ }
+
+ /* msgID (INTEGER) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_INT) {
+ ND_PRINT((ndo, "[msgID!=INT]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ length -= count;
+ np += count;
+
+ /* msgMaxSize (INTEGER) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_INT) {
+ ND_PRINT((ndo, "[msgMaxSize!=INT]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ length -= count;
+ np += count;
+
+ /* msgFlags (OCTET STRING) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_STR) {
+ ND_PRINT((ndo, "[msgFlags!=STR]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ if (elem.asnlen != 1) {
+ ND_PRINT((ndo, "[msgFlags size %d]", elem.asnlen));
+ return;
+ }
+ flags = elem.data.str[0];
+ if (flags != 0x00 && flags != 0x01 && flags != 0x03
+ && flags != 0x04 && flags != 0x05 && flags != 0x07) {
+ ND_PRINT((ndo, "[msgFlags=0x%02X]", flags));
+ return;
+ }
+ length -= count;
+ np += count;
+
+ ND_PRINT((ndo, "F=%s%s%s ",
+ flags & 0x01 ? "a" : "",
+ flags & 0x02 ? "p" : "",
+ flags & 0x04 ? "r" : ""));
+
+ /* msgSecurityModel (INTEGER) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_INT) {
+ ND_PRINT((ndo, "[msgSecurityModel!=INT]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ model = elem.data.integer;
+ length -= count;
+ np += count;
+
+ if ((u_int)count < length)
+ ND_PRINT((ndo, "[%d extra after message SEQ]", length - count));
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "} "));
+ }
+
+ if (model == 3) {
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "{ USM "));
+ }
+ } else {
+ ND_PRINT((ndo, "[security model %d]", model));
+ return;
+ }
+
+ np = xnp + (np - xnp);
+ length = xlength - (np - xnp);
+
+ /* msgSecurityParameters (OCTET STRING) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_STR) {
+ ND_PRINT((ndo, "[msgSecurityParameters!=STR]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ length -= count;
+ np += count;
+
+ if (model == 3) {
+ usm_print(ndo, elem.data.str, elem.asnlen);
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "} "));
+ }
+ }
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "{ ScopedPDU "));
+ }
+
+ scopedpdu_print(ndo, np, length, 3);
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "} "));
+ }
+}
+
+/*
+ * Decode SNMP header and pass on to PDU printing routines
+ */
+void
+snmp_print(netdissect_options *ndo,
+ const u_char *np, u_int length)
+{
+ struct be elem;
+ int count = 0;
+ int version = 0;
+
+ ND_PRINT((ndo, " "));
+
+ /* initial Sequence */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_SEQ) {
+ ND_PRINT((ndo, "[!init SEQ]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+ if ((u_int)count < length)
+ ND_PRINT((ndo, "[%d extra after iSEQ]", length - count));
+ /* descend */
+ length = elem.asnlen;
+ np = (u_char *)elem.data.raw;
+
+ /* Version (INTEGER) */
+ if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
+ return;
+ if (elem.type != BE_INT) {
+ ND_PRINT((ndo, "[version!=INT]"));
+ asn1_print(ndo, &elem);
+ return;
+ }
+
+ switch (elem.data.integer) {
+ case SNMP_VERSION_1:
+ case SNMP_VERSION_2:
+ case SNMP_VERSION_3:
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "{ %s ", SnmpVersion[elem.data.integer]));
+ break;
+ default:
+ ND_PRINT((ndo, "[version = %d]", elem.data.integer));
+ return;
+ }
+ version = elem.data.integer;
+ length -= count;
+ np += count;
+
+ switch (version) {
+ case SNMP_VERSION_1:
+ case SNMP_VERSION_2:
+ community_print(ndo, np, length, version);
+ break;
+ case SNMP_VERSION_3:
+ v3msg_print(ndo, np, length);
+ break;
+ default:
+ ND_PRINT((ndo, "[version = %d]", elem.data.integer));
+ break;
+ }
+
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "} "));
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2000 Lennert Buytenhek
+ *
+ * This software may be distributed either under the terms of the
+ * BSD-style license that accompanies tcpdump or the GNU General
+ * Public License
+ *
+ * Format and print IEEE 802.1d spanning tree protocol packets.
+ * Contributed by Lennert Buytenhek <buytenh@gnu.org>
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-stp.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+
+#include "interface.h"
+#include "extract.h"
+
+#define RSTP_EXTRACT_PORT_ROLE(x) (((x)&0x0C)>>2)
+/* STP timers are expressed in multiples of 1/256th second */
+#define STP_TIME_BASE 256
+#define STP_BPDU_MSTP_MIN_LEN 102
+
+struct stp_bpdu_ {
+ uint8_t protocol_id[2];
+ uint8_t protocol_version;
+ uint8_t bpdu_type;
+ uint8_t flags;
+ uint8_t root_id[8];
+ uint8_t root_path_cost[4];
+ uint8_t bridge_id[8];
+ uint8_t port_id[2];
+ uint8_t message_age[2];
+ uint8_t max_age[2];
+ uint8_t hello_time[2];
+ uint8_t forward_delay[2];
+ uint8_t v1_length;
+};
+
+#define STP_PROTO_REGULAR 0x00
+#define STP_PROTO_RAPID 0x02
+#define STP_PROTO_MSTP 0x03
+#define STP_PROTO_SPB 0x04
+
+static const struct tok stp_proto_values[] = {
+ { STP_PROTO_REGULAR, "802.1d" },
+ { STP_PROTO_RAPID, "802.1w" },
+ { STP_PROTO_MSTP, "802.1s" },
+ { STP_PROTO_SPB, "802.1aq" },
+ { 0, NULL}
+};
+
+#define STP_BPDU_TYPE_CONFIG 0x00
+#define STP_BPDU_TYPE_RSTP 0x02
+#define STP_BPDU_TYPE_TOPO_CHANGE 0x80
+
+static const struct tok stp_bpdu_flag_values[] = {
+ { 0x01, "Topology change" },
+ { 0x02, "Proposal" },
+ { 0x10, "Learn" },
+ { 0x20, "Forward" },
+ { 0x40, "Agreement" },
+ { 0x80, "Topology change ACK" },
+ { 0, NULL}
+};
+
+static const struct tok stp_bpdu_type_values[] = {
+ { STP_BPDU_TYPE_CONFIG, "Config" },
+ { STP_BPDU_TYPE_RSTP, "Rapid STP" },
+ { STP_BPDU_TYPE_TOPO_CHANGE, "Topology Change" },
+ { 0, NULL}
+};
+
+static const struct tok rstp_obj_port_role_values[] = {
+ { 0x00, "Unknown" },
+ { 0x01, "Alternate" },
+ { 0x02, "Root" },
+ { 0x03, "Designated" },
+ { 0, NULL}
+};
+
+static char *
+stp_print_bridge_id(const u_char *p)
+{
+ static char bridge_id_str[sizeof("pppp.aa:bb:cc:dd:ee:ff")];
+
+ snprintf(bridge_id_str, sizeof(bridge_id_str),
+ "%.2x%.2x.%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+ p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
+
+ return bridge_id_str;
+}
+
+static void
+stp_print_config_bpdu(netdissect_options *ndo, const struct stp_bpdu_ *stp_bpdu,
+ u_int length)
+{
+ ND_PRINT((ndo, ", Flags [%s]",
+ bittok2str(stp_bpdu_flag_values, "none", stp_bpdu->flags)));
+
+ ND_PRINT((ndo, ", bridge-id %s.%04x, length %u",
+ stp_print_bridge_id((const u_char *)&stp_bpdu->bridge_id),
+ EXTRACT_16BITS(&stp_bpdu->port_id), length));
+
+ /* in non-verbose mode just print the bridge-id */
+ if (!ndo->ndo_vflag) {
+ return;
+ }
+
+ ND_PRINT((ndo, "\n\tmessage-age %.2fs, max-age %.2fs"
+ ", hello-time %.2fs, forwarding-delay %.2fs",
+ (float)EXTRACT_16BITS(&stp_bpdu->message_age) / STP_TIME_BASE,
+ (float)EXTRACT_16BITS(&stp_bpdu->max_age) / STP_TIME_BASE,
+ (float)EXTRACT_16BITS(&stp_bpdu->hello_time) / STP_TIME_BASE,
+ (float)EXTRACT_16BITS(&stp_bpdu->forward_delay) / STP_TIME_BASE));
+
+ ND_PRINT((ndo, "\n\troot-id %s, root-pathcost %u",
+ stp_print_bridge_id((const u_char *)&stp_bpdu->root_id),
+ EXTRACT_32BITS(&stp_bpdu->root_path_cost)));
+
+ /* Port role is only valid for 802.1w */
+ if (stp_bpdu->protocol_version == STP_PROTO_RAPID) {
+ ND_PRINT((ndo, ", port-role %s",
+ tok2str(rstp_obj_port_role_values, "Unknown",
+ RSTP_EXTRACT_PORT_ROLE(stp_bpdu->flags))));
+ }
+}
+
+/*
+ * MSTP packet format
+ * Ref. IEEE 802.1Q 2003 Ed. Section 14
+ *
+ * MSTP BPDU
+ *
+ * 2 - bytes Protocol Id
+ * 1 - byte Protocol Ver.
+ * 1 - byte BPDU tye
+ * 1 - byte Flags
+ * 8 - bytes CIST Root Identifier
+ * 4 - bytes CIST External Path Cost
+ * 8 - bytes CIST Regional Root Identifier
+ * 2 - bytes CIST Port Identifier
+ * 2 - bytes Message Age
+ * 2 - bytes Max age
+ * 2 - bytes Hello Time
+ * 2 - bytes Forward delay
+ * 1 - byte Version 1 length. Must be 0
+ * 2 - bytes Version 3 length
+ * 1 - byte Config Identifier
+ * 32 - bytes Config Name
+ * 2 - bytes Revision level
+ * 16 - bytes Config Digest [MD5]
+ * 4 - bytes CIST Internal Root Path Cost
+ * 8 - bytes CIST Bridge Identifier
+ * 1 - byte CIST Remaining Hops
+ * 16 - bytes MSTI information [Max 64 MSTI, each 16 bytes]
+ *
+ *
+ * SPB BPDU
+ * Ref. IEEE 802.1aq. Section 14
+ *
+ * 2 - bytes Version 4 length
+ * 1 - byte Aux Config Identifier
+ * 32 - bytes Aux Config Name
+ * 2 - bytes Aux Revision level
+ * 16 - bytes Aux Config Digest [MD5]
+ * 1 - byte (1 - 2) Agreement Number
+ * (3 - 4) Discarded Agreement Number
+ * (5) Agreement Valid Flag
+ * (6) Restricted Role Flag
+ * (7 - 8) Unused sent zero
+ * 1 - byte Unused
+ * 1 - byte (1 - 4) Agreement Digest Format Identifier
+ * (5 - 8) Agreement Digest Format Capabilities
+ * 1 - byte (1 - 4) Agreement Digest Convention Identifier
+ * (5 - 8) Agreement Digest Convention Capabilities
+ * 2 - bytes Agreement Digest Edge Count
+ * 8 - byte Reserved Set
+ * 20 - bytes Computed Topology Digest
+ *
+ *
+ * MSTI Payload
+ *
+ * 1 - byte MSTI flag
+ * 8 - bytes MSTI Regional Root Identifier
+ * 4 - bytes MSTI Regional Path Cost
+ * 1 - byte MSTI Bridge Priority
+ * 1 - byte MSTI Port Priority
+ * 1 - byte MSTI Remaining Hops
+ *
+ */
+
+#define MST_BPDU_MSTI_LENGTH 16
+#define MST_BPDU_CONFIG_INFO_LENGTH 64
+
+/* Offsets of fields from the begginning for the packet */
+#define MST_BPDU_VER3_LEN_OFFSET 36
+#define MST_BPDU_CONFIG_NAME_OFFSET 39
+#define MST_BPDU_CONFIG_DIGEST_OFFSET 73
+#define MST_BPDU_CIST_INT_PATH_COST_OFFSET 89
+#define MST_BPDU_CIST_BRIDGE_ID_OFFSET 93
+#define MST_BPDU_CIST_REMAIN_HOPS_OFFSET 101
+#define MST_BPDU_MSTI_OFFSET 102
+/* Offsets within an MSTI */
+#define MST_BPDU_MSTI_ROOT_PRIO_OFFSET 1
+#define MST_BPDU_MSTI_ROOT_PATH_COST_OFFSET 9
+#define MST_BPDU_MSTI_BRIDGE_PRIO_OFFSET 13
+#define MST_BPDU_MSTI_PORT_PRIO_OFFSET 14
+#define MST_BPDU_MSTI_REMAIN_HOPS_OFFSET 15
+
+#define SPB_BPDU_MIN_LEN 87
+#define SPB_BPDU_CONFIG_NAME_OFFSET 3
+#define SPB_BPDU_CONFIG_REV_OFFSET SPB_BPDU_CONFIG_NAME_OFFSET + 32
+#define SPB_BPDU_CONFIG_DIGEST_OFFSET SPB_BPDU_CONFIG_REV_OFFSET + 2
+#define SPB_BPDU_AGREEMENT_OFFSET SPB_BPDU_CONFIG_DIGEST_OFFSET + 16
+#define SPB_BPDU_AGREEMENT_UNUSED_OFFSET SPB_BPDU_AGREEMENT_OFFSET + 1
+#define SPB_BPDU_AGREEMENT_FORMAT_OFFSET SPB_BPDU_AGREEMENT_UNUSED_OFFSET + 1
+#define SPB_BPDU_AGREEMENT_CON_OFFSET SPB_BPDU_AGREEMENT_FORMAT_OFFSET + 1
+#define SPB_BPDU_AGREEMENT_EDGE_OFFSET SPB_BPDU_AGREEMENT_CON_OFFSET + 1
+#define SPB_BPDU_AGREEMENT_RES1_OFFSET SPB_BPDU_AGREEMENT_EDGE_OFFSET + 2
+#define SPB_BPDU_AGREEMENT_RES2_OFFSET SPB_BPDU_AGREEMENT_RES1_OFFSET + 4
+#define SPB_BPDU_AGREEMENT_DIGEST_OFFSET SPB_BPDU_AGREEMENT_RES2_OFFSET + 4
+
+
+static void
+stp_print_mstp_bpdu(netdissect_options *ndo, const struct stp_bpdu_ *stp_bpdu,
+ u_int length)
+{
+ const u_char *ptr;
+ uint16_t v3len;
+ uint16_t len;
+ uint16_t msti;
+ u_int offset;
+
+ ptr = (const u_char *)stp_bpdu;
+ ND_PRINT((ndo, ", CIST Flags [%s], length %u",
+ bittok2str(stp_bpdu_flag_values, "none", stp_bpdu->flags), length));
+
+ /*
+ * in non-verbose mode just print the flags.
+ */
+ if (!ndo->ndo_vflag) {
+ return;
+ }
+
+ ND_PRINT((ndo, "\n\tport-role %s, ",
+ tok2str(rstp_obj_port_role_values, "Unknown",
+ RSTP_EXTRACT_PORT_ROLE(stp_bpdu->flags))));
+
+ ND_PRINT((ndo, "CIST root-id %s, CIST ext-pathcost %u ",
+ stp_print_bridge_id((const u_char *)&stp_bpdu->root_id),
+ EXTRACT_32BITS(&stp_bpdu->root_path_cost)));
+
+ ND_PRINT((ndo, "\n\tCIST regional-root-id %s, ",
+ stp_print_bridge_id((const u_char *)&stp_bpdu->bridge_id)));
+
+ ND_PRINT((ndo, "CIST port-id %04x, ", EXTRACT_16BITS(&stp_bpdu->port_id)));
+
+ ND_PRINT((ndo, "\n\tmessage-age %.2fs, max-age %.2fs"
+ ", hello-time %.2fs, forwarding-delay %.2fs",
+ (float)EXTRACT_16BITS(&stp_bpdu->message_age) / STP_TIME_BASE,
+ (float)EXTRACT_16BITS(&stp_bpdu->max_age) / STP_TIME_BASE,
+ (float)EXTRACT_16BITS(&stp_bpdu->hello_time) / STP_TIME_BASE,
+ (float)EXTRACT_16BITS(&stp_bpdu->forward_delay) / STP_TIME_BASE));
+
+ ND_PRINT((ndo, "\n\tv3len %d, ", EXTRACT_16BITS(ptr + MST_BPDU_VER3_LEN_OFFSET)));
+ ND_PRINT((ndo, "MCID Name %s, rev %u, "
+ "\n\t\tdigest %08x%08x%08x%08x, ",
+ ptr + MST_BPDU_CONFIG_NAME_OFFSET,
+ EXTRACT_16BITS(ptr + MST_BPDU_CONFIG_NAME_OFFSET + 32),
+ EXTRACT_32BITS(ptr + MST_BPDU_CONFIG_DIGEST_OFFSET),
+ EXTRACT_32BITS(ptr + MST_BPDU_CONFIG_DIGEST_OFFSET + 4),
+ EXTRACT_32BITS(ptr + MST_BPDU_CONFIG_DIGEST_OFFSET + 8),
+ EXTRACT_32BITS(ptr + MST_BPDU_CONFIG_DIGEST_OFFSET + 12)));
+
+ ND_PRINT((ndo, "CIST int-root-pathcost %u, ",
+ EXTRACT_32BITS(ptr + MST_BPDU_CIST_INT_PATH_COST_OFFSET)));
+
+ ND_PRINT((ndo, "\n\tCIST bridge-id %s, ",
+ stp_print_bridge_id(ptr + MST_BPDU_CIST_BRIDGE_ID_OFFSET)));
+
+ ND_PRINT((ndo, "CIST remaining-hops %d", ptr[MST_BPDU_CIST_REMAIN_HOPS_OFFSET]));
+
+ /* Dump all MSTI's */
+ v3len = EXTRACT_16BITS(ptr + MST_BPDU_VER3_LEN_OFFSET);
+ if (v3len > MST_BPDU_CONFIG_INFO_LENGTH) {
+ len = v3len - MST_BPDU_CONFIG_INFO_LENGTH;
+ offset = MST_BPDU_MSTI_OFFSET;
+ while (len >= MST_BPDU_MSTI_LENGTH) {
+ msti = EXTRACT_16BITS(ptr + offset +
+ MST_BPDU_MSTI_ROOT_PRIO_OFFSET);
+ msti = msti & 0x0FFF;
+
+ ND_PRINT((ndo, "\n\tMSTI %d, Flags [%s], port-role %s",
+ msti, bittok2str(stp_bpdu_flag_values, "none", ptr[offset]),
+ tok2str(rstp_obj_port_role_values, "Unknown",
+ RSTP_EXTRACT_PORT_ROLE(ptr[offset]))));
+ ND_PRINT((ndo, "\n\t\tMSTI regional-root-id %s, pathcost %u",
+ stp_print_bridge_id(ptr + offset +
+ MST_BPDU_MSTI_ROOT_PRIO_OFFSET),
+ EXTRACT_32BITS(ptr + offset +
+ MST_BPDU_MSTI_ROOT_PATH_COST_OFFSET)));
+ ND_PRINT((ndo, "\n\t\tMSTI bridge-prio %d, port-prio %d, hops %d",
+ ptr[offset + MST_BPDU_MSTI_BRIDGE_PRIO_OFFSET] >> 4,
+ ptr[offset + MST_BPDU_MSTI_PORT_PRIO_OFFSET] >> 4,
+ ptr[offset + MST_BPDU_MSTI_REMAIN_HOPS_OFFSET]));
+
+ len -= MST_BPDU_MSTI_LENGTH;
+ offset += MST_BPDU_MSTI_LENGTH;
+ }
+ }
+}
+
+static void
+stp_print_spb_bpdu(netdissect_options *ndo, const struct stp_bpdu_ *stp_bpdu,
+ u_int offset)
+{
+ const u_char *ptr;
+
+ /*
+ * in non-verbose mode don't print anything.
+ */
+ if (!ndo->ndo_vflag) {
+ return;
+ }
+
+ ptr = (const u_char *)stp_bpdu;
+ ND_PRINT((ndo, "\n\tv4len %d AUXMCID Name %s, Rev %u, \n\t\tdigest %08x%08x%08x%08x",
+ EXTRACT_16BITS (ptr + offset),
+ ptr + offset + SPB_BPDU_CONFIG_NAME_OFFSET,
+ EXTRACT_16BITS(ptr + offset + SPB_BPDU_CONFIG_REV_OFFSET),
+ EXTRACT_32BITS(ptr + offset + SPB_BPDU_CONFIG_DIGEST_OFFSET),
+ EXTRACT_32BITS(ptr + offset + SPB_BPDU_CONFIG_DIGEST_OFFSET + 4),
+ EXTRACT_32BITS(ptr + offset + SPB_BPDU_CONFIG_DIGEST_OFFSET + 8),
+ EXTRACT_32BITS(ptr + offset + SPB_BPDU_CONFIG_DIGEST_OFFSET + 12)));
+
+ ND_PRINT((ndo, "\n\tAgreement num %d, Discarded Agreement num %d, Agreement valid-"
+ "flag %d, \n\tRestricted role-flag: %d, Format id %d cap %d, "
+ "Convention id %d cap %d, \n\tEdge count %d, "
+ "Agreement digest %08x%08x%08x%08x%08x\n",
+ ptr[offset + SPB_BPDU_AGREEMENT_OFFSET]>>6,
+ ptr[offset + SPB_BPDU_AGREEMENT_OFFSET]>>4 & 0x3,
+ ptr[offset + SPB_BPDU_AGREEMENT_OFFSET]>>3 & 0x1,
+ ptr[offset + SPB_BPDU_AGREEMENT_OFFSET]>>2 & 0x1,
+ ptr[offset + SPB_BPDU_AGREEMENT_FORMAT_OFFSET]>>4,
+ ptr[offset + SPB_BPDU_AGREEMENT_FORMAT_OFFSET]&0x00ff,
+ ptr[offset + SPB_BPDU_AGREEMENT_CON_OFFSET]>>4,
+ ptr[offset + SPB_BPDU_AGREEMENT_CON_OFFSET]&0x00ff,
+ EXTRACT_16BITS(ptr + offset + SPB_BPDU_AGREEMENT_EDGE_OFFSET),
+ EXTRACT_32BITS(ptr + offset + SPB_BPDU_AGREEMENT_DIGEST_OFFSET),
+ EXTRACT_32BITS(ptr + offset + SPB_BPDU_AGREEMENT_DIGEST_OFFSET)+4,
+ EXTRACT_32BITS(ptr + offset + SPB_BPDU_AGREEMENT_DIGEST_OFFSET)+8,
+ EXTRACT_32BITS(ptr + offset + SPB_BPDU_AGREEMENT_DIGEST_OFFSET)+12,
+ EXTRACT_32BITS(ptr + offset + SPB_BPDU_AGREEMENT_DIGEST_OFFSET)+16));
+}
+
+/*
+ * Print 802.1d / 802.1w / 802.1q (mstp) / 802.1aq (spb) packets.
+ */
+void
+stp_print(netdissect_options *ndo, const u_char *p, u_int length)
+{
+ const struct stp_bpdu_ *stp_bpdu;
+ u_int mstp_len;
+ u_int spb_len;
+
+ stp_bpdu = (struct stp_bpdu_*)p;
+
+ /* Minimum STP Frame size. */
+ if (length < 4)
+ goto trunc;
+
+ if (EXTRACT_16BITS(&stp_bpdu->protocol_id)) {
+ ND_PRINT((ndo, "unknown STP version, length %u", length));
+ return;
+ }
+
+ ND_PRINT((ndo, "STP %s", tok2str(stp_proto_values, "Unknown STP protocol (0x%02x)",
+ stp_bpdu->protocol_version)));
+
+ switch (stp_bpdu->protocol_version) {
+ case STP_PROTO_REGULAR:
+ case STP_PROTO_RAPID:
+ case STP_PROTO_MSTP:
+ case STP_PROTO_SPB:
+ break;
+ default:
+ return;
+ }
+
+ ND_PRINT((ndo, ", %s", tok2str(stp_bpdu_type_values, "Unknown BPDU Type (0x%02x)",
+ stp_bpdu->bpdu_type)));
+
+ switch (stp_bpdu->bpdu_type) {
+ case STP_BPDU_TYPE_CONFIG:
+ if (length < sizeof(struct stp_bpdu_) - 1) {
+ goto trunc;
+ }
+ stp_print_config_bpdu(ndo, stp_bpdu, length);
+ break;
+
+ case STP_BPDU_TYPE_RSTP:
+ if (stp_bpdu->protocol_version == STP_PROTO_RAPID) {
+ if (length < sizeof(struct stp_bpdu_)) {
+ goto trunc;
+ }
+ stp_print_config_bpdu(ndo, stp_bpdu, length);
+ } else if (stp_bpdu->protocol_version == STP_PROTO_MSTP ||
+ stp_bpdu->protocol_version == STP_PROTO_SPB) {
+ if (length < STP_BPDU_MSTP_MIN_LEN) {
+ goto trunc;
+ }
+
+ if (stp_bpdu->v1_length != 0) {
+ /* FIX ME: Emit a message here ? */
+ goto trunc;
+ }
+
+ /* Validate v3 length */
+ mstp_len = EXTRACT_16BITS(p + MST_BPDU_VER3_LEN_OFFSET);
+ mstp_len += 2; /* length encoding itself is 2 bytes */
+ if (length < (sizeof(struct stp_bpdu_) + mstp_len)) {
+ goto trunc;
+ }
+ stp_print_mstp_bpdu(ndo, stp_bpdu, length);
+
+ if (stp_bpdu->protocol_version == STP_PROTO_SPB)
+ {
+ /* Validate v4 length */
+ spb_len = EXTRACT_16BITS (p + MST_BPDU_VER3_LEN_OFFSET + mstp_len);
+ spb_len += 2;
+ if (length < (sizeof(struct stp_bpdu_) + mstp_len + spb_len) ||
+ spb_len < SPB_BPDU_MIN_LEN) {
+ goto trunc;
+ }
+ stp_print_spb_bpdu(ndo, stp_bpdu, (sizeof(struct stp_bpdu_) + mstp_len));
+ }
+ }
+ break;
+
+ case STP_BPDU_TYPE_TOPO_CHANGE:
+ /* always empty message - just break out */
+ break;
+
+ default:
+ break;
+ }
+
+ return;
+ trunc:
+ ND_PRINT((ndo, "[|stp %d]", length));
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1997 Yen Yen Lim and North Dakota State University
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Yen Yen Lim and
+ North Dakota State University
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-sunatm.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+struct mbuf;
+struct rtentry;
+
+#include "interface.h"
+#include "extract.h"
+
+#include "atm.h"
+
+/* SunATM header for ATM packet */
+#define DIR_POS 0 /* Direction (0x80 = transmit, 0x00 = receive) */
+#define VPI_POS 1 /* VPI */
+#define VCI_POS 2 /* VCI */
+#define PKT_BEGIN_POS 4 /* Start of the ATM packet */
+
+/* Protocol type values in the bottom for bits of the byte at SUNATM_DIR_POS. */
+#define PT_LANE 0x01 /* LANE */
+#define PT_LLC 0x02 /* LLC encapsulation */
+
+/*
+ * This is the top level routine of the printer. 'p' points
+ * to the SunATM pseudo-header for 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
+sunatm_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int caplen = h->caplen;
+ u_int length = h->len;
+ u_short vci;
+ u_char vpi;
+ u_int traftype;
+
+ if (caplen < PKT_BEGIN_POS) {
+ ND_PRINT((ndo, "[|atm]"));
+ return (caplen);
+ }
+
+ if (ndo->ndo_eflag) {
+ ND_PRINT((ndo, p[DIR_POS] & 0x80 ? "Tx: " : "Rx: "));
+ }
+
+ switch (p[DIR_POS] & 0x0f) {
+
+ case PT_LANE:
+ traftype = ATM_LANE;
+ break;
+
+ case PT_LLC:
+ traftype = ATM_LLC;
+ break;
+
+ default:
+ traftype = ATM_UNKNOWN;
+ break;
+ }
+
+ vci = EXTRACT_16BITS(&p[VCI_POS]);
+ vpi = p[VPI_POS];
+
+ p += PKT_BEGIN_POS;
+ caplen -= PKT_BEGIN_POS;
+ length -= PKT_BEGIN_POS;
+ atm_print(ndo, vpi, vci, traftype, p, length, caplen);
+
+ return (PKT_BEGIN_POS);
+}
--- /dev/null
+/*
+ * Copyright (c) 1992, 1993, 1994, 1995, 1996
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-sunrpc.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/*
+ * At least on HP-UX:
+ *
+ * 1) getrpcbynumber() is declared in <netdb.h>, not any of the RPC
+ * header files
+ *
+ * and
+ *
+ * 2) if _XOPEN_SOURCE_EXTENDED is defined, <netdb.h> doesn't declare
+ * it
+ *
+ * so we undefine it.
+ */
+#undef _XOPEN_SOURCE_EXTENDED
+
+#include <tcpdump-stdinc.h>
+
+#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 /* defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H) */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#include "ip.h"
+#ifdef INET6
+#include "ip6.h"
+#endif
+
+#include "rpc_auth.h"
+#include "rpc_msg.h"
+
+/*
+ * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
+ * unrestricted use provided that this legend is included on all tape
+ * media and as a part of the software program in whole or part. Users
+ * may copy or modify Sun RPC without charge, but are not authorized
+ * to license or distribute it to anyone else except as part of a product or
+ * program developed by the user.
+ *
+ * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
+ * WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun RPC is provided with no support and without any obligation on the
+ * part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California 94043
+ *
+ * from: @(#)pmap_prot.h 1.14 88/02/08 SMI
+ * from: @(#)pmap_prot.h 2.1 88/07/29 4.0 RPCSRC
+ * $FreeBSD: src/include/rpc/pmap_prot.h,v 1.9.2.1 1999/08/29 14:39:05 peter Exp $
+ */
+
+/*
+ * pmap_prot.h
+ * Protocol for the local binder service, or pmap.
+ *
+ * Copyright (C) 1984, Sun Microsystems, Inc.
+ *
+ * The following procedures are supported by the protocol:
+ *
+ * PMAPPROC_NULL() returns ()
+ * takes nothing, returns nothing
+ *
+ * PMAPPROC_SET(struct pmap) returns (bool_t)
+ * TRUE is success, FALSE is failure. Registers the tuple
+ * [prog, vers, prot, port].
+ *
+ * PMAPPROC_UNSET(struct pmap) returns (bool_t)
+ * TRUE is success, FALSE is failure. Un-registers pair
+ * [prog, vers]. prot and port are ignored.
+ *
+ * PMAPPROC_GETPORT(struct pmap) returns (long unsigned).
+ * 0 is failure. Otherwise returns the port number where the pair
+ * [prog, vers] is registered. It may lie!
+ *
+ * PMAPPROC_DUMP() RETURNS (struct pmaplist *)
+ *
+ * PMAPPROC_CALLIT(unsigned, unsigned, unsigned, string<>)
+ * RETURNS (port, string<>);
+ * usage: encapsulatedresults = PMAPPROC_CALLIT(prog, vers, proc, encapsulatedargs);
+ * Calls the procedure on the local machine. If it is not registered,
+ * this procedure is quite; ie it does not return error information!!!
+ * This procedure only is supported on rpc/udp and calls via
+ * rpc/udp. This routine only passes null authentication parameters.
+ * This file has no interface to xdr routines for PMAPPROC_CALLIT.
+ *
+ * The service supports remote procedure calls on udp/ip or tcp/ip socket 111.
+ */
+
+#define SUNRPC_PMAPPORT ((uint16_t)111)
+#define SUNRPC_PMAPPROG ((uint32_t)100000)
+#define SUNRPC_PMAPVERS ((uint32_t)2)
+#define SUNRPC_PMAPVERS_PROTO ((uint32_t)2)
+#define SUNRPC_PMAPVERS_ORIG ((uint32_t)1)
+#define SUNRPC_PMAPPROC_NULL ((uint32_t)0)
+#define SUNRPC_PMAPPROC_SET ((uint32_t)1)
+#define SUNRPC_PMAPPROC_UNSET ((uint32_t)2)
+#define SUNRPC_PMAPPROC_GETPORT ((uint32_t)3)
+#define SUNRPC_PMAPPROC_DUMP ((uint32_t)4)
+#define SUNRPC_PMAPPROC_CALLIT ((uint32_t)5)
+
+struct sunrpc_pmap {
+ uint32_t pm_prog;
+ uint32_t pm_vers;
+ uint32_t pm_prot;
+ uint32_t pm_port;
+};
+
+static const struct tok proc2str[] = {
+ { SUNRPC_PMAPPROC_NULL, "null" },
+ { SUNRPC_PMAPPROC_SET, "set" },
+ { SUNRPC_PMAPPROC_UNSET, "unset" },
+ { SUNRPC_PMAPPROC_GETPORT, "getport" },
+ { SUNRPC_PMAPPROC_DUMP, "dump" },
+ { SUNRPC_PMAPPROC_CALLIT, "call" },
+ { 0, NULL }
+};
+
+/* Forwards */
+static char *progstr(uint32_t);
+
+void
+sunrpcrequest_print(netdissect_options *ndo, register const u_char *bp,
+ register u_int length, register const u_char *bp2)
+{
+ register const struct sunrpc_msg *rp;
+ register const struct ip *ip;
+#ifdef INET6
+ register const struct ip6_hdr *ip6;
+#endif
+ uint32_t x;
+ char srcid[20], dstid[20]; /*fits 32bit*/
+
+ rp = (struct sunrpc_msg *)bp;
+
+ if (!ndo->ndo_nflag) {
+ snprintf(srcid, sizeof(srcid), "0x%x",
+ EXTRACT_32BITS(&rp->rm_xid));
+ strlcpy(dstid, "sunrpc", sizeof(dstid));
+ } else {
+ snprintf(srcid, sizeof(srcid), "0x%x",
+ EXTRACT_32BITS(&rp->rm_xid));
+ snprintf(dstid, sizeof(dstid), "0x%x", SUNRPC_PMAPPORT);
+ }
+
+ switch (IP_V((struct ip *)bp2)) {
+ case 4:
+ ip = (struct ip *)bp2;
+ ND_PRINT((ndo, "%s.%s > %s.%s: %d",
+ ipaddr_string(ndo, &ip->ip_src), srcid,
+ ipaddr_string(ndo, &ip->ip_dst), dstid, length));
+ break;
+#ifdef INET6
+ case 6:
+ ip6 = (struct ip6_hdr *)bp2;
+ ND_PRINT((ndo, "%s.%s > %s.%s: %d",
+ ip6addr_string(ndo, &ip6->ip6_src), srcid,
+ ip6addr_string(ndo, &ip6->ip6_dst), dstid, length));
+ break;
+#endif
+ default:
+ ND_PRINT((ndo, "%s.%s > %s.%s: %d", "?", srcid, "?", dstid, length));
+ break;
+ }
+
+ ND_PRINT((ndo, " %s", tok2str(proc2str, " proc #%u",
+ EXTRACT_32BITS(&rp->rm_call.cb_proc))));
+ x = EXTRACT_32BITS(&rp->rm_call.cb_rpcvers);
+ if (x != 2)
+ ND_PRINT((ndo, " [rpcver %u]", x));
+
+ switch (EXTRACT_32BITS(&rp->rm_call.cb_proc)) {
+
+ case SUNRPC_PMAPPROC_SET:
+ case SUNRPC_PMAPPROC_UNSET:
+ case SUNRPC_PMAPPROC_GETPORT:
+ case SUNRPC_PMAPPROC_CALLIT:
+ x = EXTRACT_32BITS(&rp->rm_call.cb_prog);
+ if (!ndo->ndo_nflag)
+ ND_PRINT((ndo, " %s", progstr(x)));
+ else
+ ND_PRINT((ndo, " %u", x));
+ ND_PRINT((ndo, ".%u", EXTRACT_32BITS(&rp->rm_call.cb_vers)));
+ break;
+ }
+}
+
+static char *
+progstr(uint32_t prog)
+{
+#if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H)
+ register struct rpcent *rp;
+#endif
+ static char buf[32];
+ static uint32_t lastprog = 0;
+
+ if (lastprog != 0 && prog == lastprog)
+ return (buf);
+#if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H)
+ rp = getrpcbynumber(prog);
+ if (rp == NULL)
+#endif
+ (void) snprintf(buf, sizeof(buf), "#%u", prog);
+#if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H)
+ else
+ strlcpy(buf, rp->r_name, sizeof(buf));
+#endif
+ return (buf);
+}
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-symantec.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "ethertype.h"
+
+#include "ether.h"
+
+struct symantec_header {
+ uint8_t stuff1[6];
+ uint16_t ether_type;
+ uint8_t stuff2[36];
+};
+
+static inline void
+symantec_hdr_print(netdissect_options *ndo, register const u_char *bp, u_int length)
+{
+ register const struct symantec_header *sp;
+ uint16_t etype;
+
+ sp = (const struct symantec_header *)bp;
+
+ etype = EXTRACT_16BITS(&sp->ether_type);
+ if (!ndo->ndo_qflag) {
+ if (etype <= ETHERMTU)
+ ND_PRINT((ndo, "invalid ethertype %u", etype));
+ else
+ ND_PRINT((ndo, "ethertype %s (0x%04x)",
+ tok2str(ethertype_values,"Unknown", etype),
+ etype));
+ } else {
+ if (etype <= ETHERMTU)
+ ND_PRINT((ndo, "invalid ethertype %u", etype));
+ else
+ ND_PRINT((ndo, "%s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", etype)));
+ }
+
+ ND_PRINT((ndo, ", length %u: ", length));
+}
+
+/*
+ * 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
+symantec_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int length = h->len;
+ u_int caplen = h->caplen;
+ struct symantec_header *sp;
+ u_short ether_type;
+
+ if (caplen < sizeof (struct symantec_header)) {
+ ND_PRINT((ndo, "[|symantec]"));
+ return caplen;
+ }
+
+ if (ndo->ndo_eflag)
+ symantec_hdr_print(ndo, p, length);
+
+ length -= sizeof (struct symantec_header);
+ caplen -= sizeof (struct symantec_header);
+ sp = (struct symantec_header *)p;
+ p += sizeof (struct symantec_header);
+
+ ether_type = EXTRACT_16BITS(&sp->ether_type);
+
+ if (ether_type <= ETHERMTU) {
+ /* ether_type not known, print raw packet */
+ if (!ndo->ndo_eflag)
+ symantec_hdr_print(ndo, (u_char *)sp, length + sizeof (struct symantec_header));
+
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ } else if (ethertype_print(ndo, ether_type, p, length, caplen) == 0) {
+ /* ether_type not known, print raw packet */
+ if (!ndo->ndo_eflag)
+ symantec_hdr_print(ndo, (u_char *)sp, length + sizeof (struct symantec_header));
+
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+
+ return (sizeof (struct symantec_header));
+}
--- /dev/null
+/*
+ * Copyright (c) 1998-2004 Hannes Gredler <hannes@tcpdump.org>
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-syslog.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+static const char tstr[] = "[|syslog]";
+
+/*
+ * tokenlists and #defines taken from Ethereal - Network traffic analyzer
+ * by Gerald Combs <gerald@ethereal.com>
+ */
+
+#define SYSLOG_SEVERITY_MASK 0x0007 /* 0000 0000 0000 0111 */
+#define SYSLOG_FACILITY_MASK 0x03f8 /* 0000 0011 1111 1000 */
+#define SYSLOG_MAX_DIGITS 3 /* The maximum number if priority digits to read in. */
+
+static const struct tok syslog_severity_values[] = {
+ { 0, "emergency" },
+ { 1, "alert" },
+ { 2, "critical" },
+ { 3, "error" },
+ { 4, "warning" },
+ { 5, "notice" },
+ { 6, "info" },
+ { 7, "debug" },
+ { 0, NULL },
+};
+
+static const struct tok syslog_facility_values[] = {
+ { 0, "kernel" },
+ { 1, "user" },
+ { 2, "mail" },
+ { 3, "daemon" },
+ { 4, "auth" },
+ { 5, "syslog" },
+ { 6, "lpr" },
+ { 7, "news" },
+ { 8, "uucp" },
+ { 9, "cron" },
+ { 10, "authpriv" },
+ { 11, "ftp" },
+ { 12, "ntp" },
+ { 13, "security" },
+ { 14, "console" },
+ { 15, "cron" },
+ { 16, "local0" },
+ { 17, "local1" },
+ { 18, "local2" },
+ { 19, "local3" },
+ { 20, "local4" },
+ { 21, "local5" },
+ { 22, "local6" },
+ { 23, "local7" },
+ { 0, NULL },
+};
+
+void
+syslog_print(netdissect_options *ndo,
+ register const u_char *pptr, register u_int len)
+{
+ uint16_t msg_off = 0;
+ uint16_t pri = 0;
+ uint16_t facility,severity;
+
+ /* extract decimal figures that are
+ * encapsulated within < > tags
+ * based on this decimal figure extract the
+ * severity and facility values
+ */
+
+ ND_TCHECK2(*pptr, 1);
+ if (*(pptr+msg_off) == '<') {
+ msg_off++;
+ ND_TCHECK2(*(pptr + msg_off), 1);
+ while ( *(pptr+msg_off) >= '0' &&
+ *(pptr+msg_off) <= '9' &&
+ msg_off <= SYSLOG_MAX_DIGITS) {
+ pri = pri * 10 + (*(pptr+msg_off) - '0');
+ msg_off++;
+ ND_TCHECK2(*(pptr + msg_off), 1);
+ }
+ if (*(pptr+msg_off) != '>') {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+ msg_off++;
+ } else {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+
+ facility = (pri & SYSLOG_FACILITY_MASK) >> 3;
+ severity = pri & SYSLOG_SEVERITY_MASK;
+
+ if (ndo->ndo_vflag < 1 )
+ {
+ ND_PRINT((ndo, "SYSLOG %s.%s, length: %u",
+ tok2str(syslog_facility_values, "unknown (%u)", facility),
+ tok2str(syslog_severity_values, "unknown (%u)", severity),
+ len));
+ return;
+ }
+
+ ND_PRINT((ndo, "SYSLOG, length: %u\n\tFacility %s (%u), Severity %s (%u)\n\tMsg: ",
+ len,
+ tok2str(syslog_facility_values, "unknown (%u)", facility),
+ facility,
+ tok2str(syslog_severity_values, "unknown (%u)", severity),
+ severity));
+
+ /* print the syslog text in verbose mode */
+ for (; msg_off < len; msg_off++) {
+ ND_TCHECK2(*(pptr + msg_off), 1);
+ safeputchar(ndo, *(pptr + msg_off));
+ }
+
+ if (ndo->ndo_vflag > 1)
+ print_unknown_data(ndo, pptr, "\n\t", len);
+
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
--- /dev/null
+/* NetBSD: print-tcp.c,v 1.9 2007/07/26 18:15:12 plunky Exp */
+
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Copyright (c) 1999-2004 The tcpdump.org 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, (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-tcp.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#include "tcp.h"
+
+#include "ip.h"
+#ifdef INET6
+#include "ip6.h"
+#endif
+#include "ipproto.h"
+#include "rpc_auth.h"
+#include "rpc_msg.h"
+
+#include "nameser.h"
+
+#ifdef HAVE_LIBCRYPTO
+#include <openssl/md5.h>
+#include <signature.h>
+
+static int tcp_verify_signature(netdissect_options *ndo,
+ const struct ip *ip, const struct tcphdr *tp,
+ const u_char *data, int length, const u_char *rcvsig);
+#endif
+
+static void print_tcp_rst_data(netdissect_options *, register const u_char *sp, u_int length);
+
+#define MAX_RST_DATA_LEN 30
+
+
+struct tha {
+ struct in_addr src;
+ struct in_addr dst;
+ u_int port;
+};
+
+struct tcp_seq_hash {
+ struct tcp_seq_hash *nxt;
+ struct tha addr;
+ tcp_seq seq;
+ tcp_seq ack;
+};
+
+#ifdef INET6
+struct tha6 {
+ struct in6_addr src;
+ struct in6_addr dst;
+ u_int port;
+};
+
+struct tcp_seq_hash6 {
+ struct tcp_seq_hash6 *nxt;
+ struct tha6 addr;
+ tcp_seq seq;
+ tcp_seq ack;
+};
+#endif
+
+#define TSEQ_HASHSIZE 919
+
+/* These tcp optinos do not have the size octet */
+#define ZEROLENOPT(o) ((o) == TCPOPT_EOL || (o) == TCPOPT_NOP)
+
+static struct tcp_seq_hash tcp_seq_hash4[TSEQ_HASHSIZE];
+#ifdef INET6
+static struct tcp_seq_hash6 tcp_seq_hash6[TSEQ_HASHSIZE];
+#endif
+
+static const struct tok tcp_flag_values[] = {
+ { TH_FIN, "F" },
+ { TH_SYN, "S" },
+ { TH_RST, "R" },
+ { TH_PUSH, "P" },
+ { TH_ACK, "." },
+ { TH_URG, "U" },
+ { TH_ECNECHO, "E" },
+ { TH_CWR, "W" },
+ { 0, NULL }
+};
+
+static const struct tok tcp_option_values[] = {
+ { TCPOPT_EOL, "eol" },
+ { TCPOPT_NOP, "nop" },
+ { TCPOPT_MAXSEG, "mss" },
+ { TCPOPT_WSCALE, "wscale" },
+ { TCPOPT_SACKOK, "sackOK" },
+ { TCPOPT_SACK, "sack" },
+ { TCPOPT_ECHO, "echo" },
+ { TCPOPT_ECHOREPLY, "echoreply" },
+ { TCPOPT_TIMESTAMP, "TS" },
+ { TCPOPT_CC, "cc" },
+ { TCPOPT_CCNEW, "ccnew" },
+ { TCPOPT_CCECHO, "" },
+ { TCPOPT_SIGNATURE, "md5" },
+ { TCPOPT_AUTH, "enhanced auth" },
+ { TCPOPT_UTO, "uto" },
+ { TCPOPT_MPTCP, "mptcp" },
+ { TCPOPT_EXPERIMENT2, "exp" },
+ { 0, NULL }
+};
+
+static int
+tcp_cksum(netdissect_options *ndo,
+ register const struct ip *ip,
+ register const struct tcphdr *tp,
+ register u_int len)
+{
+ return nextproto4_cksum(ndo, ip, (const uint8_t *)tp, len, len,
+ IPPROTO_TCP);
+}
+
+void
+tcp_print(netdissect_options *ndo,
+ register const u_char *bp, register u_int length,
+ register const u_char *bp2, int fragmented)
+{
+ register const struct tcphdr *tp;
+ register const struct ip *ip;
+ register u_char flags;
+ register u_int hlen;
+ register char ch;
+ uint16_t sport, dport, win, urp;
+ uint32_t seq, ack, thseq, thack;
+ u_int utoval;
+ uint16_t magic;
+ register int rev;
+#ifdef INET6
+ register const struct ip6_hdr *ip6;
+#endif
+
+ tp = (struct tcphdr *)bp;
+ ip = (struct ip *)bp2;
+#ifdef INET6
+ if (IP_V(ip) == 6)
+ ip6 = (struct ip6_hdr *)bp2;
+ else
+ ip6 = NULL;
+#endif /*INET6*/
+ ch = '\0';
+ if (!ND_TTEST(tp->th_dport)) {
+ ND_PRINT((ndo, "%s > %s: [|tcp]",
+ ipaddr_string(ndo, &ip->ip_src),
+ ipaddr_string(ndo, &ip->ip_dst)));
+ return;
+ }
+
+ sport = EXTRACT_16BITS(&tp->th_sport);
+ dport = EXTRACT_16BITS(&tp->th_dport);
+
+ hlen = TH_OFF(tp) * 4;
+
+#ifdef INET6
+ if (ip6) {
+ if (ip6->ip6_nxt == IPPROTO_TCP) {
+ ND_PRINT((ndo, "%s.%s > %s.%s: ",
+ ip6addr_string(ndo, &ip6->ip6_src),
+ tcpport_string(sport),
+ ip6addr_string(ndo, &ip6->ip6_dst),
+ tcpport_string(dport)));
+ } else {
+ ND_PRINT((ndo, "%s > %s: ",
+ tcpport_string(sport), tcpport_string(dport)));
+ }
+ } else
+#endif /*INET6*/
+ {
+ if (ip->ip_p == IPPROTO_TCP) {
+ ND_PRINT((ndo, "%s.%s > %s.%s: ",
+ ipaddr_string(ndo, &ip->ip_src),
+ tcpport_string(sport),
+ ipaddr_string(ndo, &ip->ip_dst),
+ tcpport_string(dport)));
+ } else {
+ ND_PRINT((ndo, "%s > %s: ",
+ tcpport_string(sport), tcpport_string(dport)));
+ }
+ }
+
+ if (hlen < sizeof(*tp)) {
+ ND_PRINT((ndo, " tcp %d [bad hdr length %u - too short, < %lu]",
+ length - hlen, hlen, (unsigned long)sizeof(*tp)));
+ return;
+ }
+
+ ND_TCHECK(*tp);
+
+ seq = EXTRACT_32BITS(&tp->th_seq);
+ ack = EXTRACT_32BITS(&tp->th_ack);
+ win = EXTRACT_16BITS(&tp->th_win);
+ urp = EXTRACT_16BITS(&tp->th_urp);
+
+ if (ndo->ndo_qflag) {
+ ND_PRINT((ndo, "tcp %d", length - hlen));
+ if (hlen > length) {
+ ND_PRINT((ndo, " [bad hdr length %u - too long, > %u]",
+ hlen, length));
+ }
+ return;
+ }
+
+ flags = tp->th_flags;
+ ND_PRINT((ndo, "Flags [%s]", bittok2str_nosep(tcp_flag_values, "none", flags)));
+
+ if (!ndo->ndo_Sflag && (flags & TH_ACK)) {
+ /*
+ * Find (or record) the initial sequence numbers for
+ * this conversation. (we pick an arbitrary
+ * collating order so there's only one entry for
+ * both directions).
+ */
+ rev = 0;
+#ifdef INET6
+ if (ip6) {
+ register struct tcp_seq_hash6 *th;
+ struct tcp_seq_hash6 *tcp_seq_hash;
+ const struct in6_addr *src, *dst;
+ struct tha6 tha;
+
+ tcp_seq_hash = tcp_seq_hash6;
+ src = &ip6->ip6_src;
+ dst = &ip6->ip6_dst;
+ if (sport > dport)
+ rev = 1;
+ else if (sport == dport) {
+ if (UNALIGNED_MEMCMP(src, dst, sizeof ip6->ip6_dst) > 0)
+ rev = 1;
+ }
+ if (rev) {
+ UNALIGNED_MEMCPY(&tha.src, dst, sizeof ip6->ip6_dst);
+ UNALIGNED_MEMCPY(&tha.dst, src, sizeof ip6->ip6_src);
+ tha.port = dport << 16 | sport;
+ } else {
+ UNALIGNED_MEMCPY(&tha.dst, dst, sizeof ip6->ip6_dst);
+ UNALIGNED_MEMCPY(&tha.src, src, sizeof ip6->ip6_src);
+ tha.port = sport << 16 | dport;
+ }
+
+ for (th = &tcp_seq_hash[tha.port % TSEQ_HASHSIZE];
+ th->nxt; th = th->nxt)
+ if (memcmp((char *)&tha, (char *)&th->addr,
+ sizeof(th->addr)) == 0)
+ break;
+
+ if (!th->nxt || (flags & TH_SYN)) {
+ /* didn't find it or new conversation */
+ if (th->nxt == NULL) {
+ th->nxt = (struct tcp_seq_hash6 *)
+ calloc(1, sizeof(*th));
+ if (th->nxt == NULL)
+ error("tcp_print: calloc");
+ }
+ th->addr = tha;
+ if (rev)
+ th->ack = seq, th->seq = ack - 1;
+ else
+ th->seq = seq, th->ack = ack - 1;
+ } else {
+ if (rev)
+ seq -= th->ack, ack -= th->seq;
+ else
+ seq -= th->seq, ack -= th->ack;
+ }
+
+ thseq = th->seq;
+ thack = th->ack;
+ } else {
+#else /*INET6*/
+ {
+#endif /*INET6*/
+ register struct tcp_seq_hash *th;
+ struct tcp_seq_hash *tcp_seq_hash;
+ const struct in_addr *src, *dst;
+ struct tha tha;
+
+ tcp_seq_hash = tcp_seq_hash4;
+ src = &ip->ip_src;
+ dst = &ip->ip_dst;
+ if (sport > dport)
+ rev = 1;
+ else if (sport == dport) {
+ if (UNALIGNED_MEMCMP(src, dst, sizeof ip->ip_dst) > 0)
+ rev = 1;
+ }
+ if (rev) {
+ UNALIGNED_MEMCPY(&tha.src, dst, sizeof ip->ip_dst);
+ UNALIGNED_MEMCPY(&tha.dst, src, sizeof ip->ip_src);
+ tha.port = dport << 16 | sport;
+ } else {
+ UNALIGNED_MEMCPY(&tha.dst, dst, sizeof ip->ip_dst);
+ UNALIGNED_MEMCPY(&tha.src, src, sizeof ip->ip_src);
+ tha.port = sport << 16 | dport;
+ }
+
+ for (th = &tcp_seq_hash[tha.port % TSEQ_HASHSIZE];
+ th->nxt; th = th->nxt)
+ if (memcmp((char *)&tha, (char *)&th->addr,
+ sizeof(th->addr)) == 0)
+ break;
+
+ if (!th->nxt || (flags & TH_SYN)) {
+ /* didn't find it or new conversation */
+ if (th->nxt == NULL) {
+ th->nxt = (struct tcp_seq_hash *)
+ calloc(1, sizeof(*th));
+ if (th->nxt == NULL)
+ error("tcp_print: calloc");
+ }
+ th->addr = tha;
+ if (rev)
+ th->ack = seq, th->seq = ack - 1;
+ else
+ th->seq = seq, th->ack = ack - 1;
+ } else {
+ if (rev)
+ seq -= th->ack, ack -= th->seq;
+ else
+ seq -= th->seq, ack -= th->ack;
+ }
+
+ thseq = th->seq;
+ thack = th->ack;
+ }
+ } else {
+ /*fool gcc*/
+ thseq = thack = rev = 0;
+ }
+ if (hlen > length) {
+ ND_PRINT((ndo, " [bad hdr length %u - too long, > %u]",
+ hlen, length));
+ return;
+ }
+
+ if (ndo->ndo_vflag && !ndo->ndo_Kflag && !fragmented) {
+ /* Check the checksum, if possible. */
+ uint16_t sum, tcp_sum;
+
+ if (IP_V(ip) == 4) {
+ if (ND_TTEST2(tp->th_sport, length)) {
+ sum = tcp_cksum(ndo, ip, tp, length);
+ tcp_sum = EXTRACT_16BITS(&tp->th_sum);
+
+ ND_PRINT((ndo, ", cksum 0x%04x", tcp_sum));
+ if (sum != 0)
+ ND_PRINT((ndo, " (incorrect -> 0x%04x)",
+ in_cksum_shouldbe(tcp_sum, sum)));
+ else
+ ND_PRINT((ndo, " (correct)"));
+ }
+ }
+#ifdef INET6
+ else if (IP_V(ip) == 6 && ip6->ip6_plen) {
+ if (ND_TTEST2(tp->th_sport, length)) {
+ sum = nextproto6_cksum(ip6, (const uint8_t *)tp,
+ length, length, IPPROTO_TCP);
+ tcp_sum = EXTRACT_16BITS(&tp->th_sum);
+
+ ND_PRINT((ndo, ", cksum 0x%04x", tcp_sum));
+ if (sum != 0)
+ ND_PRINT((ndo, " (incorrect -> 0x%04x)",
+ in_cksum_shouldbe(tcp_sum, sum)));
+ else
+ ND_PRINT((ndo, " (correct)"));
+
+ }
+ }
+#endif
+ }
+
+ length -= hlen;
+ if (ndo->ndo_vflag > 1 || length > 0 || flags & (TH_SYN | TH_FIN | TH_RST)) {
+ ND_PRINT((ndo, ", seq %u", seq));
+
+ if (length > 0) {
+ ND_PRINT((ndo, ":%u", seq + length));
+ }
+ }
+
+ if (flags & TH_ACK) {
+ ND_PRINT((ndo, ", ack %u", ack));
+ }
+
+ ND_PRINT((ndo, ", win %d", win));
+
+ if (flags & TH_URG)
+ ND_PRINT((ndo, ", urg %d", urp));
+ /*
+ * Handle any options.
+ */
+ if (hlen > sizeof(*tp)) {
+ register const u_char *cp;
+ register u_int i, opt, datalen;
+ register u_int len;
+
+ hlen -= sizeof(*tp);
+ cp = (const u_char *)tp + sizeof(*tp);
+ ND_PRINT((ndo, ", options ["));
+ while (hlen > 0) {
+ if (ch != '\0')
+ ND_PRINT((ndo, "%c", ch));
+ ND_TCHECK(*cp);
+ opt = *cp++;
+ if (ZEROLENOPT(opt))
+ len = 1;
+ else {
+ ND_TCHECK(*cp);
+ len = *cp++; /* total including type, len */
+ if (len < 2 || len > hlen)
+ goto bad;
+ --hlen; /* account for length byte */
+ }
+ --hlen; /* account for type byte */
+ datalen = 0;
+
+/* Bail if "l" bytes of data are not left or were not captured */
+#define LENCHECK(l) { if ((l) > hlen) goto bad; ND_TCHECK2(*cp, l); }
+
+
+ ND_PRINT((ndo, "%s", tok2str(tcp_option_values, "unknown-%u", opt)));
+
+ switch (opt) {
+
+ case TCPOPT_MAXSEG:
+ datalen = 2;
+ LENCHECK(datalen);
+ ND_PRINT((ndo, " %u", EXTRACT_16BITS(cp)));
+ break;
+
+ case TCPOPT_WSCALE:
+ datalen = 1;
+ LENCHECK(datalen);
+ ND_PRINT((ndo, " %u", *cp));
+ break;
+
+ case TCPOPT_SACK:
+ datalen = len - 2;
+ if (datalen % 8 != 0) {
+ ND_PRINT((ndo, "malformed sack"));
+ } else {
+ uint32_t s, e;
+
+ ND_PRINT((ndo, " %d ", datalen / 8));
+ for (i = 0; i < datalen; i += 8) {
+ LENCHECK(i + 4);
+ s = EXTRACT_32BITS(cp + i);
+ LENCHECK(i + 8);
+ e = EXTRACT_32BITS(cp + i + 4);
+ if (rev) {
+ s -= thseq;
+ e -= thseq;
+ } else {
+ s -= thack;
+ e -= thack;
+ }
+ ND_PRINT((ndo, "{%u:%u}", s, e));
+ }
+ }
+ break;
+
+ case TCPOPT_CC:
+ case TCPOPT_CCNEW:
+ case TCPOPT_CCECHO:
+ case TCPOPT_ECHO:
+ case TCPOPT_ECHOREPLY:
+
+ /*
+ * those options share their semantics.
+ * fall through
+ */
+ datalen = 4;
+ LENCHECK(datalen);
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(cp)));
+ break;
+
+ case TCPOPT_TIMESTAMP:
+ datalen = 8;
+ LENCHECK(datalen);
+ ND_PRINT((ndo, " val %u ecr %u",
+ EXTRACT_32BITS(cp),
+ EXTRACT_32BITS(cp + 4)));
+ break;
+
+ case TCPOPT_SIGNATURE:
+ datalen = TCP_SIGLEN;
+ LENCHECK(datalen);
+#ifdef HAVE_LIBCRYPTO
+ switch (tcp_verify_signature(ndo, ip, tp,
+ bp + TH_OFF(tp) * 4, length, cp)) {
+
+ case SIGNATURE_VALID:
+ ND_PRINT((ndo, "valid"));
+ break;
+
+ case SIGNATURE_INVALID:
+ ND_PRINT((ndo, "invalid"));
+ break;
+
+ case CANT_CHECK_SIGNATURE:
+ ND_PRINT((ndo, "can't check - "));
+ for (i = 0; i < TCP_SIGLEN; ++i)
+ ND_PRINT((ndo, "%02x", cp[i]));
+ break;
+ }
+#else
+ for (i = 0; i < TCP_SIGLEN; ++i)
+ ND_PRINT((ndo, "%02x", cp[i]));
+#endif
+ break;
+
+ case TCPOPT_AUTH:
+ ND_PRINT((ndo, "keyid %d", *cp++));
+ datalen = len - 3;
+ for (i = 0; i < datalen; ++i) {
+ LENCHECK(i);
+ ND_PRINT((ndo, "%02x", cp[i]));
+ }
+ break;
+
+
+ case TCPOPT_EOL:
+ case TCPOPT_NOP:
+ case TCPOPT_SACKOK:
+ /*
+ * Nothing interesting.
+ * fall through
+ */
+ break;
+
+ case TCPOPT_UTO:
+ datalen = 2;
+ LENCHECK(datalen);
+ utoval = EXTRACT_16BITS(cp);
+ ND_PRINT((ndo, "0x%x", utoval));
+ if (utoval & 0x0001)
+ utoval = (utoval >> 1) * 60;
+ else
+ utoval >>= 1;
+ ND_PRINT((ndo, " %u", utoval));
+ break;
+
+ case TCPOPT_MPTCP:
+ datalen = len - 2;
+ LENCHECK(datalen);
+ if (!mptcp_print(ndo, cp-2, len, flags))
+ goto bad;
+ break;
+
+ case TCPOPT_EXPERIMENT2:
+ datalen = len - 2;
+ LENCHECK(datalen);
+ if (datalen < 2)
+ goto bad;
+ /* RFC6994 */
+ magic = EXTRACT_16BITS(cp);
+ ND_PRINT((ndo, "-"));
+
+ switch(magic) {
+
+ case 0xf989:
+ /* TCP Fast Open: RFC 7413 */
+ if (datalen == 2) {
+ /* Fast Open Cookie Request */
+ ND_PRINT((ndo, "tfo cookiereq"));
+ } else {
+ /* Fast Open Cookie */
+ if (datalen % 2 != 0 || datalen < 6 || datalen > 18) {
+ ND_PRINT((ndo, "tfo malformed"));
+ } else {
+ ND_PRINT((ndo, "tfo cookie "));
+ for (i = 2; i < datalen; ++i)
+ ND_PRINT((ndo, "%02x", cp[i]));
+ }
+ }
+ break;
+
+ default:
+ /* Unknown magic number */
+ ND_PRINT((ndo, "%04x", magic));
+ break;
+ }
+ break;
+
+ default:
+ datalen = len - 2;
+ if (datalen)
+ ND_PRINT((ndo, " 0x"));
+ for (i = 0; i < datalen; ++i) {
+ LENCHECK(i);
+ ND_PRINT((ndo, "%02x", cp[i]));
+ }
+ break;
+ }
+
+ /* Account for data printed */
+ cp += datalen;
+ hlen -= datalen;
+
+ /* Check specification against observed length */
+ ++datalen; /* option octet */
+ if (!ZEROLENOPT(opt))
+ ++datalen; /* size octet */
+ if (datalen != len)
+ ND_PRINT((ndo, "[len %d]", len));
+ ch = ',';
+ if (opt == TCPOPT_EOL)
+ break;
+ }
+ ND_PRINT((ndo, "]"));
+ }
+
+ /*
+ * Print length field before crawling down the stack.
+ */
+ ND_PRINT((ndo, ", length %u", length));
+
+ if (length <= 0)
+ return;
+
+ /*
+ * Decode payload if necessary.
+ */
+ bp += TH_OFF(tp) * 4;
+ if ((flags & TH_RST) && ndo->ndo_vflag) {
+ print_tcp_rst_data(ndo, bp, length);
+ return;
+ }
+
+ if (ndo->ndo_packettype) {
+ switch (ndo->ndo_packettype) {
+ case PT_ZMTP1:
+ zmtp1_print(ndo, bp, length);
+ break;
+ }
+ return;
+ }
+
+ if (sport == TELNET_PORT || dport == TELNET_PORT) {
+ telnet_print(ndo, bp, length);
+ } else if (sport == SMTP_PORT || dport == SMTP_PORT) {
+ ND_PRINT((ndo, ": "));
+ smtp_print(ndo, bp, length);
+ } else if (sport == BGP_PORT || dport == BGP_PORT)
+ bgp_print(ndo, bp, length);
+ else if (sport == PPTP_PORT || dport == PPTP_PORT)
+ pptp_print(ndo, bp);
+#ifdef TCPDUMP_DO_SMB
+ else if (sport == NETBIOS_SSN_PORT || dport == NETBIOS_SSN_PORT)
+ nbt_tcp_print(ndo, bp, length);
+ else if (sport == SMB_PORT || dport == SMB_PORT)
+ smb_tcp_print(ndo, bp, length);
+#endif
+ else if (sport == BEEP_PORT || dport == BEEP_PORT)
+ beep_print(ndo, bp, length);
+ else if (sport == OPENFLOW_PORT_OLD || dport == OPENFLOW_PORT_OLD ||
+ sport == OPENFLOW_PORT_IANA || dport == OPENFLOW_PORT_IANA)
+ openflow_print(ndo, bp, length);
+ else if (sport == FTP_PORT || dport == FTP_PORT) {
+ ND_PRINT((ndo, ": "));
+ ftp_print(ndo, bp, length);
+ } else if (sport == HTTP_PORT || dport == HTTP_PORT ||
+ sport == HTTP_PORT_ALT || dport == HTTP_PORT_ALT) {
+ ND_PRINT((ndo, ": "));
+ http_print(ndo, bp, length);
+ } else if (sport == RTSP_PORT || dport == RTSP_PORT ||
+ sport == RTSP_PORT_ALT || dport == RTSP_PORT_ALT) {
+ ND_PRINT((ndo, ": "));
+ rtsp_print(ndo, bp, length);
+ } else if (length > 2 &&
+ (sport == NAMESERVER_PORT || dport == NAMESERVER_PORT ||
+ sport == MULTICASTDNS_PORT || dport == MULTICASTDNS_PORT)) {
+ /*
+ * TCP DNS query has 2byte length at the head.
+ * XXX packet could be unaligned, it can go strange
+ */
+ ns_print(ndo, bp + 2, length - 2, 0);
+ } else if (sport == MSDP_PORT || dport == MSDP_PORT) {
+ msdp_print(ndo, bp, length);
+ } else if (sport == RPKI_RTR_PORT || dport == RPKI_RTR_PORT) {
+ rpki_rtr_print(ndo, bp, length);
+ }
+ else if (length > 0 && (sport == LDP_PORT || dport == LDP_PORT)) {
+ ldp_print(ndo, bp, length);
+ }
+ else if ((sport == NFS_PORT || dport == NFS_PORT) &&
+ length >= 4 && ND_TTEST2(*bp, 4)) {
+ /*
+ * If data present, header length valid, and NFS port used,
+ * assume NFS.
+ * Pass offset of data plus 4 bytes for RPC TCP msg length
+ * to NFS print routines.
+ */
+ uint32_t fraglen;
+ register struct sunrpc_msg *rp;
+ enum sunrpc_msg_type direction;
+
+ fraglen = EXTRACT_32BITS(bp) & 0x7FFFFFFF;
+ if (fraglen > (length) - 4)
+ fraglen = (length) - 4;
+ rp = (struct sunrpc_msg *)(bp + 4);
+ if (ND_TTEST(rp->rm_direction)) {
+ direction = (enum sunrpc_msg_type)EXTRACT_32BITS(&rp->rm_direction);
+ if (dport == NFS_PORT && direction == SUNRPC_CALL) {
+ ND_PRINT((ndo, ": NFS request xid %u ", EXTRACT_32BITS(&rp->rm_xid)));
+ nfsreq_print_noaddr(ndo, (u_char *)rp, fraglen, (u_char *)ip);
+ return;
+ }
+ if (sport == NFS_PORT && direction == SUNRPC_REPLY) {
+ ND_PRINT((ndo, ": NFS reply xid %u ", EXTRACT_32BITS(&rp->rm_xid)));
+ nfsreply_print_noaddr(ndo, (u_char *)rp, fraglen, (u_char *)ip);
+ return;
+ }
+ }
+ }
+
+ return;
+ bad:
+ ND_PRINT((ndo, "[bad opt]"));
+ if (ch != '\0')
+ ND_PRINT((ndo, ">"));
+ return;
+ trunc:
+ ND_PRINT((ndo, "[|tcp]"));
+ if (ch != '\0')
+ ND_PRINT((ndo, ">"));
+}
+
+/*
+ * RFC1122 says the following on data in RST segments:
+ *
+ * 4.2.2.12 RST Segment: RFC-793 Section 3.4
+ *
+ * A TCP SHOULD allow a received RST segment to include data.
+ *
+ * DISCUSSION
+ * It has been suggested that a RST segment could contain
+ * ASCII text that encoded and explained the cause of the
+ * RST. No standard has yet been established for such
+ * data.
+ *
+ */
+
+static void
+print_tcp_rst_data(netdissect_options *ndo,
+ register const u_char *sp, u_int length)
+{
+ int c;
+
+ ND_PRINT((ndo, ND_TTEST2(*sp, length) ? " [RST" : " [!RST"));
+ if (length > MAX_RST_DATA_LEN) {
+ length = MAX_RST_DATA_LEN; /* can use -X for longer */
+ ND_PRINT((ndo, "+")); /* indicate we truncate */
+ }
+ ND_PRINT((ndo, " "));
+ while (length-- && sp <= ndo->ndo_snapend) {
+ c = *sp++;
+ safeputchar(ndo, c);
+ }
+ ND_PRINT((ndo, "]"));
+}
+
+#ifdef HAVE_LIBCRYPTO
+USES_APPLE_DEPRECATED_API
+static int
+tcp_verify_signature(netdissect_options *ndo,
+ const struct ip *ip, const struct tcphdr *tp,
+ const u_char *data, int length, const u_char *rcvsig)
+{
+ struct tcphdr tp1;
+ u_char sig[TCP_SIGLEN];
+ char zero_proto = 0;
+ MD5_CTX ctx;
+ uint16_t savecsum, tlen;
+#ifdef INET6
+ struct ip6_hdr *ip6;
+ uint32_t len32;
+ uint8_t nxt;
+#endif
+
+ if (data + length > ndo->ndo_snapend) {
+ ND_PRINT((ndo, "snaplen too short, "));
+ return (CANT_CHECK_SIGNATURE);
+ }
+
+ tp1 = *tp;
+
+ if (ndo->ndo_sigsecret == NULL) {
+ ND_PRINT((ndo, "shared secret not supplied with -M, "));
+ return (CANT_CHECK_SIGNATURE);
+ }
+
+ MD5_Init(&ctx);
+ /*
+ * Step 1: Update MD5 hash with IP pseudo-header.
+ */
+ if (IP_V(ip) == 4) {
+ MD5_Update(&ctx, (char *)&ip->ip_src, sizeof(ip->ip_src));
+ MD5_Update(&ctx, (char *)&ip->ip_dst, sizeof(ip->ip_dst));
+ MD5_Update(&ctx, (char *)&zero_proto, sizeof(zero_proto));
+ MD5_Update(&ctx, (char *)&ip->ip_p, sizeof(ip->ip_p));
+ tlen = EXTRACT_16BITS(&ip->ip_len) - IP_HL(ip) * 4;
+ tlen = htons(tlen);
+ MD5_Update(&ctx, (char *)&tlen, sizeof(tlen));
+#ifdef INET6
+ } else if (IP_V(ip) == 6) {
+ ip6 = (struct ip6_hdr *)ip;
+ MD5_Update(&ctx, (char *)&ip6->ip6_src, sizeof(ip6->ip6_src));
+ MD5_Update(&ctx, (char *)&ip6->ip6_dst, sizeof(ip6->ip6_dst));
+ len32 = htonl(EXTRACT_16BITS(&ip6->ip6_plen));
+ MD5_Update(&ctx, (char *)&len32, sizeof(len32));
+ nxt = 0;
+ MD5_Update(&ctx, (char *)&nxt, sizeof(nxt));
+ MD5_Update(&ctx, (char *)&nxt, sizeof(nxt));
+ MD5_Update(&ctx, (char *)&nxt, sizeof(nxt));
+ nxt = IPPROTO_TCP;
+ MD5_Update(&ctx, (char *)&nxt, sizeof(nxt));
+#endif
+ } else {
+#ifdef INET6
+ ND_PRINT((ndo, "IP version not 4 or 6, "));
+#else
+ ND_PRINT((ndo, "IP version not 4, "));
+#endif
+ return (CANT_CHECK_SIGNATURE);
+ }
+
+ /*
+ * Step 2: Update MD5 hash with TCP header, excluding options.
+ * The TCP checksum must be set to zero.
+ */
+ savecsum = tp1.th_sum;
+ tp1.th_sum = 0;
+ MD5_Update(&ctx, (char *)&tp1, sizeof(struct tcphdr));
+ tp1.th_sum = savecsum;
+ /*
+ * Step 3: Update MD5 hash with TCP segment data, if present.
+ */
+ if (length > 0)
+ MD5_Update(&ctx, data, length);
+ /*
+ * Step 4: Update MD5 hash with shared secret.
+ */
+ MD5_Update(&ctx, ndo->ndo_sigsecret, strlen(ndo->ndo_sigsecret));
+ MD5_Final(sig, &ctx);
+
+ if (memcmp(rcvsig, sig, TCP_SIGLEN) == 0)
+ return (SIGNATURE_VALID);
+ else
+ return (SIGNATURE_INVALID);
+}
+USES_APPLE_RST
+#endif /* HAVE_LIBCRYPTO */
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+/* NetBSD: print-telnet.c,v 1.2 1999/10/11 12:40:12 sjg Exp */
+
+/*-
+ * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Simon J. Gerraty.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+/*
+ * @(#)Copyright (c) 1994, Simon J. Gerraty.
+ *
+ * This is free software. It comes with NO WARRANTY.
+ * Permission to use, modify and distribute this source code
+ * is granted subject to the following conditions.
+ * 1/ that the above copyright notice and this notice
+ * are preserved in all copies.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-telnet.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+
+#include "interface.h"
+
+#define TELCMDS
+#define TELOPTS
+
+/* NetBSD: telnet.h,v 1.9 2001/06/11 01:50:50 wiz Exp */
+
+/*
+ * Definitions for the TELNET protocol.
+ */
+#define IAC 255 /* interpret as command: */
+#define DONT 254 /* you are not to use option */
+#define DO 253 /* please, you use option */
+#define WONT 252 /* I won't use option */
+#define WILL 251 /* I will use option */
+#define SB 250 /* interpret as subnegotiation */
+#define GA 249 /* you may reverse the line */
+#define EL 248 /* erase the current line */
+#define EC 247 /* erase the current character */
+#define AYT 246 /* are you there */
+#define AO 245 /* abort output--but let prog finish */
+#define IP 244 /* interrupt process--permanently */
+#define BREAK 243 /* break */
+#define DM 242 /* data mark--for connect. cleaning */
+#define NOP 241 /* nop */
+#define SE 240 /* end sub negotiation */
+#define EOR 239 /* end of record (transparent mode) */
+#define ABORT 238 /* Abort process */
+#define SUSP 237 /* Suspend process */
+#define xEOF 236 /* End of file: EOF is already used... */
+
+#define SYNCH 242 /* for telfunc calls */
+
+#ifdef TELCMDS
+const char *telcmds[] = {
+ "EOF", "SUSP", "ABORT", "EOR",
+ "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC",
+ "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0,
+};
+#else
+extern char *telcmds[];
+#endif
+
+#define TELCMD_FIRST xEOF
+#define TELCMD_LAST IAC
+#define TELCMD_OK(x) ((unsigned int)(x) <= TELCMD_LAST && \
+ (unsigned int)(x) >= TELCMD_FIRST)
+#define TELCMD(x) telcmds[(x)-TELCMD_FIRST]
+
+/* telnet options */
+#define TELOPT_BINARY 0 /* 8-bit data path */
+#define TELOPT_ECHO 1 /* echo */
+#define TELOPT_RCP 2 /* prepare to reconnect */
+#define TELOPT_SGA 3 /* suppress go ahead */
+#define TELOPT_NAMS 4 /* approximate message size */
+#define TELOPT_STATUS 5 /* give status */
+#define TELOPT_TM 6 /* timing mark */
+#define TELOPT_RCTE 7 /* remote controlled transmission and echo */
+#define TELOPT_NAOL 8 /* negotiate about output line width */
+#define TELOPT_NAOP 9 /* negotiate about output page size */
+#define TELOPT_NAOCRD 10 /* negotiate about CR disposition */
+#define TELOPT_NAOHTS 11 /* negotiate about horizontal tabstops */
+#define TELOPT_NAOHTD 12 /* negotiate about horizontal tab disposition */
+#define TELOPT_NAOFFD 13 /* negotiate about formfeed disposition */
+#define TELOPT_NAOVTS 14 /* negotiate about vertical tab stops */
+#define TELOPT_NAOVTD 15 /* negotiate about vertical tab disposition */
+#define TELOPT_NAOLFD 16 /* negotiate about output LF disposition */
+#define TELOPT_XASCII 17 /* extended ascic character set */
+#define TELOPT_LOGOUT 18 /* force logout */
+#define TELOPT_BM 19 /* byte macro */
+#define TELOPT_DET 20 /* data entry terminal */
+#define TELOPT_SUPDUP 21 /* supdup protocol */
+#define TELOPT_SUPDUPOUTPUT 22 /* supdup output */
+#define TELOPT_SNDLOC 23 /* send location */
+#define TELOPT_TTYPE 24 /* terminal type */
+#define TELOPT_EOR 25 /* end or record */
+#define TELOPT_TUID 26 /* TACACS user identification */
+#define TELOPT_OUTMRK 27 /* output marking */
+#define TELOPT_TTYLOC 28 /* terminal location number */
+#define TELOPT_3270REGIME 29 /* 3270 regime */
+#define TELOPT_X3PAD 30 /* X.3 PAD */
+#define TELOPT_NAWS 31 /* window size */
+#define TELOPT_TSPEED 32 /* terminal speed */
+#define TELOPT_LFLOW 33 /* remote flow control */
+#define TELOPT_LINEMODE 34 /* Linemode option */
+#define TELOPT_XDISPLOC 35 /* X Display Location */
+#define TELOPT_OLD_ENVIRON 36 /* Old - Environment variables */
+#define TELOPT_AUTHENTICATION 37/* Authenticate */
+#define TELOPT_ENCRYPT 38 /* Encryption option */
+#define TELOPT_NEW_ENVIRON 39 /* New - Environment variables */
+#define TELOPT_EXOPL 255 /* extended-options-list */
+
+
+#define NTELOPTS (1+TELOPT_NEW_ENVIRON)
+#ifdef TELOPTS
+const char *telopts[NTELOPTS+1] = {
+ "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "NAME",
+ "STATUS", "TIMING MARK", "RCTE", "NAOL", "NAOP",
+ "NAOCRD", "NAOHTS", "NAOHTD", "NAOFFD", "NAOVTS",
+ "NAOVTD", "NAOLFD", "EXTEND ASCII", "LOGOUT", "BYTE MACRO",
+ "DATA ENTRY TERMINAL", "SUPDUP", "SUPDUP OUTPUT",
+ "SEND LOCATION", "TERMINAL TYPE", "END OF RECORD",
+ "TACACS UID", "OUTPUT MARKING", "TTYLOC",
+ "3270 REGIME", "X.3 PAD", "NAWS", "TSPEED", "LFLOW",
+ "LINEMODE", "XDISPLOC", "OLD-ENVIRON", "AUTHENTICATION",
+ "ENCRYPT", "NEW-ENVIRON",
+ 0,
+};
+#define TELOPT_FIRST TELOPT_BINARY
+#define TELOPT_LAST TELOPT_NEW_ENVIRON
+#define TELOPT_OK(x) ((unsigned int)(x) <= TELOPT_LAST)
+#define TELOPT(x) telopts[(x)-TELOPT_FIRST]
+#endif
+
+/* sub-option qualifiers */
+#define TELQUAL_IS 0 /* option is... */
+#define TELQUAL_SEND 1 /* send option */
+#define TELQUAL_INFO 2 /* ENVIRON: informational version of IS */
+#define TELQUAL_REPLY 2 /* AUTHENTICATION: client version of IS */
+#define TELQUAL_NAME 3 /* AUTHENTICATION: client version of IS */
+
+#define LFLOW_OFF 0 /* Disable remote flow control */
+#define LFLOW_ON 1 /* Enable remote flow control */
+#define LFLOW_RESTART_ANY 2 /* Restart output on any char */
+#define LFLOW_RESTART_XON 3 /* Restart output only on XON */
+
+/*
+ * LINEMODE suboptions
+ */
+
+#define LM_MODE 1
+#define LM_FORWARDMASK 2
+#define LM_SLC 3
+
+#define MODE_EDIT 0x01
+#define MODE_TRAPSIG 0x02
+#define MODE_ACK 0x04
+#define MODE_SOFT_TAB 0x08
+#define MODE_LIT_ECHO 0x10
+
+#define MODE_MASK 0x1f
+
+#define SLC_SYNCH 1
+#define SLC_BRK 2
+#define SLC_IP 3
+#define SLC_AO 4
+#define SLC_AYT 5
+#define SLC_EOR 6
+#define SLC_ABORT 7
+#define SLC_EOF 8
+#define SLC_SUSP 9
+#define SLC_EC 10
+#define SLC_EL 11
+#define SLC_EW 12
+#define SLC_RP 13
+#define SLC_LNEXT 14
+#define SLC_XON 15
+#define SLC_XOFF 16
+#define SLC_FORW1 17
+#define SLC_FORW2 18
+#define SLC_MCL 19
+#define SLC_MCR 20
+#define SLC_MCWL 21
+#define SLC_MCWR 22
+#define SLC_MCBOL 23
+#define SLC_MCEOL 24
+#define SLC_INSRT 25
+#define SLC_OVER 26
+#define SLC_ECR 27
+#define SLC_EWR 28
+#define SLC_EBOL 29
+#define SLC_EEOL 30
+
+#define NSLC 30
+
+/*
+ * For backwards compatibility, we define SLC_NAMES to be the
+ * list of names if SLC_NAMES is not defined.
+ */
+#define SLC_NAMELIST "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", \
+ "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \
+ "LNEXT", "XON", "XOFF", "FORW1", "FORW2", \
+ "MCL", "MCR", "MCWL", "MCWR", "MCBOL", \
+ "MCEOL", "INSRT", "OVER", "ECR", "EWR", \
+ "EBOL", "EEOL", \
+ 0,
+
+#ifdef SLC_NAMES
+const char *slc_names[] = {
+ SLC_NAMELIST
+};
+#else
+extern char *slc_names[];
+#define SLC_NAMES SLC_NAMELIST
+#endif
+
+#define SLC_NAME_OK(x) ((unsigned int)(x) <= NSLC)
+#define SLC_NAME(x) slc_names[x]
+
+#define SLC_NOSUPPORT 0
+#define SLC_CANTCHANGE 1
+#define SLC_VARIABLE 2
+#define SLC_DEFAULT 3
+#define SLC_LEVELBITS 0x03
+
+#define SLC_FUNC 0
+#define SLC_FLAGS 1
+#define SLC_VALUE 2
+
+#define SLC_ACK 0x80
+#define SLC_FLUSHIN 0x40
+#define SLC_FLUSHOUT 0x20
+
+#define OLD_ENV_VAR 1
+#define OLD_ENV_VALUE 0
+#define NEW_ENV_VAR 0
+#define NEW_ENV_VALUE 1
+#define ENV_ESC 2
+#define ENV_USERVAR 3
+
+/*
+ * AUTHENTICATION suboptions
+ */
+
+/*
+ * Who is authenticating who ...
+ */
+#define AUTH_WHO_CLIENT 0 /* Client authenticating server */
+#define AUTH_WHO_SERVER 1 /* Server authenticating client */
+#define AUTH_WHO_MASK 1
+
+#define AUTHTYPE_NULL 0
+#define AUTHTYPE_KERBEROS_V4 1
+#define AUTHTYPE_KERBEROS_V5 2
+#define AUTHTYPE_SPX 3
+#define AUTHTYPE_MINK 4
+#define AUTHTYPE_CNT 5
+
+#define AUTHTYPE_TEST 99
+
+#ifdef AUTH_NAMES
+const char *authtype_names[] = {
+ "NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK", 0,
+};
+#else
+extern char *authtype_names[];
+#endif
+
+#define AUTHTYPE_NAME_OK(x) ((unsigned int)(x) < AUTHTYPE_CNT)
+#define AUTHTYPE_NAME(x) authtype_names[x]
+
+/*
+ * ENCRYPTion suboptions
+ */
+#define ENCRYPT_IS 0 /* I pick encryption type ... */
+#define ENCRYPT_SUPPORT 1 /* I support encryption types ... */
+#define ENCRYPT_REPLY 2 /* Initial setup response */
+#define ENCRYPT_START 3 /* Am starting to send encrypted */
+#define ENCRYPT_END 4 /* Am ending encrypted */
+#define ENCRYPT_REQSTART 5 /* Request you start encrypting */
+#define ENCRYPT_REQEND 6 /* Request you send encrypting */
+#define ENCRYPT_ENC_KEYID 7
+#define ENCRYPT_DEC_KEYID 8
+#define ENCRYPT_CNT 9
+
+#define ENCTYPE_ANY 0
+#define ENCTYPE_DES_CFB64 1
+#define ENCTYPE_DES_OFB64 2
+#define ENCTYPE_CNT 3
+
+#ifdef ENCRYPT_NAMES
+const char *encrypt_names[] = {
+ "IS", "SUPPORT", "REPLY", "START", "END",
+ "REQUEST-START", "REQUEST-END", "ENC-KEYID", "DEC-KEYID",
+ 0,
+};
+const char *enctype_names[] = {
+ "ANY", "DES_CFB64", "DES_OFB64", 0,
+};
+#else
+extern char *encrypt_names[];
+extern char *enctype_names[];
+#endif
+
+#define ENCRYPT_NAME_OK(x) ((unsigned int)(x) < ENCRYPT_CNT)
+#define ENCRYPT_NAME(x) encrypt_names[x]
+
+#define ENCTYPE_NAME_OK(x) ((unsigned int)(x) < ENCTYPE_CNT)
+#define ENCTYPE_NAME(x) enctype_names[x]
+
+/* normal */
+static const char *cmds[] = {
+ "IS", "SEND", "INFO",
+};
+
+/* 37: Authentication */
+static const char *authcmd[] = {
+ "IS", "SEND", "REPLY", "NAME",
+};
+static const char *authtype[] = {
+ "NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK",
+ "SRP", "RSA", "SSL", NULL, NULL,
+ "LOKI", "SSA", "KEA_SJ", "KEA_SJ_INTEG", "DSS",
+ "NTLM",
+};
+
+/* 38: Encryption */
+static const char *enccmd[] = {
+ "IS", "SUPPORT", "REPLY", "START", "END",
+ "REQUEST-START", "REQUEST-END", "END_KEYID", "DEC_KEYID",
+};
+static const char *enctype[] = {
+ "NULL", "DES_CFB64", "DES_OFB64", "DES3_CFB64", "DES3_OFB64",
+ NULL, "CAST5_40_CFB64", "CAST5_40_OFB64", "CAST128_CFB64", "CAST128_OFB64",
+};
+
+#define STR_OR_ID(x, tab) \
+ (((x) < sizeof(tab)/sizeof(tab[0]) && tab[(x)]) ? tab[(x)] : numstr(x))
+
+static char *
+numstr(int x)
+{
+ static char buf[20];
+
+ snprintf(buf, sizeof(buf), "%#x", x);
+ return buf;
+}
+
+/* sp points to IAC byte */
+static int
+telnet_parse(netdissect_options *ndo, const u_char *sp, u_int length, int print)
+{
+ int i, x;
+ u_int c;
+ const u_char *osp, *p;
+#define FETCH(c, sp, length) \
+ do { \
+ if (length < 1) \
+ goto pktend; \
+ ND_TCHECK(*sp); \
+ c = *sp++; \
+ length--; \
+ } while (0)
+
+ osp = sp;
+
+ FETCH(c, sp, length);
+ if (c != IAC)
+ goto pktend;
+ FETCH(c, sp, length);
+ if (c == IAC) { /* <IAC><IAC>! */
+ if (print)
+ ND_PRINT((ndo, "IAC IAC"));
+ goto done;
+ }
+
+ i = c - TELCMD_FIRST;
+ if (i < 0 || i > IAC - TELCMD_FIRST)
+ goto pktend;
+
+ switch (c) {
+ case DONT:
+ case DO:
+ case WONT:
+ case WILL:
+ case SB:
+ /* DONT/DO/WONT/WILL x */
+ FETCH(x, sp, length);
+ if (x >= 0 && x < NTELOPTS) {
+ if (print)
+ ND_PRINT((ndo, "%s %s", telcmds[i], telopts[x]));
+ } else {
+ if (print)
+ ND_PRINT((ndo, "%s %#x", telcmds[i], x));
+ }
+ if (c != SB)
+ break;
+ /* IAC SB .... IAC SE */
+ p = sp;
+ while (length > (u_int)(p + 1 - sp)) {
+ if (p[0] == IAC && p[1] == SE)
+ break;
+ p++;
+ }
+ if (*p != IAC)
+ goto pktend;
+
+ switch (x) {
+ case TELOPT_AUTHENTICATION:
+ if (p <= sp)
+ break;
+ FETCH(c, sp, length);
+ if (print)
+ ND_PRINT((ndo, " %s", STR_OR_ID(c, authcmd)));
+ if (p <= sp)
+ break;
+ FETCH(c, sp, length);
+ if (print)
+ ND_PRINT((ndo, " %s", STR_OR_ID(c, authtype)));
+ break;
+ case TELOPT_ENCRYPT:
+ if (p <= sp)
+ break;
+ FETCH(c, sp, length);
+ if (print)
+ ND_PRINT((ndo, " %s", STR_OR_ID(c, enccmd)));
+ if (p <= sp)
+ break;
+ FETCH(c, sp, length);
+ if (print)
+ ND_PRINT((ndo, " %s", STR_OR_ID(c, enctype)));
+ break;
+ default:
+ if (p <= sp)
+ break;
+ FETCH(c, sp, length);
+ if (print)
+ ND_PRINT((ndo, " %s", STR_OR_ID(c, cmds)));
+ break;
+ }
+ while (p > sp) {
+ FETCH(x, sp, length);
+ if (print)
+ ND_PRINT((ndo, " %#x", x));
+ }
+ /* terminating IAC SE */
+ if (print)
+ ND_PRINT((ndo, " SE"));
+ sp += 2;
+ break;
+ default:
+ if (print)
+ ND_PRINT((ndo, "%s", telcmds[i]));
+ goto done;
+ }
+
+done:
+ return sp - osp;
+
+trunc:
+ ND_PRINT((ndo, "[|telnet]"));
+pktend:
+ return -1;
+#undef FETCH
+}
+
+void
+telnet_print(netdissect_options *ndo, const u_char *sp, u_int length)
+{
+ int first = 1;
+ const u_char *osp;
+ int l;
+
+ osp = sp;
+
+ while (length > 0 && *sp == IAC) {
+ /*
+ * Parse the Telnet command without printing it,
+ * to determine its length.
+ */
+ l = telnet_parse(ndo, sp, length, 0);
+ if (l < 0)
+ break;
+
+ /*
+ * now print it
+ */
+ if (ndo->ndo_Xflag && 2 < ndo->ndo_vflag) {
+ if (first)
+ ND_PRINT((ndo, "\nTelnet:"));
+ hex_print_with_offset(ndo, "\n", sp, l, sp - osp);
+ if (l > 8)
+ ND_PRINT((ndo, "\n\t\t\t\t"));
+ else
+ ND_PRINT((ndo, "%*s\t", (8 - l) * 3, ""));
+ } else
+ ND_PRINT((ndo, "%s", (first) ? " [telnet " : ", "));
+
+ (void)telnet_parse(ndo, sp, length, 1);
+ first = 0;
+
+ sp += l;
+ length -= l;
+ }
+ if (!first) {
+ if (ndo->ndo_Xflag && 2 < ndo->ndo_vflag)
+ ND_PRINT((ndo, "\n"));
+ else
+ ND_PRINT((ndo, "]"));
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ *
+ * Format and print trivial file transfer protocol packets.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-tftp.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "extract.h"
+
+/*
+ * Trivial File Transfer Protocol (IEN-133)
+ */
+
+/*
+ * Packet types.
+ */
+#define RRQ 01 /* read request */
+#define WRQ 02 /* write request */
+#define DATA 03 /* data packet */
+#define ACK 04 /* acknowledgement */
+#define TFTP_ERROR 05 /* error code */
+#define OACK 06 /* option acknowledgement */
+
+struct tftphdr {
+ unsigned short th_opcode; /* packet type */
+ union {
+ unsigned short tu_block; /* block # */
+ unsigned short tu_code; /* error code */
+ char tu_stuff[1]; /* request packet stuff */
+ } th_u;
+ char th_data[1]; /* data or error string */
+};
+
+#define th_block th_u.tu_block
+#define th_code th_u.tu_code
+#define th_stuff th_u.tu_stuff
+#define th_msg th_data
+
+/*
+ * Error codes.
+ */
+#define EUNDEF 0 /* not defined */
+#define ENOTFOUND 1 /* file not found */
+#define EACCESS 2 /* access violation */
+#define ENOSPACE 3 /* disk full or allocation exceeded */
+#define EBADOP 4 /* illegal TFTP operation */
+#define EBADID 5 /* unknown transfer ID */
+#define EEXISTS 6 /* file already exists */
+#define ENOUSER 7 /* no such user */
+
+static const char tstr[] = " [|tftp]";
+
+/* op code to string mapping */
+static const struct tok op2str[] = {
+ { RRQ, "RRQ" }, /* read request */
+ { WRQ, "WRQ" }, /* write request */
+ { DATA, "DATA" }, /* data packet */
+ { ACK, "ACK" }, /* acknowledgement */
+ { TFTP_ERROR, "ERROR" }, /* error code */
+ { OACK, "OACK" }, /* option acknowledgement */
+ { 0, NULL }
+};
+
+/* error code to string mapping */
+static const struct tok err2str[] = {
+ { EUNDEF, "EUNDEF" }, /* not defined */
+ { ENOTFOUND, "ENOTFOUND" }, /* file not found */
+ { EACCESS, "EACCESS" }, /* access violation */
+ { ENOSPACE, "ENOSPACE" }, /* disk full or allocation exceeded */
+ { EBADOP, "EBADOP" }, /* illegal TFTP operation */
+ { EBADID, "EBADID" }, /* unknown transfer ID */
+ { EEXISTS, "EEXISTS" }, /* file already exists */
+ { ENOUSER, "ENOUSER" }, /* no such user */
+ { 0, NULL }
+};
+
+/*
+ * Print trivial file transfer program requests
+ */
+void
+tftp_print(netdissect_options *ndo,
+ register const u_char *bp, u_int length)
+{
+ register const struct tftphdr *tp;
+ register const char *cp;
+ register const u_char *p;
+ register int opcode, i;
+
+ tp = (const struct tftphdr *)bp;
+
+ /* Print length */
+ ND_PRINT((ndo, " %d", length));
+
+ /* Print tftp request type */
+ ND_TCHECK(tp->th_opcode);
+ opcode = EXTRACT_16BITS(&tp->th_opcode);
+ cp = tok2str(op2str, "tftp-#%d", opcode);
+ ND_PRINT((ndo, " %s", cp));
+ /* Bail if bogus opcode */
+ if (*cp == 't')
+ return;
+
+ switch (opcode) {
+
+ case RRQ:
+ case WRQ:
+ case OACK:
+ p = (u_char *)tp->th_stuff;
+ ND_PRINT((ndo, " "));
+ /* Print filename or first option */
+ if (opcode != OACK)
+ ND_PRINT((ndo, "\""));
+ i = fn_print(ndo, p, ndo->ndo_snapend);
+ if (opcode != OACK)
+ ND_PRINT((ndo, "\""));
+
+ /* Print the mode (RRQ and WRQ only) and any options */
+ while ((p = (const u_char *)strchr((const char *)p, '\0')) != NULL) {
+ if (length <= (u_int)(p - (const u_char *)&tp->th_block))
+ break;
+ p++;
+ if (*p != '\0') {
+ ND_PRINT((ndo, " "));
+ fn_print(ndo, p, ndo->ndo_snapend);
+ }
+ }
+
+ if (i)
+ goto trunc;
+ break;
+
+ case ACK:
+ case DATA:
+ ND_TCHECK(tp->th_block);
+ ND_PRINT((ndo, " block %d", EXTRACT_16BITS(&tp->th_block)));
+ break;
+
+ case TFTP_ERROR:
+ /* Print error code string */
+ ND_TCHECK(tp->th_code);
+ ND_PRINT((ndo, " %s \"", tok2str(err2str, "tftp-err-#%d \"",
+ EXTRACT_16BITS(&tp->th_code))));
+ /* Print error message string */
+ i = fn_print(ndo, (const u_char *)tp->th_data, ndo->ndo_snapend);
+ ND_PRINT((ndo, "\""));
+ if (i)
+ goto trunc;
+ break;
+
+ default:
+ /* We shouldn't get here */
+ ND_PRINT((ndo, "(unknown #%d)", opcode));
+ break;
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+}
--- /dev/null
+/*
+ * Copyright (c) 2000 Ben Smithurst <ben@scientia.demon.co.uk>
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-timed.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+/*
+ * Time Synchronization Protocol
+ */
+
+struct tsp_timeval {
+ uint32_t tv_sec;
+ uint32_t tv_usec;
+};
+
+struct tsp {
+ uint8_t tsp_type;
+ uint8_t tsp_vers;
+ uint16_t tsp_seq;
+ union {
+ struct tsp_timeval tspu_time;
+ int8_t tspu_hopcnt;
+ } tsp_u;
+ int8_t tsp_name[256];
+};
+
+#define tsp_time tsp_u.tspu_time
+#define tsp_hopcnt tsp_u.tspu_hopcnt
+
+/*
+ * Command types.
+ */
+#define TSP_ANY 0 /* match any types */
+#define TSP_ADJTIME 1 /* send adjtime */
+#define TSP_ACK 2 /* generic acknowledgement */
+#define TSP_MASTERREQ 3 /* ask for master's name */
+#define TSP_MASTERACK 4 /* acknowledge master request */
+#define TSP_SETTIME 5 /* send network time */
+#define TSP_MASTERUP 6 /* inform slaves that master is up */
+#define TSP_SLAVEUP 7 /* slave is up but not polled */
+#define TSP_ELECTION 8 /* advance candidature for master */
+#define TSP_ACCEPT 9 /* support candidature of master */
+#define TSP_REFUSE 10 /* reject candidature of master */
+#define TSP_CONFLICT 11 /* two or more masters present */
+#define TSP_RESOLVE 12 /* masters' conflict resolution */
+#define TSP_QUIT 13 /* reject candidature if master is up */
+#define TSP_DATE 14 /* reset the time (date command) */
+#define TSP_DATEREQ 15 /* remote request to reset the time */
+#define TSP_DATEACK 16 /* acknowledge time setting */
+#define TSP_TRACEON 17 /* turn tracing on */
+#define TSP_TRACEOFF 18 /* turn tracing off */
+#define TSP_MSITE 19 /* find out master's site */
+#define TSP_MSITEREQ 20 /* remote master's site request */
+#define TSP_TEST 21 /* for testing election algo */
+#define TSP_SETDATE 22 /* New from date command */
+#define TSP_SETDATEREQ 23 /* New remote for above */
+#define TSP_LOOP 24 /* loop detection packet */
+
+#define TSPTYPENUMBER 25
+
+static const char tstr[] = "[|timed]";
+
+static const char *tsptype[TSPTYPENUMBER] =
+ { "ANY", "ADJTIME", "ACK", "MASTERREQ", "MASTERACK", "SETTIME", "MASTERUP",
+ "SLAVEUP", "ELECTION", "ACCEPT", "REFUSE", "CONFLICT", "RESOLVE", "QUIT",
+ "DATE", "DATEREQ", "DATEACK", "TRACEON", "TRACEOFF", "MSITE", "MSITEREQ",
+ "TEST", "SETDATE", "SETDATEREQ", "LOOP" };
+
+void
+timed_print(netdissect_options *ndo,
+ register const u_char *bp)
+{
+ struct tsp *tsp = (struct tsp *)bp;
+ long sec, usec;
+
+ ND_TCHECK(tsp->tsp_type);
+ if (tsp->tsp_type < TSPTYPENUMBER)
+ ND_PRINT((ndo, "TSP_%s", tsptype[tsp->tsp_type]));
+ else
+ ND_PRINT((ndo, "(tsp_type %#x)", tsp->tsp_type));
+
+ ND_TCHECK(tsp->tsp_vers);
+ ND_PRINT((ndo, " vers %u", tsp->tsp_vers));
+
+ ND_TCHECK(tsp->tsp_seq);
+ ND_PRINT((ndo, " seq %u", tsp->tsp_seq));
+
+ switch (tsp->tsp_type) {
+ case TSP_LOOP:
+ ND_TCHECK(tsp->tsp_hopcnt);
+ ND_PRINT((ndo, " hopcnt %u", tsp->tsp_hopcnt));
+ break;
+ case TSP_SETTIME:
+ case TSP_ADJTIME:
+ case TSP_SETDATE:
+ case TSP_SETDATEREQ:
+ ND_TCHECK(tsp->tsp_time);
+ sec = EXTRACT_32BITS(&tsp->tsp_time.tv_sec);
+ usec = EXTRACT_32BITS(&tsp->tsp_time.tv_usec);
+ /* XXX The comparison below is always false? */
+ if (usec < 0)
+ /* corrupt, skip the rest of the packet */
+ return;
+ ND_PRINT((ndo, " time "));
+ if (sec < 0 && usec != 0) {
+ sec++;
+ if (sec == 0)
+ ND_PRINT((ndo, "-"));
+ usec = 1000000 - usec;
+ }
+ ND_PRINT((ndo, "%ld.%06ld", sec, usec));
+ break;
+ }
+ ND_TCHECK(tsp->tsp_name);
+ ND_PRINT((ndo, " name "));
+ if (fn_print(ndo, (u_char *)tsp->tsp_name, (u_char *)tsp->tsp_name + sizeof(tsp->tsp_name)))
+ goto trunc;
+ return;
+
+trunc:
+ ND_PRINT((ndo, " %s", tstr));
+}
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "ether.h"
+#include "ethertype.h"
+#include "extract.h" /* must come after interface.h */
+
+static const char tstr[] = "[|TIPC]";
+
+/*
+ * Transparent Inter-Process Communication (TIPC) protocol.
+ *
+ * http://tipc.sourceforge.net/doc/draft-spec-tipc-07.html
+ * http://tipc.sourceforge.net/doc/tipc_message_formats.html
+ */
+
+#define TIPC_USER_LOW_IMPORTANCE 0
+#define TIPC_USER_MEDIUM_IMPORTANCE 1
+#define TIPC_USER_HIGH_IMPORTANCE 2
+#define TIPC_USER_CRITICAL_IMPORTANCE 3
+#define TIPC_USER_BCAST_PROTOCOL 5
+#define TIPC_USER_MSG_BUNDLER 6
+#define TIPC_USER_LINK_PROTOCOL 7
+#define TIPC_USER_CONN_MANAGER 8
+#define TIPC_USER_CHANGEOVER_PROTOCOL 10
+#define TIPC_USER_NAME_DISTRIBUTOR 11
+#define TIPC_USER_MSG_FRAGMENTER 12
+#define TIPC_USER_LINK_CONFIG 13
+
+#define TIPC_CONN_MSG 0
+#define TIPC_DIRECT_MSG 1
+#define TIPC_NAMED_MSG 2
+#define TIPC_MCAST_MSG 3
+
+#define TIPC_ZONE(addr) (((addr) >> 24) & 0xFF)
+#define TIPC_CLUSTER(addr) (((addr) >> 12) & 0xFFF)
+#define TIPC_NODE(addr) (((addr) >> 0) & 0xFFF)
+
+struct tipc_pkthdr {
+ uint32_t w0;
+ uint32_t w1;
+};
+
+#define TIPC_VER(w0) (((w0) >> 29) & 0x07)
+#define TIPC_USER(w0) (((w0) >> 25) & 0x0F)
+#define TIPC_HSIZE(w0) (((w0) >> 21) & 0x0F)
+#define TIPC_MSIZE(w0) (((w0) >> 0) & 0xFFFF)
+#define TIPC_MTYPE(w1) (((w1) >> 29) & 0x07)
+#define TIPC_BROADCAST_ACK(w1) (((w1) >> 0) & 0xFFFF)
+#define TIPC_LINK_ACK(w2) (((w2) >> 16) & 0xFFFF)
+#define TIPC_LINK_SEQ(w2) (((w2) >> 0) & 0xFFFF)
+
+static const struct tok tipcuser_values[] = {
+ { TIPC_USER_LOW_IMPORTANCE, "Low Importance Data payload" },
+ { TIPC_USER_MEDIUM_IMPORTANCE, "Medium Importance Data payload" },
+ { TIPC_USER_HIGH_IMPORTANCE, "High Importance Data payload" },
+ { TIPC_USER_CRITICAL_IMPORTANCE, "Critical Importance Data payload" },
+ { TIPC_USER_BCAST_PROTOCOL, "Broadcast Link Protocol internal" },
+ { TIPC_USER_MSG_BUNDLER, "Message Bundler Protocol internal" },
+ { TIPC_USER_LINK_PROTOCOL, "Link State Protocol internal" },
+ { TIPC_USER_CONN_MANAGER, "Connection Manager internal" },
+ { TIPC_USER_CHANGEOVER_PROTOCOL, "Link Changeover Protocol internal" },
+ { TIPC_USER_NAME_DISTRIBUTOR, "Name Table Update Protocol internal" },
+ { TIPC_USER_MSG_FRAGMENTER, "Message Fragmentation Protocol internal" },
+ { TIPC_USER_LINK_CONFIG, "Neighbor Detection Protocol internal" },
+ { 0, NULL }
+};
+
+static const struct tok tipcmtype_values[] = {
+ { TIPC_CONN_MSG, "CONN_MSG" },
+ { TIPC_DIRECT_MSG, "MCAST_MSG" },
+ { TIPC_NAMED_MSG, "NAMED_MSG" },
+ { TIPC_MCAST_MSG, "DIRECT_MSG" },
+ { 0, NULL }
+};
+
+static const struct tok tipc_linkconf_mtype_values[] = {
+ { 0, "Link request" },
+ { 1, "Link response" },
+ { 0, NULL }
+};
+
+struct payload_tipc_pkthdr {
+ uint32_t w0;
+ uint32_t w1;
+ uint32_t w2;
+ uint32_t prev_node;
+ uint32_t orig_port;
+ uint32_t dest_port;
+ uint32_t orig_node;
+ uint32_t dest_node;
+ uint32_t name_type;
+ uint32_t w9;
+ uint32_t wA;
+};
+
+struct internal_tipc_pkthdr {
+ uint32_t w0;
+ uint32_t w1;
+ uint32_t w2;
+ uint32_t prev_node;
+ uint32_t w4;
+ uint32_t w5;
+ uint32_t orig_node;
+ uint32_t dest_node;
+ uint32_t trans_seq;
+ uint32_t w9;
+};
+
+#define TIPC_SEQ_GAP(w1) (((w1) >> 16) & 0x1FFF)
+#define TIPC_BC_GAP_AFTER(w2) (((w2) >> 16) & 0xFFFF)
+#define TIPC_BC_GAP_TO(w2) (((w2) >> 0) & 0xFFFF)
+#define TIPC_LAST_SENT_FRAG(w4) (((w4) >> 16) & 0xFFFF)
+#define TIPC_NEXT_SENT_FRAG(w4) (((w4) >> 0) & 0xFFFF)
+#define TIPC_SESS_NO(w5) (((w5) >> 16) & 0xFFFF)
+#define TIPC_MSG_CNT(w9) (((w9) >> 16) & 0xFFFF)
+#define TIPC_LINK_TOL(w9) (((w9) >> 0) & 0xFFFF)
+
+struct link_conf_tipc_pkthdr {
+ uint32_t w0;
+ uint32_t w1;
+ uint32_t dest_domain;
+ uint32_t prev_node;
+ uint32_t ntwrk_id;
+ uint32_t w5;
+ uint8_t media_address[16];
+};
+
+#define TIPC_NODE_SIG(w1) (((w1) >> 0) & 0xFFFF)
+#define TIPC_MEDIA_ID(w5) (((w5) >> 0) & 0xFF)
+
+static void
+print_payload(netdissect_options *ndo, const struct payload_tipc_pkthdr *ap)
+{
+ uint32_t w0, w1, w2;
+ u_int user;
+ u_int hsize;
+ u_int msize;
+ u_int mtype;
+ u_int broadcast_ack;
+ u_int link_ack;
+ u_int link_seq;
+ u_int prev_node;
+ u_int orig_port;
+ u_int dest_port;
+ u_int orig_node;
+ u_int dest_node;
+
+ ND_TCHECK(ap->dest_port);
+ w0 = EXTRACT_32BITS(&ap->w0);
+ user = TIPC_USER(w0);
+ hsize = TIPC_HSIZE(w0);
+ msize = TIPC_MSIZE(w0);
+ w1 = EXTRACT_32BITS(&ap->w1);
+ mtype = TIPC_MTYPE(w1);
+ prev_node = EXTRACT_32BITS(&ap->prev_node);
+ orig_port = EXTRACT_32BITS(&ap->orig_port);
+ dest_port = EXTRACT_32BITS(&ap->dest_port);
+ if (hsize <= 6) {
+ ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u:%u > %u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
+ TIPC_VER(w0),
+ TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
+ orig_port, dest_port,
+ hsize*4, msize,
+ tok2str(tipcuser_values, "unknown", user),
+ tok2str(tipcmtype_values, "Unknown", mtype)));
+ } else {
+ ND_TCHECK(ap->dest_node);
+ orig_node = EXTRACT_32BITS(&ap->orig_node);
+ dest_node = EXTRACT_32BITS(&ap->dest_node);
+ ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u:%u > %u.%u.%u:%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
+ TIPC_VER(w0),
+ TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node),
+ orig_port,
+ TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node),
+ dest_port,
+ hsize*4, msize,
+ tok2str(tipcuser_values, "unknown", user),
+ tok2str(tipcmtype_values, "Unknown", mtype)));
+
+ if (ndo->ndo_vflag) {
+ broadcast_ack = TIPC_BROADCAST_ACK(w1);
+ w2 = EXTRACT_32BITS(&ap->w2);
+ link_ack = TIPC_LINK_ACK(w2);
+ link_seq = TIPC_LINK_SEQ(w2);
+ ND_PRINT((ndo, "\n\tPrevious Node %u.%u.%u, Broadcast Ack %u, Link Ack %u, Link Sequence %u",
+ TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
+ broadcast_ack, link_ack, link_seq));
+ }
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+print_internal(netdissect_options *ndo, const struct internal_tipc_pkthdr *ap)
+{
+ uint32_t w0, w1, w2, w4, w5, w9;
+ u_int user;
+ u_int hsize;
+ u_int msize;
+ u_int mtype;
+ u_int seq_gap;
+ u_int broadcast_ack;
+ u_int bc_gap_after;
+ u_int bc_gap_to;
+ u_int prev_node;
+ u_int last_sent_frag;
+ u_int next_sent_frag;
+ u_int sess_no;
+ u_int orig_node;
+ u_int dest_node;
+ u_int trans_seq;
+ u_int msg_cnt;
+ u_int link_tol;
+
+ ND_TCHECK(ap->dest_node);
+ w0 = EXTRACT_32BITS(&ap->w0);
+ user = TIPC_USER(w0);
+ hsize = TIPC_HSIZE(w0);
+ msize = TIPC_MSIZE(w0);
+ w1 = EXTRACT_32BITS(&ap->w1);
+ mtype = TIPC_MTYPE(w1);
+ orig_node = EXTRACT_32BITS(&ap->orig_node);
+ dest_node = EXTRACT_32BITS(&ap->dest_node);
+ ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s (0x%08x)",
+ TIPC_VER(w0),
+ TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node),
+ TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node),
+ hsize*4, msize,
+ tok2str(tipcuser_values, "unknown", user),
+ tok2str(tipcmtype_values, "Unknown", mtype), w1));
+
+ if (ndo->ndo_vflag) {
+ ND_TCHECK(*ap);
+ seq_gap = TIPC_SEQ_GAP(w1);
+ broadcast_ack = TIPC_BROADCAST_ACK(w1);
+ w2 = EXTRACT_32BITS(&ap->w2);
+ bc_gap_after = TIPC_BC_GAP_AFTER(w2);
+ bc_gap_to = TIPC_BC_GAP_TO(w2);
+ prev_node = EXTRACT_32BITS(&ap->prev_node);
+ w4 = EXTRACT_32BITS(&ap->w4);
+ last_sent_frag = TIPC_LAST_SENT_FRAG(w4);
+ next_sent_frag = TIPC_NEXT_SENT_FRAG(w4);
+ w5 = EXTRACT_32BITS(&ap->w5);
+ sess_no = TIPC_SESS_NO(w5);
+ trans_seq = EXTRACT_32BITS(&ap->trans_seq);
+ w9 = EXTRACT_32BITS(&ap->w9);
+ msg_cnt = TIPC_MSG_CNT(w9);
+ link_tol = TIPC_LINK_TOL(w9);
+ ND_PRINT((ndo, "\n\tPrevious Node %u.%u.%u, Session No. %u, Broadcast Ack %u, Sequence Gap %u, Broadcast Gap After %u, Broadcast Gap To %u, Last Sent Packet No. %u, Next sent Packet No. %u, Transport Sequence %u, msg_count %u, Link Tolerance %u",
+ TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
+ sess_no, broadcast_ack, seq_gap, bc_gap_after, bc_gap_to,
+ last_sent_frag, next_sent_frag, trans_seq, msg_cnt,
+ link_tol));
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+static void
+print_link_conf(netdissect_options *ndo, const struct link_conf_tipc_pkthdr *ap)
+{
+ uint32_t w0, w1, w5;
+ u_int user;
+ u_int hsize;
+ u_int msize;
+ u_int mtype;
+ u_int node_sig;
+ u_int prev_node;
+ u_int dest_domain;
+ u_int ntwrk_id;
+ u_int media_id;
+
+ ND_TCHECK(ap->prev_node);
+ w0 = EXTRACT_32BITS(&ap->w0);
+ user = TIPC_USER(w0);
+ hsize = TIPC_HSIZE(w0);
+ msize = TIPC_MSIZE(w0);
+ w1 = EXTRACT_32BITS(&ap->w1);
+ mtype = TIPC_MTYPE(w1);
+ dest_domain = EXTRACT_32BITS(&ap->dest_domain);
+ prev_node = EXTRACT_32BITS(&ap->prev_node);
+
+ ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
+ TIPC_VER(w0),
+ TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
+ TIPC_ZONE(dest_domain), TIPC_CLUSTER(dest_domain), TIPC_NODE(dest_domain),
+ hsize*4, msize,
+ tok2str(tipcuser_values, "unknown", user),
+ tok2str(tipc_linkconf_mtype_values, "Unknown", mtype)));
+ if (ndo->ndo_vflag) {
+ ND_TCHECK(ap->w5);
+ node_sig = TIPC_NODE_SIG(w1);
+ ntwrk_id = EXTRACT_32BITS(&ap->ntwrk_id);
+ w5 = EXTRACT_32BITS(&ap->w5);
+ media_id = TIPC_MEDIA_ID(w5);
+ ND_PRINT((ndo, "\n\tNodeSignature %u, network_id %u, media_id %u",
+ node_sig, ntwrk_id, media_id));
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+void
+tipc_print(netdissect_options *ndo, const u_char *bp, u_int length _U_,
+ u_int caplen _U_)
+{
+ const struct tipc_pkthdr *ap;
+ uint32_t w0;
+ u_int user;
+
+ ap = (struct tipc_pkthdr *)bp;
+ ND_TCHECK(ap->w0);
+ w0 = EXTRACT_32BITS(&ap->w0);
+ user = TIPC_USER(w0);
+
+ switch (user)
+ {
+ case TIPC_USER_LOW_IMPORTANCE:
+ case TIPC_USER_MEDIUM_IMPORTANCE:
+ case TIPC_USER_HIGH_IMPORTANCE:
+ case TIPC_USER_CRITICAL_IMPORTANCE:
+ case TIPC_USER_NAME_DISTRIBUTOR:
+ case TIPC_USER_CONN_MANAGER:
+ print_payload(ndo, (struct payload_tipc_pkthdr *)bp);
+ break;
+
+ case TIPC_USER_LINK_CONFIG:
+ print_link_conf(ndo, (struct link_conf_tipc_pkthdr *)bp);
+ break;
+
+ case TIPC_USER_BCAST_PROTOCOL:
+ case TIPC_USER_MSG_BUNDLER:
+ case TIPC_USER_LINK_PROTOCOL:
+ case TIPC_USER_CHANGEOVER_PROTOCOL:
+ case TIPC_USER_MSG_FRAGMENTER:
+ print_internal(ndo, (struct internal_tipc_pkthdr *)bp);
+ break;
+
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+/*
+ * Local Variables:
+ * c-style: bsd
+ * End:
+ */
+
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996
+ * 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: (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.
+ *
+ * Hacked version of print-ether.c Larry Lile <lile@stdio.com>
+ *
+ * Further tweaked to more closely resemble print-fddi.c
+ * Guy Harris <guy@alum.mit.edu>
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-token.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+#include "ether.h"
+
+/*
+ * Copyright (c) 1998, Larry Lile
+ * 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 unmodified, 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ */
+
+#define TOKEN_HDRLEN 14
+#define TOKEN_RING_MAC_LEN 6
+#define ROUTING_SEGMENT_MAX 16
+#define IS_SOURCE_ROUTED(trp) ((trp)->token_shost[0] & 0x80)
+#define FRAME_TYPE(trp) (((trp)->token_fc & 0xC0) >> 6)
+#define TOKEN_FC_LLC 1
+
+#define BROADCAST(trp) ((EXTRACT_16BITS(&(trp)->token_rcf) & 0xE000) >> 13)
+#define RIF_LENGTH(trp) ((EXTRACT_16BITS(&(trp)->token_rcf) & 0x1f00) >> 8)
+#define DIRECTION(trp) ((EXTRACT_16BITS(&(trp)->token_rcf) & 0x0080) >> 7)
+#define LARGEST_FRAME(trp) ((EXTRACT_16BITS(&(trp)->token_rcf) & 0x0070) >> 4)
+#define RING_NUMBER(trp, x) ((EXTRACT_16BITS(&(trp)->token_rseg[x]) & 0xfff0) >> 4)
+#define BRIDGE_NUMBER(trp, x) ((EXTRACT_16BITS(&(trp)->token_rseg[x]) & 0x000f))
+#define SEGMENT_COUNT(trp) ((int)((RIF_LENGTH(trp) - 2) / 2))
+
+struct token_header {
+ uint8_t token_ac;
+ uint8_t token_fc;
+ uint8_t token_dhost[TOKEN_RING_MAC_LEN];
+ uint8_t token_shost[TOKEN_RING_MAC_LEN];
+ uint16_t token_rcf;
+ uint16_t token_rseg[ROUTING_SEGMENT_MAX];
+};
+
+static const char tstr[] = "[|token-ring]";
+
+/* Extract src, dst addresses */
+static inline void
+extract_token_addrs(const struct token_header *trp, char *fsrc, char *fdst)
+{
+ memcpy(fdst, (const char *)trp->token_dhost, 6);
+ memcpy(fsrc, (const char *)trp->token_shost, 6);
+}
+
+/*
+ * Print the TR MAC header
+ */
+static inline void
+token_hdr_print(netdissect_options *ndo,
+ register const struct token_header *trp, register u_int length,
+ register const u_char *fsrc, register const u_char *fdst)
+{
+ const char *srcname, *dstname;
+
+ srcname = etheraddr_string(ndo, fsrc);
+ dstname = etheraddr_string(ndo, fdst);
+
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "%02x %02x %s %s %d: ",
+ trp->token_ac,
+ trp->token_fc,
+ srcname, dstname,
+ length));
+ else
+ ND_PRINT((ndo, "%s %s %d: ", srcname, dstname, length));
+}
+
+static const char *broadcast_indicator[] = {
+ "Non-Broadcast", "Non-Broadcast",
+ "Non-Broadcast", "Non-Broadcast",
+ "All-routes", "All-routes",
+ "Single-route", "Single-route"
+};
+
+static const char *direction[] = {
+ "Forward", "Backward"
+};
+
+static const char *largest_frame[] = {
+ "516",
+ "1500",
+ "2052",
+ "4472",
+ "8144",
+ "11407",
+ "17800",
+ "??"
+};
+
+u_int
+token_print(netdissect_options *ndo, const u_char *p, u_int length, u_int caplen)
+{
+ const struct token_header *trp;
+ u_short extracted_ethertype;
+ struct ether_header ehdr;
+ u_int route_len = 0, hdr_len = TOKEN_HDRLEN;
+ int seg;
+
+ trp = (const struct token_header *)p;
+
+ if (caplen < TOKEN_HDRLEN) {
+ ND_PRINT((ndo, "%s", tstr));
+ return hdr_len;
+ }
+
+ /*
+ * Get the TR addresses into a canonical form
+ */
+ extract_token_addrs(trp, (char*)ESRC(&ehdr), (char*)EDST(&ehdr));
+
+ /* Adjust for source routing information in the MAC header */
+ if (IS_SOURCE_ROUTED(trp)) {
+ /* Clear source-routed bit */
+ *ESRC(&ehdr) &= 0x7f;
+
+ if (ndo->ndo_eflag)
+ token_hdr_print(ndo, trp, length, ESRC(&ehdr), EDST(&ehdr));
+
+ if (caplen < TOKEN_HDRLEN + 2) {
+ ND_PRINT((ndo, "%s", tstr));
+ return hdr_len;
+ }
+ route_len = RIF_LENGTH(trp);
+ hdr_len += route_len;
+ if (caplen < hdr_len) {
+ ND_PRINT((ndo, "%s", tstr));
+ return hdr_len;
+ }
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "%s ", broadcast_indicator[BROADCAST(trp)]));
+ ND_PRINT((ndo, "%s", direction[DIRECTION(trp)]));
+
+ for (seg = 0; seg < SEGMENT_COUNT(trp); seg++)
+ ND_PRINT((ndo, " [%d:%d]", RING_NUMBER(trp, seg),
+ BRIDGE_NUMBER(trp, seg)));
+ } else {
+ ND_PRINT((ndo, "rt = %x", EXTRACT_16BITS(&trp->token_rcf)));
+
+ for (seg = 0; seg < SEGMENT_COUNT(trp); seg++)
+ ND_PRINT((ndo, ":%x", EXTRACT_16BITS(&trp->token_rseg[seg])));
+ }
+ ND_PRINT((ndo, " (%s) ", largest_frame[LARGEST_FRAME(trp)]));
+ } else {
+ if (ndo->ndo_eflag)
+ token_hdr_print(ndo, trp, length, ESRC(&ehdr), EDST(&ehdr));
+ }
+
+ /* Skip over token ring MAC header and routing information */
+ length -= hdr_len;
+ p += hdr_len;
+ caplen -= hdr_len;
+
+ /* Frame Control field determines interpretation of packet */
+ if (FRAME_TYPE(trp) == TOKEN_FC_LLC) {
+ /* Try to print the LLC-layer header & higher layers */
+ if (llc_print(ndo, p, length, caplen, ESRC(&ehdr), EDST(&ehdr),
+ &extracted_ethertype) == 0) {
+ /* ether_type not known, print raw packet */
+ if (!ndo->ndo_eflag)
+ token_hdr_print(ndo, trp,
+ length + TOKEN_HDRLEN + route_len,
+ ESRC(&ehdr), EDST(&ehdr));
+ if (extracted_ethertype) {
+ ND_PRINT((ndo, "(LLC %s) ",
+ etherproto_string(htons(extracted_ethertype))));
+ }
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+ } else {
+ /* Some kinds of TR packet we cannot handle intelligently */
+ /* XXX - dissect MAC packets if frame type is 0 */
+ if (!ndo->ndo_eflag)
+ token_hdr_print(ndo, trp, length + TOKEN_HDRLEN + route_len,
+ ESRC(&ehdr), EDST(&ehdr));
+ if (!ndo->ndo_suppress_default_print)
+ ND_DEFAULTPRINT(p, caplen);
+ }
+ return (hdr_len);
+}
+
+/*
+ * This is the top level routine of the printer. 'p' points
+ * to the TR 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
+token_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
+{
+ return (token_print(ndo, p, h->len, h->caplen));
+}
--- /dev/null
+/*
+ * Copyright (c) 1998-2007 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.
+ *
+ * UNIDIRECTIONAL LINK DETECTION (UDLD) as per
+ * http://www.ietf.org/internet-drafts/draft-foschiano-udld-02.txt
+ *
+ * Original code by Carles Kishimoto <carles.kishimoto@gmail.com>
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+#define UDLD_HEADER_LEN 4
+#define UDLD_DEVICE_ID_TLV 0x0001
+#define UDLD_PORT_ID_TLV 0x0002
+#define UDLD_ECHO_TLV 0x0003
+#define UDLD_MESSAGE_INTERVAL_TLV 0x0004
+#define UDLD_TIMEOUT_INTERVAL_TLV 0x0005
+#define UDLD_DEVICE_NAME_TLV 0x0006
+#define UDLD_SEQ_NUMBER_TLV 0x0007
+
+static const struct tok udld_tlv_values[] = {
+ { UDLD_DEVICE_ID_TLV, "Device-ID TLV"},
+ { UDLD_PORT_ID_TLV, "Port-ID TLV"},
+ { UDLD_ECHO_TLV, "Echo TLV"},
+ { UDLD_MESSAGE_INTERVAL_TLV, "Message Interval TLV"},
+ { UDLD_TIMEOUT_INTERVAL_TLV, "Timeout Interval TLV"},
+ { UDLD_DEVICE_NAME_TLV, "Device Name TLV"},
+ { UDLD_SEQ_NUMBER_TLV,"Sequence Number TLV"},
+ { 0, NULL}
+};
+
+static const struct tok udld_code_values[] = {
+ { 0x00, "Reserved"},
+ { 0x01, "Probe message"},
+ { 0x02, "Echo message"},
+ { 0x03, "Flush message"},
+ { 0, NULL}
+};
+
+static const struct tok udld_flags_values[] = {
+ { 0x00, "RT"},
+ { 0x01, "RSY"},
+ { 0, NULL}
+};
+
+/*
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Ver | Opcode | Flags | Checksum |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | List of TLVs (variable length list) |
+ * | ... |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ */
+
+#define UDLD_EXTRACT_VERSION(x) (((x)&0xe0)>>5)
+#define UDLD_EXTRACT_OPCODE(x) ((x)&0x1f)
+
+void
+udld_print (netdissect_options *ndo, const u_char *pptr, u_int length)
+{
+ int code, type, len;
+ const u_char *tptr;
+
+ if (length < UDLD_HEADER_LEN)
+ goto trunc;
+
+ tptr = pptr;
+
+ ND_TCHECK2(*tptr, UDLD_HEADER_LEN);
+
+ code = UDLD_EXTRACT_OPCODE(*tptr);
+
+ ND_PRINT((ndo, "UDLDv%u, Code %s (%x), Flags [%s] (0x%02x), length %u",
+ UDLD_EXTRACT_VERSION(*tptr),
+ tok2str(udld_code_values, "Reserved", code),
+ code,
+ bittok2str(udld_flags_values, "none", *(tptr+1)),
+ *(tptr+1),
+ length));
+
+ /*
+ * In non-verbose mode, just print version and opcode type
+ */
+ if (ndo->ndo_vflag < 1) {
+ return;
+ }
+
+ ND_PRINT((ndo, "\n\tChecksum 0x%04x (unverified)", EXTRACT_16BITS(tptr+2)));
+
+ tptr += UDLD_HEADER_LEN;
+
+ while (tptr < (pptr+length)) {
+
+ ND_TCHECK2(*tptr, 4);
+
+ type = EXTRACT_16BITS(tptr);
+ len = EXTRACT_16BITS(tptr+2);
+ len -= 4;
+ tptr += 4;
+
+ /* infinite loop check */
+ if (type == 0 || len == 0) {
+ return;
+ }
+
+ ND_PRINT((ndo, "\n\t%s (0x%04x) TLV, length %u",
+ tok2str(udld_tlv_values, "Unknown", type),
+ type, len));
+
+ switch (type) {
+ case UDLD_DEVICE_ID_TLV:
+ case UDLD_PORT_ID_TLV:
+ case UDLD_ECHO_TLV:
+ case UDLD_DEVICE_NAME_TLV:
+ ND_PRINT((ndo, ", %s", tptr));
+ break;
+
+ case UDLD_MESSAGE_INTERVAL_TLV:
+ case UDLD_TIMEOUT_INTERVAL_TLV:
+ ND_PRINT((ndo, ", %us", (*tptr)));
+ break;
+
+ case UDLD_SEQ_NUMBER_TLV:
+ ND_PRINT((ndo, ", %u", EXTRACT_32BITS(tptr)));
+ break;
+
+ default:
+ break;
+ }
+ tptr += len;
+ }
+
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "[|udld]"));
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-udp.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+#include "appletalk.h"
+
+#include "udp.h"
+
+#include "ip.h"
+#ifdef INET6
+#include "ip6.h"
+#endif
+#include "ipproto.h"
+#include "rpc_auth.h"
+#include "rpc_msg.h"
+
+#include "nameser.h"
+#include "nfs.h"
+
+struct rtcphdr {
+ uint16_t rh_flags; /* T:2 P:1 CNT:5 PT:8 */
+ uint16_t rh_len; /* length of message (in words) */
+ uint32_t rh_ssrc; /* synchronization src id */
+};
+
+typedef struct {
+ uint32_t upper; /* more significant 32 bits */
+ uint32_t lower; /* less significant 32 bits */
+} ntp64;
+
+/*
+ * Sender report.
+ */
+struct rtcp_sr {
+ ntp64 sr_ntp; /* 64-bit ntp timestamp */
+ uint32_t sr_ts; /* reference media timestamp */
+ uint32_t sr_np; /* no. packets sent */
+ uint32_t sr_nb; /* no. bytes sent */
+};
+
+/*
+ * Receiver report.
+ * Time stamps are middle 32-bits of ntp timestamp.
+ */
+struct rtcp_rr {
+ uint32_t rr_srcid; /* sender being reported */
+ uint32_t rr_nl; /* no. packets lost */
+ uint32_t rr_ls; /* extended last seq number received */
+ uint32_t rr_dv; /* jitter (delay variance) */
+ uint32_t rr_lsr; /* orig. ts from last rr from this src */
+ uint32_t rr_dlsr; /* time from recpt of last rr to xmit time */
+};
+
+/*XXX*/
+#define RTCP_PT_SR 200
+#define RTCP_PT_RR 201
+#define RTCP_PT_SDES 202
+#define RTCP_SDES_CNAME 1
+#define RTCP_SDES_NAME 2
+#define RTCP_SDES_EMAIL 3
+#define RTCP_SDES_PHONE 4
+#define RTCP_SDES_LOC 5
+#define RTCP_SDES_TOOL 6
+#define RTCP_SDES_NOTE 7
+#define RTCP_SDES_PRIV 8
+#define RTCP_PT_BYE 203
+#define RTCP_PT_APP 204
+
+static void
+vat_print(netdissect_options *ndo, const void *hdr, register const struct udphdr *up)
+{
+ /* vat/vt audio */
+ u_int ts = *(uint16_t *)hdr;
+ if ((ts & 0xf060) != 0) {
+ /* probably vt */
+ ND_PRINT((ndo, "udp/vt %u %d / %d",
+ (uint32_t)(EXTRACT_16BITS(&up->uh_ulen) - sizeof(*up)),
+ ts & 0x3ff, ts >> 10));
+ } else {
+ /* probably vat */
+ uint32_t i0 = EXTRACT_32BITS(&((u_int *)hdr)[0]);
+ uint32_t i1 = EXTRACT_32BITS(&((u_int *)hdr)[1]);
+ ND_PRINT((ndo, "udp/vat %u c%d %u%s",
+ (uint32_t)(EXTRACT_16BITS(&up->uh_ulen) - sizeof(*up) - 8),
+ i0 & 0xffff,
+ i1, i0 & 0x800000? "*" : ""));
+ /* audio format */
+ if (i0 & 0x1f0000)
+ ND_PRINT((ndo, " f%d", (i0 >> 16) & 0x1f));
+ if (i0 & 0x3f000000)
+ ND_PRINT((ndo, " s%d", (i0 >> 24) & 0x3f));
+ }
+}
+
+static void
+rtp_print(netdissect_options *ndo, const void *hdr, u_int len,
+ register const struct udphdr *up)
+{
+ /* rtp v1 or v2 */
+ u_int *ip = (u_int *)hdr;
+ u_int hasopt, hasext, contype, hasmarker;
+ uint32_t i0 = EXTRACT_32BITS(&((u_int *)hdr)[0]);
+ uint32_t i1 = EXTRACT_32BITS(&((u_int *)hdr)[1]);
+ u_int dlen = EXTRACT_16BITS(&up->uh_ulen) - sizeof(*up) - 8;
+ const char * ptype;
+
+ ip += 2;
+ len >>= 2;
+ len -= 2;
+ hasopt = 0;
+ hasext = 0;
+ if ((i0 >> 30) == 1) {
+ /* rtp v1 */
+ hasopt = i0 & 0x800000;
+ contype = (i0 >> 16) & 0x3f;
+ hasmarker = i0 & 0x400000;
+ ptype = "rtpv1";
+ } else {
+ /* rtp v2 */
+ hasext = i0 & 0x10000000;
+ contype = (i0 >> 16) & 0x7f;
+ hasmarker = i0 & 0x800000;
+ dlen -= 4;
+ ptype = "rtp";
+ ip += 1;
+ len -= 1;
+ }
+ ND_PRINT((ndo, "udp/%s %d c%d %s%s %d %u",
+ ptype,
+ dlen,
+ contype,
+ (hasopt || hasext)? "+" : "",
+ hasmarker? "*" : "",
+ i0 & 0xffff,
+ i1));
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(&((u_int *)hdr)[2])));
+ if (hasopt) {
+ u_int i2, optlen;
+ do {
+ i2 = ip[0];
+ optlen = (i2 >> 16) & 0xff;
+ if (optlen == 0 || optlen > len) {
+ ND_PRINT((ndo, " !opt"));
+ return;
+ }
+ ip += optlen;
+ len -= optlen;
+ } while ((int)i2 >= 0);
+ }
+ if (hasext) {
+ u_int i2, extlen;
+ i2 = ip[0];
+ extlen = (i2 & 0xffff) + 1;
+ if (extlen > len) {
+ ND_PRINT((ndo, " !ext"));
+ return;
+ }
+ ip += extlen;
+ }
+ if (contype == 0x1f) /*XXX H.261 */
+ ND_PRINT((ndo, " 0x%04x", ip[0] >> 16));
+ }
+}
+
+static const u_char *
+rtcp_print(netdissect_options *ndo, const u_char *hdr, const u_char *ep)
+{
+ /* rtp v2 control (rtcp) */
+ struct rtcp_rr *rr = 0;
+ struct rtcp_sr *sr;
+ struct rtcphdr *rh = (struct rtcphdr *)hdr;
+ u_int len;
+ uint16_t flags;
+ int cnt;
+ double ts, dts;
+ if ((u_char *)(rh + 1) > ep) {
+ ND_PRINT((ndo, " [|rtcp]"));
+ return (ep);
+ }
+ len = (EXTRACT_16BITS(&rh->rh_len) + 1) * 4;
+ flags = EXTRACT_16BITS(&rh->rh_flags);
+ cnt = (flags >> 8) & 0x1f;
+ switch (flags & 0xff) {
+ case RTCP_PT_SR:
+ sr = (struct rtcp_sr *)(rh + 1);
+ ND_PRINT((ndo, " sr"));
+ if (len != cnt * sizeof(*rr) + sizeof(*sr) + sizeof(*rh))
+ ND_PRINT((ndo, " [%d]", len));
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(&rh->rh_ssrc)));
+ if ((u_char *)(sr + 1) > ep) {
+ ND_PRINT((ndo, " [|rtcp]"));
+ return (ep);
+ }
+ ts = (double)(EXTRACT_32BITS(&sr->sr_ntp.upper)) +
+ ((double)(EXTRACT_32BITS(&sr->sr_ntp.lower)) /
+ 4294967296.0);
+ ND_PRINT((ndo, " @%.2f %u %up %ub", ts, EXTRACT_32BITS(&sr->sr_ts),
+ EXTRACT_32BITS(&sr->sr_np), EXTRACT_32BITS(&sr->sr_nb)));
+ rr = (struct rtcp_rr *)(sr + 1);
+ break;
+ case RTCP_PT_RR:
+ ND_PRINT((ndo, " rr"));
+ if (len != cnt * sizeof(*rr) + sizeof(*rh))
+ ND_PRINT((ndo, " [%d]", len));
+ rr = (struct rtcp_rr *)(rh + 1);
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(&rh->rh_ssrc)));
+ break;
+ case RTCP_PT_SDES:
+ ND_PRINT((ndo, " sdes %d", len));
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(&rh->rh_ssrc)));
+ cnt = 0;
+ break;
+ case RTCP_PT_BYE:
+ ND_PRINT((ndo, " bye %d", len));
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(&rh->rh_ssrc)));
+ cnt = 0;
+ break;
+ default:
+ ND_PRINT((ndo, " type-0x%x %d", flags & 0xff, len));
+ cnt = 0;
+ break;
+ }
+ if (cnt > 1)
+ ND_PRINT((ndo, " c%d", cnt));
+ while (--cnt >= 0) {
+ if ((u_char *)(rr + 1) > ep) {
+ ND_PRINT((ndo, " [|rtcp]"));
+ return (ep);
+ }
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, " %u", EXTRACT_32BITS(&rr->rr_srcid)));
+ ts = (double)(EXTRACT_32BITS(&rr->rr_lsr)) / 65536.;
+ dts = (double)(EXTRACT_32BITS(&rr->rr_dlsr)) / 65536.;
+ ND_PRINT((ndo, " %ul %us %uj @%.2f+%.2f",
+ EXTRACT_32BITS(&rr->rr_nl) & 0x00ffffff,
+ EXTRACT_32BITS(&rr->rr_ls),
+ EXTRACT_32BITS(&rr->rr_dv), ts, dts));
+ }
+ return (hdr + len);
+}
+
+static int udp_cksum(netdissect_options *ndo, register const struct ip *ip,
+ register const struct udphdr *up,
+ register u_int len)
+{
+ return nextproto4_cksum(ndo, ip, (const uint8_t *)(void *)up, len, len,
+ IPPROTO_UDP);
+}
+
+#ifdef INET6
+static int udp6_cksum(const struct ip6_hdr *ip6, const struct udphdr *up,
+ u_int len)
+{
+ return nextproto6_cksum(ip6, (const uint8_t *)(void *)up, len, len,
+ IPPROTO_UDP);
+}
+#endif
+
+static void
+udpipaddr_print(netdissect_options *ndo, const struct ip *ip, int sport, int dport)
+{
+#ifdef INET6
+ const struct ip6_hdr *ip6;
+
+ if (IP_V(ip) == 6)
+ ip6 = (const struct ip6_hdr *)ip;
+ else
+ ip6 = NULL;
+
+ if (ip6) {
+ if (ip6->ip6_nxt == IPPROTO_UDP) {
+ if (sport == -1) {
+ ND_PRINT((ndo, "%s > %s: ",
+ ip6addr_string(ndo, &ip6->ip6_src),
+ ip6addr_string(ndo, &ip6->ip6_dst)));
+ } else {
+ ND_PRINT((ndo, "%s.%s > %s.%s: ",
+ ip6addr_string(ndo, &ip6->ip6_src),
+ udpport_string(sport),
+ ip6addr_string(ndo, &ip6->ip6_dst),
+ udpport_string(dport)));
+ }
+ } else {
+ if (sport != -1) {
+ ND_PRINT((ndo, "%s > %s: ",
+ udpport_string(sport),
+ udpport_string(dport)));
+ }
+ }
+ } else
+#endif /*INET6*/
+ {
+ if (ip->ip_p == IPPROTO_UDP) {
+ if (sport == -1) {
+ ND_PRINT((ndo, "%s > %s: ",
+ ipaddr_string(ndo, &ip->ip_src),
+ ipaddr_string(ndo, &ip->ip_dst)));
+ } else {
+ ND_PRINT((ndo, "%s.%s > %s.%s: ",
+ ipaddr_string(ndo, &ip->ip_src),
+ udpport_string(sport),
+ ipaddr_string(ndo, &ip->ip_dst),
+ udpport_string(dport)));
+ }
+ } else {
+ if (sport != -1) {
+ ND_PRINT((ndo, "%s > %s: ",
+ udpport_string(sport),
+ udpport_string(dport)));
+ }
+ }
+ }
+}
+
+void
+udp_print(netdissect_options *ndo, register const u_char *bp, u_int length,
+ register const u_char *bp2, int fragmented)
+{
+ register const struct udphdr *up;
+ register const struct ip *ip;
+ register const u_char *cp;
+ register const u_char *ep = bp + length;
+ uint16_t sport, dport, ulen;
+#ifdef INET6
+ register const struct ip6_hdr *ip6;
+#endif
+
+ if (ep > ndo->ndo_snapend)
+ ep = ndo->ndo_snapend;
+ up = (struct udphdr *)bp;
+ ip = (struct ip *)bp2;
+#ifdef INET6
+ if (IP_V(ip) == 6)
+ ip6 = (struct ip6_hdr *)bp2;
+ else
+ ip6 = NULL;
+#endif /*INET6*/
+ if (!ND_TTEST(up->uh_dport)) {
+ udpipaddr_print(ndo, ip, -1, -1);
+ ND_PRINT((ndo, "[|udp]"));
+ return;
+ }
+
+ sport = EXTRACT_16BITS(&up->uh_sport);
+ dport = EXTRACT_16BITS(&up->uh_dport);
+
+ if (length < sizeof(struct udphdr)) {
+ udpipaddr_print(ndo, ip, sport, dport);
+ ND_PRINT((ndo, "truncated-udp %d", length));
+ return;
+ }
+ ulen = EXTRACT_16BITS(&up->uh_ulen);
+ if (ulen < sizeof(struct udphdr)) {
+ udpipaddr_print(ndo, ip, sport, dport);
+ ND_PRINT((ndo, "truncated-udplength %d", ulen));
+ return;
+ }
+ ulen -= sizeof(struct udphdr);
+ length -= sizeof(struct udphdr);
+ if (ulen < length)
+ length = ulen;
+
+ cp = (u_char *)(up + 1);
+ if (cp > ndo->ndo_snapend) {
+ udpipaddr_print(ndo, ip, sport, dport);
+ ND_PRINT((ndo, "[|udp]"));
+ return;
+ }
+
+ if (ndo->ndo_packettype) {
+ register struct sunrpc_msg *rp;
+ enum sunrpc_msg_type direction;
+
+ switch (ndo->ndo_packettype) {
+
+ case PT_VAT:
+ udpipaddr_print(ndo, ip, sport, dport);
+ vat_print(ndo, (void *)(up + 1), up);
+ break;
+
+ case PT_WB:
+ udpipaddr_print(ndo, ip, sport, dport);
+ wb_print(ndo, (void *)(up + 1), length);
+ break;
+
+ case PT_RPC:
+ rp = (struct sunrpc_msg *)(up + 1);
+ direction = (enum sunrpc_msg_type)EXTRACT_32BITS(&rp->rm_direction);
+ if (direction == SUNRPC_CALL)
+#ifndef __minix
+ sunrpcrequest_print(ndo, (u_char *)rp, length,
+ (u_char *)ip);
+#else /* __minix */
+ /*
+ * FIXME: remove this exception once rpc has
+ * been imported!
+ */
+ /*nothing*/;
+#endif /* __minix */
+ else
+ nfsreply_print(ndo, (u_char *)rp, length,
+ (u_char *)ip); /*XXX*/
+ break;
+
+ case PT_RTP:
+ udpipaddr_print(ndo, ip, sport, dport);
+ rtp_print(ndo, (void *)(up + 1), length, up);
+ break;
+
+ case PT_RTCP:
+ udpipaddr_print(ndo, ip, sport, dport);
+ while (cp < ep)
+ cp = rtcp_print(ndo, cp, ep);
+ break;
+
+ case PT_SNMP:
+ udpipaddr_print(ndo, ip, sport, dport);
+ snmp_print(ndo, (const u_char *)(up + 1), length);
+ break;
+
+ case PT_CNFP:
+ udpipaddr_print(ndo, ip, sport, dport);
+ cnfp_print(ndo, cp);
+ break;
+
+ case PT_TFTP:
+ udpipaddr_print(ndo, ip, sport, dport);
+ tftp_print(ndo, cp, length);
+ break;
+
+ case PT_AODV:
+ udpipaddr_print(ndo, ip, sport, dport);
+ aodv_print(ndo, (const u_char *)(up + 1), length,
+#ifdef INET6
+ ip6 != NULL);
+#else
+ 0);
+#endif
+ break;
+
+ case PT_RADIUS:
+ udpipaddr_print(ndo, ip, sport, dport);
+ radius_print(ndo, cp, length);
+ break;
+
+ case PT_VXLAN:
+ udpipaddr_print(ndo, ip, sport, dport);
+ vxlan_print(ndo, (const u_char *)(up + 1), length);
+ break;
+
+ case PT_PGM:
+ case PT_PGM_ZMTP1:
+ udpipaddr_print(ndo, ip, sport, dport);
+ pgm_print(ndo, cp, length, bp2);
+ break;
+ case PT_LMP:
+ udpipaddr_print(ndo, ip, sport, dport);
+ lmp_print(ndo, cp, length);
+ break;
+ }
+ return;
+ }
+
+ udpipaddr_print(ndo, ip, sport, dport);
+ if (!ndo->ndo_qflag) {
+ register struct sunrpc_msg *rp;
+ enum sunrpc_msg_type direction;
+
+ rp = (struct sunrpc_msg *)(up + 1);
+ if (ND_TTEST(rp->rm_direction)) {
+ direction = (enum sunrpc_msg_type)EXTRACT_32BITS(&rp->rm_direction);
+ if (dport == NFS_PORT && direction == SUNRPC_CALL) {
+ ND_PRINT((ndo, "NFS request xid %u ", EXTRACT_32BITS(&rp->rm_xid)));
+ nfsreq_print_noaddr(ndo, (u_char *)rp, length,
+ (u_char *)ip);
+ return;
+ }
+ if (sport == NFS_PORT && direction == SUNRPC_REPLY) {
+ ND_PRINT((ndo, "NFS reply xid %u ", EXTRACT_32BITS(&rp->rm_xid)));
+ nfsreply_print_noaddr(ndo, (u_char *)rp, length,
+ (u_char *)ip);
+ return;
+ }
+#ifdef notdef
+ if (dport == SUNRPC_PORT && direction == SUNRPC_CALL) {
+ sunrpcrequest_print((u_char *)rp, length, (u_char *)ip);
+ return;
+ }
+#endif
+ }
+ if (ND_TTEST(((struct LAP *)cp)->type) &&
+ ((struct LAP *)cp)->type == lapDDP &&
+ (atalk_port(sport) || atalk_port(dport))) {
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "kip "));
+ llap_print(ndo, cp, length);
+ return;
+ }
+ }
+
+ if (ndo->ndo_vflag && !ndo->ndo_Kflag && !fragmented) {
+ /* Check the checksum, if possible. */
+ uint16_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 && (ndo->ndo_vflag > 1)) {
+ udp_sum = EXTRACT_16BITS(&up->uh_sum);
+ if (udp_sum == 0) {
+ ND_PRINT((ndo, "[no cksum] "));
+ } else if (ND_TTEST2(cp[0], length)) {
+ sum = udp_cksum(ndo, ip, up, length + sizeof(struct udphdr));
+
+ if (sum != 0) {
+ ND_PRINT((ndo, "[bad udp cksum 0x%04x -> 0x%04x!] ",
+ udp_sum,
+ in_cksum_shouldbe(udp_sum, sum)));
+ } else
+ ND_PRINT((ndo, "[udp sum ok] "));
+ }
+ }
+#ifdef INET6
+ else if (IP_V(ip) == 6 && ip6->ip6_plen) {
+ /* for IPv6, UDP checksum is mandatory */
+ if (ND_TTEST2(cp[0], length)) {
+ sum = udp6_cksum(ip6, up, length + sizeof(struct udphdr));
+ udp_sum = EXTRACT_16BITS(&up->uh_sum);
+
+ if (sum != 0) {
+ ND_PRINT((ndo, "[bad udp cksum 0x%04x -> 0x%04x!] ",
+ udp_sum,
+ in_cksum_shouldbe(udp_sum, sum)));
+ } else
+ ND_PRINT((ndo, "[udp sum ok] "));
+ }
+ }
+#endif
+ }
+
+ if (!ndo->ndo_qflag) {
+#define ISPORT(p) (dport == (p) || sport == (p))
+ if (ISPORT(NAMESERVER_PORT))
+ ns_print(ndo, (const u_char *)(up + 1), length, 0);
+ else if (ISPORT(MULTICASTDNS_PORT))
+ ns_print(ndo, (const u_char *)(up + 1), length, 1);
+ else if (ISPORT(TIMED_PORT))
+ timed_print(ndo, (const u_char *)(up + 1));
+ else if (ISPORT(TFTP_PORT))
+ tftp_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(BOOTPC_PORT) || ISPORT(BOOTPS_PORT))
+ bootp_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(RIP_PORT))
+ rip_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(AODV_PORT))
+ aodv_print(ndo, (const u_char *)(up + 1), length,
+#ifdef INET6
+ ip6 != NULL);
+#else
+ 0);
+#endif
+ else if (ISPORT(ISAKMP_PORT))
+ isakmp_print(ndo, (const u_char *)(up + 1), length, bp2);
+ else if (ISPORT(ISAKMP_PORT_NATT))
+ isakmp_rfc3948_print(ndo, (const u_char *)(up + 1), length, bp2);
+#if 1 /*???*/
+ else if (ISPORT(ISAKMP_PORT_USER1) || ISPORT(ISAKMP_PORT_USER2))
+ isakmp_print(ndo, (const u_char *)(up + 1), length, bp2);
+#endif
+ else if (ISPORT(SNMP_PORT) || ISPORT(SNMPTRAP_PORT))
+ snmp_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(NTP_PORT))
+ ntp_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(KERBEROS_PORT) || ISPORT(KERBEROS_SEC_PORT))
+ krb_print(ndo, (const void *)(up + 1));
+ else if (ISPORT(L2TP_PORT))
+ l2tp_print(ndo, (const u_char *)(up + 1), length);
+#ifdef TCPDUMP_DO_SMB
+ else if (ISPORT(NETBIOS_NS_PORT))
+ nbt_udp137_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(NETBIOS_DGRAM_PORT))
+ nbt_udp138_print(ndo, (const u_char *)(up + 1), length);
+#endif
+ else if (dport == VAT_PORT)
+ vat_print(ndo, (const void *)(up + 1), up);
+ else if (ISPORT(ZEPHYR_SRV_PORT) || ISPORT(ZEPHYR_CLT_PORT))
+ zephyr_print(ndo, (const void *)(up + 1), length);
+ /*
+ * Since there are 10 possible ports to check, I think
+ * a <> test would be more efficient
+ */
+ else if ((sport >= RX_PORT_LOW && sport <= RX_PORT_HIGH) ||
+ (dport >= RX_PORT_LOW && dport <= RX_PORT_HIGH))
+ rx_print(ndo, (const void *)(up + 1), length, sport, dport,
+ (u_char *) ip);
+#ifdef INET6
+ else if (ISPORT(RIPNG_PORT))
+ ripng_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(DHCP6_SERV_PORT) || ISPORT(DHCP6_CLI_PORT))
+ dhcp6_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(AHCP_PORT))
+ ahcp_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(BABEL_PORT) || ISPORT(BABEL_PORT_OLD))
+ babel_print(ndo, (const u_char *)(up + 1), length);
+#endif /*INET6*/
+ /*
+ * Kludge in test for whiteboard packets.
+ */
+ else if (dport == WB_PORT)
+ wb_print(ndo, (const void *)(up + 1), length);
+ else if (ISPORT(CISCO_AUTORP_PORT))
+ cisco_autorp_print(ndo, (const void *)(up + 1), length);
+ else if (ISPORT(RADIUS_PORT) ||
+ ISPORT(RADIUS_NEW_PORT) ||
+ ISPORT(RADIUS_ACCOUNTING_PORT) ||
+ ISPORT(RADIUS_NEW_ACCOUNTING_PORT) ||
+ ISPORT(RADIUS_COA_PORT) )
+ radius_print(ndo, (const u_char *)(up+1), length);
+ else if (dport == HSRP_PORT)
+ hsrp_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(LWRES_PORT))
+ lwres_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(LDP_PORT))
+ ldp_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(OLSR_PORT))
+ olsr_print(ndo, (const u_char *)(up + 1), length,
+#if INET6
+ (IP_V(ip) == 6) ? 1 : 0);
+#else
+ 0);
+#endif
+ else if (ISPORT(MPLS_LSP_PING_PORT))
+ lspping_print(ndo, (const u_char *)(up + 1), length);
+ else if (dport == BFD_CONTROL_PORT ||
+ dport == BFD_ECHO_PORT )
+ bfd_print(ndo, (const u_char *)(up+1), length, dport);
+ else if (ISPORT(LMP_PORT))
+ lmp_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(VQP_PORT))
+ vqp_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(SFLOW_PORT))
+ sflow_print(ndo, (const u_char *)(up + 1), length);
+ else if (dport == LWAPP_CONTROL_PORT)
+ lwapp_control_print(ndo, (const u_char *)(up + 1), length, 1);
+ else if (sport == LWAPP_CONTROL_PORT)
+ lwapp_control_print(ndo, (const u_char *)(up + 1), length, 0);
+ else if (ISPORT(LWAPP_DATA_PORT))
+ lwapp_data_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(SIP_PORT))
+ sip_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(SYSLOG_PORT))
+ syslog_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(OTV_PORT))
+ otv_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(VXLAN_PORT))
+ vxlan_print(ndo, (const u_char *)(up + 1), length);
+ else if (ISPORT(GENEVE_PORT))
+ geneve_print(ndo, (const u_char *)(up + 1), length);
+ else {
+ if (ulen > length)
+ ND_PRINT((ndo, "UDP, bad length %u > %u",
+ ulen, length));
+ else
+ ND_PRINT((ndo, "UDP, length %u", ulen));
+ }
+#undef ISPORT
+ } else {
+ if (ulen > length)
+ ND_PRINT((ndo, "UDP, bad length %u > %u",
+ ulen, length));
+ else
+ ND_PRINT((ndo, "UDP, length %u", ulen));
+ }
+}
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
+
--- /dev/null
+/*
+ * Copyright 2009 Bert Vermeulen <bert@biot.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 Paolo Abeni.''
+ * The name of author 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.
+ *
+ * Support for USB packets
+ *
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+
+
+#if defined(HAVE_PCAP_USB_H) && defined(DLT_USB_LINUX)
+#include <pcap/usb.h>
+
+static const char tstr[] = "[|usb]";
+
+/* returns direction: 1=inbound 2=outbound -1=invalid */
+static int
+get_direction(int transfer_type, int event_type)
+{
+ int direction;
+
+ direction = -1;
+ switch(transfer_type){
+ case URB_BULK:
+ case URB_CONTROL:
+ case URB_ISOCHRONOUS:
+ switch(event_type)
+ {
+ case URB_SUBMIT:
+ direction = 2;
+ break;
+ case URB_COMPLETE:
+ case URB_ERROR:
+ direction = 1;
+ break;
+ default:
+ direction = -1;
+ }
+ break;
+ case URB_INTERRUPT:
+ switch(event_type)
+ {
+ case URB_SUBMIT:
+ direction = 1;
+ break;
+ case URB_COMPLETE:
+ case URB_ERROR:
+ direction = 2;
+ break;
+ default:
+ direction = -1;
+ }
+ break;
+ default:
+ direction = -1;
+ }
+
+ return direction;
+}
+
+static void
+usb_header_print(netdissect_options *ndo, const pcap_usb_header *uh)
+{
+ int direction;
+
+ switch(uh->transfer_type)
+ {
+ case URB_ISOCHRONOUS:
+ ND_PRINT((ndo, "ISOCHRONOUS"));
+ break;
+ case URB_INTERRUPT:
+ ND_PRINT((ndo, "INTERRUPT"));
+ break;
+ case URB_CONTROL:
+ ND_PRINT((ndo, "CONTROL"));
+ break;
+ case URB_BULK:
+ ND_PRINT((ndo, "BULK"));
+ break;
+ default:
+ ND_PRINT((ndo, " ?"));
+ }
+
+ switch(uh->event_type)
+ {
+ case URB_SUBMIT:
+ ND_PRINT((ndo, " SUBMIT"));
+ break;
+ case URB_COMPLETE:
+ ND_PRINT((ndo, " COMPLETE"));
+ break;
+ case URB_ERROR:
+ ND_PRINT((ndo, " ERROR"));
+ break;
+ default:
+ ND_PRINT((ndo, " ?"));
+ }
+
+ direction = get_direction(uh->transfer_type, uh->event_type);
+ if(direction == 1)
+ ND_PRINT((ndo, " from"));
+ else if(direction == 2)
+ ND_PRINT((ndo, " to"));
+ ND_PRINT((ndo, " %d:%d:%d", uh->bus_id, uh->device_address, uh->endpoint_number & 0x7f));
+}
+
+/*
+ * This is the top level routine of the printer for captures with a
+ * 48-byte header.
+ *
+ * 'p' points to the 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
+usb_linux_48_byte_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
+ register const u_char *p)
+{
+ if (h->caplen < sizeof(pcap_usb_header)) {
+ ND_PRINT((ndo, "%s", tstr));
+ return(sizeof(pcap_usb_header));
+ }
+
+ usb_header_print(ndo, (const pcap_usb_header *) p);
+
+ return(sizeof(pcap_usb_header));
+}
+
+#ifdef DLT_USB_LINUX_MMAPPED
+/*
+ * This is the top level routine of the printer for captures with a
+ * 64-byte header.
+ *
+ * 'p' points to the 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
+usb_linux_64_byte_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
+ register const u_char *p)
+{
+ if (h->caplen < sizeof(pcap_usb_header_mmapped)) {
+ ND_PRINT((ndo, "%s", tstr));
+ return(sizeof(pcap_usb_header_mmapped));
+ }
+
+ usb_header_print(ndo, (const pcap_usb_header *) p);
+
+ return(sizeof(pcap_usb_header_mmapped));
+}
+#endif /* DLT_USB_LINUX_MMAPPED */
+
+#endif /* defined(HAVE_PCAP_USB_H) && defined(DLT_USB_LINUX) */
+
--- /dev/null
+/*
+ * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-vjc.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "slcompress.h"
+#include "ppp.h"
+
+/*
+ * XXX - for BSD/OS PPP, what packets get supplied with a PPP header type
+ * of PPP_VJC and what packets get supplied with a PPP header type of
+ * PPP_VJNC? PPP_VJNC is for "UNCOMPRESSED_TCP" packets, and PPP_VJC
+ * is for COMPRESSED_TCP packets (PPP_IP is used for TYPE_IP packets).
+ *
+ * RFC 1144 implies that, on the wire, the packet type is *not* needed
+ * for PPP, as different PPP protocol types can be used; it only needs
+ * to be put on the wire for SLIP.
+ *
+ * It also indicates that, for compressed SLIP:
+ *
+ * If the COMPRESSED_TCP bit is set in the first byte, it's
+ * a COMPRESSED_TCP packet; that byte is the change byte, and
+ * the COMPRESSED_TCP bit, 0x80, isn't used in the change byte.
+ *
+ * If the upper 4 bits of the first byte are 7, it's an
+ * UNCOMPRESSED_TCP packet; that byte is the first byte of
+ * the UNCOMPRESSED_TCP modified IP header, with a connection
+ * number in the protocol field, and with the version field
+ * being 7, not 4.
+ *
+ * Otherwise, the packet is an IPv4 packet (where the upper 4 bits
+ * of the packet are 4).
+ *
+ * So this routine looks as if it's sort-of intended to handle
+ * compressed SLIP, although it doesn't handle UNCOMPRESSED_TCP
+ * correctly for that (it doesn't fix the version number and doesn't
+ * do anything to the protocol field), and doesn't check for COMPRESSED_TCP
+ * packets correctly for that (you only check the first bit - see
+ * B.1 in RFC 1144).
+ *
+ * But it's called for BSD/OS PPP, not SLIP - perhaps BSD/OS does weird
+ * things with the headers?
+ *
+ * Without a BSD/OS VJC-compressed PPP trace, or knowledge of what the
+ * BSD/OS VJC code does, we can't say what's the case.
+ *
+ * We therefore leave "proto" - which is the PPP protocol type - in place,
+ * *not* marked as unused, for now, so that GCC warnings about the
+ * unused argument remind us that we should fix this some day.
+ */
+int
+vjc_print(netdissect_options *ndo, register const char *bp, u_short proto _U_)
+{
+ int i;
+
+ switch (bp[0] & 0xf0) {
+ case TYPE_IP:
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "(vjc type=IP) "));
+ return PPP_IP;
+ case TYPE_UNCOMPRESSED_TCP:
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "(vjc type=raw TCP) "));
+ return PPP_IP;
+ case TYPE_COMPRESSED_TCP:
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "(vjc type=compressed TCP) "));
+ for (i = 0; i < 8; i++) {
+ if (bp[1] & (0x80 >> i))
+ ND_PRINT((ndo, "%c", "?CI?SAWU"[i]));
+ }
+ if (bp[1])
+ ND_PRINT((ndo, " "));
+ ND_PRINT((ndo, "C=0x%02x ", bp[2]));
+ ND_PRINT((ndo, "sum=0x%04x ", *(u_short *)&bp[3]));
+ return -1;
+ case TYPE_ERROR:
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "(vjc type=error) "));
+ return -1;
+ default:
+ if (ndo->ndo_eflag)
+ ND_PRINT((ndo, "(vjc type=0x%02x) ", bp[0] & 0xf0));
+ return -1;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 1998-2006 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 Cisco prop. VQP Protocol
+ *
+ * Original code by Carles Kishimoto <Carles.Kishimoto@bsc.es>
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-vqp.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+#define VQP_VERSION 1
+#define VQP_EXTRACT_VERSION(x) ((x)&0xFF)
+
+/*
+ * VQP common header
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Constant | Packet type | Error Code | nitems |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Packet Sequence Number (4 bytes) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+struct vqp_common_header_t {
+ uint8_t version;
+ uint8_t msg_type;
+ uint8_t error_code;
+ uint8_t nitems;
+ uint8_t sequence[4];
+};
+
+struct vqp_obj_tlv_t {
+ uint8_t obj_type[4];
+ uint8_t obj_length[2];
+};
+
+#define VQP_OBJ_REQ_JOIN_PORT 0x01
+#define VQP_OBJ_RESP_VLAN 0x02
+#define VQP_OBJ_REQ_RECONFIRM 0x03
+#define VQP_OBJ_RESP_RECONFIRM 0x04
+
+static const struct tok vqp_msg_type_values[] = {
+ { VQP_OBJ_REQ_JOIN_PORT, "Request, Join Port"},
+ { VQP_OBJ_RESP_VLAN, "Response, VLAN"},
+ { VQP_OBJ_REQ_RECONFIRM, "Request, Reconfirm"},
+ { VQP_OBJ_RESP_RECONFIRM, "Response, Reconfirm"},
+ { 0, NULL}
+};
+
+static const struct tok vqp_error_code_values[] = {
+ { 0x00, "No error"},
+ { 0x03, "Access denied"},
+ { 0x04, "Shutdown port"},
+ { 0x05, "Wrong VTP domain"},
+ { 0, NULL}
+};
+
+/* FIXME the heading 0x0c looks ugly - those must be flags etc. */
+#define VQP_OBJ_IP_ADDRESS 0x0c01
+#define VQP_OBJ_PORT_NAME 0x0c02
+#define VQP_OBJ_VLAN_NAME 0x0c03
+#define VQP_OBJ_VTP_DOMAIN 0x0c04
+#define VQP_OBJ_ETHERNET_PKT 0x0c05
+#define VQP_OBJ_MAC_NULL 0x0c06
+#define VQP_OBJ_MAC_ADDRESS 0x0c08
+
+static const struct tok vqp_obj_values[] = {
+ { VQP_OBJ_IP_ADDRESS, "Client IP Address" },
+ { VQP_OBJ_PORT_NAME, "Port Name" },
+ { VQP_OBJ_VLAN_NAME, "VLAN Name" },
+ { VQP_OBJ_VTP_DOMAIN, "VTP Domain" },
+ { VQP_OBJ_ETHERNET_PKT, "Ethernet Packet" },
+ { VQP_OBJ_MAC_NULL, "MAC Null" },
+ { VQP_OBJ_MAC_ADDRESS, "MAC Address" },
+ { 0, NULL}
+};
+
+void
+vqp_print(netdissect_options *ndo, register const u_char *pptr, register u_int len)
+{
+ const struct vqp_common_header_t *vqp_common_header;
+ const struct vqp_obj_tlv_t *vqp_obj_tlv;
+
+ const u_char *tptr;
+ uint16_t vqp_obj_len;
+ uint32_t vqp_obj_type;
+ int tlen;
+ uint8_t nitems;
+
+ tptr=pptr;
+ tlen = len;
+ vqp_common_header = (const struct vqp_common_header_t *)pptr;
+ ND_TCHECK(*vqp_common_header);
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (VQP_EXTRACT_VERSION(vqp_common_header->version) != VQP_VERSION) {
+ ND_PRINT((ndo, "VQP version %u packet not supported",
+ VQP_EXTRACT_VERSION(vqp_common_header->version)));
+ return;
+ }
+
+ /* in non-verbose mode just lets print the basic Message Type */
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "VQPv%u %s Message, error-code %s (%u), length %u",
+ VQP_EXTRACT_VERSION(vqp_common_header->version),
+ tok2str(vqp_msg_type_values, "unknown (%u)",vqp_common_header->msg_type),
+ tok2str(vqp_error_code_values, "unknown (%u)",vqp_common_header->error_code),
+ vqp_common_header->error_code,
+ len));
+ return;
+ }
+
+ /* ok they seem to want to know everything - lets fully decode it */
+ nitems = vqp_common_header->nitems;
+ ND_PRINT((ndo, "\n\tVQPv%u, %s Message, error-code %s (%u), seq 0x%08x, items %u, length %u",
+ VQP_EXTRACT_VERSION(vqp_common_header->version),
+ tok2str(vqp_msg_type_values, "unknown (%u)",vqp_common_header->msg_type),
+ tok2str(vqp_error_code_values, "unknown (%u)",vqp_common_header->error_code),
+ vqp_common_header->error_code,
+ EXTRACT_32BITS(&vqp_common_header->sequence),
+ nitems,
+ len));
+
+ /* skip VQP Common header */
+ tptr+=sizeof(const struct vqp_common_header_t);
+ tlen-=sizeof(const struct vqp_common_header_t);
+
+ while (nitems > 0 && tlen > 0) {
+
+ vqp_obj_tlv = (const struct vqp_obj_tlv_t *)tptr;
+ vqp_obj_type = EXTRACT_32BITS(vqp_obj_tlv->obj_type);
+ vqp_obj_len = EXTRACT_16BITS(vqp_obj_tlv->obj_length);
+ tptr+=sizeof(struct vqp_obj_tlv_t);
+ tlen-=sizeof(struct vqp_obj_tlv_t);
+
+ ND_PRINT((ndo, "\n\t %s Object (0x%08x), length %u, value: ",
+ tok2str(vqp_obj_values, "Unknown", vqp_obj_type),
+ vqp_obj_type, vqp_obj_len));
+
+ /* basic sanity check */
+ if (vqp_obj_type == 0 || vqp_obj_len ==0) {
+ return;
+ }
+
+ /* did we capture enough for fully decoding the object ? */
+ ND_TCHECK2(*tptr, vqp_obj_len);
+
+ switch(vqp_obj_type) {
+ case VQP_OBJ_IP_ADDRESS:
+ ND_PRINT((ndo, "%s (0x%08x)", ipaddr_string(ndo, tptr), EXTRACT_32BITS(tptr)));
+ break;
+ /* those objects have similar semantics - fall through */
+ case VQP_OBJ_PORT_NAME:
+ case VQP_OBJ_VLAN_NAME:
+ case VQP_OBJ_VTP_DOMAIN:
+ case VQP_OBJ_ETHERNET_PKT:
+ safeputs(ndo, tptr, vqp_obj_len);
+ break;
+ /* those objects have similar semantics - fall through */
+ case VQP_OBJ_MAC_ADDRESS:
+ case VQP_OBJ_MAC_NULL:
+ ND_PRINT((ndo, "%s", etheraddr_string(ndo, tptr)));
+ break;
+ default:
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo,tptr, "\n\t ", vqp_obj_len);
+ break;
+ }
+ tptr += vqp_obj_len;
+ tlen -= vqp_obj_len;
+ nitems--;
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "\n\t[|VQP]"));
+}
--- /dev/null
+/*
+ * 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)
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-vrrp.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+#include "ip.h"
+#include "ipproto.h"
+/*
+ * RFC 2338 (VRRP v2):
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |Version| Type | Virtual Rtr ID| Priority | Count IP Addrs|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Auth Type | Adver Int | Checksum |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IP Address (1) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | . |
+ * | . |
+ * | . |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IP Address (n) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Authentication Data (1) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Authentication Data (2) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ *
+ * RFC 5798 (VRRP v3):
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IPv4 Fields or IPv6 Fields |
+ * ... ...
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |Version| Type | Virtual Rtr ID| Priority |Count IPvX Addr|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |(rsvd) | Max Adver Int | Checksum |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * + +
+ * | IPvX Address(es) |
+ * + +
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+/* Type */
+#define VRRP_TYPE_ADVERTISEMENT 1
+
+static const struct tok type2str[] = {
+ { VRRP_TYPE_ADVERTISEMENT, "Advertisement" },
+ { 0, NULL }
+};
+
+/* Auth Type */
+#define VRRP_AUTH_NONE 0
+#define VRRP_AUTH_SIMPLE 1
+#define VRRP_AUTH_AH 2
+
+static const struct tok auth2str[] = {
+ { VRRP_AUTH_NONE, "none" },
+ { VRRP_AUTH_SIMPLE, "simple" },
+ { VRRP_AUTH_AH, "ah" },
+ { 0, NULL }
+};
+
+void
+vrrp_print(netdissect_options *ndo,
+ register const u_char *bp, register u_int len,
+ register const u_char *bp2, int ttl)
+{
+ int version, type, auth_type = VRRP_AUTH_NONE; /* keep compiler happy */
+ const char *type_s;
+
+ ND_TCHECK(bp[0]);
+ version = (bp[0] & 0xf0) >> 4;
+ type = bp[0] & 0x0f;
+ type_s = tok2str(type2str, "unknown type (%u)", type);
+ ND_PRINT((ndo, "VRRPv%u, %s", version, type_s));
+ if (ttl != 255)
+ ND_PRINT((ndo, ", (ttl %u)", ttl));
+ if (version < 2 || version > 3 || type != VRRP_TYPE_ADVERTISEMENT)
+ return;
+ ND_TCHECK(bp[2]);
+ ND_PRINT((ndo, ", vrid %u, prio %u", bp[1], bp[2]));
+ ND_TCHECK(bp[5]);
+
+ if (version == 2) {
+ auth_type = bp[4];
+ ND_PRINT((ndo, ", authtype %s", tok2str(auth2str, NULL, auth_type)));
+ ND_PRINT((ndo, ", intvl %us, length %u", bp[5], len));
+ } else { /* version == 3 */
+ uint16_t intvl = (bp[4] & 0x0f) << 8 | bp[5];
+ ND_PRINT((ndo, ", intvl %ucs, length %u", intvl, len));
+ }
+
+ if (ndo->ndo_vflag) {
+ int naddrs = bp[3];
+ int i;
+ char c;
+
+ if (version == 2 && ND_TTEST2(bp[0], len)) {
+ struct cksum_vec vec[1];
+
+ vec[0].ptr = bp;
+ vec[0].len = len;
+ if (in_cksum(vec, 1))
+ ND_PRINT((ndo, ", (bad vrrp cksum %x)",
+ EXTRACT_16BITS(&bp[6])));
+ }
+
+ if (version == 3 && ND_TTEST2(bp[0], len)) {
+ uint16_t cksum = nextproto4_cksum(ndo, (struct ip *)bp2, bp,
+ len, len, IPPROTO_VRRP);
+ if (cksum)
+ ND_PRINT((ndo, ", (bad vrrp cksum %x)",
+ EXTRACT_16BITS(&bp[6])));
+ }
+
+ ND_PRINT((ndo, ", addrs"));
+ if (naddrs > 1)
+ ND_PRINT((ndo, "(%d)", naddrs));
+ ND_PRINT((ndo, ":"));
+ c = ' ';
+ bp += 8;
+ for (i = 0; i < naddrs; i++) {
+ ND_TCHECK(bp[3]);
+ ND_PRINT((ndo, "%c%s", c, ipaddr_string(ndo, bp)));
+ c = ',';
+ bp += 4;
+ }
+ if (version == 2 && auth_type == VRRP_AUTH_SIMPLE) { /* simple text password */
+ ND_TCHECK(bp[7]);
+ ND_PRINT((ndo, " auth \""));
+ if (fn_printn(ndo, bp, 8, ndo->ndo_snapend)) {
+ ND_PRINT((ndo, "\""));
+ goto trunc;
+ }
+ ND_PRINT((ndo, "\""));
+ }
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "[|vrrp]"));
+}
--- /dev/null
+/*
+ * Copyright (c) 1998-2007 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.
+ *
+ * VLAN TRUNKING PROTOCOL (VTP)
+ *
+ * Reference documentation:
+ * http://www.cisco.com/en/US/tech/tk389/tk689/technologies_tech_note09186a0080094c52.shtml
+ * http://www.cisco.com/warp/public/473/21.html
+ * http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm
+ *
+ * Original code ode by Carles Kishimoto <carles.kishimoto@gmail.com>
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#define VTP_HEADER_LEN 36
+#define VTP_DOMAIN_NAME_LEN 32
+#define VTP_MD5_DIGEST_LEN 16
+#define VTP_UPDATE_TIMESTAMP_LEN 12
+#define VTP_VLAN_INFO_OFFSET 12
+
+#define VTP_SUMMARY_ADV 0x01
+#define VTP_SUBSET_ADV 0x02
+#define VTP_ADV_REQUEST 0x03
+#define VTP_JOIN_MESSAGE 0x04
+
+struct vtp_vlan_ {
+ uint8_t len;
+ uint8_t status;
+ uint8_t type;
+ uint8_t name_len;
+ uint16_t vlanid;
+ uint16_t mtu;
+ uint32_t index;
+};
+
+static const struct tok vtp_message_type_values[] = {
+ { VTP_SUMMARY_ADV, "Summary advertisement"},
+ { VTP_SUBSET_ADV, "Subset advertisement"},
+ { VTP_ADV_REQUEST, "Advertisement request"},
+ { VTP_JOIN_MESSAGE, "Join message"},
+ { 0, NULL }
+};
+
+static const struct tok vtp_header_values[] = {
+ { 0x01, "Followers"}, /* On Summary advertisement, 3rd byte is Followers */
+ { 0x02, "Seq number"}, /* On Subset advertisement, 3rd byte is Sequence number */
+ { 0x03, "Rsvd"}, /* On Adver. requests 3rd byte is Rsvd */
+ { 0x04, "Rsvd"}, /* On Adver. requests 3rd byte is Rsvd */
+ { 0, NULL }
+};
+
+static const struct tok vtp_vlan_type_values[] = {
+ { 0x01, "Ethernet"},
+ { 0x02, "FDDI"},
+ { 0x03, "TrCRF"},
+ { 0x04, "FDDI-net"},
+ { 0x05, "TrBRF"},
+ { 0, NULL }
+};
+
+static const struct tok vtp_vlan_status[] = {
+ { 0x00, "Operational"},
+ { 0x01, "Suspended"},
+ { 0, NULL }
+};
+
+#define VTP_VLAN_SOURCE_ROUTING_RING_NUMBER 0x01
+#define VTP_VLAN_SOURCE_ROUTING_BRIDGE_NUMBER 0x02
+#define VTP_VLAN_STP_TYPE 0x03
+#define VTP_VLAN_PARENT_VLAN 0x04
+#define VTP_VLAN_TRANS_BRIDGED_VLAN 0x05
+#define VTP_VLAN_PRUNING 0x06
+#define VTP_VLAN_BRIDGE_TYPE 0x07
+#define VTP_VLAN_ARP_HOP_COUNT 0x08
+#define VTP_VLAN_STE_HOP_COUNT 0x09
+#define VTP_VLAN_BACKUP_CRF_MODE 0x0A
+
+static const struct tok vtp_vlan_tlv_values[] = {
+ { VTP_VLAN_SOURCE_ROUTING_RING_NUMBER, "Source-Routing Ring Number TLV"},
+ { VTP_VLAN_SOURCE_ROUTING_BRIDGE_NUMBER, "Source-Routing Bridge Number TLV"},
+ { VTP_VLAN_STP_TYPE, "STP type TLV"},
+ { VTP_VLAN_PARENT_VLAN, "Parent VLAN TLV"},
+ { VTP_VLAN_TRANS_BRIDGED_VLAN, "Translationally bridged VLANs TLV"},
+ { VTP_VLAN_PRUNING, "Pruning TLV"},
+ { VTP_VLAN_BRIDGE_TYPE, "Bridge Type TLV"},
+ { VTP_VLAN_ARP_HOP_COUNT, "Max ARP Hop Count TLV"},
+ { VTP_VLAN_STE_HOP_COUNT, "Max STE Hop Count TLV"},
+ { VTP_VLAN_BACKUP_CRF_MODE, "Backup CRF Mode TLV"},
+ { 0, NULL }
+};
+
+static const struct tok vtp_stp_type_values[] = {
+ { 1, "SRT"},
+ { 2, "SRB"},
+ { 3, "Auto"},
+ { 0, NULL }
+};
+
+void
+vtp_print (netdissect_options *ndo,
+ const u_char *pptr, u_int length)
+{
+ int type, len, tlv_len, tlv_value;
+ const u_char *tptr;
+ const struct vtp_vlan_ *vtp_vlan;
+
+ if (length < VTP_HEADER_LEN)
+ goto trunc;
+
+ tptr = pptr;
+
+ ND_TCHECK2(*tptr, VTP_HEADER_LEN);
+
+ type = *(tptr+1);
+ ND_PRINT((ndo, "VTPv%u, Message %s (0x%02x), length %u",
+ *tptr,
+ tok2str(vtp_message_type_values,"Unknown message type", type),
+ *(tptr+1),
+ length));
+
+ /* In non-verbose mode, just print version and message type */
+ if (ndo->ndo_vflag < 1) {
+ return;
+ }
+
+ /* verbose mode print all fields */
+ ND_PRINT((ndo, "\n\tDomain name: %s, %s: %u",
+ (tptr+4),
+ tok2str(vtp_header_values,"Unknown",*(tptr+1)),
+ *(tptr+2)));
+
+ tptr += VTP_HEADER_LEN;
+
+ switch (type) {
+
+ case VTP_SUMMARY_ADV:
+
+ /*
+ * SUMMARY ADVERTISEMENT
+ *
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Version | Code | Followers | MmgtD Len |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Management Domain Name |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Configuration revision number |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Updater Identity IP address |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Update Timestamp (12 bytes) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | MD5 digest (16 bytes) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ */
+
+ ND_PRINT((ndo, "\n\t Config Rev %x, Updater %s",
+ EXTRACT_32BITS(tptr),
+ ipaddr_string(ndo, tptr+4)));
+ tptr += 8;
+ ND_PRINT((ndo, ", Timestamp 0x%08x 0x%08x 0x%08x",
+ EXTRACT_32BITS(tptr),
+ EXTRACT_32BITS(tptr + 4),
+ EXTRACT_32BITS(tptr + 8)));
+ tptr += VTP_UPDATE_TIMESTAMP_LEN;
+ ND_PRINT((ndo, ", MD5 digest: %08x%08x%08x%08x",
+ EXTRACT_32BITS(tptr),
+ EXTRACT_32BITS(tptr + 4),
+ EXTRACT_32BITS(tptr + 8),
+ EXTRACT_32BITS(tptr + 12)));
+ tptr += VTP_MD5_DIGEST_LEN;
+ break;
+
+ case VTP_SUBSET_ADV:
+
+ /*
+ * SUBSET ADVERTISEMENT
+ *
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Version | Code | Seq number | MmgtD Len |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Management Domain Name |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Configuration revision number |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | VLAN info field 1 |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | ................ |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | VLAN info field N |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ */
+
+ ND_PRINT((ndo, ", Config Rev %x", EXTRACT_32BITS(tptr)));
+
+ /*
+ * VLAN INFORMATION
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | V info len | Status | VLAN type | VLAN name len |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | ISL vlan id | MTU size |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | 802.10 index (SAID) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | VLAN name |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ */
+
+ tptr += 4;
+ while (tptr < (pptr+length)) {
+
+ len = *tptr;
+ if (len == 0)
+ break;
+
+ ND_TCHECK2(*tptr, len);
+
+ vtp_vlan = (struct vtp_vlan_*)tptr;
+ ND_PRINT((ndo, "\n\tVLAN info status %s, type %s, VLAN-id %u, MTU %u, SAID 0x%08x, Name %s",
+ tok2str(vtp_vlan_status,"Unknown",vtp_vlan->status),
+ tok2str(vtp_vlan_type_values,"Unknown",vtp_vlan->type),
+ EXTRACT_16BITS(&vtp_vlan->vlanid),
+ EXTRACT_16BITS(&vtp_vlan->mtu),
+ EXTRACT_32BITS(&vtp_vlan->index),
+ (tptr + VTP_VLAN_INFO_OFFSET)));
+
+ /*
+ * Vlan names are aligned to 32-bit boundaries.
+ */
+ len -= VTP_VLAN_INFO_OFFSET + 4*((vtp_vlan->name_len + 3)/4);
+ tptr += VTP_VLAN_INFO_OFFSET + 4*((vtp_vlan->name_len + 3)/4);
+
+ /* TLV information follows */
+
+ while (len > 0) {
+
+ /*
+ * Cisco specs says 2 bytes for type + 2 bytes for length, take only 1
+ * See: http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm
+ */
+ type = *tptr;
+ tlv_len = *(tptr+1);
+
+ ND_PRINT((ndo, "\n\t\t%s (0x%04x) TLV",
+ tok2str(vtp_vlan_tlv_values, "Unknown", type),
+ type));
+
+ /*
+ * infinite loop check
+ */
+ if (type == 0 || tlv_len == 0) {
+ return;
+ }
+
+ ND_TCHECK2(*tptr, tlv_len * 2 +2);
+
+ tlv_value = EXTRACT_16BITS(tptr+2);
+
+ switch (type) {
+ case VTP_VLAN_STE_HOP_COUNT:
+ ND_PRINT((ndo, ", %u", tlv_value));
+ break;
+
+ case VTP_VLAN_PRUNING:
+ ND_PRINT((ndo, ", %s (%u)",
+ tlv_value == 1 ? "Enabled" : "Disabled",
+ tlv_value));
+ break;
+
+ case VTP_VLAN_STP_TYPE:
+ ND_PRINT((ndo, ", %s (%u)",
+ tok2str(vtp_stp_type_values, "Unknown", tlv_value),
+ tlv_value));
+ break;
+
+ case VTP_VLAN_BRIDGE_TYPE:
+ ND_PRINT((ndo, ", %s (%u)",
+ tlv_value == 1 ? "SRB" : "SRT",
+ tlv_value));
+ break;
+
+ case VTP_VLAN_BACKUP_CRF_MODE:
+ ND_PRINT((ndo, ", %s (%u)",
+ tlv_value == 1 ? "Backup" : "Not backup",
+ tlv_value));
+ break;
+
+ /*
+ * FIXME those are the defined TLVs that lack a decoder
+ * you are welcome to contribute code ;-)
+ */
+
+ case VTP_VLAN_SOURCE_ROUTING_RING_NUMBER:
+ case VTP_VLAN_SOURCE_ROUTING_BRIDGE_NUMBER:
+ case VTP_VLAN_PARENT_VLAN:
+ case VTP_VLAN_TRANS_BRIDGED_VLAN:
+ case VTP_VLAN_ARP_HOP_COUNT:
+ default:
+ print_unknown_data(ndo, tptr, "\n\t\t ", 2 + tlv_len*2);
+ break;
+ }
+ len -= 2 + tlv_len*2;
+ tptr += 2 + tlv_len*2;
+ }
+ }
+ break;
+
+ case VTP_ADV_REQUEST:
+
+ /*
+ * ADVERTISEMENT REQUEST
+ *
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Version | Code | Reserved | MmgtD Len |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Management Domain Name |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Start value |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ */
+
+ ND_PRINT((ndo, "\n\tStart value: %u", EXTRACT_32BITS(tptr)));
+ break;
+
+ case VTP_JOIN_MESSAGE:
+
+ /* FIXME - Could not find message format */
+ break;
+
+ default:
+ break;
+ }
+
+ return;
+
+ trunc:
+ ND_PRINT((ndo, "[|vtp]"));
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ * 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.
+ *
+ * Original code by Francesco Fondelli (francesco dot fondelli, gmail dot com)
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+/*
+ * VXLAN header, RFC7348
+ * Virtual eXtensible Local Area Network (VXLAN): A Framework
+ * for Overlaying Virtualized Layer 2 Networks over Layer 3 Networks
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |R|R|R|R|I|R|R|R| Reserved |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | VXLAN Network Identifier (VNI) | Reserved |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+void
+vxlan_print(netdissect_options *ndo, const u_char *bp, u_int len)
+{
+ uint8_t flags;
+ uint32_t vni;
+
+ if (len < 8) {
+ ND_PRINT((ndo, "[|VXLAN]"));
+ return;
+ }
+
+ flags = *bp;
+ bp += 4;
+
+ vni = EXTRACT_24BITS(bp);
+ bp += 4;
+
+ ND_PRINT((ndo, "VXLAN, "));
+ ND_PRINT((ndo, "flags [%s] (0x%02x), ", flags & 0x08 ? "I" : ".", flags));
+ ND_PRINT((ndo, "vni %u\n", vni));
+
+ ether_print(ndo, bp, len - 8, len - 8, NULL, NULL);
+}
--- /dev/null
+/*
+ * Copyright (c) 1993, 1994, 1995, 1996
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-wb.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+static const char tstr[] = "[|wb]";
+
+/* XXX need to add byte-swapping macros! */
+/* XXX - you mean like the ones in "extract.h"? */
+
+/*
+ * Largest packet size. Everything should fit within this space.
+ * For instance, multiline objects are sent piecewise.
+ */
+#define MAXFRAMESIZE 1024
+
+/*
+ * Multiple drawing ops can be sent in one packet. Each one starts on a
+ * an even multiple of DOP_ALIGN bytes, which must be a power of two.
+ */
+#define DOP_ALIGN 4
+#define DOP_ROUNDUP(x) ((((int)(x)) + (DOP_ALIGN - 1)) & ~(DOP_ALIGN - 1))
+#define DOP_NEXT(d)\
+ ((struct dophdr *)((u_char *)(d) + \
+ DOP_ROUNDUP(EXTRACT_16BITS(&(d)->dh_len) + sizeof(*(d)))))
+
+/*
+ * Format of the whiteboard packet header.
+ * The transport level header.
+ */
+struct pkt_hdr {
+ uint32_t ph_src; /* site id of source */
+ uint32_t ph_ts; /* time stamp (for skew computation) */
+ uint16_t ph_version; /* version number */
+ u_char ph_type; /* message type */
+ u_char ph_flags; /* message flags */
+};
+
+/* Packet types */
+#define PT_DRAWOP 0 /* drawing operation */
+#define PT_ID 1 /* announcement packet */
+#define PT_RREQ 2 /* repair request */
+#define PT_RREP 3 /* repair reply */
+#define PT_KILL 4 /* terminate participation */
+#define PT_PREQ 5 /* page vector request */
+#define PT_PREP 7 /* page vector reply */
+
+#ifdef PF_USER
+#undef PF_USER /* {Digital,Tru64} UNIX define this, alas */
+#endif
+
+/* flags */
+#define PF_USER 0x01 /* hint that packet has interactive data */
+#define PF_VIS 0x02 /* only visible ops wanted */
+
+struct PageID {
+ uint32_t p_sid; /* session id of initiator */
+ uint32_t p_uid; /* page number */
+};
+
+struct dophdr {
+ uint32_t dh_ts; /* sender's timestamp */
+ uint16_t dh_len; /* body length */
+ u_char dh_flags;
+ u_char dh_type; /* body type */
+ /* body follows */
+};
+/*
+ * Drawing op sub-types.
+ */
+#define DT_RECT 2
+#define DT_LINE 3
+#define DT_ML 4
+#define DT_DEL 5
+#define DT_XFORM 6
+#define DT_ELL 7
+#define DT_CHAR 8
+#define DT_STR 9
+#define DT_NOP 10
+#define DT_PSCODE 11
+#define DT_PSCOMP 12
+#define DT_REF 13
+#define DT_SKIP 14
+#define DT_HOLE 15
+#define DT_MAXTYPE 15
+
+/*
+ * A drawing operation.
+ */
+struct pkt_dop {
+ struct PageID pd_page; /* page that operations apply to */
+ uint32_t pd_sseq; /* start sequence number */
+ uint32_t pd_eseq; /* end sequence number */
+ /* drawing ops follow */
+};
+
+/*
+ * A repair request.
+ */
+struct pkt_rreq {
+ uint32_t pr_id; /* source id of drawops to be repaired */
+ struct PageID pr_page; /* page of drawops */
+ uint32_t pr_sseq; /* start seqno */
+ uint32_t pr_eseq; /* end seqno */
+};
+
+/*
+ * A repair reply.
+ */
+struct pkt_rrep {
+ uint32_t pr_id; /* original site id of ops */
+ struct pkt_dop pr_dop;
+ /* drawing ops follow */
+};
+
+struct id_off {
+ uint32_t id;
+ uint32_t off;
+};
+
+struct pgstate {
+ uint32_t slot;
+ struct PageID page;
+ uint16_t nid;
+ uint16_t rsvd;
+ /* seqptr's */
+};
+
+/*
+ * An announcement packet.
+ */
+struct pkt_id {
+ uint32_t pi_mslot;
+ struct PageID pi_mpage; /* current page */
+ struct pgstate pi_ps;
+ /* seqptr's */
+ /* null-terminated site name */
+};
+
+struct pkt_preq {
+ struct PageID pp_page;
+ uint32_t pp_low;
+ uint32_t pp_high;
+};
+
+struct pkt_prep {
+ uint32_t pp_n; /* size of pageid array */
+ /* pgstate's follow */
+};
+
+static int
+wb_id(netdissect_options *ndo,
+ const struct pkt_id *id, u_int len)
+{
+ int i;
+ const char *cp;
+ const struct id_off *io;
+ char c;
+ int nid;
+
+ ND_PRINT((ndo, " wb-id:"));
+ if (len < sizeof(*id) || !ND_TTEST(*id))
+ return (-1);
+ len -= sizeof(*id);
+
+ ND_PRINT((ndo, " %u/%s:%u (max %u/%s:%u) ",
+ EXTRACT_32BITS(&id->pi_ps.slot),
+ ipaddr_string(ndo, &id->pi_ps.page.p_sid),
+ EXTRACT_32BITS(&id->pi_ps.page.p_uid),
+ EXTRACT_32BITS(&id->pi_mslot),
+ ipaddr_string(ndo, &id->pi_mpage.p_sid),
+ EXTRACT_32BITS(&id->pi_mpage.p_uid)));
+
+ nid = EXTRACT_16BITS(&id->pi_ps.nid);
+ len -= sizeof(*io) * nid;
+ io = (struct id_off *)(id + 1);
+ cp = (char *)(io + nid);
+ if (!ND_TTEST2(cp, len)) {
+ ND_PRINT((ndo, "\""));
+ fn_print(ndo, (u_char *)cp, (u_char *)cp + len);
+ ND_PRINT((ndo, "\""));
+ }
+
+ c = '<';
+ for (i = 0; i < nid && ND_TTEST(*io); ++io, ++i) {
+ ND_PRINT((ndo, "%c%s:%u",
+ c, ipaddr_string(ndo, &io->id), EXTRACT_32BITS(&io->off)));
+ c = ',';
+ }
+ if (i >= nid) {
+ ND_PRINT((ndo, ">"));
+ return (0);
+ }
+ return (-1);
+}
+
+static int
+wb_rreq(netdissect_options *ndo,
+ const struct pkt_rreq *rreq, u_int len)
+{
+ ND_PRINT((ndo, " wb-rreq:"));
+ if (len < sizeof(*rreq) || !ND_TTEST(*rreq))
+ return (-1);
+
+ ND_PRINT((ndo, " please repair %s %s:%u<%u:%u>",
+ ipaddr_string(ndo, &rreq->pr_id),
+ ipaddr_string(ndo, &rreq->pr_page.p_sid),
+ EXTRACT_32BITS(&rreq->pr_page.p_uid),
+ EXTRACT_32BITS(&rreq->pr_sseq),
+ EXTRACT_32BITS(&rreq->pr_eseq)));
+ return (0);
+}
+
+static int
+wb_preq(netdissect_options *ndo,
+ const struct pkt_preq *preq, u_int len)
+{
+ ND_PRINT((ndo, " wb-preq:"));
+ if (len < sizeof(*preq) || !ND_TTEST(*preq))
+ return (-1);
+
+ ND_PRINT((ndo, " need %u/%s:%u",
+ EXTRACT_32BITS(&preq->pp_low),
+ ipaddr_string(ndo, &preq->pp_page.p_sid),
+ EXTRACT_32BITS(&preq->pp_page.p_uid)));
+ return (0);
+}
+
+static int
+wb_prep(netdissect_options *ndo,
+ const struct pkt_prep *prep, u_int len)
+{
+ int n;
+ const struct pgstate *ps;
+ const u_char *ep = ndo->ndo_snapend;
+
+ ND_PRINT((ndo, " wb-prep:"));
+ if (len < sizeof(*prep)) {
+ return (-1);
+ }
+ n = EXTRACT_32BITS(&prep->pp_n);
+ ps = (const struct pgstate *)(prep + 1);
+ while (--n >= 0 && !ND_TTEST(*ps)) {
+ const struct id_off *io, *ie;
+ char c = '<';
+
+ ND_PRINT((ndo, " %u/%s:%u",
+ EXTRACT_32BITS(&ps->slot),
+ ipaddr_string(ndo, &ps->page.p_sid),
+ EXTRACT_32BITS(&ps->page.p_uid)));
+ io = (struct id_off *)(ps + 1);
+ for (ie = io + ps->nid; io < ie && !ND_TTEST(*io); ++io) {
+ ND_PRINT((ndo, "%c%s:%u", c, ipaddr_string(ndo, &io->id),
+ EXTRACT_32BITS(&io->off)));
+ c = ',';
+ }
+ ND_PRINT((ndo, ">"));
+ ps = (struct pgstate *)io;
+ }
+ return ((u_char *)ps <= ep? 0 : -1);
+}
+
+
+static const char *dopstr[] = {
+ "dop-0!",
+ "dop-1!",
+ "RECT",
+ "LINE",
+ "ML",
+ "DEL",
+ "XFORM",
+ "ELL",
+ "CHAR",
+ "STR",
+ "NOP",
+ "PSCODE",
+ "PSCOMP",
+ "REF",
+ "SKIP",
+ "HOLE",
+};
+
+static int
+wb_dops(netdissect_options *ndo, const struct pkt_dop *dop,
+ uint32_t ss, uint32_t es)
+{
+ const struct dophdr *dh = (const struct dophdr *)((const u_char *)dop + sizeof(*dop));
+
+ ND_PRINT((ndo, " <"));
+ for ( ; ss <= es; ++ss) {
+ int t;
+
+ if (!ND_TTEST(*dh)) {
+ ND_PRINT((ndo, "%s", tstr));
+ break;
+ }
+ t = dh->dh_type;
+
+ if (t > DT_MAXTYPE)
+ ND_PRINT((ndo, " dop-%d!", t));
+ else {
+ ND_PRINT((ndo, " %s", dopstr[t]));
+ if (t == DT_SKIP || t == DT_HOLE) {
+ uint32_t ts = EXTRACT_32BITS(&dh->dh_ts);
+ ND_PRINT((ndo, "%d", ts - ss + 1));
+ if (ss > ts || ts > es) {
+ ND_PRINT((ndo, "[|]"));
+ if (ts < ss)
+ return (0);
+ }
+ ss = ts;
+ }
+ }
+ dh = DOP_NEXT(dh);
+ }
+ ND_PRINT((ndo, " >"));
+ return (0);
+}
+
+static int
+wb_rrep(netdissect_options *ndo,
+ const struct pkt_rrep *rrep, u_int len)
+{
+ const struct pkt_dop *dop = &rrep->pr_dop;
+
+ ND_PRINT((ndo, " wb-rrep:"));
+ if (len < sizeof(*rrep) || !ND_TTEST(*rrep))
+ return (-1);
+ len -= sizeof(*rrep);
+
+ ND_PRINT((ndo, " for %s %s:%u<%u:%u>",
+ ipaddr_string(ndo, &rrep->pr_id),
+ ipaddr_string(ndo, &dop->pd_page.p_sid),
+ EXTRACT_32BITS(&dop->pd_page.p_uid),
+ EXTRACT_32BITS(&dop->pd_sseq),
+ EXTRACT_32BITS(&dop->pd_eseq)));
+
+ if (ndo->ndo_vflag)
+ return (wb_dops(ndo, dop,
+ EXTRACT_32BITS(&dop->pd_sseq),
+ EXTRACT_32BITS(&dop->pd_eseq)));
+ return (0);
+}
+
+static int
+wb_drawop(netdissect_options *ndo,
+ const struct pkt_dop *dop, u_int len)
+{
+ ND_PRINT((ndo, " wb-dop:"));
+ if (len < sizeof(*dop) || !ND_TTEST(*dop))
+ return (-1);
+ len -= sizeof(*dop);
+
+ ND_PRINT((ndo, " %s:%u<%u:%u>",
+ ipaddr_string(ndo, &dop->pd_page.p_sid),
+ EXTRACT_32BITS(&dop->pd_page.p_uid),
+ EXTRACT_32BITS(&dop->pd_sseq),
+ EXTRACT_32BITS(&dop->pd_eseq)));
+
+ if (ndo->ndo_vflag)
+ return (wb_dops(ndo, dop,
+ EXTRACT_32BITS(&dop->pd_sseq),
+ EXTRACT_32BITS(&dop->pd_eseq)));
+ return (0);
+}
+
+/*
+ * Print whiteboard multicast packets.
+ */
+void
+wb_print(netdissect_options *ndo,
+ register const void *hdr, register u_int len)
+{
+ register const struct pkt_hdr *ph;
+
+ ph = (const struct pkt_hdr *)hdr;
+ if (len < sizeof(*ph) || !ND_TTEST(*ph)) {
+ ND_PRINT((ndo, "%s", tstr));
+ return;
+ }
+ len -= sizeof(*ph);
+
+ if (ph->ph_flags)
+ ND_PRINT((ndo, "*"));
+ switch (ph->ph_type) {
+
+ case PT_KILL:
+ ND_PRINT((ndo, " wb-kill"));
+ return;
+
+ case PT_ID:
+ if (wb_id(ndo, (struct pkt_id *)(ph + 1), len) >= 0)
+ return;
+ break;
+
+ case PT_RREQ:
+ if (wb_rreq(ndo, (struct pkt_rreq *)(ph + 1), len) >= 0)
+ return;
+ break;
+
+ case PT_RREP:
+ if (wb_rrep(ndo, (struct pkt_rrep *)(ph + 1), len) >= 0)
+ return;
+ break;
+
+ case PT_DRAWOP:
+ if (wb_drawop(ndo, (struct pkt_dop *)(ph + 1), len) >= 0)
+ return;
+ break;
+
+ case PT_PREQ:
+ if (wb_preq(ndo, (struct pkt_preq *)(ph + 1), len) >= 0)
+ return;
+ break;
+
+ case PT_PREP:
+ if (wb_prep(ndo, (struct pkt_prep *)(ph + 1), len) >= 0)
+ return;
+ break;
+
+ default:
+ ND_PRINT((ndo, " wb-%d!", ph->ph_type));
+ return;
+ }
+}
--- /dev/null
+/*
+ * Decode and print Zephyr packets.
+ *
+ * http://web.mit.edu/zephyr/doc/protocol
+ *
+ * Copyright (c) 2001 Nickolai Zeldovich <kolya@MIT.EDU>
+ * All rights reserved.
+ *
+ * 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 the author(s) 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: print-zephyr.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "interface.h"
+
+struct z_packet {
+ char *version;
+ int numfields;
+ int kind;
+ char *uid;
+ int port;
+ int auth;
+ int authlen;
+ char *authdata;
+ char *class;
+ char *inst;
+ char *opcode;
+ char *sender;
+ const char *recipient;
+ char *format;
+ int cksum;
+ int multi;
+ char *multi_uid;
+ /* Other fields follow here.. */
+};
+
+enum z_packet_type {
+ Z_PACKET_UNSAFE = 0,
+ Z_PACKET_UNACKED,
+ Z_PACKET_ACKED,
+ Z_PACKET_HMACK,
+ Z_PACKET_HMCTL,
+ Z_PACKET_SERVACK,
+ Z_PACKET_SERVNAK,
+ Z_PACKET_CLIENTACK,
+ Z_PACKET_STAT
+};
+
+static const struct tok z_types[] = {
+ { Z_PACKET_UNSAFE, "unsafe" },
+ { Z_PACKET_UNACKED, "unacked" },
+ { Z_PACKET_ACKED, "acked" },
+ { Z_PACKET_HMACK, "hm-ack" },
+ { Z_PACKET_HMCTL, "hm-ctl" },
+ { Z_PACKET_SERVACK, "serv-ack" },
+ { Z_PACKET_SERVNAK, "serv-nak" },
+ { Z_PACKET_CLIENTACK, "client-ack" },
+ { Z_PACKET_STAT, "stat" }
+};
+
+static char z_buf[256];
+
+static char *
+parse_field(netdissect_options *ndo, char **pptr, int *len)
+{
+ char *s;
+
+ if (*len <= 0 || !pptr || !*pptr)
+ return NULL;
+ if (*pptr > (char *) ndo->ndo_snapend)
+ return NULL;
+
+ s = *pptr;
+ while (*pptr <= (char *) ndo->ndo_snapend && *len >= 0 && **pptr) {
+ (*pptr)++;
+ (*len)--;
+ }
+ (*pptr)++;
+ (*len)--;
+ if (*len < 0 || *pptr > (char *) ndo->ndo_snapend)
+ return NULL;
+ return s;
+}
+
+static const char *
+z_triple(char *class, char *inst, const char *recipient)
+{
+ if (!*recipient)
+ recipient = "*";
+ snprintf(z_buf, sizeof(z_buf), "<%s,%s,%s>", class, inst, recipient);
+ z_buf[sizeof(z_buf)-1] = '\0';
+ return z_buf;
+}
+
+static const char *
+str_to_lower(char *string)
+{
+ strncpy(z_buf, string, sizeof(z_buf));
+ z_buf[sizeof(z_buf)-1] = '\0';
+
+ string = z_buf;
+ while (*string) {
+ *string = tolower((unsigned char)(*string));
+ string++;
+ }
+
+ return z_buf;
+}
+
+void
+zephyr_print(netdissect_options *ndo, const u_char *cp, int length)
+{
+ struct z_packet z;
+ char *parse = (char *) cp;
+ int parselen = length;
+ char *s;
+ int lose = 0;
+
+ /* squelch compiler warnings */
+
+ z.kind = 0;
+ z.class = 0;
+ z.inst = 0;
+ z.opcode = 0;
+ z.sender = 0;
+ z.recipient = 0;
+
+ memset(&z, 0, sizeof(z)); /* XXX gcc */
+
+#define PARSE_STRING \
+ s = parse_field(ndo, &parse, &parselen); \
+ if (!s) lose = 1;
+
+#define PARSE_FIELD_INT(field) \
+ PARSE_STRING \
+ if (!lose) field = strtol(s, 0, 16);
+
+#define PARSE_FIELD_STR(field) \
+ PARSE_STRING \
+ if (!lose) field = s;
+
+ PARSE_FIELD_STR(z.version);
+ if (lose) return;
+ if (strncmp(z.version, "ZEPH", 4))
+ return;
+
+ PARSE_FIELD_INT(z.numfields);
+ PARSE_FIELD_INT(z.kind);
+ PARSE_FIELD_STR(z.uid);
+ PARSE_FIELD_INT(z.port);
+ PARSE_FIELD_INT(z.auth);
+ PARSE_FIELD_INT(z.authlen);
+ PARSE_FIELD_STR(z.authdata);
+ PARSE_FIELD_STR(z.class);
+ PARSE_FIELD_STR(z.inst);
+ PARSE_FIELD_STR(z.opcode);
+ PARSE_FIELD_STR(z.sender);
+ PARSE_FIELD_STR(z.recipient);
+ PARSE_FIELD_STR(z.format);
+ PARSE_FIELD_INT(z.cksum);
+ PARSE_FIELD_INT(z.multi);
+ PARSE_FIELD_STR(z.multi_uid);
+
+ if (lose) {
+ ND_PRINT((ndo, " [|zephyr] (%d)", length));
+ return;
+ }
+
+ ND_PRINT((ndo, " zephyr"));
+ if (strncmp(z.version+4, "0.2", 3)) {
+ ND_PRINT((ndo, " v%s", z.version+4));
+ return;
+ }
+
+ ND_PRINT((ndo, " %s", tok2str(z_types, "type %d", z.kind)));
+ if (z.kind == Z_PACKET_SERVACK) {
+ /* Initialization to silence warnings */
+ char *ackdata = NULL;
+ PARSE_FIELD_STR(ackdata);
+ if (!lose && strcmp(ackdata, "SENT"))
+ ND_PRINT((ndo, "/%s", str_to_lower(ackdata)));
+ }
+ if (*z.sender) ND_PRINT((ndo, " %s", z.sender));
+
+ if (!strcmp(z.class, "USER_LOCATE")) {
+ if (!strcmp(z.opcode, "USER_HIDE"))
+ ND_PRINT((ndo, " hide"));
+ else if (!strcmp(z.opcode, "USER_UNHIDE"))
+ ND_PRINT((ndo, " unhide"));
+ else
+ ND_PRINT((ndo, " locate %s", z.inst));
+ return;
+ }
+
+ if (!strcmp(z.class, "ZEPHYR_ADMIN")) {
+ ND_PRINT((ndo, " zephyr-admin %s", str_to_lower(z.opcode)));
+ return;
+ }
+
+ if (!strcmp(z.class, "ZEPHYR_CTL")) {
+ if (!strcmp(z.inst, "CLIENT")) {
+ if (!strcmp(z.opcode, "SUBSCRIBE") ||
+ !strcmp(z.opcode, "SUBSCRIBE_NODEFS") ||
+ !strcmp(z.opcode, "UNSUBSCRIBE")) {
+
+ ND_PRINT((ndo, " %ssub%s", strcmp(z.opcode, "SUBSCRIBE") ? "un" : "",
+ strcmp(z.opcode, "SUBSCRIBE_NODEFS") ? "" :
+ "-nodefs"));
+ if (z.kind != Z_PACKET_SERVACK) {
+ /* Initialization to silence warnings */
+ char *c = NULL, *i = NULL, *r = NULL;
+ PARSE_FIELD_STR(c);
+ PARSE_FIELD_STR(i);
+ PARSE_FIELD_STR(r);
+ if (!lose) ND_PRINT((ndo, " %s", z_triple(c, i, r)));
+ }
+ return;
+ }
+
+ if (!strcmp(z.opcode, "GIMME")) {
+ ND_PRINT((ndo, " ret"));
+ return;
+ }
+
+ if (!strcmp(z.opcode, "GIMMEDEFS")) {
+ ND_PRINT((ndo, " gimme-defs"));
+ return;
+ }
+
+ if (!strcmp(z.opcode, "CLEARSUB")) {
+ ND_PRINT((ndo, " clear-subs"));
+ return;
+ }
+
+ ND_PRINT((ndo, " %s", str_to_lower(z.opcode)));
+ return;
+ }
+
+ if (!strcmp(z.inst, "HM")) {
+ ND_PRINT((ndo, " %s", str_to_lower(z.opcode)));
+ return;
+ }
+
+ if (!strcmp(z.inst, "REALM")) {
+ if (!strcmp(z.opcode, "ADD_SUBSCRIBE"))
+ ND_PRINT((ndo, " realm add-subs"));
+ if (!strcmp(z.opcode, "REQ_SUBSCRIBE"))
+ ND_PRINT((ndo, " realm req-subs"));
+ if (!strcmp(z.opcode, "RLM_SUBSCRIBE"))
+ ND_PRINT((ndo, " realm rlm-sub"));
+ if (!strcmp(z.opcode, "RLM_UNSUBSCRIBE"))
+ ND_PRINT((ndo, " realm rlm-unsub"));
+ return;
+ }
+ }
+
+ if (!strcmp(z.class, "HM_CTL")) {
+ ND_PRINT((ndo, " hm_ctl %s", str_to_lower(z.inst)));
+ ND_PRINT((ndo, " %s", str_to_lower(z.opcode)));
+ return;
+ }
+
+ if (!strcmp(z.class, "HM_STAT")) {
+ if (!strcmp(z.inst, "HMST_CLIENT") && !strcmp(z.opcode, "GIMMESTATS")) {
+ ND_PRINT((ndo, " get-client-stats"));
+ return;
+ }
+ }
+
+ if (!strcmp(z.class, "WG_CTL")) {
+ ND_PRINT((ndo, " wg_ctl %s", str_to_lower(z.inst)));
+ ND_PRINT((ndo, " %s", str_to_lower(z.opcode)));
+ return;
+ }
+
+ if (!strcmp(z.class, "LOGIN")) {
+ if (!strcmp(z.opcode, "USER_FLUSH")) {
+ ND_PRINT((ndo, " flush_locs"));
+ return;
+ }
+
+ if (!strcmp(z.opcode, "NONE") ||
+ !strcmp(z.opcode, "OPSTAFF") ||
+ !strcmp(z.opcode, "REALM-VISIBLE") ||
+ !strcmp(z.opcode, "REALM-ANNOUNCED") ||
+ !strcmp(z.opcode, "NET-VISIBLE") ||
+ !strcmp(z.opcode, "NET-ANNOUNCED")) {
+ ND_PRINT((ndo, " set-exposure %s", str_to_lower(z.opcode)));
+ return;
+ }
+ }
+
+ if (!*z.recipient)
+ z.recipient = "*";
+
+ ND_PRINT((ndo, " to %s", z_triple(z.class, z.inst, z.recipient)));
+ if (*z.opcode)
+ ND_PRINT((ndo, " op %s", z.opcode));
+}
--- /dev/null
+/*
+ * This file implements decoding of ZeroMQ network protocol(s).
+ *
+ *
+ * Copyright (c) 2013 The TCPDUMP 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
+ * COPYRIGHT HOLDER 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.
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+#include "extract.h"
+
+static const char tstr[] = " [|zmtp1]";
+
+/* Maximum number of ZMTP/1.0 frame body bytes (without the flags) to dump in
+ * hex and ASCII under a single "-v" flag.
+ */
+#define VBYTES 128
+
+/*
+ * Below is an excerpt from the "13/ZMTP" specification:
+ *
+ * A ZMTP message consists of 1 or more frames.
+ *
+ * A ZMTP frame consists of a length, followed by a flags field and a frame
+ * body of (length - 1) octets. Note: the length includes the flags field, so
+ * an empty frame has a length of 1.
+ *
+ * For frames with a length of 1 to 254 octets, the length SHOULD BE encoded
+ * as a single octet. The minimum valid length of a frame is 1 octet, thus a
+ * length of 0 is invalid and such frames SHOULD be discarded silently.
+ *
+ * For frames with lengths of 255 and greater, the length SHALL BE encoded as
+ * a single octet with the value 255, followed by the length encoded as a
+ * 64-bit unsigned integer in network byte order. For frames with lengths of
+ * 1 to 254 octets this encoding MAY be also used.
+ *
+ * The flags field consists of a single octet containing various control
+ * flags. Bit 0 is the least significant bit.
+ *
+ * - Bit 0 (MORE): More frames to follow. A value of 0 indicates that there
+ * are no more frames to follow. A value of 1 indicates that more frames
+ * will follow. On messages consisting of a single frame the MORE flag MUST
+ * be 0.
+ *
+ * - Bits 1-7: Reserved. Bits 1-7 are reserved for future use and SHOULD be
+ * zero.
+ */
+
+static const u_char *
+zmtp1_print_frame(netdissect_options *ndo, const u_char *cp, const u_char *ep)
+{
+ uint64_t body_len_declared, body_len_captured, header_len;
+ uint8_t flags;
+
+ ND_PRINT((ndo, "\n\t"));
+ ND_TCHECK2(*cp, 1); /* length/0xFF */
+
+ if (cp[0] != 0xFF) {
+ header_len = 1; /* length */
+ body_len_declared = cp[0];
+ if (body_len_declared == 0)
+ return cp + header_len; /* skip to next frame */
+ ND_PRINT((ndo, " frame flags+body (8-bit) length %u", cp[0]));
+ ND_TCHECK2(*cp, header_len + 1); /* length, flags */
+ flags = cp[1];
+ } else {
+ header_len = 1 + 8; /* 0xFF, length */
+ ND_PRINT((ndo, " frame flags+body (64-bit) length"));
+ ND_TCHECK2(*cp, header_len); /* 0xFF, length */
+ body_len_declared = EXTRACT_64BITS(cp + 1);
+ if (body_len_declared == 0)
+ return cp + header_len; /* skip to next frame */
+ ND_PRINT((ndo, " %" PRIu64, body_len_declared));
+ ND_TCHECK2(*cp, header_len + 1); /* 0xFF, length, flags */
+ flags = cp[9];
+ }
+
+ body_len_captured = ep - cp - header_len;
+ if (body_len_declared > body_len_captured)
+ ND_PRINT((ndo, " (%" PRIu64 " captured)", body_len_captured));
+ ND_PRINT((ndo, ", flags 0x%02x", flags));
+
+ if (ndo->ndo_vflag) {
+ uint64_t body_len_printed = min(body_len_captured, body_len_declared);
+
+ ND_PRINT((ndo, " (%s|%s|%s|%s|%s|%s|%s|%s)",
+ flags & 0x80 ? "MBZ" : "-",
+ flags & 0x40 ? "MBZ" : "-",
+ flags & 0x20 ? "MBZ" : "-",
+ flags & 0x10 ? "MBZ" : "-",
+ flags & 0x08 ? "MBZ" : "-",
+ flags & 0x04 ? "MBZ" : "-",
+ flags & 0x02 ? "MBZ" : "-",
+ flags & 0x01 ? "MORE" : "-"));
+
+ if (ndo->ndo_vflag == 1)
+ body_len_printed = min(VBYTES + 1, body_len_printed);
+ if (body_len_printed > 1) {
+ ND_PRINT((ndo, ", first %" PRIu64 " byte(s) of body:", body_len_printed - 1));
+ hex_and_ascii_print(ndo, "\n\t ", cp + header_len + 1, body_len_printed - 1);
+ ND_PRINT((ndo, "\n"));
+ }
+ }
+
+ ND_TCHECK2(*cp, header_len + body_len_declared); /* Next frame within the buffer ? */
+ return cp + header_len + body_len_declared;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return ep;
+}
+
+void
+zmtp1_print(netdissect_options *ndo, const u_char *cp, u_int len)
+{
+ const u_char *ep = min(ndo->ndo_snapend, cp + len);
+
+ ND_PRINT((ndo, ": ZMTP/1.0"));
+ while (cp < ep)
+ cp = zmtp1_print_frame(ndo, cp, ep);
+}
+
+/* The functions below decode a ZeroMQ datagram, supposedly stored in the "Data"
+ * field of an ODATA/RDATA [E]PGM packet. An excerpt from zmq_pgm(7) man page
+ * follows.
+ *
+ * In order for late joining consumers to be able to identify message
+ * boundaries, each PGM datagram payload starts with a 16-bit unsigned integer
+ * in network byte order specifying either the offset of the first message frame
+ * in the datagram or containing the value 0xFFFF if the datagram contains
+ * solely an intermediate part of a larger message.
+ *
+ * Note that offset specifies where the first message begins rather than the
+ * first message part. Thus, if there are trailing message parts at the
+ * beginning of the packet the offset ignores them and points to first initial
+ * message part in the packet.
+ */
+
+static const u_char *
+zmtp1_print_intermediate_part(netdissect_options *ndo, const u_char *cp, const u_int len)
+{
+ u_int frame_offset;
+ uint64_t remaining_len;
+
+ ND_TCHECK2(*cp, 2);
+ frame_offset = EXTRACT_16BITS(cp);
+ ND_PRINT((ndo, "\n\t frame offset 0x%04x", frame_offset));
+ cp += 2;
+ remaining_len = ndo->ndo_snapend - cp; /* without the frame length */
+
+ if (frame_offset == 0xFFFF)
+ frame_offset = len - 2; /* always within the declared length */
+ else if (2 + frame_offset > len) {
+ ND_PRINT((ndo, " (exceeds datagram declared length)"));
+ goto trunc;
+ }
+
+ /* offset within declared length of the datagram */
+ if (frame_offset) {
+ ND_PRINT((ndo, "\n\t frame intermediate part, %u bytes", frame_offset));
+ if (frame_offset > remaining_len)
+ ND_PRINT((ndo, " (%"PRIu64" captured)", remaining_len));
+ if (ndo->ndo_vflag) {
+ uint64_t len_printed = min(frame_offset, remaining_len);
+
+ if (ndo->ndo_vflag == 1)
+ len_printed = min(VBYTES, len_printed);
+ if (len_printed > 1) {
+ ND_PRINT((ndo, ", first %"PRIu64" byte(s):", len_printed));
+ hex_and_ascii_print(ndo, "\n\t ", cp, len_printed);
+ ND_PRINT((ndo, "\n"));
+ }
+ }
+ }
+ return cp + frame_offset;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return cp + len;
+}
+
+void
+zmtp1_print_datagram(netdissect_options *ndo, const u_char *cp, const u_int len)
+{
+ const u_char *ep = min(ndo->ndo_snapend, cp + len);
+
+ cp = zmtp1_print_intermediate_part(ndo, cp, len);
+ while (cp < ep)
+ cp = zmtp1_print_frame(ndo, cp, ep);
+}
--- /dev/null
+/*
+ * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
+ * unrestricted use provided that this legend is included on all tape
+ * media and as a part of the software program in whole or part. Users
+ * may copy or modify Sun RPC without charge, but are not authorized
+ * to license or distribute it to anyone else except as part of a product or
+ * program developed by the user.
+ *
+ * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
+ * WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun RPC is provided with no support and without any obligation on the
+ * part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California 94043
+ *
+ * from: @(#)auth.h 1.17 88/02/08 SMI
+ * from: @(#)auth.h 2.3 88/08/07 4.0 RPCSRC
+ * $FreeBSD: src/include/rpc/auth.h,v 1.14.2.1 1999/08/29 14:39:02 peter Exp $
+ */
+
+/*
+ * auth.h, Authentication interface.
+ *
+ * Copyright (C) 1984, Sun Microsystems, Inc.
+ *
+ * The data structures are completely opaque to the client. The client
+ * is required to pass a AUTH * to routines that create rpc
+ * "sessions".
+ */
+
+/*
+ * Status returned from authentication check
+ */
+enum sunrpc_auth_stat {
+ SUNRPC_AUTH_OK=0,
+ /*
+ * failed at remote end
+ */
+ SUNRPC_AUTH_BADCRED=1, /* bogus credentials (seal broken) */
+ SUNRPC_AUTH_REJECTEDCRED=2, /* client should begin new session */
+ SUNRPC_AUTH_BADVERF=3, /* bogus verifier (seal broken) */
+ SUNRPC_AUTH_REJECTEDVERF=4, /* verifier expired or was replayed */
+ SUNRPC_AUTH_TOOWEAK=5, /* rejected due to security reasons */
+ /*
+ * failed locally
+ */
+ SUNRPC_AUTH_INVALIDRESP=6, /* bogus response verifier */
+ SUNRPC_AUTH_FAILED=7 /* some unknown reason */
+};
+
+/*
+ * Authentication info. Opaque to client.
+ */
+struct sunrpc_opaque_auth {
+ uint32_t oa_flavor; /* flavor of auth */
+ uint32_t oa_len; /* length of opaque body */
+ /* zero or more bytes of body */
+};
+
+#define SUNRPC_AUTH_NONE 0 /* no authentication */
+#define SUNRPC_AUTH_NULL 0 /* backward compatibility */
+#define SUNRPC_AUTH_UNIX 1 /* unix style (uid, gids) */
+#define SUNRPC_AUTH_SYS 1 /* forward compatibility */
+#define SUNRPC_AUTH_SHORT 2 /* short hand unix style */
+#define SUNRPC_AUTH_DES 3 /* des style (encrypted timestamps) */
--- /dev/null
+/*
+ * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
+ * unrestricted use provided that this legend is included on all tape
+ * media and as a part of the software program in whole or part. Users
+ * may copy or modify Sun RPC without charge, but are not authorized
+ * to license or distribute it to anyone else except as part of a product or
+ * program developed by the user.
+ *
+ * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
+ * WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun RPC is provided with no support and without any obligation on the
+ * part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California 94043
+ *
+ * from: @(#)rpc_msg.h 1.7 86/07/16 SMI
+ * from: @(#)rpc_msg.h 2.1 88/07/29 4.0 RPCSRC
+ * $FreeBSD: src/include/rpc/rpc_msg.h,v 1.11.2.1 1999/08/29 14:39:07 peter Exp $
+ */
+
+/*
+ * rpc_msg.h
+ * rpc message definition
+ *
+ * Copyright (C) 1984, Sun Microsystems, Inc.
+ */
+
+#define SUNRPC_MSG_VERSION ((uint32_t) 2)
+
+/*
+ * Bottom up definition of an rpc message.
+ * NOTE: call and reply use the same overall stuct but
+ * different parts of unions within it.
+ */
+
+enum sunrpc_msg_type {
+ SUNRPC_CALL=0,
+ SUNRPC_REPLY=1
+};
+
+enum sunrpc_reply_stat {
+ SUNRPC_MSG_ACCEPTED=0,
+ SUNRPC_MSG_DENIED=1
+};
+
+enum sunrpc_accept_stat {
+ SUNRPC_SUCCESS=0,
+ SUNRPC_PROG_UNAVAIL=1,
+ SUNRPC_PROG_MISMATCH=2,
+ SUNRPC_PROC_UNAVAIL=3,
+ SUNRPC_GARBAGE_ARGS=4,
+ SUNRPC_SYSTEM_ERR=5
+};
+
+enum sunrpc_reject_stat {
+ SUNRPC_RPC_MISMATCH=0,
+ SUNRPC_AUTH_ERROR=1
+};
+
+/*
+ * Reply part of an rpc exchange
+ */
+
+/*
+ * Reply to an rpc request that was rejected by the server.
+ */
+struct sunrpc_rejected_reply {
+ uint32_t rj_stat; /* enum reject_stat */
+ union {
+ struct {
+ uint32_t low;
+ uint32_t high;
+ } RJ_versions;
+ uint32_t RJ_why; /* enum auth_stat - why authentication did not work */
+ } ru;
+#define rj_vers ru.RJ_versions
+#define rj_why ru.RJ_why
+};
+
+/*
+ * Body of a reply to an rpc request.
+ */
+struct sunrpc_reply_body {
+ uint32_t rp_stat; /* enum reply_stat */
+ struct sunrpc_rejected_reply rp_reject; /* if rejected */
+};
+
+/*
+ * Body of an rpc request call.
+ */
+struct sunrpc_call_body {
+ uint32_t cb_rpcvers; /* must be equal to two */
+ uint32_t cb_prog;
+ uint32_t cb_vers;
+ uint32_t cb_proc;
+ struct sunrpc_opaque_auth cb_cred;
+ /* followed by opaque verifier */
+};
+
+/*
+ * The rpc message
+ */
+struct sunrpc_msg {
+ uint32_t rm_xid;
+ uint32_t rm_direction; /* enum msg_type */
+ union {
+ struct sunrpc_call_body RM_cmb;
+ struct sunrpc_reply_body RM_rmb;
+ } ru;
+#define rm_call ru.RM_cmb
+#define rm_reply ru.RM_rmb
+};
+#define acpted_rply ru.RM_rmb.ru.RP_ar
+#define rjcted_rply ru.RM_rmb.ru.RP_dr
--- /dev/null
+#ifndef _RPL_H_
+
+/*
+ * NOTE: the contents of this file are an interpretation of RFC6550.
+ * no copyright is asserted on this file, as it transcribes
+ * a public specification.
+ *
+ */
+
+/*
+ * DIO: Updated to RFC6550, as published in 2012: section 6. (page 30)
+ */
+
+#define ND_RPL_MESSAGE 155 /* 0x9B */
+
+enum ND_RPL_CODE {
+ ND_RPL_DAG_IS=0x00,
+ ND_RPL_DAG_IO=0x01,
+ ND_RPL_DAO =0x02,
+ ND_RPL_DAO_ACK=0x03,
+ ND_RPL_SEC_DAG_IS = 0x80,
+ ND_RPL_SEC_DAG_IO = 0x81,
+ ND_RPL_SEC_DAG = 0x82,
+ ND_RPL_SEC_DAG_ACK= 0x83,
+ ND_RPL_SEC_CONSIST= 0x84,
+};
+
+enum ND_RPL_DIO_FLAGS {
+ ND_RPL_DIO_GROUNDED = 0x80,
+ ND_RPL_DIO_DATRIG = 0x40,
+ ND_RPL_DIO_DASUPPORT= 0x20,
+ ND_RPL_DIO_RES4 = 0x10,
+ ND_RPL_DIO_RES3 = 0x08,
+ ND_RPL_DIO_PRF_MASK = 0x07, /* 3-bit preference */
+};
+
+#define DAGID_LEN 16
+
+/* section 6 of draft-ietf-roll-rpl-19 */
+struct nd_rpl_security {
+ uint8_t rpl_sec_t_reserved; /* bit 7 is T-bit */
+ uint8_t rpl_sec_algo;
+ uint16_t rpl_sec_kim_lvl_flags; /* bit 15/14, KIM */
+ /* bit 10-8, LVL, bit 7-0 flags */
+ uint32_t rpl_sec_counter;
+#if 0
+ uint8_t rpl_sec_ki[0]; /* depends upon kim */
+#endif
+};
+
+/* section 6.2.1, DODAG Information Solication (DIS_IS) */
+struct nd_rpl_dis_is {
+ uint8_t rpl_dis_flags;
+ uint8_t rpl_dis_reserved;
+#if 0
+ uint8_t rpl_dis_options[0];
+#endif
+};
+
+/* section 6.3.1, DODAG Information Object (DIO) */
+struct nd_rpl_dio {
+ uint8_t rpl_instanceid;
+ uint8_t rpl_version;
+ uint16_t rpl_dagrank;
+ uint8_t rpl_mopprf; /* bit 7=G, 5-3=MOP, 2-0=PRF */
+ uint8_t rpl_dtsn; /* Dest. Advertisement Trigger Sequence Number */
+ uint8_t rpl_flags; /* no flags defined yet */
+ uint8_t rpl_resv1;
+ uint8_t rpl_dagid[DAGID_LEN];
+};
+#define RPL_DIO_GROUND_FLAG 0x80
+#define RPL_DIO_MOP_SHIFT 3
+#define RPL_DIO_MOP_MASK (7 << RPL_DIO_MOP_SHIFT)
+#define RPL_DIO_PRF_SHIFT 0
+#define RPL_DIO_PRF_MASK (7 << RPL_DIO_PRF_SHIFT)
+#define RPL_DIO_GROUNDED(X) ((X)&RPL_DIO_GROUND_FLAG)
+#define RPL_DIO_MOP(X) (enum RPL_DIO_MOP)(((X)&RPL_DIO_MOP_MASK) >> RPL_DIO_MOP_SHIFT)
+#define RPL_DIO_PRF(X) (((X)&RPL_DIO_PRF_MASK) >> RPL_DIO_PRF_SHIFT)
+
+enum RPL_DIO_MOP {
+ RPL_DIO_NONSTORING= 0x0,
+ RPL_DIO_STORING = 0x1,
+ RPL_DIO_NONSTORING_MULTICAST = 0x2,
+ RPL_DIO_STORING_MULTICAST = 0x3,
+};
+
+enum RPL_SUBOPT {
+ RPL_OPT_PAD0 = 0,
+ RPL_OPT_PADN = 1,
+ RPL_DIO_METRICS = 2,
+ RPL_DIO_ROUTINGINFO = 3,
+ RPL_DIO_CONFIG = 4,
+ RPL_DAO_RPLTARGET = 5,
+ RPL_DAO_TRANSITINFO = 6,
+ RPL_DIO_DESTPREFIX = 8,
+ RPL_DAO_RPLTARGET_DESC=9,
+};
+
+struct rpl_dio_genoption {
+ uint8_t rpl_dio_type;
+ uint8_t rpl_dio_len; /* suboption length, not including type/len */
+};
+#define RPL_DIO_GENOPTION_LEN 2
+
+#define RPL_DIO_LIFETIME_INFINITE 0xffffffff
+#define RPL_DIO_LIFETIME_DISCONNECT 0
+
+struct rpl_dio_destprefix {
+ uint8_t rpl_dio_type;
+ uint8_t rpl_dio_len;
+ uint8_t rpl_dio_prefixlen; /* in bits */
+ uint8_t rpl_dio_prf; /* flags, including Route Preference */
+ uint32_t rpl_dio_prefixlifetime; /* in seconds */
+#if 0
+ uint8_t rpl_dio_prefix[0]; /* variable number of bytes */
+#endif
+};
+
+/* section 6.4.1, DODAG Information Object (DIO) */
+struct nd_rpl_dao {
+ uint8_t rpl_instanceid;
+ uint8_t rpl_flags; /* bit 7=K, 6=D */
+ uint8_t rpl_resv;
+ uint8_t rpl_daoseq;
+ uint8_t rpl_dagid[DAGID_LEN]; /* present when D set. */
+};
+#define ND_RPL_DAO_MIN_LEN 4 /* length without DAGID */
+
+/* indicates if this DAO is to be acK'ed */
+#define RPL_DAO_K_SHIFT 7
+#define RPL_DAO_K_MASK (1 << RPL_DAO_K_SHIFT)
+#define RPL_DAO_K(X) (((X)&RPL_DAO_K_MASK) >> RPL_DAO_K_SHIFT)
+
+/* indicates if the DAGID is present */
+#define RPL_DAO_D_SHIFT 6
+#define RPL_DAO_D_MASK (1 << RPL_DAO_D_SHIFT)
+#define RPL_DAO_D(X) (((X)&RPL_DAO_D_MASK) >> RPL_DAO_D_SHIFT)
+
+struct rpl_dao_target {
+ uint8_t rpl_dao_type;
+ uint8_t rpl_dao_len;
+ uint8_t rpl_dao_flags; /* unused */
+ uint8_t rpl_dao_prefixlen; /* in bits */
+#if 0
+ uint8_t rpl_dao_prefix[0]; /* variable number of bytes */
+#endif
+};
+
+/* section 6.5.1, Destination Advertisement Object Acknowledgement (DAO-ACK) */
+struct nd_rpl_daoack {
+ uint8_t rpl_instanceid;
+ uint8_t rpl_flags; /* bit 7=D */
+ uint8_t rpl_daoseq;
+ uint8_t rpl_status;
+ uint8_t rpl_dagid[DAGID_LEN]; /* present when D set. */
+};
+#define ND_RPL_DAOACK_MIN_LEN 4 /* length without DAGID */
+/* indicates if the DAGID is present */
+#define RPL_DAOACK_D_SHIFT 7
+#define RPL_DAOACK_D_MASK (1 << RPL_DAOACK_D_SHIFT)
+#define RPL_DAOACK_D(X) (((X)&RPL_DAOACK_D_MASK) >> RPL_DAOACK_D_SHIFT)
+
+
+
+#define _RPL_H_
+#endif /* _RPL_H_ */
+
+/*
+ * Local Variables:
+ * c-basic-offset:4
+ * c-style: whitesmith
+ * End:
+ */
+
--- /dev/null
+BEGIN {
+ # we need the number of bytes in a packet to do the output
+ # in packet numbers rather than byte numbers.
+ if (packetsize <= 0)
+ packetsize = 512
+ expectNext = 1
+ lastwin = -1
+ }
+ {
+ # convert tcp trace to send/ack form.
+ n = split ($1,t,":")
+ tim = t[1]*3600 + t[2]*60 + t[3]
+ if (NR <= 1) {
+ tzero = tim
+ ltim = tim
+ OFS = "\t"
+ }
+ if ($6 != "ack") {
+ # we have a data packet record:
+ # ignore guys with syn, fin or reset 'cause we
+ # can't handle their sequence numbers. Try to
+ # detect and add a flag character for 'anomalies':
+ # * -> re-sent packet
+ # - -> packet after hole (missing packet(s))
+ # # -> odd size packet
+ if ($5 !~ /[SFR]/) {
+ i = index($6,":")
+ j = index($6,"(")
+ strtSeq = substr($6,1,i-1)
+ endSeq = substr($6,i+1,j-i-1)
+ len = endSeq - strtSeq
+ id = endSeq
+ if (! timeOf[id])
+ timeOf[id] = tim
+ if (endSeq - expectNext < 0)
+ flag = "*"
+ else {
+ if (strtSeq - expectNext > 0)
+ flag = "-"
+ else if (len != packetsize)
+ flag = "#"
+ else
+ flag = " "
+ expectNext = endSeq
+ }
+ printf "%7.2f\t%7.2f\t%s send %s %d", tim-tzero, tim-ltim,\
+ flag, $5, strtSeq
+ if (++timesSent[id] > 1)
+ printf " (%.2f) [%d]", tim - timeOf[id], timesSent[id]
+ if (len != packetsize)
+ printf " <%d>", len
+ }
+ } else {
+ id = $7
+
+ printf "%7.2f\t%7.2f\t%s ack %s %d", tim-tzero, tim-ltim,\
+ flag, $5, id
+ if ($9 != lastwin) {
+ printf " win %d", $9
+ lastwin = $9
+ }
+ printf " (%.2f)", tim - timeOf[id]
+ if (++timesAcked[id] > 1)
+ printf " [%d]", timesAcked[id]
+ }
+ printf "\n"
+ ltim = tim
+ }
--- /dev/null
+/*
+ * Copyright (c) 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: setsignal.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <signal.h>
+#ifdef HAVE_SIGACTION
+#include <string.h>
+#endif
+
+#ifdef HAVE_OS_PROTO_H
+#include "os-proto.h"
+#endif
+
+#include "setsignal.h"
+
+/*
+ * An OS-independent signal() with, whenever possible, partial BSD
+ * semantics, i.e. the signal handler is restored following service
+ * of the signal, but system calls are *not* restarted, so that if
+ * "pcap_breakloop()" is called in a signal handler in a live capture,
+ * the read/recvfrom/whatever in the live capture doesn't get restarted,
+ * it returns -1 and sets "errno" to EINTR, so we can break out of the
+ * live capture loop.
+ *
+ * We use "sigaction()" if available. We don't specify that the signal
+ * should restart system calls, so that should always do what we want.
+ *
+ * Otherwise, if "sigset()" is available, it probably has BSD semantics
+ * while "signal()" has traditional semantics, so we use "sigset()"; it
+ * might cause system calls to be restarted for the signal, however.
+ * I don't know whether, in any systems where it did cause system calls to
+ * be restarted, there was a way to ask it not to do so; there may no
+ * longer be any interesting systems without "sigaction()", however,
+ * and, if there are, they might have "sigvec()" with SV_INTERRUPT
+ * (which I think first appeared in 4.3BSD).
+ *
+ * Otherwise, we use "signal()" - which means we might get traditional
+ * semantics, wherein system calls don't get restarted *but* the
+ * signal handler is reset to SIG_DFL and the signal is not blocked,
+ * so that a subsequent signal would kill the process immediately.
+ *
+ * Did I mention that signals suck? At least in POSIX-compliant systems
+ * they suck far less, as those systems have "sigaction()".
+ */
+RETSIGTYPE
+(*setsignal (int sig, RETSIGTYPE (*func)(int)))(int)
+{
+#ifdef HAVE_SIGACTION
+ struct sigaction old, new;
+
+ memset(&new, 0, sizeof(new));
+ new.sa_handler = func;
+ if (sig == SIGCHLD)
+ new.sa_flags = SA_RESTART;
+ if (sigaction(sig, &new, &old) < 0)
+ return (SIG_ERR);
+ return (old.sa_handler);
+
+#else
+#ifdef HAVE_SIGSET
+ return (sigset(sig, func));
+#else
+ return (signal(sig, func));
+#endif
+#endif
+}
+
--- /dev/null
+/*
+ * Copyright (c) 1997
+ * 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: (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.
+ */
+#ifndef setsignal_h
+#define setsignal_h
+
+RETSIGTYPE (*setsignal(int, RETSIGTYPE (*)(int)))(int);
+#endif
--- /dev/null
+/*
+ * 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.
+ *
+ * Functions for signature and digest verification.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: signature.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <string.h>
+
+#include "interface.h"
+#include "signature.h"
+
+#ifdef HAVE_LIBCRYPTO
+#include <openssl/md5.h>
+#endif
+
+const struct tok signature_check_values[] = {
+ { SIGNATURE_VALID, "valid"},
+ { SIGNATURE_INVALID, "invalid"},
+ { CANT_CHECK_SIGNATURE, "unchecked"},
+ { 0, NULL }
+};
+
+
+#ifdef HAVE_LIBCRYPTO
+/*
+ * Compute a HMAC MD5 sum.
+ * Taken from rfc2104, Appendix.
+ */
+USES_APPLE_DEPRECATED_API
+static void
+signature_compute_hmac_md5(const uint8_t *text, int text_len, unsigned char *key,
+ unsigned int key_len, uint8_t *digest)
+{
+ MD5_CTX context;
+ unsigned char k_ipad[65]; /* inner padding - key XORd with ipad */
+ unsigned char k_opad[65]; /* outer padding - key XORd with opad */
+ unsigned char tk[16];
+ int i;
+
+ /* if key is longer than 64 bytes reset it to key=MD5(key) */
+ if (key_len > 64) {
+
+ MD5_CTX tctx;
+
+ MD5_Init(&tctx);
+ MD5_Update(&tctx, key, key_len);
+ MD5_Final(tk, &tctx);
+
+ key = tk;
+ key_len = 16;
+ }
+
+ /*
+ * the HMAC_MD5 transform looks like:
+ *
+ * MD5(K XOR opad, MD5(K XOR ipad, text))
+ *
+ * where K is an n byte key
+ * ipad is the byte 0x36 repeated 64 times
+ * opad is the byte 0x5c repeated 64 times
+ * and text is the data being protected
+ */
+
+ /* start out by storing key in pads */
+ memset(k_ipad, 0, sizeof k_ipad);
+ memset(k_opad, 0, sizeof k_opad);
+ memcpy(k_ipad, key, key_len);
+ memcpy(k_opad, key, key_len);
+
+ /* XOR key with ipad and opad values */
+ for (i=0; i<64; i++) {
+ k_ipad[i] ^= 0x36;
+ k_opad[i] ^= 0x5c;
+ }
+
+ /*
+ * perform inner MD5
+ */
+ MD5_Init(&context); /* init context for 1st pass */
+ MD5_Update(&context, k_ipad, 64); /* start with inner pad */
+ MD5_Update(&context, text, text_len); /* then text of datagram */
+ MD5_Final(digest, &context); /* finish up 1st pass */
+
+ /*
+ * perform outer MD5
+ */
+ MD5_Init(&context); /* init context for 2nd pass */
+ MD5_Update(&context, k_opad, 64); /* start with outer pad */
+ MD5_Update(&context, digest, 16); /* then results of 1st hash */
+ MD5_Final(digest, &context); /* finish up 2nd pass */
+}
+USES_APPLE_RST
+#endif
+
+#ifdef HAVE_LIBCRYPTO
+/*
+ * Verify a cryptographic signature of the packet.
+ * Currently only MD5 is supported.
+ */
+int
+signature_verify(netdissect_options *ndo,
+ const u_char *pptr, u_int plen, u_char *sig_ptr)
+{
+ uint8_t rcvsig[16];
+ uint8_t sig[16];
+ unsigned int i;
+
+ /*
+ * Save the signature before clearing it.
+ */
+ memcpy(rcvsig, sig_ptr, sizeof(rcvsig));
+ memset(sig_ptr, 0, sizeof(rcvsig));
+
+ if (!ndo->ndo_sigsecret) {
+ return (CANT_CHECK_SIGNATURE);
+ }
+
+ signature_compute_hmac_md5(pptr, plen, (unsigned char *)ndo->ndo_sigsecret,
+ strlen(ndo->ndo_sigsecret), sig);
+
+ if (memcmp(rcvsig, sig, sizeof(sig)) == 0) {
+ return (SIGNATURE_VALID);
+
+ } else {
+
+ for (i = 0; i < sizeof(sig); ++i) {
+ ND_PRINT((ndo, "%02x", sig[i]));
+ }
+
+ return (SIGNATURE_INVALID);
+ }
+}
+#endif
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ * 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.
+ *
+ * Functions for signature and digest verification.
+ *
+ * Original code by Hannes Gredler (hannes@juniper.net)
+ */
+
+/* for netdissect_options */
+#include "netdissect.h"
+
+/* signature checking result codes */
+#define SIGNATURE_VALID 0
+#define SIGNATURE_INVALID 1
+#define CANT_CHECK_SIGNATURE 2
+
+extern const struct tok signature_check_values[];
+extern int signature_verify(netdissect_options *, const u_char *, u_int, u_char *);
--- /dev/null
+/*
+ * Definitions for tcp compression routines.
+ *
+ * Copyright (c) 1989, 1990, 1992, 1993 Regents of the University of
+ * California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley. The name of the
+ * University 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 MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Van Jacobson (van@ee.lbl.gov), Dec 31, 1989:
+ * - Initial distribution.
+ */
+
+/*
+ * Compressed packet format:
+ *
+ * The first octet contains the packet type (top 3 bits), TCP
+ * 'push' bit, and flags that indicate which of the 4 TCP sequence
+ * numbers have changed (bottom 5 bits). The next octet is a
+ * conversation number that associates a saved IP/TCP header with
+ * the compressed packet. The next two octets are the TCP checksum
+ * from the original datagram. The next 0 to 15 octets are
+ * sequence number changes, one change per bit set in the header
+ * (there may be no changes and there are two special cases where
+ * the receiver implicitly knows what changed -- see below).
+ *
+ * There are 5 numbers which can change (they are always inserted
+ * in the following order): TCP urgent pointer, window,
+ * acknowlegement, sequence number and IP ID. (The urgent pointer
+ * is different from the others in that its value is sent, not the
+ * change in value.) Since typical use of SLIP links is biased
+ * toward small packets (see comments on MTU/MSS below), changes
+ * use a variable length coding with one octet for numbers in the
+ * range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the
+ * range 256 - 65535 or 0. (If the change in sequence number or
+ * ack is more than 65535, an uncompressed packet is sent.)
+ */
+
+/*
+ * Packet types (must not conflict with IP protocol version)
+ *
+ * The top nibble of the first octet is the packet type. There are
+ * three possible types: IP (not proto TCP or tcp with one of the
+ * control flags set); uncompressed TCP (a normal IP/TCP packet but
+ * with the 8-bit protocol field replaced by an 8-bit connection id --
+ * this type of packet syncs the sender & receiver); and compressed
+ * TCP (described above).
+ *
+ * LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and
+ * is logically part of the 4-bit "changes" field that follows. Top
+ * three bits are actual packet type. For backward compatibility
+ * and in the interest of conserving bits, numbers are chosen so the
+ * IP protocol version number (4) which normally appears in this nibble
+ * means "IP packet".
+ */
+
+/* packet types */
+#define TYPE_IP 0x40
+#define TYPE_UNCOMPRESSED_TCP 0x70
+#define TYPE_COMPRESSED_TCP 0x80
+#define TYPE_ERROR 0x00
+
+/* Bits in first octet of compressed packet */
+#define NEW_C 0x40 /* flag bits for what changed in a packet */
+#define NEW_I 0x20
+#define NEW_S 0x08
+#define NEW_A 0x04
+#define NEW_W 0x02
+#define NEW_U 0x01
+
+/* reserved, special-case values of above */
+#define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */
+#define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */
+#define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U)
+
+#define TCP_PUSH_BIT 0x10
--- /dev/null
+/*
+ * Copyright (C) Andrew Tridgell 1995-1999
+ *
+ * This software may be distributed either under the terms of the
+ * BSD-style license that accompanies tcpdump or the GNU GPL version 2
+ * or later
+ */
+
+/* for netdissect_options */
+#include "netdissect.h"
+
+/* the complete */
+#define SMBmkdir 0x00 /* create directory */
+#define SMBrmdir 0x01 /* delete directory */
+#define SMBopen 0x02 /* open file */
+#define SMBcreate 0x03 /* create file */
+#define SMBclose 0x04 /* close file */
+#define SMBflush 0x05 /* flush file */
+#define SMBunlink 0x06 /* delete file */
+#define SMBmv 0x07 /* rename file */
+#define SMBgetatr 0x08 /* get file attributes */
+#define SMBsetatr 0x09 /* set file attributes */
+#define SMBread 0x0A /* read from file */
+#define SMBwrite 0x0B /* write to file */
+#define SMBlock 0x0C /* lock byte range */
+#define SMBunlock 0x0D /* unlock byte range */
+#define SMBctemp 0x0E /* create temporary file */
+#define SMBmknew 0x0F /* make new file */
+#define SMBchkpth 0x10 /* check directory path */
+#define SMBexit 0x11 /* process exit */
+#define SMBlseek 0x12 /* seek */
+#define SMBtcon 0x70 /* tree connect */
+#define SMBtconX 0x75 /* tree connect and X*/
+#define SMBtdis 0x71 /* tree disconnect */
+#define SMBnegprot 0x72 /* negotiate protocol */
+#define SMBdskattr 0x80 /* get disk attributes */
+#define SMBsearch 0x81 /* search directory */
+#define SMBsplopen 0xC0 /* open print spool file */
+#define SMBsplwr 0xC1 /* write to print spool file */
+#define SMBsplclose 0xC2 /* close print spool file */
+#define SMBsplretq 0xC3 /* return print queue */
+#define SMBsends 0xD0 /* send single block message */
+#define SMBsendb 0xD1 /* send broadcast message */
+#define SMBfwdname 0xD2 /* forward user name */
+#define SMBcancelf 0xD3 /* cancel forward */
+#define SMBgetmac 0xD4 /* get machine name */
+#define SMBsendstrt 0xD5 /* send start of multi-block message */
+#define SMBsendend 0xD6 /* send end of multi-block message */
+#define SMBsendtxt 0xD7 /* send text of multi-block message */
+
+/* Core+ protocol */
+#define SMBlockread 0x13 /* Lock a range and read */
+#define SMBwriteunlock 0x14 /* Unlock a range then write */
+#define SMBreadbraw 0x1a /* read a block of data with no smb header */
+#define SMBwritebraw 0x1d /* write a block of data with no smb header */
+#define SMBwritec 0x20 /* secondary write request */
+#define SMBwriteclose 0x2c /* write a file then close it */
+
+/* dos extended protocol */
+#define SMBreadBraw 0x1A /* read block raw */
+#define SMBreadBmpx 0x1B /* read block multiplexed */
+#define SMBreadBs 0x1C /* read block (secondary response) */
+#define SMBwriteBraw 0x1D /* write block raw */
+#define SMBwriteBmpx 0x1E /* write block multiplexed */
+#define SMBwriteBs 0x1F /* write block (secondary request) */
+#define SMBwriteC 0x20 /* write complete response */
+#define SMBsetattrE 0x22 /* set file attributes expanded */
+#define SMBgetattrE 0x23 /* get file attributes expanded */
+#define SMBlockingX 0x24 /* lock/unlock byte ranges and X */
+#define SMBtrans 0x25 /* transaction - name, bytes in/out */
+#define SMBtranss 0x26 /* transaction (secondary request/response) */
+#define SMBioctl 0x27 /* IOCTL */
+#define SMBioctls 0x28 /* IOCTL (secondary request/response) */
+#define SMBcopy 0x29 /* copy */
+#define SMBmove 0x2A /* move */
+#define SMBecho 0x2B /* echo */
+#define SMBopenX 0x2D /* open and X */
+#define SMBreadX 0x2E /* read and X */
+#define SMBwriteX 0x2F /* write and X */
+#define SMBsesssetupX 0x73 /* Session Set Up & X (including User Logon) */
+#define SMBffirst 0x82 /* find first */
+#define SMBfunique 0x83 /* find unique */
+#define SMBfclose 0x84 /* find close */
+#define SMBinvalid 0xFE /* invalid command */
+
+/* Extended 2.0 protocol */
+#define SMBtrans2 0x32 /* TRANS2 protocol set */
+#define SMBtranss2 0x33 /* TRANS2 protocol set, secondary command */
+#define SMBfindclose 0x34 /* Terminate a TRANSACT2_FINDFIRST */
+#define SMBfindnclose 0x35 /* Terminate a TRANSACT2_FINDNOTIFYFIRST */
+#define SMBulogoffX 0x74 /* user logoff */
+
+/* NT SMB extensions. */
+#define SMBnttrans 0xA0 /* NT transact */
+#define SMBnttranss 0xA1 /* NT transact secondary */
+#define SMBntcreateX 0xA2 /* NT create and X */
+#define SMBntcancel 0xA4 /* NT cancel */
+
+/* pathworks special */
+#define pSETDIR '\377'
+
+
+/* these are the TRANS2 sub commands */
+#define TRANSACT2_OPEN 0
+#define TRANSACT2_FINDFIRST 1
+#define TRANSACT2_FINDNEXT 2
+#define TRANSACT2_QFSINFO 3
+#define TRANSACT2_SETFSINFO 4
+#define TRANSACT2_QPATHINFO 5
+#define TRANSACT2_SETPATHINFO 6
+#define TRANSACT2_QFILEINFO 7
+#define TRANSACT2_SETFILEINFO 8
+#define TRANSACT2_FSCTL 9
+#define TRANSACT2_IOCTL 10
+#define TRANSACT2_FINDNOTIFYFIRST 11
+#define TRANSACT2_FINDNOTIFYNEXT 12
+#define TRANSACT2_MKDIR 13
+
+#define PTR_DIFF(p1, p2) ((size_t)(((char *)(p1)) - (char *)(p2)))
+
+/* some protos */
+const u_char *smb_fdata(netdissect_options *, const u_char *, const char *, const u_char *, int);
--- /dev/null
+/*
+ * Copyright (C) Andrew Tridgell 1995-1999
+ *
+ * This software may be distributed either under the terms of the
+ * BSD-style license that accompanies tcpdump or the GNU GPL version 2
+ * or later
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: smbutil.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#define NETDISSECT_REWORKED
+#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 "smb.h"
+
+static uint32_t stringlen;
+extern const u_char *startbuf;
+
+/*
+ * interpret a 32 bit dos packed date/time to some parameters
+ */
+static void
+interpret_dos_date(uint32_t date, struct tm *tp)
+{
+ uint32_t p0, p1, p2, p3;
+
+ p0 = date & 0xFF;
+ p1 = ((date & 0xFF00) >> 8) & 0xFF;
+ p2 = ((date & 0xFF0000) >> 16) & 0xFF;
+ p3 = ((date & 0xFF000000) >> 24) & 0xFF;
+
+ tp->tm_sec = 2 * (p0 & 0x1F);
+ tp->tm_min = ((p0 >> 5) & 0xFF) + ((p1 & 0x7) << 3);
+ tp->tm_hour = (p1 >> 3) & 0xFF;
+ tp->tm_mday = (p2 & 0x1F);
+ tp->tm_mon = ((p2 >> 5) & 0xFF) + ((p3 & 0x1) << 3) - 1;
+ tp->tm_year = ((p3 >> 1) & 0xFF) + 80;
+}
+
+/*
+ * common portion:
+ * create a unix date from a dos date
+ */
+static time_t
+int_unix_date(uint32_t dos_date)
+{
+ struct tm t;
+
+ if (dos_date == 0)
+ return(0);
+
+ interpret_dos_date(dos_date, &t);
+ t.tm_wday = 1;
+ t.tm_yday = 1;
+ t.tm_isdst = 0;
+
+ return (mktime(&t));
+}
+
+/*
+ * create a unix date from a dos date
+ * in network byte order
+ */
+static time_t
+make_unix_date(const u_char *date_ptr)
+{
+ uint32_t dos_date = 0;
+
+ dos_date = EXTRACT_LE_32BITS(date_ptr);
+
+ return int_unix_date(dos_date);
+}
+
+/*
+ * create a unix date from a dos date
+ * in halfword-swapped network byte order!
+ */
+static time_t
+make_unix_date2(const u_char *date_ptr)
+{
+ uint32_t x, x2;
+
+ x = EXTRACT_LE_32BITS(date_ptr);
+ x2 = ((x & 0xFFFF) << 16) | ((x & 0xFFFF0000) >> 16);
+ return int_unix_date(x2);
+}
+
+/*
+ * interpret an 8 byte "filetime" structure to a time_t
+ * It's originally in "100ns units since jan 1st 1601"
+ */
+static time_t
+interpret_long_date(const u_char *p)
+{
+ double d;
+ time_t ret;
+
+ /* this gives us seconds since jan 1st 1601 (approx) */
+ d = (EXTRACT_LE_32BITS(p + 4) * 256.0 + p[3]) * (1.0e-7 * (1 << 24));
+
+ /* now adjust by 369 years to make the secs since 1970 */
+ d -= 369.0 * 365.25 * 24 * 60 * 60;
+
+ /* and a fudge factor as we got it wrong by a few days */
+ d += (3 * 24 * 60 * 60 + 6 * 60 * 60 + 2);
+
+ if (d < 0)
+ return(0);
+
+ ret = (time_t)d;
+
+ return(ret);
+}
+
+/*
+ * interpret the weird netbios "name". Return the name type, or -1 if
+ * we run past the end of the buffer
+ */
+static int
+name_interpret(netdissect_options *ndo,
+ const u_char *in, const u_char *maxbuf, char *out)
+{
+ int ret;
+ int len;
+
+ if (in >= maxbuf)
+ return(-1); /* name goes past the end of the buffer */
+ ND_TCHECK2(*in, 1);
+ len = (*in++) / 2;
+
+ *out=0;
+
+ if (len > 30 || len < 1)
+ return(0);
+
+ while (len--) {
+ ND_TCHECK2(*in, 2);
+ if (in + 1 >= maxbuf)
+ return(-1); /* name goes past the end of the buffer */
+ if (in[0] < 'A' || in[0] > 'P' || in[1] < 'A' || in[1] > 'P') {
+ *out = 0;
+ return(0);
+ }
+ *out = ((in[0] - 'A') << 4) + (in[1] - 'A');
+ in += 2;
+ out++;
+ }
+ *out = 0;
+ ret = out[-1];
+
+ return(ret);
+
+trunc:
+ return(-1);
+}
+
+/*
+ * find a pointer to a netbios name
+ */
+static const u_char *
+name_ptr(netdissect_options *ndo,
+ const u_char *buf, int ofs, const u_char *maxbuf)
+{
+ const u_char *p;
+ u_char c;
+
+ p = buf + ofs;
+ if (p >= maxbuf)
+ return(NULL); /* name goes past the end of the buffer */
+ ND_TCHECK2(*p, 1);
+
+ c = *p;
+
+ /* XXX - this should use the same code that the DNS dissector does */
+ if ((c & 0xC0) == 0xC0) {
+ uint16_t l;
+
+ ND_TCHECK2(*p, 2);
+ if ((p + 1) >= maxbuf)
+ return(NULL); /* name goes past the end of the buffer */
+ l = EXTRACT_16BITS(p) & 0x3FFF;
+ if (l == 0) {
+ /* We have a pointer that points to itself. */
+ return(NULL);
+ }
+ p = buf + l;
+ if (p >= maxbuf)
+ return(NULL); /* name goes past the end of the buffer */
+ ND_TCHECK2(*p, 1);
+ }
+ return(p);
+
+trunc:
+ return(NULL); /* name goes past the end of the buffer */
+}
+
+/*
+ * extract a netbios name from a buf
+ */
+static int
+name_extract(netdissect_options *ndo,
+ const u_char *buf, int ofs, const u_char *maxbuf, char *name)
+{
+ const u_char *p = name_ptr(ndo, buf, ofs, maxbuf);
+ if (p == NULL)
+ return(-1); /* error (probably name going past end of buffer) */
+ name[0] = '\0';
+ return(name_interpret(ndo, p, maxbuf, name));
+}
+
+
+/*
+ * return the total storage length of a mangled name
+ */
+static int
+name_len(netdissect_options *ndo,
+ const unsigned char *s, const unsigned char *maxbuf)
+{
+ const unsigned char *s0 = s;
+ unsigned char c;
+
+ if (s >= maxbuf)
+ return(-1); /* name goes past the end of the buffer */
+ ND_TCHECK2(*s, 1);
+ c = *s;
+ if ((c & 0xC0) == 0xC0)
+ return(2);
+ while (*s) {
+ if (s >= maxbuf)
+ return(-1); /* name goes past the end of the buffer */
+ ND_TCHECK2(*s, 1);
+ s += (*s) + 1;
+ }
+ return(PTR_DIFF(s, s0) + 1);
+
+trunc:
+ return(-1); /* name goes past the end of the buffer */
+}
+
+static void
+print_asc(netdissect_options *ndo,
+ const unsigned char *buf, int len)
+{
+ int i;
+ for (i = 0; i < len; i++)
+ safeputchar(ndo, buf[i]);
+}
+
+static const char *
+name_type_str(int name_type)
+{
+ const char *f = NULL;
+
+ switch (name_type) {
+ case 0: f = "Workstation"; break;
+ case 0x03: f = "Client?"; break;
+ case 0x20: f = "Server"; break;
+ case 0x1d: f = "Master Browser"; break;
+ case 0x1b: f = "Domain Controller"; break;
+ case 0x1e: f = "Browser Server"; break;
+ default: f = "Unknown"; break;
+ }
+ return(f);
+}
+
+void
+print_data(netdissect_options *ndo,
+ const unsigned char *buf, int len)
+{
+ int i = 0;
+
+ if (len <= 0)
+ return;
+ ND_PRINT((ndo, "[%03X] ", i));
+ for (i = 0; i < len; /*nothing*/) {
+ ND_TCHECK(buf[i]);
+ ND_PRINT((ndo, "%02X ", buf[i] & 0xff));
+ i++;
+ if (i%8 == 0)
+ ND_PRINT((ndo, " "));
+ if (i % 16 == 0) {
+ print_asc(ndo, &buf[i - 16], 8);
+ ND_PRINT((ndo, " "));
+ print_asc(ndo, &buf[i - 8], 8);
+ ND_PRINT((ndo, "\n"));
+ if (i < len)
+ ND_PRINT((ndo, "[%03X] ", i));
+ }
+ }
+ if (i % 16) {
+ int n;
+
+ n = 16 - (i % 16);
+ ND_PRINT((ndo, " "));
+ if (n>8)
+ ND_PRINT((ndo, " "));
+ while (n--)
+ ND_PRINT((ndo, " "));
+
+ n = min(8, i % 16);
+ print_asc(ndo, &buf[i - (i % 16)], n);
+ ND_PRINT((ndo, " "));
+ n = (i % 16) - n;
+ if (n > 0)
+ print_asc(ndo, &buf[i - n], n);
+ ND_PRINT((ndo, "\n"));
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "\n"));
+ ND_PRINT((ndo, "WARNING: Short packet. Try increasing the snap length\n"));
+}
+
+
+static void
+write_bits(netdissect_options *ndo,
+ unsigned int val, const char *fmt)
+{
+ const char *p = fmt;
+ int i = 0;
+
+ while ((p = strchr(fmt, '|'))) {
+ size_t l = PTR_DIFF(p, fmt);
+ if (l && (val & (1 << i)))
+ ND_PRINT((ndo, "%.*s ", (int)l, fmt));
+ fmt = p + 1;
+ i++;
+ }
+}
+
+/* convert a UCS-2 string into an ASCII string */
+#define MAX_UNISTR_SIZE 1000
+static const char *
+unistr(netdissect_options *ndo,
+ const u_char *s, uint32_t *len, int use_unicode)
+{
+ static char buf[MAX_UNISTR_SIZE+1];
+ size_t l = 0;
+ uint32_t strsize;
+ const u_char *sp;
+
+ if (use_unicode) {
+ /*
+ * Skip padding that puts the string on an even boundary.
+ */
+ if (((s - startbuf) % 2) != 0) {
+ ND_TCHECK(s[0]);
+ s++;
+ }
+ }
+ if (*len == 0) {
+ /*
+ * Null-terminated string.
+ */
+ strsize = 0;
+ sp = s;
+ if (!use_unicode) {
+ for (;;) {
+ ND_TCHECK(sp[0]);
+ *len += 1;
+ if (sp[0] == 0)
+ break;
+ sp++;
+ }
+ strsize = *len - 1;
+ } else {
+ for (;;) {
+ ND_TCHECK2(sp[0], 2);
+ *len += 2;
+ if (sp[0] == 0 && sp[1] == 0)
+ break;
+ sp += 2;
+ }
+ strsize = *len - 2;
+ }
+ } else {
+ /*
+ * Counted string.
+ */
+ strsize = *len;
+ }
+ if (!use_unicode) {
+ while (strsize != 0) {
+ ND_TCHECK(s[0]);
+ if (l >= MAX_UNISTR_SIZE)
+ break;
+ if (ND_ISPRINT(s[0]))
+ buf[l] = s[0];
+ else {
+ if (s[0] == 0)
+ break;
+ buf[l] = '.';
+ }
+ l++;
+ s++;
+ strsize--;
+ }
+ } else {
+ while (strsize != 0) {
+ ND_TCHECK2(s[0], 2);
+ if (l >= MAX_UNISTR_SIZE)
+ break;
+ if (s[1] == 0 && ND_ISPRINT(s[0])) {
+ /* It's a printable ASCII character */
+ buf[l] = s[0];
+ } else {
+ /* It's a non-ASCII character or a non-printable ASCII character */
+ if (s[0] == 0 && s[1] == 0)
+ break;
+ buf[l] = '.';
+ }
+ l++;
+ s += 2;
+ if (strsize == 1)
+ break;
+ strsize -= 2;
+ }
+ }
+ buf[l] = 0;
+ return buf;
+
+trunc:
+ return NULL;
+}
+
+static const u_char *
+smb_fdata1(netdissect_options *ndo,
+ const u_char *buf, const char *fmt, const u_char *maxbuf,
+ int unicodestr)
+{
+ int reverse = 0;
+ const char *attrib_fmt = "READONLY|HIDDEN|SYSTEM|VOLUME|DIR|ARCHIVE|";
+
+ while (*fmt && buf<maxbuf) {
+ switch (*fmt) {
+ case 'a':
+ ND_TCHECK(buf[0]);
+ write_bits(ndo, buf[0], attrib_fmt);
+ buf++;
+ fmt++;
+ break;
+
+ case 'A':
+ ND_TCHECK2(buf[0], 2);
+ write_bits(ndo, EXTRACT_LE_16BITS(buf), attrib_fmt);
+ buf += 2;
+ fmt++;
+ break;
+
+ case '{':
+ {
+ char bitfmt[128];
+ char *p;
+ int l;
+
+ p = strchr(++fmt, '}');
+ l = PTR_DIFF(p, fmt);
+
+ if ((unsigned int)l > sizeof(bitfmt) - 1)
+ l = sizeof(bitfmt)-1;
+
+ strncpy(bitfmt, fmt, l);
+ bitfmt[l] = '\0';
+ fmt = p + 1;
+ ND_TCHECK(buf[0]);
+ write_bits(ndo, buf[0], bitfmt);
+ buf++;
+ break;
+ }
+
+ case 'P':
+ {
+ int l = atoi(fmt + 1);
+ ND_TCHECK2(buf[0], l);
+ buf += l;
+ fmt++;
+ while (isdigit((unsigned char)*fmt))
+ fmt++;
+ break;
+ }
+ case 'r':
+ reverse = !reverse;
+ fmt++;
+ break;
+ case 'b':
+ {
+ unsigned int x;
+ ND_TCHECK(buf[0]);
+ x = buf[0];
+ ND_PRINT((ndo, "%u (0x%x)", x, x));
+ buf += 1;
+ fmt++;
+ break;
+ }
+ case 'd':
+ {
+ unsigned int x;
+ ND_TCHECK2(buf[0], 2);
+ x = reverse ? EXTRACT_16BITS(buf) :
+ EXTRACT_LE_16BITS(buf);
+ ND_PRINT((ndo, "%d (0x%x)", x, x));
+ buf += 2;
+ fmt++;
+ break;
+ }
+ case 'D':
+ {
+ unsigned int x;
+ ND_TCHECK2(buf[0], 4);
+ x = reverse ? EXTRACT_32BITS(buf) :
+ EXTRACT_LE_32BITS(buf);
+ ND_PRINT((ndo, "%d (0x%x)", x, x));
+ buf += 4;
+ fmt++;
+ break;
+ }
+ case 'L':
+ {
+ uint64_t x;
+ ND_TCHECK2(buf[0], 8);
+ x = reverse ? EXTRACT_64BITS(buf) :
+ EXTRACT_LE_64BITS(buf);
+ ND_PRINT((ndo, "%" PRIu64 " (0x%" PRIx64 ")", x, x));
+ buf += 8;
+ fmt++;
+ break;
+ }
+ case 'M':
+ {
+ /* Weird mixed-endian length values in 64-bit locks */
+ uint32_t x1, x2;
+ uint64_t x;
+ ND_TCHECK2(buf[0], 8);
+ x1 = reverse ? EXTRACT_32BITS(buf) :
+ EXTRACT_LE_32BITS(buf);
+ x2 = reverse ? EXTRACT_32BITS(buf + 4) :
+ EXTRACT_LE_32BITS(buf + 4);
+ x = (((uint64_t)x1) << 32) | x2;
+ ND_PRINT((ndo, "%" PRIu64 " (0x%" PRIx64 ")", x, x));
+ buf += 8;
+ fmt++;
+ break;
+ }
+ case 'B':
+ {
+ unsigned int x;
+ ND_TCHECK(buf[0]);
+ x = buf[0];
+ ND_PRINT((ndo, "0x%X", x));
+ buf += 1;
+ fmt++;
+ break;
+ }
+ case 'w':
+ {
+ unsigned int x;
+ ND_TCHECK2(buf[0], 2);
+ x = reverse ? EXTRACT_16BITS(buf) :
+ EXTRACT_LE_16BITS(buf);
+ ND_PRINT((ndo, "0x%X", x));
+ buf += 2;
+ fmt++;
+ break;
+ }
+ case 'W':
+ {
+ unsigned int x;
+ ND_TCHECK2(buf[0], 4);
+ x = reverse ? EXTRACT_32BITS(buf) :
+ EXTRACT_LE_32BITS(buf);
+ ND_PRINT((ndo, "0x%X", x));
+ buf += 4;
+ fmt++;
+ break;
+ }
+ case 'l':
+ {
+ fmt++;
+ switch (*fmt) {
+
+ case 'b':
+ ND_TCHECK(buf[0]);
+ stringlen = buf[0];
+ ND_PRINT((ndo, "%u", stringlen));
+ buf += 1;
+ break;
+
+ case 'd':
+ ND_TCHECK2(buf[0], 2);
+ stringlen = reverse ? EXTRACT_16BITS(buf) :
+ EXTRACT_LE_16BITS(buf);
+ ND_PRINT((ndo, "%u", stringlen));
+ buf += 2;
+ break;
+
+ case 'D':
+ ND_TCHECK2(buf[0], 4);
+ stringlen = reverse ? EXTRACT_32BITS(buf) :
+ EXTRACT_LE_32BITS(buf);
+ ND_PRINT((ndo, "%u", stringlen));
+ buf += 4;
+ break;
+ }
+ fmt++;
+ break;
+ }
+ case 'S':
+ case 'R': /* like 'S', but always ASCII */
+ {
+ /*XXX unistr() */
+ const char *s;
+ uint32_t len;
+
+ len = 0;
+ s = unistr(ndo, buf, &len, (*fmt == 'R') ? 0 : unicodestr);
+ if (s == NULL)
+ goto trunc;
+ ND_PRINT((ndo, "%s", s));
+ buf += len;
+ fmt++;
+ break;
+ }
+ case 'Z':
+ case 'Y': /* like 'Z', but always ASCII */
+ {
+ const char *s;
+ uint32_t len;
+
+ ND_TCHECK(*buf);
+ if (*buf != 4 && *buf != 2) {
+ ND_PRINT((ndo, "Error! ASCIIZ buffer of type %u", *buf));
+ return maxbuf; /* give up */
+ }
+ len = 0;
+ s = unistr(ndo, buf + 1, &len, (*fmt == 'Y') ? 0 : unicodestr);
+ if (s == NULL)
+ goto trunc;
+ ND_PRINT((ndo, "%s", s));
+ buf += len + 1;
+ fmt++;
+ break;
+ }
+ case 's':
+ {
+ int l = atoi(fmt + 1);
+ ND_TCHECK2(*buf, l);
+ ND_PRINT((ndo, "%-*.*s", l, l, buf));
+ buf += l;
+ fmt++;
+ while (isdigit((unsigned char)*fmt))
+ fmt++;
+ break;
+ }
+ case 'c':
+ {
+ ND_TCHECK2(*buf, stringlen);
+ ND_PRINT((ndo, "%-*.*s", (int)stringlen, (int)stringlen, buf));
+ buf += stringlen;
+ fmt++;
+ while (isdigit((unsigned char)*fmt))
+ fmt++;
+ break;
+ }
+ case 'C':
+ {
+ const char *s;
+ s = unistr(ndo, buf, &stringlen, unicodestr);
+ if (s == NULL)
+ goto trunc;
+ ND_PRINT((ndo, "%s", s));
+ buf += stringlen;
+ fmt++;
+ break;
+ }
+ case 'h':
+ {
+ int l = atoi(fmt + 1);
+ ND_TCHECK2(*buf, l);
+ while (l--)
+ ND_PRINT((ndo, "%02x", *buf++));
+ fmt++;
+ while (isdigit((unsigned char)*fmt))
+ fmt++;
+ break;
+ }
+ case 'n':
+ {
+ int t = atoi(fmt+1);
+ char nbuf[255];
+ int name_type;
+ int len;
+
+ switch (t) {
+ case 1:
+ name_type = name_extract(ndo, startbuf, PTR_DIFF(buf, startbuf),
+ maxbuf, nbuf);
+ if (name_type < 0)
+ goto trunc;
+ len = name_len(ndo, buf, maxbuf);
+ if (len < 0)
+ goto trunc;
+ buf += len;
+ ND_PRINT((ndo, "%-15.15s NameType=0x%02X (%s)", nbuf, name_type,
+ name_type_str(name_type)));
+ break;
+ case 2:
+ ND_TCHECK(buf[15]);
+ name_type = buf[15];
+ ND_PRINT((ndo, "%-15.15s NameType=0x%02X (%s)", buf, name_type,
+ name_type_str(name_type)));
+ buf += 16;
+ break;
+ }
+ fmt++;
+ while (isdigit((unsigned char)*fmt))
+ fmt++;
+ break;
+ }
+ case 'T':
+ {
+ time_t t;
+ struct tm *lt;
+ const char *tstring;
+ uint32_t x;
+
+ switch (atoi(fmt + 1)) {
+ case 1:
+ ND_TCHECK2(buf[0], 4);
+ x = EXTRACT_LE_32BITS(buf);
+ if (x == 0 || x == 0xFFFFFFFF)
+ t = 0;
+ else
+ t = make_unix_date(buf);
+ buf += 4;
+ break;
+ case 2:
+ ND_TCHECK2(buf[0], 4);
+ x = EXTRACT_LE_32BITS(buf);
+ if (x == 0 || x == 0xFFFFFFFF)
+ t = 0;
+ else
+ t = make_unix_date2(buf);
+ buf += 4;
+ break;
+ case 3:
+ ND_TCHECK2(buf[0], 8);
+ t = interpret_long_date(buf);
+ buf += 8;
+ break;
+ default:
+ t = 0;
+ break;
+ }
+ if (t != 0) {
+ lt = localtime(&t);
+ if (lt != NULL)
+ tstring = asctime(lt);
+ else
+ tstring = "(Can't convert time)\n";
+ } else
+ tstring = "NULL\n";
+ ND_PRINT((ndo, "%s", tstring));
+ fmt++;
+ while (isdigit((unsigned char)*fmt))
+ fmt++;
+ break;
+ }
+ default:
+ ND_PRINT((ndo, "%c", *fmt));
+ fmt++;
+ break;
+ }
+ }
+
+ if (buf >= maxbuf && *fmt)
+ ND_PRINT((ndo, "END OF BUFFER\n"));
+
+ return(buf);
+
+trunc:
+ ND_PRINT((ndo, "\n"));
+ ND_PRINT((ndo, "WARNING: Short packet. Try increasing the snap length\n"));
+ return(NULL);
+}
+
+const u_char *
+smb_fdata(netdissect_options *ndo,
+ const u_char *buf, const char *fmt, const u_char *maxbuf,
+ int unicodestr)
+{
+ static int depth = 0;
+ char s[128];
+ char *p;
+
+ while (*fmt) {
+ switch (*fmt) {
+ case '*':
+ fmt++;
+ while (buf < maxbuf) {
+ const u_char *buf2;
+ depth++;
+ buf2 = smb_fdata(ndo, buf, fmt, maxbuf, unicodestr);
+ depth--;
+ if (buf2 == NULL)
+ return(NULL);
+ if (buf2 == buf)
+ return(buf);
+ buf = buf2;
+ }
+ return(buf);
+
+ case '|':
+ fmt++;
+ if (buf >= maxbuf)
+ return(buf);
+ break;
+
+ case '%':
+ fmt++;
+ buf = maxbuf;
+ break;
+
+ case '#':
+ fmt++;
+ return(buf);
+ break;
+
+ case '[':
+ fmt++;
+ if (buf >= maxbuf)
+ return(buf);
+ memset(s, 0, sizeof(s));
+ p = strchr(fmt, ']');
+ if ((size_t)(p - fmt + 1) > sizeof(s)) {
+ /* overrun */
+ return(buf);
+ }
+ strncpy(s, fmt, p - fmt);
+ s[p - fmt] = '\0';
+ fmt = p + 1;
+ buf = smb_fdata1(ndo, buf, s, maxbuf, unicodestr);
+ if (buf == NULL)
+ return(NULL);
+ break;
+
+ default:
+ ND_PRINT((ndo, "%c", *fmt));
+ fmt++;
+ break;
+ }
+ }
+ if (!depth && buf < maxbuf) {
+ size_t len = PTR_DIFF(maxbuf, buf);
+ ND_PRINT((ndo, "Data: (%lu bytes)\n", (unsigned long)len));
+ print_data(ndo, buf, len);
+ return(buf + len);
+ }
+ return(buf);
+}
+
+typedef struct {
+ const char *name;
+ int code;
+ const char *message;
+} err_code_struct;
+
+/* DOS Error Messages */
+static const err_code_struct dos_msgs[] = {
+ { "ERRbadfunc", 1, "Invalid function." },
+ { "ERRbadfile", 2, "File not found." },
+ { "ERRbadpath", 3, "Directory invalid." },
+ { "ERRnofids", 4, "No file descriptors available" },
+ { "ERRnoaccess", 5, "Access denied." },
+ { "ERRbadfid", 6, "Invalid file handle." },
+ { "ERRbadmcb", 7, "Memory control blocks destroyed." },
+ { "ERRnomem", 8, "Insufficient server memory to perform the requested function." },
+ { "ERRbadmem", 9, "Invalid memory block address." },
+ { "ERRbadenv", 10, "Invalid environment." },
+ { "ERRbadformat", 11, "Invalid format." },
+ { "ERRbadaccess", 12, "Invalid open mode." },
+ { "ERRbaddata", 13, "Invalid data." },
+ { "ERR", 14, "reserved." },
+ { "ERRbaddrive", 15, "Invalid drive specified." },
+ { "ERRremcd", 16, "A Delete Directory request attempted to remove the server's current directory." },
+ { "ERRdiffdevice", 17, "Not same device." },
+ { "ERRnofiles", 18, "A File Search command can find no more files matching the specified criteria." },
+ { "ERRbadshare", 32, "The sharing mode specified for an Open conflicts with existing FIDs on the file." },
+ { "ERRlock", 33, "A Lock request conflicted with an existing lock or specified an invalid mode, or an Unlock requested attempted to remove a lock held by another process." },
+ { "ERRfilexists", 80, "The file named in a Create Directory, Make New File or Link request already exists." },
+ { "ERRbadpipe", 230, "Pipe invalid." },
+ { "ERRpipebusy", 231, "All instances of the requested pipe are busy." },
+ { "ERRpipeclosing", 232, "Pipe close in progress." },
+ { "ERRnotconnected", 233, "No process on other end of pipe." },
+ { "ERRmoredata", 234, "There is more data to be returned." },
+ { NULL, -1, NULL }
+ };
+
+/* Server Error Messages */
+static const err_code_struct server_msgs[] = {
+ { "ERRerror", 1, "Non-specific error code." },
+ { "ERRbadpw", 2, "Bad password - name/password pair in a Tree Connect or Session Setup are invalid." },
+ { "ERRbadtype", 3, "reserved." },
+ { "ERRaccess", 4, "The requester does not have the necessary access rights within the specified context for the requested function. The context is defined by the TID or the UID." },
+ { "ERRinvnid", 5, "The tree ID (TID) specified in a command was invalid." },
+ { "ERRinvnetname", 6, "Invalid network name in tree connect." },
+ { "ERRinvdevice", 7, "Invalid device - printer request made to non-printer connection or non-printer request made to printer connection." },
+ { "ERRqfull", 49, "Print queue full (files) -- returned by open print file." },
+ { "ERRqtoobig", 50, "Print queue full -- no space." },
+ { "ERRqeof", 51, "EOF on print queue dump." },
+ { "ERRinvpfid", 52, "Invalid print file FID." },
+ { "ERRsmbcmd", 64, "The server did not recognize the command received." },
+ { "ERRsrverror", 65, "The server encountered an internal error, e.g., system file unavailable." },
+ { "ERRfilespecs", 67, "The file handle (FID) and pathname parameters contained an invalid combination of values." },
+ { "ERRreserved", 68, "reserved." },
+ { "ERRbadpermits", 69, "The access permissions specified for a file or directory are not a valid combination. The server cannot set the requested attribute." },
+ { "ERRreserved", 70, "reserved." },
+ { "ERRsetattrmode", 71, "The attribute mode in the Set File Attribute request is invalid." },
+ { "ERRpaused", 81, "Server is paused." },
+ { "ERRmsgoff", 82, "Not receiving messages." },
+ { "ERRnoroom", 83, "No room to buffer message." },
+ { "ERRrmuns", 87, "Too many remote user names." },
+ { "ERRtimeout", 88, "Operation timed out." },
+ { "ERRnoresource", 89, "No resources currently available for request." },
+ { "ERRtoomanyuids", 90, "Too many UIDs active on this session." },
+ { "ERRbaduid", 91, "The UID is not known as a valid ID on this session." },
+ { "ERRusempx", 250, "Temp unable to support Raw, use MPX mode." },
+ { "ERRusestd", 251, "Temp unable to support Raw, use standard read/write." },
+ { "ERRcontmpx", 252, "Continue in MPX mode." },
+ { "ERRreserved", 253, "reserved." },
+ { "ERRreserved", 254, "reserved." },
+ { "ERRnosupport", 0xFFFF, "Function not supported." },
+ { NULL, -1, NULL }
+};
+
+/* Hard Error Messages */
+static const err_code_struct hard_msgs[] = {
+ { "ERRnowrite", 19, "Attempt to write on write-protected diskette." },
+ { "ERRbadunit", 20, "Unknown unit." },
+ { "ERRnotready", 21, "Drive not ready." },
+ { "ERRbadcmd", 22, "Unknown command." },
+ { "ERRdata", 23, "Data error (CRC)." },
+ { "ERRbadreq", 24, "Bad request structure length." },
+ { "ERRseek", 25 , "Seek error." },
+ { "ERRbadmedia", 26, "Unknown media type." },
+ { "ERRbadsector", 27, "Sector not found." },
+ { "ERRnopaper", 28, "Printer out of paper." },
+ { "ERRwrite", 29, "Write fault." },
+ { "ERRread", 30, "Read fault." },
+ { "ERRgeneral", 31, "General failure." },
+ { "ERRbadshare", 32, "A open conflicts with an existing open." },
+ { "ERRlock", 33, "A Lock request conflicted with an existing lock or specified an invalid mode, or an Unlock requested attempted to remove a lock held by another process." },
+ { "ERRwrongdisk", 34, "The wrong disk was found in a drive." },
+ { "ERRFCBUnavail", 35, "No FCBs are available to process request." },
+ { "ERRsharebufexc", 36, "A sharing buffer has been exceeded." },
+ { NULL, -1, NULL }
+};
+
+static const struct {
+ int code;
+ const char *class;
+ const err_code_struct *err_msgs;
+} err_classes[] = {
+ { 0, "SUCCESS", NULL },
+ { 0x01, "ERRDOS", dos_msgs },
+ { 0x02, "ERRSRV", server_msgs },
+ { 0x03, "ERRHRD", hard_msgs },
+ { 0x04, "ERRXOS", NULL },
+ { 0xE1, "ERRRMX1", NULL },
+ { 0xE2, "ERRRMX2", NULL },
+ { 0xE3, "ERRRMX3", NULL },
+ { 0xFF, "ERRCMD", NULL },
+ { -1, NULL, NULL }
+};
+
+/*
+ * return a SMB error string from a SMB buffer
+ */
+char *
+smb_errstr(int class, int num)
+{
+ static char ret[128];
+ int i, j;
+
+ ret[0] = 0;
+
+ for (i = 0; err_classes[i].class; i++)
+ if (err_classes[i].code == class) {
+ if (err_classes[i].err_msgs) {
+ const err_code_struct *err = err_classes[i].err_msgs;
+ for (j = 0; err[j].name; j++)
+ if (num == err[j].code) {
+ snprintf(ret, sizeof(ret), "%s - %s (%s)",
+ err_classes[i].class, err[j].name, err[j].message);
+ return ret;
+ }
+ }
+
+ snprintf(ret, sizeof(ret), "%s - %d", err_classes[i].class, num);
+ return ret;
+ }
+
+ snprintf(ret, sizeof(ret), "ERROR: Unknown error (%d,%d)", class, num);
+ return(ret);
+}
+
+typedef struct {
+ uint32_t code;
+ const char *name;
+} nt_err_code_struct;
+
+/*
+ * NT Error codes
+ */
+static const nt_err_code_struct nt_errors[] = {
+ { 0x00000000, "STATUS_SUCCESS" },
+ { 0x00000000, "STATUS_WAIT_0" },
+ { 0x00000001, "STATUS_WAIT_1" },
+ { 0x00000002, "STATUS_WAIT_2" },
+ { 0x00000003, "STATUS_WAIT_3" },
+ { 0x0000003F, "STATUS_WAIT_63" },
+ { 0x00000080, "STATUS_ABANDONED" },
+ { 0x00000080, "STATUS_ABANDONED_WAIT_0" },
+ { 0x000000BF, "STATUS_ABANDONED_WAIT_63" },
+ { 0x000000C0, "STATUS_USER_APC" },
+ { 0x00000100, "STATUS_KERNEL_APC" },
+ { 0x00000101, "STATUS_ALERTED" },
+ { 0x00000102, "STATUS_TIMEOUT" },
+ { 0x00000103, "STATUS_PENDING" },
+ { 0x00000104, "STATUS_REPARSE" },
+ { 0x00000105, "STATUS_MORE_ENTRIES" },
+ { 0x00000106, "STATUS_NOT_ALL_ASSIGNED" },
+ { 0x00000107, "STATUS_SOME_NOT_MAPPED" },
+ { 0x00000108, "STATUS_OPLOCK_BREAK_IN_PROGRESS" },
+ { 0x00000109, "STATUS_VOLUME_MOUNTED" },
+ { 0x0000010A, "STATUS_RXACT_COMMITTED" },
+ { 0x0000010B, "STATUS_NOTIFY_CLEANUP" },
+ { 0x0000010C, "STATUS_NOTIFY_ENUM_DIR" },
+ { 0x0000010D, "STATUS_NO_QUOTAS_FOR_ACCOUNT" },
+ { 0x0000010E, "STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED" },
+ { 0x00000110, "STATUS_PAGE_FAULT_TRANSITION" },
+ { 0x00000111, "STATUS_PAGE_FAULT_DEMAND_ZERO" },
+ { 0x00000112, "STATUS_PAGE_FAULT_COPY_ON_WRITE" },
+ { 0x00000113, "STATUS_PAGE_FAULT_GUARD_PAGE" },
+ { 0x00000114, "STATUS_PAGE_FAULT_PAGING_FILE" },
+ { 0x00000115, "STATUS_CACHE_PAGE_LOCKED" },
+ { 0x00000116, "STATUS_CRASH_DUMP" },
+ { 0x00000117, "STATUS_BUFFER_ALL_ZEROS" },
+ { 0x00000118, "STATUS_REPARSE_OBJECT" },
+ { 0x0000045C, "STATUS_NO_SHUTDOWN_IN_PROGRESS" },
+ { 0x40000000, "STATUS_OBJECT_NAME_EXISTS" },
+ { 0x40000001, "STATUS_THREAD_WAS_SUSPENDED" },
+ { 0x40000002, "STATUS_WORKING_SET_LIMIT_RANGE" },
+ { 0x40000003, "STATUS_IMAGE_NOT_AT_BASE" },
+ { 0x40000004, "STATUS_RXACT_STATE_CREATED" },
+ { 0x40000005, "STATUS_SEGMENT_NOTIFICATION" },
+ { 0x40000006, "STATUS_LOCAL_USER_SESSION_KEY" },
+ { 0x40000007, "STATUS_BAD_CURRENT_DIRECTORY" },
+ { 0x40000008, "STATUS_SERIAL_MORE_WRITES" },
+ { 0x40000009, "STATUS_REGISTRY_RECOVERED" },
+ { 0x4000000A, "STATUS_FT_READ_RECOVERY_FROM_BACKUP" },
+ { 0x4000000B, "STATUS_FT_WRITE_RECOVERY" },
+ { 0x4000000C, "STATUS_SERIAL_COUNTER_TIMEOUT" },
+ { 0x4000000D, "STATUS_NULL_LM_PASSWORD" },
+ { 0x4000000E, "STATUS_IMAGE_MACHINE_TYPE_MISMATCH" },
+ { 0x4000000F, "STATUS_RECEIVE_PARTIAL" },
+ { 0x40000010, "STATUS_RECEIVE_EXPEDITED" },
+ { 0x40000011, "STATUS_RECEIVE_PARTIAL_EXPEDITED" },
+ { 0x40000012, "STATUS_EVENT_DONE" },
+ { 0x40000013, "STATUS_EVENT_PENDING" },
+ { 0x40000014, "STATUS_CHECKING_FILE_SYSTEM" },
+ { 0x40000015, "STATUS_FATAL_APP_EXIT" },
+ { 0x40000016, "STATUS_PREDEFINED_HANDLE" },
+ { 0x40000017, "STATUS_WAS_UNLOCKED" },
+ { 0x40000018, "STATUS_SERVICE_NOTIFICATION" },
+ { 0x40000019, "STATUS_WAS_LOCKED" },
+ { 0x4000001A, "STATUS_LOG_HARD_ERROR" },
+ { 0x4000001B, "STATUS_ALREADY_WIN32" },
+ { 0x4000001C, "STATUS_WX86_UNSIMULATE" },
+ { 0x4000001D, "STATUS_WX86_CONTINUE" },
+ { 0x4000001E, "STATUS_WX86_SINGLE_STEP" },
+ { 0x4000001F, "STATUS_WX86_BREAKPOINT" },
+ { 0x40000020, "STATUS_WX86_EXCEPTION_CONTINUE" },
+ { 0x40000021, "STATUS_WX86_EXCEPTION_LASTCHANCE" },
+ { 0x40000022, "STATUS_WX86_EXCEPTION_CHAIN" },
+ { 0x40000023, "STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE" },
+ { 0x40000024, "STATUS_NO_YIELD_PERFORMED" },
+ { 0x40000025, "STATUS_TIMER_RESUME_IGNORED" },
+ { 0x80000001, "STATUS_GUARD_PAGE_VIOLATION" },
+ { 0x80000002, "STATUS_DATATYPE_MISALIGNMENT" },
+ { 0x80000003, "STATUS_BREAKPOINT" },
+ { 0x80000004, "STATUS_SINGLE_STEP" },
+ { 0x80000005, "STATUS_BUFFER_OVERFLOW" },
+ { 0x80000006, "STATUS_NO_MORE_FILES" },
+ { 0x80000007, "STATUS_WAKE_SYSTEM_DEBUGGER" },
+ { 0x8000000A, "STATUS_HANDLES_CLOSED" },
+ { 0x8000000B, "STATUS_NO_INHERITANCE" },
+ { 0x8000000C, "STATUS_GUID_SUBSTITUTION_MADE" },
+ { 0x8000000D, "STATUS_PARTIAL_COPY" },
+ { 0x8000000E, "STATUS_DEVICE_PAPER_EMPTY" },
+ { 0x8000000F, "STATUS_DEVICE_POWERED_OFF" },
+ { 0x80000010, "STATUS_DEVICE_OFF_LINE" },
+ { 0x80000011, "STATUS_DEVICE_BUSY" },
+ { 0x80000012, "STATUS_NO_MORE_EAS" },
+ { 0x80000013, "STATUS_INVALID_EA_NAME" },
+ { 0x80000014, "STATUS_EA_LIST_INCONSISTENT" },
+ { 0x80000015, "STATUS_INVALID_EA_FLAG" },
+ { 0x80000016, "STATUS_VERIFY_REQUIRED" },
+ { 0x80000017, "STATUS_EXTRANEOUS_INFORMATION" },
+ { 0x80000018, "STATUS_RXACT_COMMIT_NECESSARY" },
+ { 0x8000001A, "STATUS_NO_MORE_ENTRIES" },
+ { 0x8000001B, "STATUS_FILEMARK_DETECTED" },
+ { 0x8000001C, "STATUS_MEDIA_CHANGED" },
+ { 0x8000001D, "STATUS_BUS_RESET" },
+ { 0x8000001E, "STATUS_END_OF_MEDIA" },
+ { 0x8000001F, "STATUS_BEGINNING_OF_MEDIA" },
+ { 0x80000020, "STATUS_MEDIA_CHECK" },
+ { 0x80000021, "STATUS_SETMARK_DETECTED" },
+ { 0x80000022, "STATUS_NO_DATA_DETECTED" },
+ { 0x80000023, "STATUS_REDIRECTOR_HAS_OPEN_HANDLES" },
+ { 0x80000024, "STATUS_SERVER_HAS_OPEN_HANDLES" },
+ { 0x80000025, "STATUS_ALREADY_DISCONNECTED" },
+ { 0x80000026, "STATUS_LONGJUMP" },
+ { 0x80040111, "MAPI_E_LOGON_FAILED" },
+ { 0x80090300, "SEC_E_INSUFFICIENT_MEMORY" },
+ { 0x80090301, "SEC_E_INVALID_HANDLE" },
+ { 0x80090302, "SEC_E_UNSUPPORTED_FUNCTION" },
+ { 0x8009030B, "SEC_E_NO_IMPERSONATION" },
+ { 0x8009030D, "SEC_E_UNKNOWN_CREDENTIALS" },
+ { 0x8009030E, "SEC_E_NO_CREDENTIALS" },
+ { 0x8009030F, "SEC_E_MESSAGE_ALTERED" },
+ { 0x80090310, "SEC_E_OUT_OF_SEQUENCE" },
+ { 0x80090311, "SEC_E_NO_AUTHENTICATING_AUTHORITY" },
+ { 0xC0000001, "STATUS_UNSUCCESSFUL" },
+ { 0xC0000002, "STATUS_NOT_IMPLEMENTED" },
+ { 0xC0000003, "STATUS_INVALID_INFO_CLASS" },
+ { 0xC0000004, "STATUS_INFO_LENGTH_MISMATCH" },
+ { 0xC0000005, "STATUS_ACCESS_VIOLATION" },
+ { 0xC0000006, "STATUS_IN_PAGE_ERROR" },
+ { 0xC0000007, "STATUS_PAGEFILE_QUOTA" },
+ { 0xC0000008, "STATUS_INVALID_HANDLE" },
+ { 0xC0000009, "STATUS_BAD_INITIAL_STACK" },
+ { 0xC000000A, "STATUS_BAD_INITIAL_PC" },
+ { 0xC000000B, "STATUS_INVALID_CID" },
+ { 0xC000000C, "STATUS_TIMER_NOT_CANCELED" },
+ { 0xC000000D, "STATUS_INVALID_PARAMETER" },
+ { 0xC000000E, "STATUS_NO_SUCH_DEVICE" },
+ { 0xC000000F, "STATUS_NO_SUCH_FILE" },
+ { 0xC0000010, "STATUS_INVALID_DEVICE_REQUEST" },
+ { 0xC0000011, "STATUS_END_OF_FILE" },
+ { 0xC0000012, "STATUS_WRONG_VOLUME" },
+ { 0xC0000013, "STATUS_NO_MEDIA_IN_DEVICE" },
+ { 0xC0000014, "STATUS_UNRECOGNIZED_MEDIA" },
+ { 0xC0000015, "STATUS_NONEXISTENT_SECTOR" },
+ { 0xC0000016, "STATUS_MORE_PROCESSING_REQUIRED" },
+ { 0xC0000017, "STATUS_NO_MEMORY" },
+ { 0xC0000018, "STATUS_CONFLICTING_ADDRESSES" },
+ { 0xC0000019, "STATUS_NOT_MAPPED_VIEW" },
+ { 0xC000001A, "STATUS_UNABLE_TO_FREE_VM" },
+ { 0xC000001B, "STATUS_UNABLE_TO_DELETE_SECTION" },
+ { 0xC000001C, "STATUS_INVALID_SYSTEM_SERVICE" },
+ { 0xC000001D, "STATUS_ILLEGAL_INSTRUCTION" },
+ { 0xC000001E, "STATUS_INVALID_LOCK_SEQUENCE" },
+ { 0xC000001F, "STATUS_INVALID_VIEW_SIZE" },
+ { 0xC0000020, "STATUS_INVALID_FILE_FOR_SECTION" },
+ { 0xC0000021, "STATUS_ALREADY_COMMITTED" },
+ { 0xC0000022, "STATUS_ACCESS_DENIED" },
+ { 0xC0000023, "STATUS_BUFFER_TOO_SMALL" },
+ { 0xC0000024, "STATUS_OBJECT_TYPE_MISMATCH" },
+ { 0xC0000025, "STATUS_NONCONTINUABLE_EXCEPTION" },
+ { 0xC0000026, "STATUS_INVALID_DISPOSITION" },
+ { 0xC0000027, "STATUS_UNWIND" },
+ { 0xC0000028, "STATUS_BAD_STACK" },
+ { 0xC0000029, "STATUS_INVALID_UNWIND_TARGET" },
+ { 0xC000002A, "STATUS_NOT_LOCKED" },
+ { 0xC000002B, "STATUS_PARITY_ERROR" },
+ { 0xC000002C, "STATUS_UNABLE_TO_DECOMMIT_VM" },
+ { 0xC000002D, "STATUS_NOT_COMMITTED" },
+ { 0xC000002E, "STATUS_INVALID_PORT_ATTRIBUTES" },
+ { 0xC000002F, "STATUS_PORT_MESSAGE_TOO_LONG" },
+ { 0xC0000030, "STATUS_INVALID_PARAMETER_MIX" },
+ { 0xC0000031, "STATUS_INVALID_QUOTA_LOWER" },
+ { 0xC0000032, "STATUS_DISK_CORRUPT_ERROR" },
+ { 0xC0000033, "STATUS_OBJECT_NAME_INVALID" },
+ { 0xC0000034, "STATUS_OBJECT_NAME_NOT_FOUND" },
+ { 0xC0000035, "STATUS_OBJECT_NAME_COLLISION" },
+ { 0xC0000037, "STATUS_PORT_DISCONNECTED" },
+ { 0xC0000038, "STATUS_DEVICE_ALREADY_ATTACHED" },
+ { 0xC0000039, "STATUS_OBJECT_PATH_INVALID" },
+ { 0xC000003A, "STATUS_OBJECT_PATH_NOT_FOUND" },
+ { 0xC000003B, "STATUS_OBJECT_PATH_SYNTAX_BAD" },
+ { 0xC000003C, "STATUS_DATA_OVERRUN" },
+ { 0xC000003D, "STATUS_DATA_LATE_ERROR" },
+ { 0xC000003E, "STATUS_DATA_ERROR" },
+ { 0xC000003F, "STATUS_CRC_ERROR" },
+ { 0xC0000040, "STATUS_SECTION_TOO_BIG" },
+ { 0xC0000041, "STATUS_PORT_CONNECTION_REFUSED" },
+ { 0xC0000042, "STATUS_INVALID_PORT_HANDLE" },
+ { 0xC0000043, "STATUS_SHARING_VIOLATION" },
+ { 0xC0000044, "STATUS_QUOTA_EXCEEDED" },
+ { 0xC0000045, "STATUS_INVALID_PAGE_PROTECTION" },
+ { 0xC0000046, "STATUS_MUTANT_NOT_OWNED" },
+ { 0xC0000047, "STATUS_SEMAPHORE_LIMIT_EXCEEDED" },
+ { 0xC0000048, "STATUS_PORT_ALREADY_SET" },
+ { 0xC0000049, "STATUS_SECTION_NOT_IMAGE" },
+ { 0xC000004A, "STATUS_SUSPEND_COUNT_EXCEEDED" },
+ { 0xC000004B, "STATUS_THREAD_IS_TERMINATING" },
+ { 0xC000004C, "STATUS_BAD_WORKING_SET_LIMIT" },
+ { 0xC000004D, "STATUS_INCOMPATIBLE_FILE_MAP" },
+ { 0xC000004E, "STATUS_SECTION_PROTECTION" },
+ { 0xC000004F, "STATUS_EAS_NOT_SUPPORTED" },
+ { 0xC0000050, "STATUS_EA_TOO_LARGE" },
+ { 0xC0000051, "STATUS_NONEXISTENT_EA_ENTRY" },
+ { 0xC0000052, "STATUS_NO_EAS_ON_FILE" },
+ { 0xC0000053, "STATUS_EA_CORRUPT_ERROR" },
+ { 0xC0000054, "STATUS_FILE_LOCK_CONFLICT" },
+ { 0xC0000055, "STATUS_LOCK_NOT_GRANTED" },
+ { 0xC0000056, "STATUS_DELETE_PENDING" },
+ { 0xC0000057, "STATUS_CTL_FILE_NOT_SUPPORTED" },
+ { 0xC0000058, "STATUS_UNKNOWN_REVISION" },
+ { 0xC0000059, "STATUS_REVISION_MISMATCH" },
+ { 0xC000005A, "STATUS_INVALID_OWNER" },
+ { 0xC000005B, "STATUS_INVALID_PRIMARY_GROUP" },
+ { 0xC000005C, "STATUS_NO_IMPERSONATION_TOKEN" },
+ { 0xC000005D, "STATUS_CANT_DISABLE_MANDATORY" },
+ { 0xC000005E, "STATUS_NO_LOGON_SERVERS" },
+ { 0xC000005F, "STATUS_NO_SUCH_LOGON_SESSION" },
+ { 0xC0000060, "STATUS_NO_SUCH_PRIVILEGE" },
+ { 0xC0000061, "STATUS_PRIVILEGE_NOT_HELD" },
+ { 0xC0000062, "STATUS_INVALID_ACCOUNT_NAME" },
+ { 0xC0000063, "STATUS_USER_EXISTS" },
+ { 0xC0000064, "STATUS_NO_SUCH_USER" },
+ { 0xC0000065, "STATUS_GROUP_EXISTS" },
+ { 0xC0000066, "STATUS_NO_SUCH_GROUP" },
+ { 0xC0000067, "STATUS_MEMBER_IN_GROUP" },
+ { 0xC0000068, "STATUS_MEMBER_NOT_IN_GROUP" },
+ { 0xC0000069, "STATUS_LAST_ADMIN" },
+ { 0xC000006A, "STATUS_WRONG_PASSWORD" },
+ { 0xC000006B, "STATUS_ILL_FORMED_PASSWORD" },
+ { 0xC000006C, "STATUS_PASSWORD_RESTRICTION" },
+ { 0xC000006D, "STATUS_LOGON_FAILURE" },
+ { 0xC000006E, "STATUS_ACCOUNT_RESTRICTION" },
+ { 0xC000006F, "STATUS_INVALID_LOGON_HOURS" },
+ { 0xC0000070, "STATUS_INVALID_WORKSTATION" },
+ { 0xC0000071, "STATUS_PASSWORD_EXPIRED" },
+ { 0xC0000072, "STATUS_ACCOUNT_DISABLED" },
+ { 0xC0000073, "STATUS_NONE_MAPPED" },
+ { 0xC0000074, "STATUS_TOO_MANY_LUIDS_REQUESTED" },
+ { 0xC0000075, "STATUS_LUIDS_EXHAUSTED" },
+ { 0xC0000076, "STATUS_INVALID_SUB_AUTHORITY" },
+ { 0xC0000077, "STATUS_INVALID_ACL" },
+ { 0xC0000078, "STATUS_INVALID_SID" },
+ { 0xC0000079, "STATUS_INVALID_SECURITY_DESCR" },
+ { 0xC000007A, "STATUS_PROCEDURE_NOT_FOUND" },
+ { 0xC000007B, "STATUS_INVALID_IMAGE_FORMAT" },
+ { 0xC000007C, "STATUS_NO_TOKEN" },
+ { 0xC000007D, "STATUS_BAD_INHERITANCE_ACL" },
+ { 0xC000007E, "STATUS_RANGE_NOT_LOCKED" },
+ { 0xC000007F, "STATUS_DISK_FULL" },
+ { 0xC0000080, "STATUS_SERVER_DISABLED" },
+ { 0xC0000081, "STATUS_SERVER_NOT_DISABLED" },
+ { 0xC0000082, "STATUS_TOO_MANY_GUIDS_REQUESTED" },
+ { 0xC0000083, "STATUS_GUIDS_EXHAUSTED" },
+ { 0xC0000084, "STATUS_INVALID_ID_AUTHORITY" },
+ { 0xC0000085, "STATUS_AGENTS_EXHAUSTED" },
+ { 0xC0000086, "STATUS_INVALID_VOLUME_LABEL" },
+ { 0xC0000087, "STATUS_SECTION_NOT_EXTENDED" },
+ { 0xC0000088, "STATUS_NOT_MAPPED_DATA" },
+ { 0xC0000089, "STATUS_RESOURCE_DATA_NOT_FOUND" },
+ { 0xC000008A, "STATUS_RESOURCE_TYPE_NOT_FOUND" },
+ { 0xC000008B, "STATUS_RESOURCE_NAME_NOT_FOUND" },
+ { 0xC000008C, "STATUS_ARRAY_BOUNDS_EXCEEDED" },
+ { 0xC000008D, "STATUS_FLOAT_DENORMAL_OPERAND" },
+ { 0xC000008E, "STATUS_FLOAT_DIVIDE_BY_ZERO" },
+ { 0xC000008F, "STATUS_FLOAT_INEXACT_RESULT" },
+ { 0xC0000090, "STATUS_FLOAT_INVALID_OPERATION" },
+ { 0xC0000091, "STATUS_FLOAT_OVERFLOW" },
+ { 0xC0000092, "STATUS_FLOAT_STACK_CHECK" },
+ { 0xC0000093, "STATUS_FLOAT_UNDERFLOW" },
+ { 0xC0000094, "STATUS_INTEGER_DIVIDE_BY_ZERO" },
+ { 0xC0000095, "STATUS_INTEGER_OVERFLOW" },
+ { 0xC0000096, "STATUS_PRIVILEGED_INSTRUCTION" },
+ { 0xC0000097, "STATUS_TOO_MANY_PAGING_FILES" },
+ { 0xC0000098, "STATUS_FILE_INVALID" },
+ { 0xC0000099, "STATUS_ALLOTTED_SPACE_EXCEEDED" },
+ { 0xC000009A, "STATUS_INSUFFICIENT_RESOURCES" },
+ { 0xC000009B, "STATUS_DFS_EXIT_PATH_FOUND" },
+ { 0xC000009C, "STATUS_DEVICE_DATA_ERROR" },
+ { 0xC000009D, "STATUS_DEVICE_NOT_CONNECTED" },
+ { 0xC000009E, "STATUS_DEVICE_POWER_FAILURE" },
+ { 0xC000009F, "STATUS_FREE_VM_NOT_AT_BASE" },
+ { 0xC00000A0, "STATUS_MEMORY_NOT_ALLOCATED" },
+ { 0xC00000A1, "STATUS_WORKING_SET_QUOTA" },
+ { 0xC00000A2, "STATUS_MEDIA_WRITE_PROTECTED" },
+ { 0xC00000A3, "STATUS_DEVICE_NOT_READY" },
+ { 0xC00000A4, "STATUS_INVALID_GROUP_ATTRIBUTES" },
+ { 0xC00000A5, "STATUS_BAD_IMPERSONATION_LEVEL" },
+ { 0xC00000A6, "STATUS_CANT_OPEN_ANONYMOUS" },
+ { 0xC00000A7, "STATUS_BAD_VALIDATION_CLASS" },
+ { 0xC00000A8, "STATUS_BAD_TOKEN_TYPE" },
+ { 0xC00000A9, "STATUS_BAD_MASTER_BOOT_RECORD" },
+ { 0xC00000AA, "STATUS_INSTRUCTION_MISALIGNMENT" },
+ { 0xC00000AB, "STATUS_INSTANCE_NOT_AVAILABLE" },
+ { 0xC00000AC, "STATUS_PIPE_NOT_AVAILABLE" },
+ { 0xC00000AD, "STATUS_INVALID_PIPE_STATE" },
+ { 0xC00000AE, "STATUS_PIPE_BUSY" },
+ { 0xC00000AF, "STATUS_ILLEGAL_FUNCTION" },
+ { 0xC00000B0, "STATUS_PIPE_DISCONNECTED" },
+ { 0xC00000B1, "STATUS_PIPE_CLOSING" },
+ { 0xC00000B2, "STATUS_PIPE_CONNECTED" },
+ { 0xC00000B3, "STATUS_PIPE_LISTENING" },
+ { 0xC00000B4, "STATUS_INVALID_READ_MODE" },
+ { 0xC00000B5, "STATUS_IO_TIMEOUT" },
+ { 0xC00000B6, "STATUS_FILE_FORCED_CLOSED" },
+ { 0xC00000B7, "STATUS_PROFILING_NOT_STARTED" },
+ { 0xC00000B8, "STATUS_PROFILING_NOT_STOPPED" },
+ { 0xC00000B9, "STATUS_COULD_NOT_INTERPRET" },
+ { 0xC00000BA, "STATUS_FILE_IS_A_DIRECTORY" },
+ { 0xC00000BB, "STATUS_NOT_SUPPORTED" },
+ { 0xC00000BC, "STATUS_REMOTE_NOT_LISTENING" },
+ { 0xC00000BD, "STATUS_DUPLICATE_NAME" },
+ { 0xC00000BE, "STATUS_BAD_NETWORK_PATH" },
+ { 0xC00000BF, "STATUS_NETWORK_BUSY" },
+ { 0xC00000C0, "STATUS_DEVICE_DOES_NOT_EXIST" },
+ { 0xC00000C1, "STATUS_TOO_MANY_COMMANDS" },
+ { 0xC00000C2, "STATUS_ADAPTER_HARDWARE_ERROR" },
+ { 0xC00000C3, "STATUS_INVALID_NETWORK_RESPONSE" },
+ { 0xC00000C4, "STATUS_UNEXPECTED_NETWORK_ERROR" },
+ { 0xC00000C5, "STATUS_BAD_REMOTE_ADAPTER" },
+ { 0xC00000C6, "STATUS_PRINT_QUEUE_FULL" },
+ { 0xC00000C7, "STATUS_NO_SPOOL_SPACE" },
+ { 0xC00000C8, "STATUS_PRINT_CANCELLED" },
+ { 0xC00000C9, "STATUS_NETWORK_NAME_DELETED" },
+ { 0xC00000CA, "STATUS_NETWORK_ACCESS_DENIED" },
+ { 0xC00000CB, "STATUS_BAD_DEVICE_TYPE" },
+ { 0xC00000CC, "STATUS_BAD_NETWORK_NAME" },
+ { 0xC00000CD, "STATUS_TOO_MANY_NAMES" },
+ { 0xC00000CE, "STATUS_TOO_MANY_SESSIONS" },
+ { 0xC00000CF, "STATUS_SHARING_PAUSED" },
+ { 0xC00000D0, "STATUS_REQUEST_NOT_ACCEPTED" },
+ { 0xC00000D1, "STATUS_REDIRECTOR_PAUSED" },
+ { 0xC00000D2, "STATUS_NET_WRITE_FAULT" },
+ { 0xC00000D3, "STATUS_PROFILING_AT_LIMIT" },
+ { 0xC00000D4, "STATUS_NOT_SAME_DEVICE" },
+ { 0xC00000D5, "STATUS_FILE_RENAMED" },
+ { 0xC00000D6, "STATUS_VIRTUAL_CIRCUIT_CLOSED" },
+ { 0xC00000D7, "STATUS_NO_SECURITY_ON_OBJECT" },
+ { 0xC00000D8, "STATUS_CANT_WAIT" },
+ { 0xC00000D9, "STATUS_PIPE_EMPTY" },
+ { 0xC00000DA, "STATUS_CANT_ACCESS_DOMAIN_INFO" },
+ { 0xC00000DB, "STATUS_CANT_TERMINATE_SELF" },
+ { 0xC00000DC, "STATUS_INVALID_SERVER_STATE" },
+ { 0xC00000DD, "STATUS_INVALID_DOMAIN_STATE" },
+ { 0xC00000DE, "STATUS_INVALID_DOMAIN_ROLE" },
+ { 0xC00000DF, "STATUS_NO_SUCH_DOMAIN" },
+ { 0xC00000E0, "STATUS_DOMAIN_EXISTS" },
+ { 0xC00000E1, "STATUS_DOMAIN_LIMIT_EXCEEDED" },
+ { 0xC00000E2, "STATUS_OPLOCK_NOT_GRANTED" },
+ { 0xC00000E3, "STATUS_INVALID_OPLOCK_PROTOCOL" },
+ { 0xC00000E4, "STATUS_INTERNAL_DB_CORRUPTION" },
+ { 0xC00000E5, "STATUS_INTERNAL_ERROR" },
+ { 0xC00000E6, "STATUS_GENERIC_NOT_MAPPED" },
+ { 0xC00000E7, "STATUS_BAD_DESCRIPTOR_FORMAT" },
+ { 0xC00000E8, "STATUS_INVALID_USER_BUFFER" },
+ { 0xC00000E9, "STATUS_UNEXPECTED_IO_ERROR" },
+ { 0xC00000EA, "STATUS_UNEXPECTED_MM_CREATE_ERR" },
+ { 0xC00000EB, "STATUS_UNEXPECTED_MM_MAP_ERROR" },
+ { 0xC00000EC, "STATUS_UNEXPECTED_MM_EXTEND_ERR" },
+ { 0xC00000ED, "STATUS_NOT_LOGON_PROCESS" },
+ { 0xC00000EE, "STATUS_LOGON_SESSION_EXISTS" },
+ { 0xC00000EF, "STATUS_INVALID_PARAMETER_1" },
+ { 0xC00000F0, "STATUS_INVALID_PARAMETER_2" },
+ { 0xC00000F1, "STATUS_INVALID_PARAMETER_3" },
+ { 0xC00000F2, "STATUS_INVALID_PARAMETER_4" },
+ { 0xC00000F3, "STATUS_INVALID_PARAMETER_5" },
+ { 0xC00000F4, "STATUS_INVALID_PARAMETER_6" },
+ { 0xC00000F5, "STATUS_INVALID_PARAMETER_7" },
+ { 0xC00000F6, "STATUS_INVALID_PARAMETER_8" },
+ { 0xC00000F7, "STATUS_INVALID_PARAMETER_9" },
+ { 0xC00000F8, "STATUS_INVALID_PARAMETER_10" },
+ { 0xC00000F9, "STATUS_INVALID_PARAMETER_11" },
+ { 0xC00000FA, "STATUS_INVALID_PARAMETER_12" },
+ { 0xC00000FB, "STATUS_REDIRECTOR_NOT_STARTED" },
+ { 0xC00000FC, "STATUS_REDIRECTOR_STARTED" },
+ { 0xC00000FD, "STATUS_STACK_OVERFLOW" },
+ { 0xC00000FE, "STATUS_NO_SUCH_PACKAGE" },
+ { 0xC00000FF, "STATUS_BAD_FUNCTION_TABLE" },
+ { 0xC0000100, "STATUS_VARIABLE_NOT_FOUND" },
+ { 0xC0000101, "STATUS_DIRECTORY_NOT_EMPTY" },
+ { 0xC0000102, "STATUS_FILE_CORRUPT_ERROR" },
+ { 0xC0000103, "STATUS_NOT_A_DIRECTORY" },
+ { 0xC0000104, "STATUS_BAD_LOGON_SESSION_STATE" },
+ { 0xC0000105, "STATUS_LOGON_SESSION_COLLISION" },
+ { 0xC0000106, "STATUS_NAME_TOO_LONG" },
+ { 0xC0000107, "STATUS_FILES_OPEN" },
+ { 0xC0000108, "STATUS_CONNECTION_IN_USE" },
+ { 0xC0000109, "STATUS_MESSAGE_NOT_FOUND" },
+ { 0xC000010A, "STATUS_PROCESS_IS_TERMINATING" },
+ { 0xC000010B, "STATUS_INVALID_LOGON_TYPE" },
+ { 0xC000010C, "STATUS_NO_GUID_TRANSLATION" },
+ { 0xC000010D, "STATUS_CANNOT_IMPERSONATE" },
+ { 0xC000010E, "STATUS_IMAGE_ALREADY_LOADED" },
+ { 0xC000010F, "STATUS_ABIOS_NOT_PRESENT" },
+ { 0xC0000110, "STATUS_ABIOS_LID_NOT_EXIST" },
+ { 0xC0000111, "STATUS_ABIOS_LID_ALREADY_OWNED" },
+ { 0xC0000112, "STATUS_ABIOS_NOT_LID_OWNER" },
+ { 0xC0000113, "STATUS_ABIOS_INVALID_COMMAND" },
+ { 0xC0000114, "STATUS_ABIOS_INVALID_LID" },
+ { 0xC0000115, "STATUS_ABIOS_SELECTOR_NOT_AVAILABLE" },
+ { 0xC0000116, "STATUS_ABIOS_INVALID_SELECTOR" },
+ { 0xC0000117, "STATUS_NO_LDT" },
+ { 0xC0000118, "STATUS_INVALID_LDT_SIZE" },
+ { 0xC0000119, "STATUS_INVALID_LDT_OFFSET" },
+ { 0xC000011A, "STATUS_INVALID_LDT_DESCRIPTOR" },
+ { 0xC000011B, "STATUS_INVALID_IMAGE_NE_FORMAT" },
+ { 0xC000011C, "STATUS_RXACT_INVALID_STATE" },
+ { 0xC000011D, "STATUS_RXACT_COMMIT_FAILURE" },
+ { 0xC000011E, "STATUS_MAPPED_FILE_SIZE_ZERO" },
+ { 0xC000011F, "STATUS_TOO_MANY_OPENED_FILES" },
+ { 0xC0000120, "STATUS_CANCELLED" },
+ { 0xC0000121, "STATUS_CANNOT_DELETE" },
+ { 0xC0000122, "STATUS_INVALID_COMPUTER_NAME" },
+ { 0xC0000123, "STATUS_FILE_DELETED" },
+ { 0xC0000124, "STATUS_SPECIAL_ACCOUNT" },
+ { 0xC0000125, "STATUS_SPECIAL_GROUP" },
+ { 0xC0000126, "STATUS_SPECIAL_USER" },
+ { 0xC0000127, "STATUS_MEMBERS_PRIMARY_GROUP" },
+ { 0xC0000128, "STATUS_FILE_CLOSED" },
+ { 0xC0000129, "STATUS_TOO_MANY_THREADS" },
+ { 0xC000012A, "STATUS_THREAD_NOT_IN_PROCESS" },
+ { 0xC000012B, "STATUS_TOKEN_ALREADY_IN_USE" },
+ { 0xC000012C, "STATUS_PAGEFILE_QUOTA_EXCEEDED" },
+ { 0xC000012D, "STATUS_COMMITMENT_LIMIT" },
+ { 0xC000012E, "STATUS_INVALID_IMAGE_LE_FORMAT" },
+ { 0xC000012F, "STATUS_INVALID_IMAGE_NOT_MZ" },
+ { 0xC0000130, "STATUS_INVALID_IMAGE_PROTECT" },
+ { 0xC0000131, "STATUS_INVALID_IMAGE_WIN_16" },
+ { 0xC0000132, "STATUS_LOGON_SERVER_CONFLICT" },
+ { 0xC0000133, "STATUS_TIME_DIFFERENCE_AT_DC" },
+ { 0xC0000134, "STATUS_SYNCHRONIZATION_REQUIRED" },
+ { 0xC0000135, "STATUS_DLL_NOT_FOUND" },
+ { 0xC0000136, "STATUS_OPEN_FAILED" },
+ { 0xC0000137, "STATUS_IO_PRIVILEGE_FAILED" },
+ { 0xC0000138, "STATUS_ORDINAL_NOT_FOUND" },
+ { 0xC0000139, "STATUS_ENTRYPOINT_NOT_FOUND" },
+ { 0xC000013A, "STATUS_CONTROL_C_EXIT" },
+ { 0xC000013B, "STATUS_LOCAL_DISCONNECT" },
+ { 0xC000013C, "STATUS_REMOTE_DISCONNECT" },
+ { 0xC000013D, "STATUS_REMOTE_RESOURCES" },
+ { 0xC000013E, "STATUS_LINK_FAILED" },
+ { 0xC000013F, "STATUS_LINK_TIMEOUT" },
+ { 0xC0000140, "STATUS_INVALID_CONNECTION" },
+ { 0xC0000141, "STATUS_INVALID_ADDRESS" },
+ { 0xC0000142, "STATUS_DLL_INIT_FAILED" },
+ { 0xC0000143, "STATUS_MISSING_SYSTEMFILE" },
+ { 0xC0000144, "STATUS_UNHANDLED_EXCEPTION" },
+ { 0xC0000145, "STATUS_APP_INIT_FAILURE" },
+ { 0xC0000146, "STATUS_PAGEFILE_CREATE_FAILED" },
+ { 0xC0000147, "STATUS_NO_PAGEFILE" },
+ { 0xC0000148, "STATUS_INVALID_LEVEL" },
+ { 0xC0000149, "STATUS_WRONG_PASSWORD_CORE" },
+ { 0xC000014A, "STATUS_ILLEGAL_FLOAT_CONTEXT" },
+ { 0xC000014B, "STATUS_PIPE_BROKEN" },
+ { 0xC000014C, "STATUS_REGISTRY_CORRUPT" },
+ { 0xC000014D, "STATUS_REGISTRY_IO_FAILED" },
+ { 0xC000014E, "STATUS_NO_EVENT_PAIR" },
+ { 0xC000014F, "STATUS_UNRECOGNIZED_VOLUME" },
+ { 0xC0000150, "STATUS_SERIAL_NO_DEVICE_INITED" },
+ { 0xC0000151, "STATUS_NO_SUCH_ALIAS" },
+ { 0xC0000152, "STATUS_MEMBER_NOT_IN_ALIAS" },
+ { 0xC0000153, "STATUS_MEMBER_IN_ALIAS" },
+ { 0xC0000154, "STATUS_ALIAS_EXISTS" },
+ { 0xC0000155, "STATUS_LOGON_NOT_GRANTED" },
+ { 0xC0000156, "STATUS_TOO_MANY_SECRETS" },
+ { 0xC0000157, "STATUS_SECRET_TOO_LONG" },
+ { 0xC0000158, "STATUS_INTERNAL_DB_ERROR" },
+ { 0xC0000159, "STATUS_FULLSCREEN_MODE" },
+ { 0xC000015A, "STATUS_TOO_MANY_CONTEXT_IDS" },
+ { 0xC000015B, "STATUS_LOGON_TYPE_NOT_GRANTED" },
+ { 0xC000015C, "STATUS_NOT_REGISTRY_FILE" },
+ { 0xC000015D, "STATUS_NT_CROSS_ENCRYPTION_REQUIRED" },
+ { 0xC000015E, "STATUS_DOMAIN_CTRLR_CONFIG_ERROR" },
+ { 0xC000015F, "STATUS_FT_MISSING_MEMBER" },
+ { 0xC0000160, "STATUS_ILL_FORMED_SERVICE_ENTRY" },
+ { 0xC0000161, "STATUS_ILLEGAL_CHARACTER" },
+ { 0xC0000162, "STATUS_UNMAPPABLE_CHARACTER" },
+ { 0xC0000163, "STATUS_UNDEFINED_CHARACTER" },
+ { 0xC0000164, "STATUS_FLOPPY_VOLUME" },
+ { 0xC0000165, "STATUS_FLOPPY_ID_MARK_NOT_FOUND" },
+ { 0xC0000166, "STATUS_FLOPPY_WRONG_CYLINDER" },
+ { 0xC0000167, "STATUS_FLOPPY_UNKNOWN_ERROR" },
+ { 0xC0000168, "STATUS_FLOPPY_BAD_REGISTERS" },
+ { 0xC0000169, "STATUS_DISK_RECALIBRATE_FAILED" },
+ { 0xC000016A, "STATUS_DISK_OPERATION_FAILED" },
+ { 0xC000016B, "STATUS_DISK_RESET_FAILED" },
+ { 0xC000016C, "STATUS_SHARED_IRQ_BUSY" },
+ { 0xC000016D, "STATUS_FT_ORPHANING" },
+ { 0xC000016E, "STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT" },
+ { 0xC0000172, "STATUS_PARTITION_FAILURE" },
+ { 0xC0000173, "STATUS_INVALID_BLOCK_LENGTH" },
+ { 0xC0000174, "STATUS_DEVICE_NOT_PARTITIONED" },
+ { 0xC0000175, "STATUS_UNABLE_TO_LOCK_MEDIA" },
+ { 0xC0000176, "STATUS_UNABLE_TO_UNLOAD_MEDIA" },
+ { 0xC0000177, "STATUS_EOM_OVERFLOW" },
+ { 0xC0000178, "STATUS_NO_MEDIA" },
+ { 0xC000017A, "STATUS_NO_SUCH_MEMBER" },
+ { 0xC000017B, "STATUS_INVALID_MEMBER" },
+ { 0xC000017C, "STATUS_KEY_DELETED" },
+ { 0xC000017D, "STATUS_NO_LOG_SPACE" },
+ { 0xC000017E, "STATUS_TOO_MANY_SIDS" },
+ { 0xC000017F, "STATUS_LM_CROSS_ENCRYPTION_REQUIRED" },
+ { 0xC0000180, "STATUS_KEY_HAS_CHILDREN" },
+ { 0xC0000181, "STATUS_CHILD_MUST_BE_VOLATILE" },
+ { 0xC0000182, "STATUS_DEVICE_CONFIGURATION_ERROR" },
+ { 0xC0000183, "STATUS_DRIVER_INTERNAL_ERROR" },
+ { 0xC0000184, "STATUS_INVALID_DEVICE_STATE" },
+ { 0xC0000185, "STATUS_IO_DEVICE_ERROR" },
+ { 0xC0000186, "STATUS_DEVICE_PROTOCOL_ERROR" },
+ { 0xC0000187, "STATUS_BACKUP_CONTROLLER" },
+ { 0xC0000188, "STATUS_LOG_FILE_FULL" },
+ { 0xC0000189, "STATUS_TOO_LATE" },
+ { 0xC000018A, "STATUS_NO_TRUST_LSA_SECRET" },
+ { 0xC000018B, "STATUS_NO_TRUST_SAM_ACCOUNT" },
+ { 0xC000018C, "STATUS_TRUSTED_DOMAIN_FAILURE" },
+ { 0xC000018D, "STATUS_TRUSTED_RELATIONSHIP_FAILURE" },
+ { 0xC000018E, "STATUS_EVENTLOG_FILE_CORRUPT" },
+ { 0xC000018F, "STATUS_EVENTLOG_CANT_START" },
+ { 0xC0000190, "STATUS_TRUST_FAILURE" },
+ { 0xC0000191, "STATUS_MUTANT_LIMIT_EXCEEDED" },
+ { 0xC0000192, "STATUS_NETLOGON_NOT_STARTED" },
+ { 0xC0000193, "STATUS_ACCOUNT_EXPIRED" },
+ { 0xC0000194, "STATUS_POSSIBLE_DEADLOCK" },
+ { 0xC0000195, "STATUS_NETWORK_CREDENTIAL_CONFLICT" },
+ { 0xC0000196, "STATUS_REMOTE_SESSION_LIMIT" },
+ { 0xC0000197, "STATUS_EVENTLOG_FILE_CHANGED" },
+ { 0xC0000198, "STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT" },
+ { 0xC0000199, "STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT" },
+ { 0xC000019A, "STATUS_NOLOGON_SERVER_TRUST_ACCOUNT" },
+ { 0xC000019B, "STATUS_DOMAIN_TRUST_INCONSISTENT" },
+ { 0xC000019C, "STATUS_FS_DRIVER_REQUIRED" },
+ { 0xC0000202, "STATUS_NO_USER_SESSION_KEY" },
+ { 0xC0000203, "STATUS_USER_SESSION_DELETED" },
+ { 0xC0000204, "STATUS_RESOURCE_LANG_NOT_FOUND" },
+ { 0xC0000205, "STATUS_INSUFF_SERVER_RESOURCES" },
+ { 0xC0000206, "STATUS_INVALID_BUFFER_SIZE" },
+ { 0xC0000207, "STATUS_INVALID_ADDRESS_COMPONENT" },
+ { 0xC0000208, "STATUS_INVALID_ADDRESS_WILDCARD" },
+ { 0xC0000209, "STATUS_TOO_MANY_ADDRESSES" },
+ { 0xC000020A, "STATUS_ADDRESS_ALREADY_EXISTS" },
+ { 0xC000020B, "STATUS_ADDRESS_CLOSED" },
+ { 0xC000020C, "STATUS_CONNECTION_DISCONNECTED" },
+ { 0xC000020D, "STATUS_CONNECTION_RESET" },
+ { 0xC000020E, "STATUS_TOO_MANY_NODES" },
+ { 0xC000020F, "STATUS_TRANSACTION_ABORTED" },
+ { 0xC0000210, "STATUS_TRANSACTION_TIMED_OUT" },
+ { 0xC0000211, "STATUS_TRANSACTION_NO_RELEASE" },
+ { 0xC0000212, "STATUS_TRANSACTION_NO_MATCH" },
+ { 0xC0000213, "STATUS_TRANSACTION_RESPONDED" },
+ { 0xC0000214, "STATUS_TRANSACTION_INVALID_ID" },
+ { 0xC0000215, "STATUS_TRANSACTION_INVALID_TYPE" },
+ { 0xC0000216, "STATUS_NOT_SERVER_SESSION" },
+ { 0xC0000217, "STATUS_NOT_CLIENT_SESSION" },
+ { 0xC0000218, "STATUS_CANNOT_LOAD_REGISTRY_FILE" },
+ { 0xC0000219, "STATUS_DEBUG_ATTACH_FAILED" },
+ { 0xC000021A, "STATUS_SYSTEM_PROCESS_TERMINATED" },
+ { 0xC000021B, "STATUS_DATA_NOT_ACCEPTED" },
+ { 0xC000021C, "STATUS_NO_BROWSER_SERVERS_FOUND" },
+ { 0xC000021D, "STATUS_VDM_HARD_ERROR" },
+ { 0xC000021E, "STATUS_DRIVER_CANCEL_TIMEOUT" },
+ { 0xC000021F, "STATUS_REPLY_MESSAGE_MISMATCH" },
+ { 0xC0000220, "STATUS_MAPPED_ALIGNMENT" },
+ { 0xC0000221, "STATUS_IMAGE_CHECKSUM_MISMATCH" },
+ { 0xC0000222, "STATUS_LOST_WRITEBEHIND_DATA" },
+ { 0xC0000223, "STATUS_CLIENT_SERVER_PARAMETERS_INVALID" },
+ { 0xC0000224, "STATUS_PASSWORD_MUST_CHANGE" },
+ { 0xC0000225, "STATUS_NOT_FOUND" },
+ { 0xC0000226, "STATUS_NOT_TINY_STREAM" },
+ { 0xC0000227, "STATUS_RECOVERY_FAILURE" },
+ { 0xC0000228, "STATUS_STACK_OVERFLOW_READ" },
+ { 0xC0000229, "STATUS_FAIL_CHECK" },
+ { 0xC000022A, "STATUS_DUPLICATE_OBJECTID" },
+ { 0xC000022B, "STATUS_OBJECTID_EXISTS" },
+ { 0xC000022C, "STATUS_CONVERT_TO_LARGE" },
+ { 0xC000022D, "STATUS_RETRY" },
+ { 0xC000022E, "STATUS_FOUND_OUT_OF_SCOPE" },
+ { 0xC000022F, "STATUS_ALLOCATE_BUCKET" },
+ { 0xC0000230, "STATUS_PROPSET_NOT_FOUND" },
+ { 0xC0000231, "STATUS_MARSHALL_OVERFLOW" },
+ { 0xC0000232, "STATUS_INVALID_VARIANT" },
+ { 0xC0000233, "STATUS_DOMAIN_CONTROLLER_NOT_FOUND" },
+ { 0xC0000234, "STATUS_ACCOUNT_LOCKED_OUT" },
+ { 0xC0000235, "STATUS_HANDLE_NOT_CLOSABLE" },
+ { 0xC0000236, "STATUS_CONNECTION_REFUSED" },
+ { 0xC0000237, "STATUS_GRACEFUL_DISCONNECT" },
+ { 0xC0000238, "STATUS_ADDRESS_ALREADY_ASSOCIATED" },
+ { 0xC0000239, "STATUS_ADDRESS_NOT_ASSOCIATED" },
+ { 0xC000023A, "STATUS_CONNECTION_INVALID" },
+ { 0xC000023B, "STATUS_CONNECTION_ACTIVE" },
+ { 0xC000023C, "STATUS_NETWORK_UNREACHABLE" },
+ { 0xC000023D, "STATUS_HOST_UNREACHABLE" },
+ { 0xC000023E, "STATUS_PROTOCOL_UNREACHABLE" },
+ { 0xC000023F, "STATUS_PORT_UNREACHABLE" },
+ { 0xC0000240, "STATUS_REQUEST_ABORTED" },
+ { 0xC0000241, "STATUS_CONNECTION_ABORTED" },
+ { 0xC0000242, "STATUS_BAD_COMPRESSION_BUFFER" },
+ { 0xC0000243, "STATUS_USER_MAPPED_FILE" },
+ { 0xC0000244, "STATUS_AUDIT_FAILED" },
+ { 0xC0000245, "STATUS_TIMER_RESOLUTION_NOT_SET" },
+ { 0xC0000246, "STATUS_CONNECTION_COUNT_LIMIT" },
+ { 0xC0000247, "STATUS_LOGIN_TIME_RESTRICTION" },
+ { 0xC0000248, "STATUS_LOGIN_WKSTA_RESTRICTION" },
+ { 0xC0000249, "STATUS_IMAGE_MP_UP_MISMATCH" },
+ { 0xC0000250, "STATUS_INSUFFICIENT_LOGON_INFO" },
+ { 0xC0000251, "STATUS_BAD_DLL_ENTRYPOINT" },
+ { 0xC0000252, "STATUS_BAD_SERVICE_ENTRYPOINT" },
+ { 0xC0000253, "STATUS_LPC_REPLY_LOST" },
+ { 0xC0000254, "STATUS_IP_ADDRESS_CONFLICT1" },
+ { 0xC0000255, "STATUS_IP_ADDRESS_CONFLICT2" },
+ { 0xC0000256, "STATUS_REGISTRY_QUOTA_LIMIT" },
+ { 0xC0000257, "STATUS_PATH_NOT_COVERED" },
+ { 0xC0000258, "STATUS_NO_CALLBACK_ACTIVE" },
+ { 0xC0000259, "STATUS_LICENSE_QUOTA_EXCEEDED" },
+ { 0xC000025A, "STATUS_PWD_TOO_SHORT" },
+ { 0xC000025B, "STATUS_PWD_TOO_RECENT" },
+ { 0xC000025C, "STATUS_PWD_HISTORY_CONFLICT" },
+ { 0xC000025E, "STATUS_PLUGPLAY_NO_DEVICE" },
+ { 0xC000025F, "STATUS_UNSUPPORTED_COMPRESSION" },
+ { 0xC0000260, "STATUS_INVALID_HW_PROFILE" },
+ { 0xC0000261, "STATUS_INVALID_PLUGPLAY_DEVICE_PATH" },
+ { 0xC0000262, "STATUS_DRIVER_ORDINAL_NOT_FOUND" },
+ { 0xC0000263, "STATUS_DRIVER_ENTRYPOINT_NOT_FOUND" },
+ { 0xC0000264, "STATUS_RESOURCE_NOT_OWNED" },
+ { 0xC0000265, "STATUS_TOO_MANY_LINKS" },
+ { 0xC0000266, "STATUS_QUOTA_LIST_INCONSISTENT" },
+ { 0xC0000267, "STATUS_FILE_IS_OFFLINE" },
+ { 0xC0000268, "STATUS_EVALUATION_EXPIRATION" },
+ { 0xC0000269, "STATUS_ILLEGAL_DLL_RELOCATION" },
+ { 0xC000026A, "STATUS_LICENSE_VIOLATION" },
+ { 0xC000026B, "STATUS_DLL_INIT_FAILED_LOGOFF" },
+ { 0xC000026C, "STATUS_DRIVER_UNABLE_TO_LOAD" },
+ { 0xC000026D, "STATUS_DFS_UNAVAILABLE" },
+ { 0xC000026E, "STATUS_VOLUME_DISMOUNTED" },
+ { 0xC000026F, "STATUS_WX86_INTERNAL_ERROR" },
+ { 0xC0000270, "STATUS_WX86_FLOAT_STACK_CHECK" },
+ { 0xC0000271, "STATUS_VALIDATE_CONTINUE" },
+ { 0xC0000272, "STATUS_NO_MATCH" },
+ { 0xC0000273, "STATUS_NO_MORE_MATCHES" },
+ { 0xC0000275, "STATUS_NOT_A_REPARSE_POINT" },
+ { 0xC0000276, "STATUS_IO_REPARSE_TAG_INVALID" },
+ { 0xC0000277, "STATUS_IO_REPARSE_TAG_MISMATCH" },
+ { 0xC0000278, "STATUS_IO_REPARSE_DATA_INVALID" },
+ { 0xC0000279, "STATUS_IO_REPARSE_TAG_NOT_HANDLED" },
+ { 0xC0000280, "STATUS_REPARSE_POINT_NOT_RESOLVED" },
+ { 0xC0000281, "STATUS_DIRECTORY_IS_A_REPARSE_POINT" },
+ { 0xC0000282, "STATUS_RANGE_LIST_CONFLICT" },
+ { 0xC0000283, "STATUS_SOURCE_ELEMENT_EMPTY" },
+ { 0xC0000284, "STATUS_DESTINATION_ELEMENT_FULL" },
+ { 0xC0000285, "STATUS_ILLEGAL_ELEMENT_ADDRESS" },
+ { 0xC0000286, "STATUS_MAGAZINE_NOT_PRESENT" },
+ { 0xC0000287, "STATUS_REINITIALIZATION_NEEDED" },
+ { 0x80000288, "STATUS_DEVICE_REQUIRES_CLEANING" },
+ { 0x80000289, "STATUS_DEVICE_DOOR_OPEN" },
+ { 0xC000028A, "STATUS_ENCRYPTION_FAILED" },
+ { 0xC000028B, "STATUS_DECRYPTION_FAILED" },
+ { 0xC000028C, "STATUS_RANGE_NOT_FOUND" },
+ { 0xC000028D, "STATUS_NO_RECOVERY_POLICY" },
+ { 0xC000028E, "STATUS_NO_EFS" },
+ { 0xC000028F, "STATUS_WRONG_EFS" },
+ { 0xC0000290, "STATUS_NO_USER_KEYS" },
+ { 0xC0000291, "STATUS_FILE_NOT_ENCRYPTED" },
+ { 0xC0000292, "STATUS_NOT_EXPORT_FORMAT" },
+ { 0xC0000293, "STATUS_FILE_ENCRYPTED" },
+ { 0x40000294, "STATUS_WAKE_SYSTEM" },
+ { 0xC0000295, "STATUS_WMI_GUID_NOT_FOUND" },
+ { 0xC0000296, "STATUS_WMI_INSTANCE_NOT_FOUND" },
+ { 0xC0000297, "STATUS_WMI_ITEMID_NOT_FOUND" },
+ { 0xC0000298, "STATUS_WMI_TRY_AGAIN" },
+ { 0xC0000299, "STATUS_SHARED_POLICY" },
+ { 0xC000029A, "STATUS_POLICY_OBJECT_NOT_FOUND" },
+ { 0xC000029B, "STATUS_POLICY_ONLY_IN_DS" },
+ { 0xC000029C, "STATUS_VOLUME_NOT_UPGRADED" },
+ { 0xC000029D, "STATUS_REMOTE_STORAGE_NOT_ACTIVE" },
+ { 0xC000029E, "STATUS_REMOTE_STORAGE_MEDIA_ERROR" },
+ { 0xC000029F, "STATUS_NO_TRACKING_SERVICE" },
+ { 0xC00002A0, "STATUS_SERVER_SID_MISMATCH" },
+ { 0xC00002A1, "STATUS_DS_NO_ATTRIBUTE_OR_VALUE" },
+ { 0xC00002A2, "STATUS_DS_INVALID_ATTRIBUTE_SYNTAX" },
+ { 0xC00002A3, "STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED" },
+ { 0xC00002A4, "STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS" },
+ { 0xC00002A5, "STATUS_DS_BUSY" },
+ { 0xC00002A6, "STATUS_DS_UNAVAILABLE" },
+ { 0xC00002A7, "STATUS_DS_NO_RIDS_ALLOCATED" },
+ { 0xC00002A8, "STATUS_DS_NO_MORE_RIDS" },
+ { 0xC00002A9, "STATUS_DS_INCORRECT_ROLE_OWNER" },
+ { 0xC00002AA, "STATUS_DS_RIDMGR_INIT_ERROR" },
+ { 0xC00002AB, "STATUS_DS_OBJ_CLASS_VIOLATION" },
+ { 0xC00002AC, "STATUS_DS_CANT_ON_NON_LEAF" },
+ { 0xC00002AD, "STATUS_DS_CANT_ON_RDN" },
+ { 0xC00002AE, "STATUS_DS_CANT_MOD_OBJ_CLASS" },
+ { 0xC00002AF, "STATUS_DS_CROSS_DOM_MOVE_FAILED" },
+ { 0xC00002B0, "STATUS_DS_GC_NOT_AVAILABLE" },
+ { 0xC00002B1, "STATUS_DIRECTORY_SERVICE_REQUIRED" },
+ { 0xC00002B2, "STATUS_REPARSE_ATTRIBUTE_CONFLICT" },
+ { 0xC00002B3, "STATUS_CANT_ENABLE_DENY_ONLY" },
+ { 0xC00002B4, "STATUS_FLOAT_MULTIPLE_FAULTS" },
+ { 0xC00002B5, "STATUS_FLOAT_MULTIPLE_TRAPS" },
+ { 0xC00002B6, "STATUS_DEVICE_REMOVED" },
+ { 0xC00002B7, "STATUS_JOURNAL_DELETE_IN_PROGRESS" },
+ { 0xC00002B8, "STATUS_JOURNAL_NOT_ACTIVE" },
+ { 0xC00002B9, "STATUS_NOINTERFACE" },
+ { 0xC00002C1, "STATUS_DS_ADMIN_LIMIT_EXCEEDED" },
+ { 0xC00002C2, "STATUS_DRIVER_FAILED_SLEEP" },
+ { 0xC00002C3, "STATUS_MUTUAL_AUTHENTICATION_FAILED" },
+ { 0xC00002C4, "STATUS_CORRUPT_SYSTEM_FILE" },
+ { 0xC00002C5, "STATUS_DATATYPE_MISALIGNMENT_ERROR" },
+ { 0xC00002C6, "STATUS_WMI_READ_ONLY" },
+ { 0xC00002C7, "STATUS_WMI_SET_FAILURE" },
+ { 0xC00002C8, "STATUS_COMMITMENT_MINIMUM" },
+ { 0xC00002C9, "STATUS_REG_NAT_CONSUMPTION" },
+ { 0xC00002CA, "STATUS_TRANSPORT_FULL" },
+ { 0xC00002CB, "STATUS_DS_SAM_INIT_FAILURE" },
+ { 0xC00002CC, "STATUS_ONLY_IF_CONNECTED" },
+ { 0xC00002CD, "STATUS_DS_SENSITIVE_GROUP_VIOLATION" },
+ { 0xC00002CE, "STATUS_PNP_RESTART_ENUMERATION" },
+ { 0xC00002CF, "STATUS_JOURNAL_ENTRY_DELETED" },
+ { 0xC00002D0, "STATUS_DS_CANT_MOD_PRIMARYGROUPID" },
+ { 0xC00002D1, "STATUS_SYSTEM_IMAGE_BAD_SIGNATURE" },
+ { 0xC00002D2, "STATUS_PNP_REBOOT_REQUIRED" },
+ { 0xC00002D3, "STATUS_POWER_STATE_INVALID" },
+ { 0xC00002D4, "STATUS_DS_INVALID_GROUP_TYPE" },
+ { 0xC00002D5, "STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN" },
+ { 0xC00002D6, "STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN" },
+ { 0xC00002D7, "STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER" },
+ { 0xC00002D8, "STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER" },
+ { 0xC00002D9, "STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER" },
+ { 0xC00002DA, "STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER" },
+ { 0xC00002DB, "STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER" },
+ { 0xC00002DC, "STATUS_DS_HAVE_PRIMARY_MEMBERS" },
+ { 0xC00002DD, "STATUS_WMI_NOT_SUPPORTED" },
+ { 0xC00002DE, "STATUS_INSUFFICIENT_POWER" },
+ { 0xC00002DF, "STATUS_SAM_NEED_BOOTKEY_PASSWORD" },
+ { 0xC00002E0, "STATUS_SAM_NEED_BOOTKEY_FLOPPY" },
+ { 0xC00002E1, "STATUS_DS_CANT_START" },
+ { 0xC00002E2, "STATUS_DS_INIT_FAILURE" },
+ { 0xC00002E3, "STATUS_SAM_INIT_FAILURE" },
+ { 0xC00002E4, "STATUS_DS_GC_REQUIRED" },
+ { 0xC00002E5, "STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY" },
+ { 0xC00002E6, "STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS" },
+ { 0xC00002E7, "STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED" },
+ { 0xC00002E8, "STATUS_MULTIPLE_FAULT_VIOLATION" },
+ { 0xC0000300, "STATUS_NOT_SUPPORTED_ON_SBS" },
+ { 0xC0009898, "STATUS_WOW_ASSERTION" },
+ { 0xC0020001, "RPC_NT_INVALID_STRING_BINDING" },
+ { 0xC0020002, "RPC_NT_WRONG_KIND_OF_BINDING" },
+ { 0xC0020003, "RPC_NT_INVALID_BINDING" },
+ { 0xC0020004, "RPC_NT_PROTSEQ_NOT_SUPPORTED" },
+ { 0xC0020005, "RPC_NT_INVALID_RPC_PROTSEQ" },
+ { 0xC0020006, "RPC_NT_INVALID_STRING_UUID" },
+ { 0xC0020007, "RPC_NT_INVALID_ENDPOINT_FORMAT" },
+ { 0xC0020008, "RPC_NT_INVALID_NET_ADDR" },
+ { 0xC0020009, "RPC_NT_NO_ENDPOINT_FOUND" },
+ { 0xC002000A, "RPC_NT_INVALID_TIMEOUT" },
+ { 0xC002000B, "RPC_NT_OBJECT_NOT_FOUND" },
+ { 0xC002000C, "RPC_NT_ALREADY_REGISTERED" },
+ { 0xC002000D, "RPC_NT_TYPE_ALREADY_REGISTERED" },
+ { 0xC002000E, "RPC_NT_ALREADY_LISTENING" },
+ { 0xC002000F, "RPC_NT_NO_PROTSEQS_REGISTERED" },
+ { 0xC0020010, "RPC_NT_NOT_LISTENING" },
+ { 0xC0020011, "RPC_NT_UNKNOWN_MGR_TYPE" },
+ { 0xC0020012, "RPC_NT_UNKNOWN_IF" },
+ { 0xC0020013, "RPC_NT_NO_BINDINGS" },
+ { 0xC0020014, "RPC_NT_NO_PROTSEQS" },
+ { 0xC0020015, "RPC_NT_CANT_CREATE_ENDPOINT" },
+ { 0xC0020016, "RPC_NT_OUT_OF_RESOURCES" },
+ { 0xC0020017, "RPC_NT_SERVER_UNAVAILABLE" },
+ { 0xC0020018, "RPC_NT_SERVER_TOO_BUSY" },
+ { 0xC0020019, "RPC_NT_INVALID_NETWORK_OPTIONS" },
+ { 0xC002001A, "RPC_NT_NO_CALL_ACTIVE" },
+ { 0xC002001B, "RPC_NT_CALL_FAILED" },
+ { 0xC002001C, "RPC_NT_CALL_FAILED_DNE" },
+ { 0xC002001D, "RPC_NT_PROTOCOL_ERROR" },
+ { 0xC002001F, "RPC_NT_UNSUPPORTED_TRANS_SYN" },
+ { 0xC0020021, "RPC_NT_UNSUPPORTED_TYPE" },
+ { 0xC0020022, "RPC_NT_INVALID_TAG" },
+ { 0xC0020023, "RPC_NT_INVALID_BOUND" },
+ { 0xC0020024, "RPC_NT_NO_ENTRY_NAME" },
+ { 0xC0020025, "RPC_NT_INVALID_NAME_SYNTAX" },
+ { 0xC0020026, "RPC_NT_UNSUPPORTED_NAME_SYNTAX" },
+ { 0xC0020028, "RPC_NT_UUID_NO_ADDRESS" },
+ { 0xC0020029, "RPC_NT_DUPLICATE_ENDPOINT" },
+ { 0xC002002A, "RPC_NT_UNKNOWN_AUTHN_TYPE" },
+ { 0xC002002B, "RPC_NT_MAX_CALLS_TOO_SMALL" },
+ { 0xC002002C, "RPC_NT_STRING_TOO_LONG" },
+ { 0xC002002D, "RPC_NT_PROTSEQ_NOT_FOUND" },
+ { 0xC002002E, "RPC_NT_PROCNUM_OUT_OF_RANGE" },
+ { 0xC002002F, "RPC_NT_BINDING_HAS_NO_AUTH" },
+ { 0xC0020030, "RPC_NT_UNKNOWN_AUTHN_SERVICE" },
+ { 0xC0020031, "RPC_NT_UNKNOWN_AUTHN_LEVEL" },
+ { 0xC0020032, "RPC_NT_INVALID_AUTH_IDENTITY" },
+ { 0xC0020033, "RPC_NT_UNKNOWN_AUTHZ_SERVICE" },
+ { 0xC0020034, "EPT_NT_INVALID_ENTRY" },
+ { 0xC0020035, "EPT_NT_CANT_PERFORM_OP" },
+ { 0xC0020036, "EPT_NT_NOT_REGISTERED" },
+ { 0xC0020037, "RPC_NT_NOTHING_TO_EXPORT" },
+ { 0xC0020038, "RPC_NT_INCOMPLETE_NAME" },
+ { 0xC0020039, "RPC_NT_INVALID_VERS_OPTION" },
+ { 0xC002003A, "RPC_NT_NO_MORE_MEMBERS" },
+ { 0xC002003B, "RPC_NT_NOT_ALL_OBJS_UNEXPORTED" },
+ { 0xC002003C, "RPC_NT_INTERFACE_NOT_FOUND" },
+ { 0xC002003D, "RPC_NT_ENTRY_ALREADY_EXISTS" },
+ { 0xC002003E, "RPC_NT_ENTRY_NOT_FOUND" },
+ { 0xC002003F, "RPC_NT_NAME_SERVICE_UNAVAILABLE" },
+ { 0xC0020040, "RPC_NT_INVALID_NAF_ID" },
+ { 0xC0020041, "RPC_NT_CANNOT_SUPPORT" },
+ { 0xC0020042, "RPC_NT_NO_CONTEXT_AVAILABLE" },
+ { 0xC0020043, "RPC_NT_INTERNAL_ERROR" },
+ { 0xC0020044, "RPC_NT_ZERO_DIVIDE" },
+ { 0xC0020045, "RPC_NT_ADDRESS_ERROR" },
+ { 0xC0020046, "RPC_NT_FP_DIV_ZERO" },
+ { 0xC0020047, "RPC_NT_FP_UNDERFLOW" },
+ { 0xC0020048, "RPC_NT_FP_OVERFLOW" },
+ { 0xC0021007, "RPC_P_RECEIVE_ALERTED" },
+ { 0xC0021008, "RPC_P_CONNECTION_CLOSED" },
+ { 0xC0021009, "RPC_P_RECEIVE_FAILED" },
+ { 0xC002100A, "RPC_P_SEND_FAILED" },
+ { 0xC002100B, "RPC_P_TIMEOUT" },
+ { 0xC002100C, "RPC_P_SERVER_TRANSPORT_ERROR" },
+ { 0xC002100E, "RPC_P_EXCEPTION_OCCURED" },
+ { 0xC0021012, "RPC_P_CONNECTION_SHUTDOWN" },
+ { 0xC0021015, "RPC_P_THREAD_LISTENING" },
+ { 0xC0030001, "RPC_NT_NO_MORE_ENTRIES" },
+ { 0xC0030002, "RPC_NT_SS_CHAR_TRANS_OPEN_FAIL" },
+ { 0xC0030003, "RPC_NT_SS_CHAR_TRANS_SHORT_FILE" },
+ { 0xC0030004, "RPC_NT_SS_IN_NULL_CONTEXT" },
+ { 0xC0030005, "RPC_NT_SS_CONTEXT_MISMATCH" },
+ { 0xC0030006, "RPC_NT_SS_CONTEXT_DAMAGED" },
+ { 0xC0030007, "RPC_NT_SS_HANDLES_MISMATCH" },
+ { 0xC0030008, "RPC_NT_SS_CANNOT_GET_CALL_HANDLE" },
+ { 0xC0030009, "RPC_NT_NULL_REF_POINTER" },
+ { 0xC003000A, "RPC_NT_ENUM_VALUE_OUT_OF_RANGE" },
+ { 0xC003000B, "RPC_NT_BYTE_COUNT_TOO_SMALL" },
+ { 0xC003000C, "RPC_NT_BAD_STUB_DATA" },
+ { 0xC0020049, "RPC_NT_CALL_IN_PROGRESS" },
+ { 0xC002004A, "RPC_NT_NO_MORE_BINDINGS" },
+ { 0xC002004B, "RPC_NT_GROUP_MEMBER_NOT_FOUND" },
+ { 0xC002004C, "EPT_NT_CANT_CREATE" },
+ { 0xC002004D, "RPC_NT_INVALID_OBJECT" },
+ { 0xC002004F, "RPC_NT_NO_INTERFACES" },
+ { 0xC0020050, "RPC_NT_CALL_CANCELLED" },
+ { 0xC0020051, "RPC_NT_BINDING_INCOMPLETE" },
+ { 0xC0020052, "RPC_NT_COMM_FAILURE" },
+ { 0xC0020053, "RPC_NT_UNSUPPORTED_AUTHN_LEVEL" },
+ { 0xC0020054, "RPC_NT_NO_PRINC_NAME" },
+ { 0xC0020055, "RPC_NT_NOT_RPC_ERROR" },
+ { 0x40020056, "RPC_NT_UUID_LOCAL_ONLY" },
+ { 0xC0020057, "RPC_NT_SEC_PKG_ERROR" },
+ { 0xC0020058, "RPC_NT_NOT_CANCELLED" },
+ { 0xC0030059, "RPC_NT_INVALID_ES_ACTION" },
+ { 0xC003005A, "RPC_NT_WRONG_ES_VERSION" },
+ { 0xC003005B, "RPC_NT_WRONG_STUB_VERSION" },
+ { 0xC003005C, "RPC_NT_INVALID_PIPE_OBJECT" },
+ { 0xC003005D, "RPC_NT_INVALID_PIPE_OPERATION" },
+ { 0xC003005E, "RPC_NT_WRONG_PIPE_VERSION" },
+ { 0x400200AF, "RPC_NT_SEND_INCOMPLETE" },
+ { 0, NULL }
+};
+
+/*
+ * return an NT error string from a SMB buffer
+ */
+const char *
+nt_errstr(uint32_t err)
+{
+ static char ret[128];
+ int i;
+
+ ret[0] = 0;
+
+ for (i = 0; nt_errors[i].name; i++) {
+ if (err == nt_errors[i].code)
+ return nt_errors[i].name;
+ }
+
+ snprintf(ret, sizeof(ret), "0x%08x", err);
+ return ret;
+}
--- /dev/null
+$6 !~ /^ack/ && $5 !~ /[SFR]/ {
+ # given a tcpdump ftp trace, output one line for each send
+ # in the form
+ # <send time> <seq no>
+ # where <send time> is the time packet was sent (in seconds with
+ # zero at time of first packet) and <seq no> is the tcp sequence
+ # number of the packet divided by 1024 (i.e., Kbytes sent).
+ #
+ # convert time to seconds
+ n = split ($1,t,":")
+ tim = t[1]*3600 + t[2]*60 + t[3]
+ if (! tzero) {
+ tzero = tim
+ OFS = "\t"
+ }
+ # get packet sequence number
+ i = index($6,":")
+ printf "%7.2f\t%g\n", tim-tzero, substr($6,1,i-1)/1024
+ }
--- /dev/null
+/*
+ * Copyright (c) 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of California at Berkeley. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific written prior permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#else
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include "interface.h"
+
+/*
+ * This array is designed for mapping upper and lower case letter
+ * together for a case independent comparison. The mappings are
+ * based upon ascii character sequences.
+ */
+static const u_char charmap[] = {
+ '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+ '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+ '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+ '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+ '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+ '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+ '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+ '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+ '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+ '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+ '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+ '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
+ '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+ '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+ '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+ '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+ '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
+ '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
+ '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
+ '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
+ '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+ '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
+ '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
+ '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
+ '\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+ '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+ '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+ '\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337',
+ '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+ '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+ '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+ '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
+};
+
+int
+strcasecmp(s1, s2)
+ const char *s1, *s2;
+{
+ register const u_char *cm = charmap,
+ *us1 = (u_char *)s1,
+ *us2 = (u_char *)s2;
+
+ while (cm[*us1] == cm[*us2++])
+ if (*us1++ == '\0')
+ return(0);
+ return(cm[*us1] - cm[*--us2]);
+}
+
+int
+strncasecmp(s1, s2, n)
+ const char *s1, *s2;
+ register int n;
+{
+ register const u_char *cm = charmap,
+ *us1 = (u_char *)s1,
+ *us2 = (u_char *)s2;
+
+ while (--n >= 0 && cm[*us1] == cm[*us2++])
+ if (*us1++ == '\0')
+ return(0);
+ return(n < 0 ? 0 : cm[*us1] - cm[*--us2]);
+}
--- /dev/null
+/*
+ * Copyright (c) 1982, 1986, 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.
+ *
+ * @(#)tcp.h 8.1 (Berkeley) 6/10/93
+ */
+
+typedef uint32_t tcp_seq;
+/*
+ * TCP header.
+ * Per RFC 793, September, 1981.
+ */
+struct tcphdr {
+ uint16_t th_sport; /* source port */
+ uint16_t th_dport; /* destination port */
+ tcp_seq th_seq; /* sequence number */
+ tcp_seq th_ack; /* acknowledgement number */
+ uint8_t th_offx2; /* data offset, rsvd */
+ uint8_t th_flags;
+ uint16_t th_win; /* window */
+ uint16_t th_sum; /* checksum */
+ uint16_t th_urp; /* urgent pointer */
+} UNALIGNED;
+
+#define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4)
+
+/* TCP flags */
+#define TH_FIN 0x01
+#define TH_SYN 0x02
+#define TH_RST 0x04
+#define TH_PUSH 0x08
+#define TH_ACK 0x10
+#define TH_URG 0x20
+#define TH_ECNECHO 0x40 /* ECN Echo */
+#define TH_CWR 0x80 /* ECN Cwnd Reduced */
+
+
+#define TCPOPT_EOL 0
+#define TCPOPT_NOP 1
+#define TCPOPT_MAXSEG 2
+#define TCPOLEN_MAXSEG 4
+#define TCPOPT_WSCALE 3 /* window scale factor (rfc1323) */
+#define TCPOPT_SACKOK 4 /* selective ack ok (rfc2018) */
+#define TCPOPT_SACK 5 /* selective ack (rfc2018) */
+#define TCPOPT_ECHO 6 /* echo (rfc1072) */
+#define TCPOPT_ECHOREPLY 7 /* echo (rfc1072) */
+#define TCPOPT_TIMESTAMP 8 /* timestamp (rfc1323) */
+#define TCPOLEN_TIMESTAMP 10
+#define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */
+#define TCPOPT_CC 11 /* T/TCP CC options (rfc1644) */
+#define TCPOPT_CCNEW 12 /* T/TCP CC options (rfc1644) */
+#define TCPOPT_CCECHO 13 /* T/TCP CC options (rfc1644) */
+#define TCPOPT_SIGNATURE 19 /* Keyed MD5 (rfc2385) */
+#define TCPOLEN_SIGNATURE 18
+#define TCP_SIGLEN 16 /* length of an option 19 digest */
+#define TCPOPT_AUTH 20 /* Enhanced AUTH option */
+#define TCPOPT_UTO 28 /* tcp user timeout (rfc5482) */
+#define TCPOLEN_UTO 4
+#define TCPOPT_MPTCP 30 /* MPTCP options */
+#define TCPOPT_EXPERIMENT2 254 /* experimental headers (rfc4727) */
+
+#define TCPOPT_TSTAMP_HDR \
+ (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP)
+
+#ifndef TELNET_PORT
+#define TELNET_PORT 23
+#endif
+#ifndef SMTP_PORT
+#define SMTP_PORT 25
+#endif
+#ifndef BGP_PORT
+#define BGP_PORT 179
+#endif
+#define NETBIOS_SSN_PORT 139
+#ifndef OPENFLOW_PORT_OLD
+#define OPENFLOW_PORT_OLD 6633
+#endif
+#ifndef OPENFLOW_PORT_IANA
+#define OPENFLOW_PORT_IANA 6653
+#endif
+#ifndef PPTP_PORT
+#define PPTP_PORT 1723
+#endif
+#define BEEP_PORT 10288
+#ifndef NFS_PORT
+#define NFS_PORT 2049
+#endif
+#define MSDP_PORT 639
+#define RPKI_RTR_PORT 323
+#define LDP_PORT 646
+#ifndef SMB_PORT
+#define SMB_PORT 445
+#endif
+#ifndef HTTP_PORT
+#define HTTP_PORT 80
+#endif
+#ifndef HTTP_PORT_ALT
+#define HTTP_PORT_ALT 8080
+#endif
+#ifndef RTSP_PORT
+#define RTSP_PORT 554
+#endif
+#ifndef RTSP_PORT_ALT
+#define RTSP_PORT_ALT 8554
+#endif
+#ifndef FTP_PORT
+#define FTP_PORT 21
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2002 - 2003
+ * NetGroup, Politecnico di Torino (Italy)
+ * 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 Politecnico di Torino 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 COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ */
+
+/*
+ * Include the appropriate OS header files on Windows and various flavors
+ * of UNIX, include various non-OS header files on Windows, and define
+ * various items as needed, to isolate most of tcpdump's platform
+ * differences to this one file.
+ */
+
+#ifndef tcpdump_stdinc_h
+#define tcpdump_stdinc_h
+
+#include <errno.h>
+
+#ifdef WIN32
+
+#include <stdint.h>
+#include <stdio.h>
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#include "bittypes.h" /* in wpcap's Win32/include */
+#include <ctype.h>
+#include <time.h>
+#include <io.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <net/netdb.h> /* in wpcap's Win32/include */
+
+#ifndef uint8_t
+#define uint8_t unsigned char
+#endif
+
+#ifndef int8_t
+#define int8_t signed char
+#endif
+
+#ifndef uint16_t
+#define uint16_t unsigned short
+#endif
+
+#ifndef int16_t
+#define int16_t signed short
+#endif
+
+#ifndef uint32_t
+#define uint32_t unsigned int
+#endif
+
+#ifndef int32_t
+#define int32_t signed int
+#endif
+
+#ifdef _MSC_EXTENSIONS
+
+#ifndef uint64_t
+#define uint64_t unsigned _int64
+#endif
+
+#ifndef int64_t
+#define int64_t _int64
+#endif
+
+#ifndef PRId64
+#define PRId64 "I64d"
+#endif
+
+#ifndef PRIo64
+#define PRIo64 "I64o"
+#endif
+
+#ifndef PRIu64
+#define PRIu64 "I64u"
+#endif
+
+#ifndef PRIx64
+#define PRIx64 "I64x"
+#endif
+
+#else /* _MSC_EXTENSIONS */
+
+#ifndef uint64_t
+#define uint64_t unsigned long long
+#endif
+
+#ifndef int64_t
+#define int64_t long long
+#endif
+
+#ifndef PRId64
+#define PRId64 "lld"
+#endif
+
+#ifndef PRIo64
+#define PRIo64 "llo"
+#endif
+
+#ifndef PRIu64
+#define PRIu64 "llu"
+#endif
+
+#ifndef PRIx64
+#define PRIx64 "llx"
+#endif
+
+#endif /* _MSC_EXTENSIONS */
+
+#ifdef _MSC_VER
+#define stat _stat
+#define open _open
+#define fstat _fstat
+#define read _read
+#define close _close
+#define O_RDONLY _O_RDONLY
+#endif /* _MSC_VER */
+
+/* Protos for missing/x.c functions (ideally <missing/addrinfo.h>
+ * should be used, but it clashes with <ws2tcpip.h>).
+ */
+extern const char *inet_ntop (int, const void *, char *, size_t);
+extern int inet_pton (int, const char *, void *);
+extern int inet_aton (const char *cp, struct in_addr *addr);
+
+/*
+ * With MSVC, for C, __inline is used to make a function an inline.
+ */
+#ifdef _MSC_VER
+#define inline __inline
+#endif
+
+#ifndef INET6_ADDRSTRLEN
+#define INET6_ADDRSTRLEN 46
+#endif
+
+/* It is in MSVC's <errno.h>, but not defined in MingW+Watcom.
+ */
+#ifndef EAFNOSUPPORT
+#define EAFNOSUPPORT WSAEAFNOSUPPORT
+#endif
+
+#ifndef caddr_t
+typedef char* caddr_t;
+#endif /* caddr_t */
+
+#define MAXHOSTNAMELEN 64
+#define NI_MAXHOST 1025
+#define snprintf _snprintf
+#define vsnprintf _vsnprintf
+#define RETSIGTYPE void
+
+#else /* WIN32 */
+
+#include <ctype.h>
+#include <unistd.h>
+#include <netdb.h>
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#elif HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#include <sys/param.h>
+#include <sys/types.h> /* concession to AIX */
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#ifdef TIME_WITH_SYS_TIME
+#include <time.h>
+#endif
+
+#include <arpa/inet.h>
+
+#endif /* WIN32 */
+
+#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)).
+ */
+#if !(defined(_MSC_VER) && defined(UNALIGNED))
+/* MSVC may have its own macro defined with the same name and purpose. */
+#undef UNALIGNED
+#define UNALIGNED __attribute__((packed))
+#endif
+
+#if defined(WIN32) || defined(MSDOS)
+ #define FOPEN_READ_TXT "rt"
+ #define FOPEN_READ_BIN "rb"
+ #define FOPEN_WRITE_TXT "wt"
+ #define FOPEN_WRITE_BIN "wb"
+#else
+ #define FOPEN_READ_TXT "r"
+ #define FOPEN_READ_BIN FOPEN_READ_TXT
+ #define FOPEN_WRITE_TXT "w"
+ #define FOPEN_WRITE_BIN FOPEN_WRITE_TXT
+#endif
+
+#if defined(__GNUC__) && defined(__i386__) && !defined(__APPLE__) && !defined(__ntohl)
+ #undef ntohl
+ #undef ntohs
+ #undef htonl
+ #undef htons
+
+ static __inline__ unsigned int __ntohl (unsigned int x);
+ static __inline__ unsigned short __ntohs (unsigned short x);
+
+ #define ntohl(x) __ntohl(x)
+ #define ntohs(x) __ntohs(x)
+ #define htonl(x) __ntohl(x)
+ #define htons(x) __ntohs(x)
+
+ static __inline__ unsigned int __ntohl (unsigned int x)
+ {
+ __asm__ ("xchgb %b0, %h0\n\t" /* swap lower bytes */
+ "rorl $16, %0\n\t" /* swap words */
+ "xchgb %b0, %h0" /* swap higher bytes */
+ : "=q" (x) : "0" (x));
+ return (x);
+ }
+
+ static __inline__ unsigned short __ntohs (unsigned short x)
+ {
+ __asm__ ("xchgb %b0, %h0" /* swap bytes */
+ : "=q" (x) : "0" (x));
+ return (x);
+ }
+#endif
+
+#ifndef INET_ADDRSTRLEN
+#define INET_ADDRSTRLEN 16
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+/*
+ * The Apple deprecation workaround macros below were adopted from the
+ * FreeRADIUS server code under permission of Alan DeKok and Arran Cudbard-Bell.
+ */
+
+#define XSTRINGIFY(x) #x
+
+/*
+ * Macros for controlling warnings in GCC >= 4.2 and clang >= 2.8
+ */
+#define DIAG_JOINSTR(x,y) XSTRINGIFY(x ## y)
+#define DIAG_DO_PRAGMA(x) _Pragma (#x)
+
+#if defined(__GNUC__) && ((__GNUC__ * 100) + __GNUC_MINOR__) >= 402
+# define DIAG_PRAGMA(x) DIAG_DO_PRAGMA(GCC diagnostic x)
+# if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406
+# define DIAG_OFF(x) DIAG_PRAGMA(push) DIAG_PRAGMA(ignored DIAG_JOINSTR(-W,x))
+# define DIAG_ON(x) DIAG_PRAGMA(pop)
+# else
+# define DIAG_OFF(x) DIAG_PRAGMA(ignored DIAG_JOINSTR(-W,x))
+# define DIAG_ON(x) DIAG_PRAGMA(warning DIAG_JOINSTR(-W,x))
+# endif
+#elif defined(__clang__) && ((__clang_major__ * 100) + __clang_minor__ >= 208)
+# define DIAG_PRAGMA(x) DIAG_DO_PRAGMA(clang diagnostic x)
+# define DIAG_OFF(x) DIAG_PRAGMA(push) DIAG_PRAGMA(ignored DIAG_JOINSTR(-W,x))
+# define DIAG_ON(x) DIAG_PRAGMA(pop)
+#else
+# define DIAG_OFF(x)
+# define DIAG_ON(x)
+#endif
+
+/*
+ * For dealing with APIs which are only deprecated in OSX (like the OpenSSL API)
+ */
+#ifdef __APPLE__
+# define USES_APPLE_DEPRECATED_API DIAG_OFF(deprecated-declarations)
+# define USES_APPLE_RST DIAG_ON(deprecated-declarations)
+#else
+# define USES_APPLE_DEPRECATED_API
+# define USES_APPLE_RST
+#endif
+
+/*
+ * end of Apple deprecation workaround macros
+ */
+
+#ifndef min
+#define min(a,b) ((a)>(b)?(b):(a))
+#endif
+#ifndef max
+#define max(a,b) ((b)>(a)?(b):(a))
+#endif
+
+#endif /* tcpdump_stdinc_h */
--- /dev/null
+.\" NetBSD: tcpdump.8,v 1.9 2003/03/31 00:18:17 perry Exp
+.\"
+.\" Copyright (c) 1987, 1988, 1989, 1990, 1991, 1992, 1994, 1995, 1996, 1997
+.\" The Regents of the University of California. All rights reserved.
+.\" All rights reserved.
+.\"
+.\" 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.
+.\"
+.TH TCPDUMP 8 "11 July 2014"
+.SH NAME
+tcpdump \- dump traffic on a network
+.SH SYNOPSIS
+.na
+.B tcpdump
+[
+.B \-AbdDefhHIJKlLnNOpqRStuUvxX#
+] [
+.B \-B
+.I buffer_size
+]
+.br
+.ti +8
+[
+.B \-c
+.I count
+]
+.br
+.ti +8
+[
+.B \-C
+.I file_size
+] [
+.B \-G
+.I rotate_seconds
+] [
+.B \-F
+.I file
+]
+.br
+.ti +8
+[
+.B \-i
+.I interface
+]
+[
+.B \-j
+.I tstamp_type
+]
+[
+.B \-m
+.I module
+]
+[
+.B \-M
+.I secret
+]
+.br
+.ti +8
+[
+.B \-\-number
+]
+[
+.B \-Q
+.I in|out|inout
+]
+.ti +8
+[
+.B \-r
+.I file
+]
+[
+.B \-V
+.I file
+]
+[
+.B \-s
+.I snaplen
+]
+[
+.B \-T
+.I type
+]
+[
+.B \-w
+.I file
+]
+.br
+.ti +8
+[
+.B \-W
+.I filecount
+]
+.br
+.ti +8
+[
+.B \-E
+.I spi@ipaddr algo:secret,...
+]
+.br
+.ti +8
+[
+.B \-y
+.I datalinktype
+]
+[
+.B \-z
+.I postrotate-command
+]
+[
+.B \-Z
+.I user
+]
+.ti +8
+[
+.BI \-\-time\-stamp\-precision= tstamp_precision
+]
+.ti +8
+[
+.B \-\-immediate\-mode
+]
+[
+.B \-\-version
+]
+.ti +8
+[
+.I expression
+]
+.br
+.ad
+.SH DESCRIPTION
+.LP
+\fITcpdump\fP prints out a description of the contents of packets on a
+network interface that match the boolean \fIexpression\fP; the
+description is preceded by a time stamp, printed, by default, as hours,
+minutes, seconds, and fractions of a second since midnight. It can also
+be run with the
+.B \-w
+flag, which causes it to save the packet data to a file for later
+analysis, and/or with the
+.B \-r
+flag, which causes it to read from a saved packet file rather than to
+read packets from a network interface. It can also be run with the
+.B \-V
+flag, which causes it to read a list of saved packet files. In all cases,
+only packets that match
+.I expression
+will be processed by
+.IR tcpdump .
+.LP
+.I Tcpdump
+will, if not run with the
+.B \-c
+flag, continue capturing packets until it is interrupted by a SIGINT
+signal (generated, for example, by typing your interrupt character,
+typically control-C) or a SIGTERM signal (typically generated with the
+.BR kill (1)
+command); if run with the
+.B \-c
+flag, it will capture packets until it is interrupted by a SIGINT or
+SIGTERM signal or the specified number of packets have been processed.
+.LP
+When
+.I tcpdump
+finishes capturing packets, it will report counts of:
+.IP
+packets ``captured'' (this is the number of packets that
+.I tcpdump
+has received and processed);
+.IP
+packets ``received by filter'' (the meaning of this depends on the OS on
+which you're running
+.IR tcpdump ,
+and possibly on the way the OS was configured - if a filter was
+specified on the command line, on some OSes it counts packets regardless
+of whether they were matched by the filter expression and, even if they
+were matched by the filter expression, regardless of whether
+.I tcpdump
+has read and processed them yet, on other OSes it counts only packets that were
+matched by the filter expression regardless of whether
+.I tcpdump
+has read and processed them yet, and on other OSes it counts only
+packets that were matched by the filter expression and were processed by
+.IR tcpdump );
+.IP
+packets ``dropped by kernel'' (this is the number of packets that were
+dropped, due to a lack of buffer space, by the packet capture mechanism
+in the OS on which
+.I tcpdump
+is running, if the OS reports that information to applications; if not,
+it will be reported as 0).
+.LP
+On platforms that support the SIGINFO signal, such as most BSDs
+(including Mac OS X) and Digital/Tru64 UNIX, it will report those counts
+when it receives a SIGINFO signal (generated, for example, by typing
+your ``status'' character, typically control-T)
+\" , although on some
+\" platforms, such as Mac OS X, the ``status'' character is not set by
+\" default, so you must set it with
+\" .BR stty (1)
+\" in order to use it) and will continue capturing packets. On platforms that
+\" do not support the SIGINFO signal, the same can be achieved by using the
+SIGUSR1 signal.
+and will continue capturing packets.
+.LP
+Reading packets from a network interface may require that you have
+special privileges; see the
+.B pcap (3)
+man page for details. Reading a saved packet file doesn't require
+special privileges.
+.SH OPTIONS
+.TP
+.B \-A
+Print each packet (minus its link level header) in ASCII. Handy for
+capturing web pages.
+.TP
+.B \-a
+Attempt to convert network and broadcast addresses to names.
+.TP
+.B \-b
+Print the AS number in BGP packets in ASDOT notation rather than ASPLAIN
+notation.
+.TP
+.BI \-B " buffer_size"
+.PD 0
+.TP
+.BI \-\-buffer\-size= buffer_size
+.PD
+Set the operating system capture buffer size to \fIbuffer_size\fP, in
+units of KiB (1024 bytes).
+.TP
+.BI \-c " count"
+Exit after receiving \fIcount\fP packets.
+.TP
+.BI \-C " file_size"
+Before writing a raw packet to a savefile, check whether the file is
+currently larger than \fIfile_size\fP and, if so, close the current
+savefile and open a new one. Savefiles after the first savefile will
+have the name specified with the
+.B \-w
+flag, with a number after it, starting at 1 and continuing upward.
+The units of \fIfile_size\fP are millions of bytes (1,000,000 bytes,
+not 1,048,576 bytes).
+.TP
+.B \-d
+Dump the compiled packet-matching code in a human readable form to
+standard output and stop.
+.TP
+.B \-dd
+Dump packet-matching code as a
+.B C
+program fragment.
+.TP
+.B \-ddd
+Dump packet-matching code as decimal numbers (preceded with a count).
+.TP
+.B \-D
+.PD 0
+.TP
+.B \-\-list\-interfaces
+.PD
+Print the list of the network interfaces available on the system and on
+which
+.I tcpdump
+can capture packets. For each network interface, a number and an
+interface name, possibly followed by a text description of the
+interface, is printed. The interface name or the number can be supplied
+to the
+.B \-i
+flag to specify an interface on which to capture.
+.IP
+This can be useful on systems that don't have a command to list them
+(e.g., Windows systems, or UNIX systems lacking
+.BR "ifconfig \-a" );
+the number can be useful on Windows 2000 and later systems, where the
+interface name is a somewhat complex string.
+.IP
+The
+.B \-D
+flag will not be supported if
+.I tcpdump
+was built with an older version of
+.I libpcap
+that lacks the
+.B pcap_findalldevs()
+function.
+.TP
+.B \-e
+Print the link-level header on each dump line. This can be used, for
+example, to print MAC layer addresses for protocols such as Ethernet and
+IEEE 802.11.
+.TP
+.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 separation.
+.IP
+Note that setting the secret for IPv4 ESP packets is supported at this time.
+.IP
+Algorithms may be
+\fBdes-cbc\fP,
+\fB3des-cbc\fP,
+\fBblowfish-cbc\fP,
+\fBrc3-cbc\fP,
+\fBcast128-cbc\fP, or
+\fBnone\fP.
+The default is \fBdes-cbc\fP.
+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 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
+the use of this option with a true `secret' key is discouraged.
+By presenting IPsec secret key onto command line
+you make it visible to others, via
+.IR ps (1)
+and other occasions.
+.IP
+In addition to the above syntax, the syntax \fIfile name\fP may be used
+to have tcpdump read the provided file in. The file is opened upon
+receiving the first ESP packet, so any special permissions that tcpdump
+may have been given should already have been given up.
+.TP
+.B \-f
+Print `foreign' IPv4 addresses numerically rather than symbolically
+(this option is intended to get around serious brain damage in
+Sun's NIS server \(em usually it hangs forever translating non-local
+internet numbers).
+.IP
+The test for `foreign' IPv4 addresses is done using the IPv4 address and
+netmask of the interface on which capture is being done. If that
+address or netmask are not available, either because the
+interface on which capture is being done has no address or netmask or
+because the capture is being done on the Linux "any" interface, which
+can capture on more than one interface, this option will not work
+correctly.
+.TP
+.BI \-F " file"
+Use \fIfile\fP as input for the filter expression.
+An additional expression given on the command line is ignored.
+.TP
+.BI \-G " rotate_seconds"
+If specified, rotates the dump file specified with the
+.B \-w
+option every \fIrotate_seconds\fP seconds.
+Savefiles will have the name specified by
+.B \-w
+which should include a time format as defined by
+.BR strftime (3).
+If no time format is specified, each new file will overwrite the previous.
+.IP
+If used in conjunction with the
+.B \-C
+option, filenames will take the form of `\fIfile\fP<count>'.
+.TP
+.B \-h
+.PD 0
+.TP
+.B \-\-help
+.PD
+Print the tcpdump and libpcap version strings, print a usage message,
+and exit.
+.TP
+.B \-\-version
+.PD
+Print the tcpdump and libpcap version strings and exit.
+.TP
+.B \-H
+Attempt to detect 802.11s draft mesh headers.
+.TP
+.BI \-i " interface"
+.PD 0
+.TP
+.BI \-\-interface= interface
+.PD
+Listen on \fIinterface\fP.
+If unspecified, \fItcpdump\fP searches the system interface list for the
+lowest numbered, configured up interface (excluding loopback).
+Ties are broken by choosing the earliest match.
+.\" which may turn out to be, for example, ``eth0''.
+.IP
+.\" On Linux systems with 2.2 or later kernels, an
+.\" .I interface
+.\" argument of ``any'' can be used to capture packets from all interfaces.
+.\" Note that captures on the ``any'' device will not be done in promiscuous
+.\" mode.
+.IP
+If the
+.B \-D
+flag is supported, an interface number as printed by that flag can be
+used as the
+.I interface
+argument.
+.TP
+.B \-I
+.PD 0
+.TP
+.B \-\-monitor\-mode
+.PD
+Put the interface in "monitor mode"; this is supported only on IEEE
+802.11 Wi-Fi interfaces, and supported only on some operating systems.
+.IP
+Note that in monitor mode the adapter might disassociate from the
+network with which it's associated, so that you will not be able to use
+any wireless networks with that adapter. This could prevent accessing
+files on a network server, or resolving host names or network addresses,
+if you are capturing in monitor mode and are not connected to another
+network with another adapter.
+.IP
+This flag will affect the output of the
+.B \-L
+flag. If
+.B \-I
+isn't specified, only those link-layer types available when not in
+monitor mode will be shown; if
+.B \-I
+is specified, only those link-layer types available when in monitor mode
+will be shown.
+.TP
+.BI \-\-immediate\-mode
+Capture in "immediate mode". In this mode, packets are delivered to
+tcpdump as soon as they arrive, rather than being buffered for
+efficiency. This is the default when printing packets rather than
+saving packets to a ``savefile'' if the packets are being printed to a
+terminal rather than to a file or pipe.
+.TP
+.BI \-j " tstamp_type"
+.PD 0
+.TP
+.BI \-\-time\-stamp\-type= tstamp_type
+.PD
+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 (@MAN_MISC_INFO@);
+not all the types listed there will necessarily be valid for any given
+interface.
+.TP
+.B \-J
+.PD 0
+.TP
+.B \-\-list\-time\-stamp\-types
+.PD
+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
+.BI \-\-time\-stamp\-precision= tstamp_precision
+When capturing, set the time stamp precision for the capture to
+\fItstamp_precision\fP. Note that availability of high precision time
+stamps (nanoseconds) and their actual accuracy is platform and hardware
+dependent. Also note that when writing captures made with nanosecond
+accuracy to a savefile, the time stamps are written with nanosecond
+resolution, and the file is written with a different magic number, to
+indicate that the time stamps are in seconds and nanoseconds; not all
+programs that read pcap savefiles will be able to read those captures.
+.LP
+When reading a savefile, convert time stamps to the precision specified
+by \fItimestamp_precision\fP, and display them with that resolution. If
+the precision specified is less than the precision of time stamps in the
+file, the conversion will lose precision.
+.LP
+The supported values for \fItimestamp_precision\fP are \fBmicro\fP for
+microsecond resolution and \fBnano\fP for nanosecond resolution. The
+default is microsecond resolution.
+.TP
+.B \-K
+.PD 0
+.TP
+.B \-\-dont\-verify\-checksums
+.PD
+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
+hardware; otherwise, all outgoing TCP checksums will be flagged as bad.
+.TP
+.B \-l
+Make stdout line buffered.
+Useful if you want to see the data
+while capturing it.
+E.g.,
+.IP
+.RS
+.RS
+.nf
+\fBtcpdump \-l | tee dat\fP
+.fi
+.RE
+.RE
+.IP
+or
+.IP
+.RS
+.RS
+.nf
+\fBtcpdump \-l > dat & tail \-f dat\fP
+.fi
+.RE
+.RE
+.IP
+Note that on Windows,``line buffered'' means ``unbuffered'', so that
+WinDump will write each character individually if
+.B \-l
+is specified.
+.IP
+.B \-U
+is similar to
+.B \-l
+in its behavior, but it will cause output to be ``packet-buffered'', so
+that the output is written to stdout at the end of each packet rather
+than at the end of each line; this is buffered on all platforms,
+including Windows.
+.TP
+.B \-L
+.PD 0
+.TP
+.B \-\-list\-data\-link\-types
+.PD
+List the known data link types for the interface, in the specified mode,
+and exit. The list of known data link types may be dependent on the
+specified mode; for example, on some platforms, a Wi-Fi interface might
+support one set of data link types when not in monitor mode (for
+example, it might support only fake Ethernet headers, or might support
+802.11 headers but not support 802.11 headers with radio information)
+and another set of data link types when in monitor mode (for example, it
+might support 802.11 headers, or 802.11 headers with radio information,
+only in monitor mode).
+.TP
+.BI \-m " module"
+Load SMI MIB module definitions from file \fImodule\fR.
+This option
+can be used several times to load several MIB modules into \fItcpdump\fP.
+.TP
+.BI \-M " secret"
+Use \fIsecret\fP as a shared secret for validating the digests found in
+TCP segments with the TCP-MD5 option (RFC 2385), if present.
+.TP
+.B \-n
+Don't convert addresses (i.e., host addresses, port numbers, etc.) to names.
+.TP
+.B \-N
+Don't print domain name qualification of host names.
+E.g.,
+if you give this flag then \fItcpdump\fP will print ``nic''
+instead of ``nic.ddn.mil''.
+.TP
+.B \-#
+.PD 0
+.TP
+.B \-\-number
+.PD
+Print an optional packet number at the beginning of the line.
+.TP
+.B \-O
+.PD 0
+.TP
+.B \-\-no\-optimize
+.PD
+Do not run the packet-matching code optimizer.
+This is useful only
+if you suspect a bug in the optimizer.
+.TP
+.B \-p
+.PD 0
+.TP
+.B \-\-no\-promiscuous\-mode
+.PD
+\fIDon't\fP put the interface
+into promiscuous mode.
+Note that the interface might be in promiscuous
+mode for some other reason; hence, `-p' cannot be used as an abbreviation for
+`ether host {local-hw-addr} or ether broadcast'.
+.TP
+.BI \-Q " direction"
+.PD 0
+.TP
+.BI \-\-direction= direction
+.PD
+Choose send/receive direction \fIdirection\fR for which packets should be
+captured. Possible values are `in', `out' and `inout'. Not available
+on all platforms.
+.TP
+.B \-q
+Quick (quiet?) output.
+Print less protocol information so output
+lines are shorter.
+.TP
+.B \-R
+Assume ESP/AH packets to be based on old specification (RFC1825 to RFC1829).
+If specified, \fItcpdump\fP will not print replay prevention field.
+Since there is no protocol version field in ESP/AH specification,
+\fItcpdump\fP cannot deduce the version of ESP/AH protocol.
+.TP
+.BI \-r " file"
+Read packets from \fIfile\fR (which was created with the
+.B \-w
+option or by other tools that write pcap or pcap-ng files).
+Standard input is used if \fIfile\fR is ``-''.
+.TP
+.B \-S
+.PD 0
+.TP
+.B \-\-absolute\-tcp\-sequence\-numbers
+.PD
+Print absolute, rather than relative, TCP sequence numbers.
+.TP
+.BI \-s " snaplen"
+.PD 0
+.TP
+.BI \-\-snapshot\-length= snaplen
+.PD
+Snarf \fIsnaplen\fP bytes of data from each packet rather than the
+default of 65535 bytes.
+Packets truncated because of a limited snapshot
+are indicated in the output with ``[|\fIproto\fP]'', where \fIproto\fP
+is the name of the protocol level at which the truncation has occurred.
+Note that taking larger snapshots both increases
+the amount of time it takes to process packets and, effectively,
+decreases the amount of packet buffering.
+This may cause packets to be
+lost.
+You should limit \fIsnaplen\fP to the smallest number that will
+capture the protocol information you're interested in.
+Setting
+\fIsnaplen\fP to 0 sets it to the default of 65535,
+for backwards compatibility with recent older versions of
+.IR tcpdump .
+.TP
+.BI \-T " type"
+Force packets selected by "\fIexpression\fP" to be interpreted the
+specified \fItype\fR.
+Currently known types are
+\fBaodv\fR (Ad-hoc On-demand Distance Vector protocol),
+\fBcarp\fR (Common Address Redundancy Protocol),
+\fBcnfp\fR (Cisco NetFlow protocol),
+\fBlmp\fR (Link Management Protocol),
+\fBpgm\fR (Pragmatic General Multicast),
+\fBpgm_zmtp1\fR (ZMTP/1.0 inside PGM/EPGM),
+\fBradius\fR (RADIUS),
+\fBrpc\fR (Remote Procedure Call),
+\fBrtp\fR (Real-Time Applications protocol),
+\fBrtcp\fR (Real-Time Applications control protocol),
+\fBsnmp\fR (Simple Network Management Protocol),
+\fBtftp\fR (Trivial File Transfer Protocol),
+\fBvat\fR (Visual Audio Tool),
+\fBwb\fR (distributed White Board),
+\fBzmtp1\fR (ZeroMQ Message Transport Protocol 1.0)
+and
+\fBvxlan\fR (Virtual eXtensible Local Area Network).
+.IP
+Note that the \fBpgm\fR type above affects UDP interpretation only, the native
+PGM is always recognised as IP protocol 113 regardless. UDP-encapsulated PGM is
+often called "EPGM" or "PGM/UDP".
+.IP
+Note that the \fBpgm_zmtp1\fR type above affects interpretation of both native
+PGM and UDP at once. During the native PGM decoding the application data of an
+ODATA/RDATA packet would be decoded as a ZeroMQ datagram with ZMTP/1.0 frames.
+During the UDP decoding in addition to that any UDP packet would be treated as
+an encapsulated PGM packet.
+.TP
+.B \-t
+\fIDon't\fP print a timestamp on each dump line.
+.TP
+.B \-tt
+Print the timestamp, as seconds since January 1, 1970, 00:00:00, UTC, and
+fractions of a second since that time, on each dump line.
+.TP
+.B \-ttt
+Print a delta (micro-second resolution) between current and previous line
+on each dump line.
+.TP
+.B \-tttt
+Print a timestamp, as hours, minutes, seconds, and fractions of a second
+since midnight, preceded by the date, on each dump line.
+.TP
+.B \-ttttt
+Print a delta (micro-second resolution) between current and first line
+on each dump line.
+.TP
+.B \-u
+Print undecoded NFS handles.
+.TP
+.B \-U
+.PD 0
+.TP
+.B \-\-packet\-buffered
+.PD
+If the
+.B \-w
+option is not specified, make the printed packet output
+``packet-buffered''; i.e., as the description of the contents of each
+packet is printed, it will be written to the standard output, rather
+than, when not writing to a terminal, being written only when the output
+buffer fills.
+.IP
+If the
+.B \-w
+option is specified, make the saved raw packet output
+``packet-buffered''; i.e., as each packet is saved, it will be written
+to the output file, rather than being written only when the output
+buffer fills.
+.IP
+The
+.B \-U
+flag will not be supported if
+.I tcpdump
+was built with an older version of
+.I libpcap
+that lacks the
+.B pcap_dump_flush()
+function.
+.TP
+.B \-v
+When parsing and printing, produce (slightly more) verbose output.
+For example, the time to live,
+identification, total length and options in an IP packet are printed.
+Also enables additional packet integrity checks such as verifying the
+IP and ICMP header checksum.
+.IP
+When writing to a file with the
+.B \-w
+option, report, every 10 seconds, the number of packets captured.
+.TP
+.B \-vv
+Even more verbose output.
+For example, additional fields are
+printed from NFS reply packets, and SMB packets are fully decoded.
+.TP
+.B \-vvv
+Even more verbose output.
+For example,
+telnet \fBSB\fP ... \fBSE\fP options
+are printed in full.
+With
+.B \-X
+Telnet options are printed in hex as well.
+.TP
+.BI \-V " file"
+Read a list of filenames from \fIfile\fR. Standard input is used
+if \fIfile\fR is ``-''.
+.TP
+.BI \-w " file"
+Write the raw packets to \fIfile\fR rather than parsing and printing
+them out.
+They can later be printed with the \-r option.
+Standard output is used if \fIfile\fR is ``-''.
+.IP
+This output will be buffered if written to a file or pipe, so a program
+reading from the file or pipe may not see packets for an arbitrary
+amount of time after they are received. Use the
+.B \-U
+flag to cause packets to be written as soon as they are received.
+.IP
+The MIME type \fIapplication/vnd.tcpdump.pcap\fP has been registered
+with IANA for \fIpcap\fP files. The filename extension \fI.pcap\fP
+appears to be the most commonly used along with \fI.cap\fP and
+\fI.dmp\fP. \fITcpdump\fP itself doesn't check the extension when
+reading capture files and doesn't add an extension when writing them
+(it uses magic numbers in the file header instead). However, many
+operating systems and applications will use the extension if it is
+present and adding one (e.g. .pcap) is recommended.
+.IP
+See
+.BR pcap-savefile (5)
+for a description of the file format.
+.TP
+.B \-W
+Used in conjunction with the
+.B \-C
+option, this will limit the number
+of files created to the specified number, and begin overwriting files
+from the beginning, thus creating a 'rotating' buffer.
+In addition, it will name
+the files with enough leading 0s to support the maximum number of
+files, allowing them to sort correctly.
+.IP
+Used in conjunction with the
+.B \-G
+option, this will limit the number of rotated dump files that get
+created, exiting with status 0 when reaching the limit. If used with
+.B \-C
+as well, the behavior will result in cyclical files per timeslice.
+.TP
+.B \-x
+When parsing and printing,
+in addition to printing the headers of each packet, print the data of
+each packet (minus its link level header) in hex.
+The smaller of the entire packet or
+.I snaplen
+bytes will be printed. Note that this is the entire link-layer
+packet, so for link layers that pad (e.g. Ethernet), the padding bytes
+will also be printed when the higher layer packet is shorter than the
+required padding.
+.TP
+.B \-xx
+When parsing and printing,
+in addition to printing the headers of each packet, print the data of
+each packet,
+.I including
+its link level header, in hex.
+.TP
+.B \-X
+When parsing and printing,
+in addition to printing the headers of each packet, print the data of
+each packet (minus its link level header) in hex and ASCII.
+This is very handy for analysing new protocols.
+.TP
+.B \-XX
+When parsing and printing,
+in addition to printing the headers of each packet, print the data of
+each packet,
+.I including
+its link level header, in hex and ASCII.
+.TP
+.BI \-y " datalinktype"
+.PD 0
+.TP
+.BI \-\-linktype= datalinktype
+.PD
+Set the data link type to use while capturing packets to \fIdatalinktype\fP.
+The available data link types may be found using the \-L option.
+.TP
+.BI \-z " postrotate-command"
+Used in conjunction with the
+.B -C
+or
+.B -G
+options, this will make
+.I tcpdump
+run "
+.I postrotate-command file
+" where
+.I file
+is the savefile being closed after each rotation. For example, specifying
+.B \-z gzip
+or
+.B \-z bzip2
+will compress each savefile using gzip or bzip2.
+.IP
+Note that tcpdump will run the command in parallel to the capture, using
+the lowest priority so that this doesn't disturb the capture process.
+.IP
+And in case you would like to use a command that itself takes flags or
+different arguments, you can always write a shell script that will take the
+savefile name as the only argument, make the flags & arguments arrangements
+and execute the command that you want.
+.TP
+.BI \-Z " user"
+.PD 0
+.TP
+.BI \-\-relinquish\-privileges= user
+.PD
+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 .
+.IP
+This behavior is the default for NetBSD where
+.I tcpdump
+runs as the user ``_tcpdump''.
+.IP "\fI expression\fP"
+.RS
+selects which packets will be dumped.
+If no \fIexpression\fP
+is given, all packets on the net will be dumped.
+Otherwise,
+only packets for which \fIexpression\fP is `true' will be dumped.
+.LP
+For the \fIexpression\fP syntax, see
+.BR pcap-filter (7).
+.LP
+The \fIexpression\fP argument can be passed to \fItcpdump\fP as either a single
+Shell argument, or as multiple Shell arguments, whichever is more convenient.
+Generally, if the expression contains Shell metacharacters, such as
+backslashes used to escape protocol names, it is easier to pass it as
+a single, quoted argument rather than to escape the Shell
+metacharacters.
+Multiple arguments are concatenated with spaces before being parsed.
+.SH EXAMPLES
+.LP
+To print all packets arriving at or departing from \fIsundown\fP:
+.RS
+.nf
+\fBtcpdump host sundown\fP
+.fi
+.RE
+.LP
+To print traffic between \fIhelios\fR and either \fIhot\fR or \fIace\fR:
+.RS
+.nf
+\fBtcpdump host helios and \\( hot or ace \\)\fP
+.fi
+.RE
+.LP
+To print all IP packets between \fIace\fR and any host except \fIhelios\fR:
+.RS
+.nf
+\fBtcpdump ip host ace and not helios\fP
+.fi
+.RE
+.LP
+To print all traffic between local hosts and hosts at Berkeley:
+.RS
+.nf
+.B
+tcpdump net ucb-ether
+.fi
+.RE
+.LP
+To print all ftp traffic through internet gateway \fIsnup\fP:
+(note that the expression is quoted to prevent the shell from
+(mis-)interpreting the parentheses):
+.RS
+.nf
+.B
+tcpdump 'gateway snup and (port ftp or ftp-data)'
+.fi
+.RE
+.LP
+To print traffic neither sourced from nor destined for local hosts
+(if you gateway to one other net, this stuff should never make it
+onto your local net).
+.RS
+.nf
+.B
+tcpdump ip and not net \fIlocalnet\fP
+.fi
+.RE
+.LP
+To print the start and end packets (the SYN and FIN packets) of each
+TCP conversation that involves a non-local host.
+.RS
+.nf
+.B
+tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net \fIlocalnet\fP'
+.fi
+.RE
+.LP
+To print all IPv4 HTTP packets to and from port 80, i.e. print only
+packets that contain data, not, for example, SYN and FIN packets and
+ACK-only packets. (IPv6 is left as an exercise for the reader.)
+.RS
+.nf
+.B
+tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
+.fi
+.RE
+.LP
+To print IP packets longer than 576 bytes sent through gateway \fIsnup\fP:
+.RS
+.nf
+.B
+tcpdump 'gateway snup and ip[2:2] > 576'
+.fi
+.RE
+.LP
+To print IP broadcast or multicast packets that were
+.I not
+sent via Ethernet broadcast or multicast:
+.RS
+.nf
+.B
+tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'
+.fi
+.RE
+.LP
+To print all ICMP packets that are not echo requests/replies (i.e., not
+ping packets):
+.RS
+.nf
+.B
+tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
+.fi
+.RE
+.SH OUTPUT FORMAT
+.LP
+The output of \fItcpdump\fP is protocol dependent.
+The following
+gives a brief description and examples of most of the formats.
+.de HD
+.sp 1.5
+.B
+..
+.HD
+Link Level Headers
+.LP
+If the '-e' option is given, the link level header is printed out.
+On Ethernets, the source and destination addresses, protocol,
+and packet length are printed.
+.LP
+On FDDI networks, the '-e' option causes \fItcpdump\fP to print
+the `frame control' field, the source and destination addresses,
+and the packet length.
+(The `frame control' field governs the
+interpretation of the rest of the packet.
+Normal packets (such
+as those containing IP datagrams) are `async' packets, with a priority
+value between 0 and 7; for example, `\fBasync4\fR'.
+Such packets
+are assumed to contain an 802.2 Logical Link Control (LLC) packet;
+the LLC header is printed if it is \fInot\fR an ISO datagram or a
+so-called SNAP packet.
+.LP
+On Token Ring networks, the '-e' option causes \fItcpdump\fP to print
+the `access control' and `frame control' fields, the source and
+destination addresses, and the packet length.
+As on FDDI networks,
+packets are assumed to contain an LLC packet.
+Regardless of whether
+the '-e' option is specified or not, the source routing information is
+printed for source-routed packets.
+.LP
+On 802.11 networks, the '-e' option causes \fItcpdump\fP to print
+the `frame control' fields, all of the addresses in the 802.11 header,
+and the packet length.
+As on FDDI networks,
+packets are assumed to contain an LLC packet.
+.LP
+\fI(N.B.: The following description assumes familiarity with
+the SLIP compression algorithm described in RFC-1144.)\fP
+.LP
+On SLIP links, a direction indicator (``I'' for inbound, ``O'' for outbound),
+packet type, and compression information are printed out.
+The packet type is printed first.
+The three types are \fIip\fP, \fIutcp\fP, and \fIctcp\fP.
+No further link information is printed for \fIip\fR packets.
+For TCP packets, the connection identifier is printed following the type.
+If the packet is compressed, its encoded header is printed out.
+The special cases are printed out as
+\fB*S+\fIn\fR and \fB*SA+\fIn\fR, where \fIn\fR is the amount by which
+the sequence number (or sequence number and ack) has changed.
+If it is not a special case,
+zero or more changes are printed.
+A change is indicated by U (urgent pointer), W (window), A (ack),
+S (sequence number), and I (packet ID), followed by a delta (+n or -n),
+or a new value (=n).
+Finally, the amount of data in the packet and compressed header length
+are printed.
+.LP
+For example, the following line shows an outbound compressed TCP packet,
+with an implicit connection identifier; the ack has changed by 6,
+the sequence number by 49, and the packet ID by 6; there are 3 bytes of
+data and 6 bytes of compressed header:
+.RS
+.nf
+\fBO ctcp * A+6 S+49 I+6 3 (6)\fP
+.fi
+.RE
+.HD
+ARP/RARP Packets
+.LP
+Arp/rarp output shows the type of request and its arguments.
+The
+format is intended to be self explanatory.
+Here is a short sample taken from the start of an `rlogin' from
+host \fIrtsg\fP to host \fIcsam\fP:
+.RS
+.nf
+.sp .5
+\f(CWarp who-has csam tell rtsg
+arp reply csam is-at CSAM\fR
+.sp .5
+.fi
+.RE
+The first line says that rtsg sent an arp packet asking
+for the Ethernet address of internet host csam.
+Csam
+replies with its Ethernet address (in this example, Ethernet addresses
+are in caps and internet addresses in lower case).
+.LP
+This would look less redundant if we had done \fItcpdump \-n\fP:
+.RS
+.nf
+.sp .5
+\f(CWarp who-has 128.3.254.6 tell 128.3.254.68
+arp reply 128.3.254.6 is-at 02:07:01:00:01:c4\fP
+.fi
+.RE
+.LP
+If we had done \fItcpdump \-e\fP, the fact that the first packet is
+broadcast and the second is point-to-point would be visible:
+.RS
+.nf
+.sp .5
+\f(CWRTSG Broadcast 0806 64: arp who-has csam tell rtsg
+CSAM RTSG 0806 64: arp reply csam is-at CSAM\fR
+.sp .5
+.fi
+.RE
+For the first packet this says the Ethernet source address is RTSG, the
+destination is the Ethernet broadcast address, the type field
+contained hex 0806 (type ETHER_ARP) and the total length was 64 bytes.
+.HD
+TCP Packets
+.LP
+\fI(N.B.:The following description assumes familiarity with
+the TCP protocol described in RFC-793.
+If you are not familiar
+with the protocol, neither this description nor \fItcpdump\fP will
+be of much use to you.)\fP
+.LP
+The general format of a tcp protocol line is:
+.RS
+.nf
+.sp .5
+\fIsrc > dst: flags data-seqno ack window urgent options\fP
+.sp .5
+.fi
+.RE
+\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), 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
+direction on this connection.
+\fIWindow\fP is the number of bytes of receive buffer space available
+the other direction on this connection.
+\fIUrg\fP indicates there is `urgent' data in the packet.
+\fIOptions\fP are tcp options enclosed in angle brackets (e.g., <mss 1024>).
+.LP
+\fISrc, dst\fP and \fIflags\fP are always present.
+The other fields
+depend on the contents of the packet's tcp protocol header and
+are output only if appropriate.
+.LP
+Here is the opening portion of an rlogin from host \fIrtsg\fP to
+host \fIcsam\fP.
+.RS
+.nf
+.sp .5
+\s-2\f(CWrtsg.1023 > csam.login: S 768512:768512(0) win 4096 <mss 1024>
+csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 <mss 1024>
+rtsg.1023 > csam.login: . ack 1 win 4096
+rtsg.1023 > csam.login: P 1:2(1) ack 1 win 4096
+csam.login > rtsg.1023: . ack 2 win 4096
+rtsg.1023 > csam.login: P 2:21(19) ack 1 win 4096
+csam.login > rtsg.1023: P 1:2(1) ack 21 win 4077
+csam.login > rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1
+csam.login > rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1\fR\s+2
+.sp .5
+.fi
+.RE
+The first line says that tcp port 1023 on rtsg sent a packet
+to port \fIlogin\fP
+on csam.
+The \fBS\fP indicates that the \fISYN\fP flag was set.
+The packet sequence number was 768512 and it contained no data.
+(The notation is `first:last(nbytes)' which means `sequence
+numbers \fIfirst\fP
+up to but not including \fIlast\fP which is \fInbytes\fP bytes of user data'.)
+There was no piggy-backed ack, the available receive window was 4096
+bytes and there was a max-segment-size option requesting an mss of
+1024 bytes.
+.LP
+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 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).
+The first time \fItcpdump\fP sees a
+tcp `conversation', it prints the sequence number from the packet.
+On subsequent packets of the conversation, the difference between
+the current packet's sequence number and this initial sequence number
+is printed.
+This means that sequence numbers after the
+first can be interpreted
+as relative byte positions in the conversation's data stream (with the
+first data byte each direction being `1').
+`-S' will override this
+feature, causing the original sequence numbers to be output.
+.LP
+On the 6th line, rtsg sends csam 19 bytes of data (bytes 2 through 20
+in the rtsg \(-> csam side of the conversation).
+The PUSH flag is set in the packet.
+On the 7th line, csam says it's received data sent by rtsg up to
+but not including byte 21.
+Most of this data is apparently sitting in the
+socket buffer since csam's receive window has gotten 19 bytes smaller.
+Csam also sends one byte of data to rtsg in this packet.
+On the 8th and 9th lines,
+csam sends two bytes of urgent, pushed data to rtsg.
+.LP
+If the snapshot was small enough that \fItcpdump\fP didn't capture
+the full TCP header, it interprets as much of the header as it can
+and then reports ``[|\fItcp\fP]'' to indicate the remainder could not
+be interpreted.
+If the header contains a bogus option (one with a length
+that's either too small or beyond the end of the header), \fItcpdump\fP
+reports it as ``[\fIbad opt\fP]'' and does not interpret any further
+options (since it's impossible to tell where they start).
+If the header
+length indicates options are present but the IP datagram length is not
+long enough for the options to actually be there, \fItcpdump\fP reports
+it as ``[\fIbad hdr length\fP]''.
+.HD
+.B Capturing TCP packets with particular flag combinations (SYN-ACK, URG-ACK, etc.)
+.PP
+There are 8 bits in the control bits section of the TCP header:
+.IP
+.I CWR | ECE | URG | ACK | PSH | RST | SYN | FIN
+.PP
+Let's assume that we want to watch packets used in establishing
+a TCP connection.
+Recall that TCP uses a 3-way handshake protocol
+when it initializes a new connection; the connection sequence with
+regard to the TCP control bits is
+.PP
+.RS
+1) Caller sends SYN
+.RE
+.RS
+2) Recipient responds with SYN, ACK
+.RE
+.RS
+3) Caller sends ACK
+.RE
+.PP
+Now we're interested in capturing packets that have only the
+SYN bit set (Step 1).
+Note that we don't want packets from step 2
+(SYN-ACK), just a plain initial SYN.
+What we need is a correct filter
+expression for \fItcpdump\fP.
+.PP
+Recall the structure of a TCP header without options:
+.PP
+.nf
+ 0 15 31
+-----------------------------------------------------------------
+| source port | destination port |
+-----------------------------------------------------------------
+| sequence number |
+-----------------------------------------------------------------
+| acknowledgment number |
+-----------------------------------------------------------------
+| HL | rsvd |C|E|U|A|P|R|S|F| window size |
+-----------------------------------------------------------------
+| TCP checksum | urgent pointer |
+-----------------------------------------------------------------
+.fi
+.PP
+A TCP header usually holds 20 octets of data, unless options are
+present.
+The first line of the graph contains octets 0 - 3, the
+second line shows octets 4 - 7 etc.
+.PP
+Starting to count with 0, the relevant TCP control bits are contained
+in octet 13:
+.PP
+.nf
+ 0 7| 15| 23| 31
+----------------|---------------|---------------|----------------
+| HL | rsvd |C|E|U|A|P|R|S|F| window size |
+----------------|---------------|---------------|----------------
+| | 13th octet | | |
+.fi
+.PP
+Let's have a closer look at octet no. 13:
+.PP
+.nf
+ | |
+ |---------------|
+ |C|E|U|A|P|R|S|F|
+ |---------------|
+ |7 5 3 0|
+.fi
+.PP
+These are the TCP control bits we are interested
+in.
+We have numbered the bits in this octet from 0 to 7, right to
+left, so the PSH bit is bit number 3, while the URG bit is number 5.
+.PP
+Recall that we want to capture packets with only SYN set.
+Let's see what happens to octet 13 if a TCP datagram arrives
+with the SYN bit set in its header:
+.PP
+.nf
+ |C|E|U|A|P|R|S|F|
+ |---------------|
+ |0 0 0 0 0 0 1 0|
+ |---------------|
+ |7 6 5 4 3 2 1 0|
+.fi
+.PP
+Looking at the
+control bits section we see that only bit number 1 (SYN) is set.
+.PP
+Assuming that octet number 13 is an 8-bit unsigned integer in
+network byte order, the binary value of this octet is
+.IP
+00000010
+.PP
+and its decimal representation is
+.PP
+.nf
+ 7 6 5 4 3 2 1 0
+0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 1*2 + 0*2 = 2
+.fi
+.PP
+We're almost done, because now we know that if only SYN is set,
+the value of the 13th octet in the TCP header, when interpreted
+as a 8-bit unsigned integer in network byte order, must be exactly 2.
+.PP
+This relationship can be expressed as
+.RS
+.B
+tcp[13] == 2
+.RE
+.PP
+We can use this expression as the filter for \fItcpdump\fP in order
+to watch packets which have only SYN set:
+.RS
+.B
+tcpdump -i xl0 tcp[13] == 2
+.RE
+.PP
+The expression says "let the 13th octet of a TCP datagram have
+the decimal value 2", which is exactly what we want.
+.PP
+Now, let's assume that we need to capture SYN packets, but we
+don't care if ACK or any other TCP control bit is set at the
+same time.
+Let's see what happens to octet 13 when a TCP datagram
+with SYN-ACK set arrives:
+.PP
+.nf
+ |C|E|U|A|P|R|S|F|
+ |---------------|
+ |0 0 0 1 0 0 1 0|
+ |---------------|
+ |7 6 5 4 3 2 1 0|
+.fi
+.PP
+Now bits 1 and 4 are set in the 13th octet.
+The binary value of
+octet 13 is
+.IP
+ 00010010
+.PP
+which translates to decimal
+.PP
+.nf
+ 7 6 5 4 3 2 1 0
+0*2 + 0*2 + 0*2 + 1*2 + 0*2 + 0*2 + 1*2 + 0*2 = 18
+.fi
+.PP
+Now we can't just use 'tcp[13] == 18' in the \fItcpdump\fP filter
+expression, because that would select only those packets that have
+SYN-ACK set, but not those with only SYN set.
+Remember that we don't care
+if ACK or any other control bit is set as long as SYN is set.
+.PP
+In order to achieve our goal, we need to logically AND the
+binary value of octet 13 with some other value to preserve
+the SYN bit.
+We know that we want SYN to be set in any case,
+so we'll logically AND the value in the 13th octet with
+the binary value of a SYN:
+.PP
+.nf
+
+ 00010010 SYN-ACK 00000010 SYN
+ AND 00000010 (we want SYN) AND 00000010 (we want SYN)
+ -------- --------
+ = 00000010 = 00000010
+.fi
+.PP
+We see that this AND operation delivers the same result
+regardless whether ACK or another TCP control bit is set.
+The decimal representation of the AND value as well as
+the result of this operation is 2 (binary 00000010),
+so we know that for packets with SYN set the following
+relation must hold true:
+.IP
+( ( value of octet 13 ) AND ( 2 ) ) == ( 2 )
+.PP
+This points us to the \fItcpdump\fP filter expression
+.RS
+.B
+ tcpdump -i xl0 'tcp[13] & 2 == 2'
+.RE
+.PP
+Some offsets and field values may be expressed as names
+rather than as numeric values. For example tcp[13] may
+be replaced with tcp[tcpflags]. The following TCP flag
+field values are also available: tcp-fin, tcp-syn, tcp-rst,
+tcp-push, tcp-act, tcp-urg.
+.PP
+This can be demonstrated as:
+.RS
+.B
+ tcpdump -i xl0 'tcp[tcpflags] & tcp-push != 0'
+.RE
+.PP
+Note that you should use single quotes or a backslash
+in the expression to hide the AND ('&') special character
+from the shell.
+.HD
+.B
+UDP Packets
+.LP
+UDP format is illustrated by this rwho packet:
+.RS
+.nf
+.sp .5
+\f(CWactinide.who > broadcast.who: udp 84\fP
+.sp .5
+.fi
+.RE
+This says that port \fIwho\fP on host \fIactinide\fP sent a udp
+datagram to port \fIwho\fP on host \fIbroadcast\fP, the Internet
+broadcast address.
+The packet contained 84 bytes of user data.
+.LP
+Some UDP services are recognized (from the source or destination
+port number) and the higher level protocol information printed.
+In particular, Domain Name service requests (RFC-1034/1035) and Sun
+RPC calls (RFC-1050) to NFS.
+.HD
+UDP Name Server Requests
+.LP
+\fI(N.B.:The following description assumes familiarity with
+the Domain Service protocol described in RFC-1035.
+If you are not familiar
+with the protocol, the following description will appear to be written
+in greek.)\fP
+.LP
+Name server requests are formatted as
+.RS
+.nf
+.sp .5
+\fIsrc > dst: id op? flags qtype qclass name (len)\fP
+.sp .5
+\f(CWh2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37)\fR
+.sp .5
+.fi
+.RE
+Host \fIh2opolo\fP asked the domain server on \fIhelios\fP for an
+address record (qtype=A) associated with the name \fIucbvax.berkeley.edu.\fP
+The query id was `3'.
+The `+' indicates the \fIrecursion desired\fP flag
+was set.
+The query length was 37 bytes, not including the UDP and
+IP protocol headers.
+The query operation was the normal one, \fIQuery\fP,
+so the op field was omitted.
+If the op had been anything else, it would
+have been printed between the `3' and the `+'.
+Similarly, the qclass was the normal one,
+\fIC_IN\fP, and omitted.
+Any other qclass would have been printed
+immediately after the `A'.
+.LP
+A few anomalies are checked and may result in extra fields enclosed in
+square brackets: If a query contains an answer, authority records or
+additional records section,
+.IR ancount ,
+.IR nscount ,
+or
+.I arcount
+are printed as `[\fIn\fPa]', `[\fIn\fPn]' or `[\fIn\fPau]' where \fIn\fP
+is the appropriate count.
+If any of the response bits are set (AA, RA or rcode) or any of the
+`must be zero' bits are set in bytes two and three, `[b2&3=\fIx\fP]'
+is printed, where \fIx\fP is the hex value of header bytes two and three.
+.HD
+UDP Name Server Responses
+.LP
+Name server responses are formatted as
+.RS
+.nf
+.sp .5
+\fIsrc > dst: id op rcode flags a/n/au type class data (len)\fP
+.sp .5
+\f(CWhelios.domain > h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273)
+helios.domain > h2opolo.1537: 2 NXDomain* 0/1/0 (97)\fR
+.sp .5
+.fi
+.RE
+In the first example, \fIhelios\fP responds to query id 3 from \fIh2opolo\fP
+with 3 answer records, 3 name server records and 7 additional records.
+The first answer record is type A (address) and its data is internet
+address 128.32.137.3.
+The total size of the response was 273 bytes,
+excluding UDP and IP headers.
+The op (Query) and response code
+(NoError) were omitted, as was the class (C_IN) of the A record.
+.LP
+In the second example, \fIhelios\fP responds to query 2 with a
+response code of non-existent domain (NXDomain) with no answers,
+one name server and no authority records.
+The `*' indicates that
+the \fIauthoritative answer\fP bit was set.
+Since there were no
+answers, no type, class or data were printed.
+.LP
+Other flag characters that might appear are `\-' (recursion available,
+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
+\fItcpdump\fP now includes fairly extensive SMB/CIFS/NBT decoding for data
+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.
+.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
+Sun NFS (Network File System) requests and replies are printed as:
+.RS
+.nf
+.sp .5
+\fIsrc.sport > dst.nfs: NFS request xid xid len op args\fP
+\fIsrc.nfs > dst.dport: NFS reply xid xid reply stat len op results\fP
+.sp .5
+\f(CW
+sushi.1023 > wrl.nfs: NFS request xid 26377
+ 112 readlink fh 21,24/10.73165
+wrl.nfs > sushi.1023: NFS reply xid 26377
+ reply ok 40 readlink "../var"
+sushi.1022 > wrl.nfs: NFS request xid 8219
+ 144 lookup fh 9,74/4096.6878 "xcolors"
+wrl.nfs > sushi.1022: NFS reply xid 8219
+ reply ok 128 lookup fh 9,74/4134.3150
+\fR
+.sp .5
+.fi
+.RE
+In the first line, host \fIsushi\fP sends a transaction with id \fI26377\fP
+to \fIwrl\fP.
+The request was 112 bytes,
+excluding the UDP and IP headers.
+The operation was a \fIreadlink\fP
+(read symbolic link) on file handle (\fIfh\fP) 21,24/10.731657119.
+(If one is lucky, as in this case, the file handle can be interpreted
+as a major,minor device number pair, followed by the inode number and
+generation number.) In the second line, \fIwrl\fP replies `ok' with
+the same transaction id and the contents of the link.
+.LP
+In the third line, \fIsushi\fP asks (using a new transaction id) \fIwrl\fP
+to lookup the name `\fIxcolors\fP' in directory file 9,74/4096.6878. In
+the fourth line, \fIwrl\fP sends a reply with the respective transaction id.
+.LP
+Note that the data printed
+depends on the operation type.
+The format is intended to be self
+explanatory if read in conjunction with
+an NFS protocol spec.
+Also note that older versions of tcpdump printed NFS packets in a
+slightly different format: the transaction id (xid) would be printed
+instead of the non-NFS port number of the packet.
+.LP
+If the \-v (verbose) flag is given, additional information is printed.
+For example:
+.RS
+.nf
+.sp .5
+\f(CW
+sushi.1023 > wrl.nfs: NFS request xid 79658
+ 148 read fh 21,11/12.195 8192 bytes @ 24576
+wrl.nfs > sushi.1023: NFS reply xid 79658
+ reply ok 1472 read REG 100664 ids 417/0 sz 29388
+\fP
+.sp .5
+.fi
+.RE
+(\-v also prints the IP header TTL, ID, length, and fragmentation fields,
+which have been omitted from this example.) In the first line,
+\fIsushi\fP asks \fIwrl\fP to read 8192 bytes from file 21,11/12.195,
+at byte offset 24576.
+\fIWrl\fP replies `ok'; the packet shown on the
+second line is the first fragment of the reply, and hence is only 1472
+bytes long (the other bytes will follow in subsequent fragments, but
+these fragments do not have NFS or even UDP headers and so might not be
+printed, depending on the filter expression used).
+Because the \-v flag
+is given, some of the file attributes (which are returned in addition
+to the file data) are printed: the file type (``REG'', for regular file),
+the file mode (in octal), the uid and gid, and the file size.
+.LP
+If the \-v flag is given more than once, even more details are printed.
+.LP
+Note that NFS requests are very large and much of the detail won't be printed
+unless \fIsnaplen\fP is increased.
+Try using `\fB\-s 192\fP' to watch
+NFS traffic.
+.LP
+NFS reply packets do not explicitly identify the RPC operation.
+Instead,
+\fItcpdump\fP keeps track of ``recent'' requests, and matches them to the
+replies using the transaction ID.
+If a reply does not closely follow the
+corresponding request, it might not be parsable.
+.HD
+AFS Requests and Replies
+.LP
+Transarc AFS (Andrew File System) requests and replies are printed
+as:
+.HD
+.RS
+.nf
+.sp .5
+\fIsrc.sport > dst.dport: rx packet-type\fP
+\fIsrc.sport > dst.dport: rx packet-type service call call-name args\fP
+\fIsrc.sport > dst.dport: rx packet-type service reply call-name args\fP
+.sp .5
+\f(CW
+elvis.7001 > pike.afsfs:
+ rx data fs call rename old fid 536876964/1/1 ".newsrc.new"
+ new fid 536876964/1/1 ".newsrc"
+pike.afsfs > elvis.7001: rx data fs reply rename
+\fR
+.sp .5
+.fi
+.RE
+In the first line, host elvis sends a RX packet to pike.
+This was
+a RX data packet to the fs (fileserver) service, and is the start of
+an RPC call.
+The RPC call was a rename, with the old directory file id
+of 536876964/1/1 and an old filename of `.newsrc.new', and a new directory
+file id of 536876964/1/1 and a new filename of `.newsrc'.
+The host pike
+responds with a RPC reply to the rename call (which was successful, because
+it was a data packet and not an abort packet).
+.LP
+In general, all AFS RPCs are decoded at least by RPC call name.
+Most
+AFS RPCs have at least some of the arguments decoded (generally only
+the `interesting' arguments, for some definition of interesting).
+.LP
+The format is intended to be self-describing, but it will probably
+not be useful to people who are not familiar with the workings of
+AFS and RX.
+.LP
+If the -v (verbose) flag is given twice, acknowledgement packets and
+additional header information is printed, such as the RX call ID,
+call number, sequence number, serial number, and the RX packet flags.
+.LP
+If the -v flag is given twice, additional information is printed,
+such as the RX call ID, serial number, and the RX packet flags.
+The MTU negotiation information is also printed from RX ack packets.
+.LP
+If the -v flag is given three times, the security index and service id
+are printed.
+.LP
+Error codes are printed for abort packets, with the exception of Ubik
+beacon packets (because abort packets are used to signify a yes vote
+for the Ubik protocol).
+.LP
+Note that AFS requests are very large and many of the arguments won't
+be printed unless \fIsnaplen\fP is increased.
+Try using `\fB-s 256\fP'
+to watch AFS traffic.
+.LP
+AFS reply packets do not explicitly identify the RPC operation.
+Instead,
+\fItcpdump\fP keeps track of ``recent'' requests, and matches them to the
+replies using the call number and service ID.
+If a reply does not closely
+follow the
+corresponding request, it might not be parsable.
+
+.HD
+KIP AppleTalk (DDP in UDP)
+.LP
+AppleTalk DDP packets encapsulated in UDP datagrams are de-encapsulated
+and dumped as DDP packets (i.e., all the UDP header information is
+discarded).
+The file
+.I /etc/atalk.names
+is used to translate AppleTalk net and node numbers to names.
+Lines in this file have the form
+.RS
+.nf
+.sp .5
+\fInumber name\fP
+
+\f(CW1.254 ether
+16.1 icsd-net
+1.254.110 ace\fR
+.sp .5
+.fi
+.RE
+The first two lines give the names of AppleTalk networks.
+The third
+line gives the name of a particular host (a host is distinguished
+from a net by the 3rd octet in the number \-
+a net number \fImust\fP have two octets and a host number \fImust\fP
+have three octets.) The number and name should be separated by
+whitespace (blanks or tabs).
+The
+.I /etc/atalk.names
+file may contain blank lines or comment lines (lines starting with
+a `#').
+.LP
+AppleTalk addresses are printed in the form
+.RS
+.nf
+.sp .5
+\fInet.host.port\fP
+
+\f(CW144.1.209.2 > icsd-net.112.220
+office.2 > icsd-net.112.220
+jssmag.149.235 > icsd-net.2\fR
+.sp .5
+.fi
+.RE
+(If the
+.I /etc/atalk.names
+doesn't exist or doesn't contain an entry for some AppleTalk
+host/net number, addresses are printed in numeric form.)
+In the first example, NBP (DDP port 2) on net 144.1 node 209
+is sending to whatever is listening on port 220 of net icsd node 112.
+The second line is the same except the full name of the source node
+is known (`office').
+The third line is a send from port 235 on
+net jssmag node 149 to broadcast on the icsd-net NBP port (note that
+the broadcast address (255) is indicated by a net name with no host
+number \- for this reason it's a good idea to keep node names and
+net names distinct in /etc/atalk.names).
+.LP
+NBP (name binding protocol) and ATP (AppleTalk transaction protocol)
+packets have their contents interpreted.
+Other protocols just dump
+the protocol name (or number if no name is registered for the
+protocol) and packet size.
+
+\fBNBP packets\fP are formatted like the following examples:
+.RS
+.nf
+.sp .5
+\s-2\f(CWicsd-net.112.220 > jssmag.2: nbp-lkup 190: "=:LaserWriter@*"
+jssmag.209.2 > icsd-net.112.220: nbp-reply 190: "RM1140:LaserWriter@*" 250
+techpit.2 > icsd-net.112.220: nbp-reply 190: "techpit:LaserWriter@*" 186\fR\s+2
+.sp .5
+.fi
+.RE
+The first line is a name lookup request for laserwriters sent by net icsd host
+112 and broadcast on net jssmag.
+The nbp id for the lookup is 190.
+The second line shows a reply for this request (note that it has the
+same id) from host jssmag.209 saying that it has a laserwriter
+resource named "RM1140" registered on port 250.
+The third line is
+another reply to the same request saying host techpit has laserwriter
+"techpit" registered on port 186.
+
+\fBATP packet\fP formatting is demonstrated by the following example:
+.RS
+.nf
+.sp .5
+\s-2\f(CWjssmag.209.165 > helios.132: atp-req 12266<0-7> 0xae030001
+helios.132 > jssmag.209.165: atp-resp 12266:0 (512) 0xae040000
+helios.132 > jssmag.209.165: atp-resp 12266:1 (512) 0xae040000
+helios.132 > jssmag.209.165: atp-resp 12266:2 (512) 0xae040000
+helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000
+helios.132 > jssmag.209.165: atp-resp 12266:4 (512) 0xae040000
+helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000
+helios.132 > jssmag.209.165: atp-resp 12266:6 (512) 0xae040000
+helios.132 > jssmag.209.165: atp-resp*12266:7 (512) 0xae040000
+jssmag.209.165 > helios.132: atp-req 12266<3,5> 0xae030001
+helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000
+helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000
+jssmag.209.165 > helios.132: atp-rel 12266<0-7> 0xae030001
+jssmag.209.133 > helios.132: atp-req* 12267<0-7> 0xae030002\fR\s+2
+.sp .5
+.fi
+.RE
+Jssmag.209 initiates transaction id 12266 with host helios by requesting
+up to 8 packets (the `<0-7>').
+The hex number at the end of the line
+is the value of the `userdata' field in the request.
+.LP
+Helios responds with 8 512-byte packets.
+The `:digit' following the
+transaction id gives the packet sequence number in the transaction
+and the number in parens is the amount of data in the packet,
+excluding the atp header.
+The `*' on packet 7 indicates that the
+EOM bit was set.
+.LP
+Jssmag.209 then requests that packets 3 & 5 be retransmitted.
+Helios
+resends them then jssmag.209 releases the transaction.
+Finally,
+jssmag.209 initiates the next request.
+The `*' on the request
+indicates that XO (`exactly once') was \fInot\fP set.
+
+.HD
+IP Fragmentation
+.LP
+Fragmented Internet datagrams are printed as
+.RS
+.nf
+.sp .5
+\fB(frag \fIid\fB:\fIsize\fB@\fIoffset\fB+)\fR
+\fB(frag \fIid\fB:\fIsize\fB@\fIoffset\fB)\fR
+.sp .5
+.fi
+.RE
+(The first form indicates there are more fragments.
+The second
+indicates this is the last fragment.)
+.LP
+\fIId\fP is the fragment id.
+\fISize\fP is the fragment
+size (in bytes) excluding the IP header.
+\fIOffset\fP is this
+fragment's offset (in bytes) in the original datagram.
+.LP
+The fragment information is output for each fragment.
+The first
+fragment contains the higher level protocol header and the frag
+info is printed after the protocol info.
+Fragments
+after the first contain no higher level protocol header and the
+frag info is printed after the source and destination addresses.
+For example, here is part of an ftp from arizona.edu to lbl-rtsg.arpa
+over a CSNET connection that doesn't appear to handle 576 byte datagrams:
+.RS
+.nf
+.sp .5
+\s-2\f(CWarizona.ftp-data > rtsg.1170: . 1024:1332(308) ack 1 win 4096 (frag 595a:328@0+)
+arizona > rtsg: (frag 595a:204@328)
+rtsg.1170 > arizona.ftp-data: . ack 1536 win 2560\fP\s+2
+.sp .5
+.fi
+.RE
+There are a couple of things to note here: First, addresses in the
+2nd line don't include port numbers.
+This is because the TCP
+protocol information is all in the first fragment and we have no idea
+what the port or sequence numbers are when we print the later fragments.
+Second, the tcp sequence information in the first line is printed as if there
+were 308 bytes of user data when, in fact, there are 512 bytes (308 in
+the first frag and 204 in the second).
+If you are looking for holes
+in the sequence space or trying to match up acks
+with packets, this can fool you.
+.LP
+A packet with the IP \fIdon't fragment\fP flag is marked with a
+trailing \fB(DF)\fP.
+.HD
+Timestamps
+.LP
+By default, all output lines are preceded by a timestamp.
+The timestamp
+is the current clock time in the form
+.RS
+.nf
+\fIhh:mm:ss.frac\fP
+.fi
+.RE
+and is as accurate as the kernel's clock.
+The timestamp reflects the time the kernel first saw the packet.
+No attempt
+is made to account for the time lag between when the
+Ethernet interface removed the packet from the wire and when the kernel
+serviced the `new packet' interrupt.
+.SH "SEE ALSO"
+stty(1), pcap(3), bpf(4), pcap-savefile(5), pcap-filter(7), pcap-tstamp(7)
+.LP
+.RS
+.I http://www.iana.org/assignments/media-types/application/vnd.tcpdump.pcap
+.RE
+.LP
+.SH AUTHORS
+The original authors are:
+.LP
+Van Jacobson,
+Craig Leres and
+Steven McCanne, all of the
+Lawrence Berkeley National Laboratory, University of California, Berkeley, CA.
+.LP
+It is currently being maintained by tcpdump.org.
+.LP
+The current version is available via http:
+.LP
+.RS
+.I http://www.tcpdump.org/
+.RE
+.LP
+The original distribution is available via anonymous ftp:
+.LP
+.RS
+.I ftp://ftp.ee.lbl.gov/old/tcpdump.tar.Z
+.RE
+.LP
+IPv6/IPsec support is added by WIDE/KAME project.
+This program uses Eric Young's SSLeay library, under specific configurations.
+.SH BUGS
+Please send problems, bugs, questions, desirable enhancements, patches
+etc. to:
+.LP
+.RS
+tcpdump-workers@lists.tcpdump.org
+.RE
+.\" .LP
+.\" NIT doesn't let you watch your own outbound traffic, BPF will.
+.\" We recommend that you use the latter.
+.\" .LP
+.\" On Linux systems with 2.0[.x] kernels:
+.\" .IP
+.\" packets on the loopback device will be seen twice;
+.\" .IP
+.\" packet filtering cannot be done in the kernel, so that all packets must
+.\" be copied from the kernel in order to be filtered in user mode;
+.\" .IP
+.\" all of a packet, not just the part that's within the snapshot length,
+.\" will be copied from the kernel (the 2.0[.x] packet capture mechanism, if
+.\" asked to copy only part of a packet to userland, will not report the
+.\" true length of the packet; this would cause most IP packets to get an
+.\" error from
+.\" .BR tcpdump );
+.\" .IP
+.\" capturing on some PPP devices won't work correctly.
+.\" .LP
+.\" We recommend that you upgrade to a 2.2 or later kernel.
+.LP
+Some attempt should be made to reassemble IP fragments or, at least
+to compute the right length for the higher level protocol.
+.LP
+Name server inverse queries are not dumped correctly: the (empty)
+question section is printed rather than real query in the answer
+section.
+Some believe that inverse queries are themselves a bug and
+prefer to fix the program generating them rather than \fItcpdump\fP.
+.LP
+A packet trace that crosses a daylight savings time change will give
+skewed time stamps (the time change is ignored).
+.LP
+Filter expressions on fields other than those in Token Ring headers will
+not correctly handle source-routed Token Ring packets.
+.LP
+Filter expressions on fields other than those in 802.11 headers will not
+correctly handle 802.11 data packets with both To DS and From DS set.
+.LP
+.BR "ip6 proto"
+should chase header chain, but at this moment it does not.
+.BR "ip6 protochain"
+is supplied for this behavior.
+.LP
+Arithmetic expression against transport layer headers, like \fBtcp[0]\fP,
+does not work against IPv6 packets.
+It only looks at IPv4 packets.
--- /dev/null
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
+ * 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: (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.
+ *
+ * Support for splitting captures into multiple files with a maximum
+ * file size:
+ *
+ * Copyright (c) 2001
+ * Seth Webster <swebster@sst.ll.mit.edu>
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+static const char copyright[] _U_ =
+ "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
+The Regents of the University of California. All rights reserved.\n";
+__RCSID("$NetBSD: tcpdump.c,v 1.12 2015/09/17 14:03:10 nonaka Exp $");
+#endif
+
+/*
+ * tcpdump - monitor tcp/ip traffic on an ethernet.
+ *
+ * First written in 1987 by Van Jacobson, Lawrence Berkeley Laboratory.
+ * Mercilessly hacked and occasionally improved since then via the
+ * combined efforts of Van, Steve McCanne and Craig Leres of LBL.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/*
+ * Mac OS X may ship pcap.h from libpcap 0.6 with a libpcap based on
+ * 0.8. That means it has pcap_findalldevs() but the header doesn't
+ * define pcap_if_t, meaning that we can't actually *use* pcap_findalldevs().
+ */
+#ifdef HAVE_PCAP_FINDALLDEVS
+#ifndef HAVE_PCAP_IF_T
+#undef HAVE_PCAP_FINDALLDEVS
+#endif
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#ifdef WIN32
+#include "w32_fzs.h"
+extern int strcasecmp (const char *__s1, const char *__s2);
+extern int SIZE_BUF;
+#define off_t long
+#define uint UINT
+#endif /* WIN32 */
+
+#ifdef USE_LIBSMI
+#include <smi.h>
+#endif
+
+#ifdef HAVE_LIBCRYPTO
+#include <openssl/crypto.h>
+#endif
+
+#ifdef HAVE_GETOPT_LONG
+#include <getopt.h>
+#else
+#include "getopt_long.h"
+#endif
+/* Capsicum-specific code requires macros from <net/bpf.h>, which will fail
+ * to compile if <pcap.h> has already been included; including the headers
+ * in the opposite order works fine.
+ */
+#ifdef HAVE_CAPSICUM
+#include <sys/capability.h>
+#include <sys/ioccom.h>
+#include <net/bpf.h>
+#include <fcntl.h>
+#include <libgen.h>
+#endif /* HAVE_CAPSICUM */
+#include <pcap.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <resolv.h>
+#ifndef WIN32
+#include <sys/wait.h>
+#include <sys/resource.h>
+#include <pwd.h>
+#include <grp.h>
+#endif /* WIN32 */
+
+/* capabilities convenience library */
+/* If a code depends on HAVE_LIBCAP_NG, it depends also on HAVE_CAP_NG_H.
+ * If HAVE_CAP_NG_H is not defined, undefine HAVE_LIBCAP_NG.
+ * Thus, the later tests are done only on HAVE_LIBCAP_NG.
+ */
+#ifdef HAVE_LIBCAP_NG
+#ifdef HAVE_CAP_NG_H
+#include <cap-ng.h>
+#else
+#undef HAVE_LIBCAP_NG
+#endif /* HAVE_CAP_NG_H */
+#endif /* HAVE_LIBCAP_NG */
+
+#include "netdissect.h"
+#include "interface.h"
+#include "addrtoname.h"
+#include "machdep.h"
+#include "setsignal.h"
+#include "gmt2local.h"
+#include "pcap-missing.h"
+
+#ifndef PATH_MAX
+#define PATH_MAX 1024
+#endif
+
+#ifdef SIGINFO
+#define SIGNAL_REQ_INFO SIGINFO
+#elif SIGUSR1
+#define SIGNAL_REQ_INFO SIGUSR1
+#endif
+
+netdissect_options Gndo;
+netdissect_options *gndo = &Gndo;
+
+static int Dflag; /* list available devices and exit */
+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
+#ifdef HAVE_PCAP_SETDIRECTION
+int Qflag = -1; /* restrict captured packet by send/receive direction */
+#endif
+static char *zflag = NULL; /* compress each savefile using a specified command (like gzip or bzip2) */
+
+static int infodelay;
+static int infoprint;
+
+char *program_name;
+
+int32_t thiszone; /* seconds offset from gmt to local time */
+
+/* Forwards */
+static RETSIGTYPE cleanup(int);
+static RETSIGTYPE child_cleanup(int);
+static void print_version(void);
+static void print_usage(void);
+static void show_dlts_and_exit(const char *device, pcap_t *pd) __attribute__((noreturn));
+
+static void print_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
+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, ...)
+ __attribute__((noreturn))
+#ifdef __ATTRIBUTE___FORMAT_OK
+ __attribute__((format (printf, 2, 3)))
+#endif /* __ATTRIBUTE___FORMAT_OK */
+ ;
+static void ndo_warning(netdissect_options *ndo, const char *fmt, ...)
+#ifdef __ATTRIBUTE___FORMAT_OK
+ __attribute__((format (printf, 2, 3)))
+#endif /* __ATTRIBUTE___FORMAT_OK */
+ ;
+
+#ifdef SIGNAL_REQ_INFO
+RETSIGTYPE requestinfo(int);
+#endif
+
+#if defined(USE_WIN32_MM_TIMER)
+ #include <MMsystem.h>
+ static UINT timer_id;
+ static void CALLBACK verbose_stats_dump(UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR);
+#elif defined(HAVE_ALARM)
+ static void verbose_stats_dump(int sig);
+#endif
+
+static void info(int);
+static u_int packets_captured;
+
+struct printer {
+ if_printer f;
+ int type;
+};
+
+
+struct ndo_printer {
+ if_ndo_printer f;
+ int type;
+};
+
+
+static const struct printer printers[] = {
+ { NULL, 0 },
+};
+
+static const 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
+#if defined(DLT_NFLOG) && defined(HAVE_PCAP_NFLOG_H)
+ { nflog_if_print, DLT_NFLOG},
+#endif
+#ifdef DLT_CIP
+ { cip_if_print, DLT_CIP },
+#endif
+#ifdef DLT_ATM_CLIP
+ { cip_if_print, DLT_ATM_CLIP },
+#endif
+#ifdef DLT_IP_OVER_FC
+ { ipfc_if_print, DLT_IP_OVER_FC },
+#endif
+ { null_if_print, DLT_NULL },
+#ifdef DLT_LOOP
+ { null_if_print, DLT_LOOP },
+#endif
+#ifdef DLT_APPLE_IP_OVER_IEEE1394
+ { ap1394_if_print, DLT_APPLE_IP_OVER_IEEE1394 },
+#endif
+#if defined(DLT_BLUETOOTH_HCI_H4_WITH_PHDR) && defined(HAVE_PCAP_BLUETOOTH_H)
+ { bt_if_print, DLT_BLUETOOTH_HCI_H4_WITH_PHDR},
+#endif
+#ifdef DLT_LANE8023
+ { lane_if_print, DLT_LANE8023 },
+#endif
+ { arcnet_if_print, DLT_ARCNET },
+#ifdef DLT_ARCNET_LINUX
+ { arcnet_linux_if_print, DLT_ARCNET_LINUX },
+#endif
+ { raw_if_print, DLT_RAW },
+#ifdef DLT_IPV4
+ { raw_if_print, DLT_IPV4 },
+#endif
+#ifdef DLT_IPV6
+ { raw_if_print, DLT_IPV6 },
+#endif
+#ifdef HAVE_PCAP_USB_H
+#ifdef DLT_USB_LINUX
+ { usb_linux_48_byte_print, DLT_USB_LINUX},
+#endif /* DLT_USB_LINUX */
+#ifdef DLT_USB_LINUX_MMAPPED
+ { usb_linux_64_byte_print, DLT_USB_LINUX_MMAPPED},
+#endif /* DLT_USB_LINUX_MMAPPED */
+#endif /* HAVE_PCAP_USB_H */
+#ifdef DLT_SYMANTEC_FIREWALL
+ { symantec_if_print, DLT_SYMANTEC_FIREWALL },
+#endif
+#ifdef DLT_C_HDLC
+ { chdlc_if_print, DLT_C_HDLC },
+#endif
+#ifdef DLT_HDLC
+ { chdlc_if_print, DLT_HDLC },
+#endif
+#ifdef DLT_PPP_ETHER
+ { pppoe_if_print, DLT_PPP_ETHER },
+#endif
+#if defined(DLT_PFLOG) && defined(HAVE_NET_PFVAR_H)
+ { pflog_if_print, DLT_PFLOG },
+#endif
+ { token_if_print, DLT_IEEE802 },
+ { fddi_if_print, DLT_FDDI },
+#ifdef DLT_LINUX_SLL
+ { sll_if_print, DLT_LINUX_SLL },
+#endif
+#ifdef DLT_FR
+ { fr_if_print, DLT_FR },
+#endif
+#ifdef DLT_FRELAY
+ { fr_if_print, DLT_FRELAY },
+#endif
+#ifdef DLT_MFR
+ { mfr_if_print, DLT_MFR },
+#endif
+ { atm_if_print, DLT_ATM_RFC1483 },
+#ifdef DLT_SUNATM
+ { sunatm_if_print, DLT_SUNATM },
+#endif
+#ifdef DLT_ENC
+ { enc_if_print, DLT_ENC },
+#endif
+ { sl_if_print, DLT_SLIP },
+#ifdef DLT_SLIP_BSDOS
+ { sl_bsdos_if_print, DLT_SLIP_BSDOS },
+#endif
+#ifdef DLT_LTALK
+ { ltalk_if_print, DLT_LTALK },
+#endif
+#ifdef DLT_JUNIPER_ATM1
+ { juniper_atm1_print, DLT_JUNIPER_ATM1 },
+#endif
+#ifdef DLT_JUNIPER_ATM2
+ { juniper_atm2_print, DLT_JUNIPER_ATM2 },
+#endif
+#ifdef DLT_JUNIPER_MFR
+ { juniper_mfr_print, DLT_JUNIPER_MFR },
+#endif
+#ifdef DLT_JUNIPER_MLFR
+ { juniper_mlfr_print, DLT_JUNIPER_MLFR },
+#endif
+#ifdef DLT_JUNIPER_MLPPP
+ { juniper_mlppp_print, DLT_JUNIPER_MLPPP },
+#endif
+#ifdef DLT_JUNIPER_PPPOE
+ { juniper_pppoe_print, DLT_JUNIPER_PPPOE },
+#endif
+#ifdef DLT_JUNIPER_PPPOE_ATM
+ { juniper_pppoe_atm_print, DLT_JUNIPER_PPPOE_ATM },
+#endif
+#ifdef DLT_JUNIPER_GGSN
+ { juniper_ggsn_print, DLT_JUNIPER_GGSN },
+#endif
+#ifdef DLT_JUNIPER_ES
+ { juniper_es_print, DLT_JUNIPER_ES },
+#endif
+#ifdef DLT_JUNIPER_MONITOR
+ { juniper_monitor_print, DLT_JUNIPER_MONITOR },
+#endif
+#ifdef DLT_JUNIPER_SERVICES
+ { juniper_services_print, DLT_JUNIPER_SERVICES },
+#endif
+#ifdef DLT_JUNIPER_ETHER
+ { juniper_ether_print, DLT_JUNIPER_ETHER },
+#endif
+#ifdef DLT_JUNIPER_PPP
+ { juniper_ppp_print, DLT_JUNIPER_PPP },
+#endif
+#ifdef DLT_JUNIPER_FRELAY
+ { juniper_frelay_print, DLT_JUNIPER_FRELAY },
+#endif
+#ifdef DLT_JUNIPER_CHDLC
+ { juniper_chdlc_print, DLT_JUNIPER_CHDLC },
+#endif
+#ifdef DLT_PKTAP
+ { pktap_if_print, DLT_PKTAP },
+#endif
+#ifdef DLT_IEEE802_11_RADIO
+ { ieee802_11_radio_if_print, DLT_IEEE802_11_RADIO },
+#endif
+#ifdef DLT_IEEE802_11
+ { ieee802_11_if_print, DLT_IEEE802_11},
+#endif
+#ifdef DLT_IEEE802_11_RADIO_AVS
+ { ieee802_11_radio_avs_if_print, DLT_IEEE802_11_RADIO_AVS },
+#endif
+#ifdef DLT_PRISM_HEADER
+ { prism_if_print, DLT_PRISM_HEADER },
+#endif
+ { ppp_if_print, DLT_PPP },
+#ifdef DLT_PPP_WITHDIRECTION
+ { ppp_if_print, DLT_PPP_WITHDIRECTION },
+#endif
+#ifdef DLT_PPP_BSDOS
+ { ppp_bsdos_if_print, DLT_PPP_BSDOS },
+#endif
+#ifdef DLT_PPP_SERIAL
+ { ppp_hdlc_if_print, DLT_PPP_SERIAL },
+#endif
+#ifdef DLT_PFSYNC
+ { pfsync_if_print, DLT_PFSYNC },
+#endif
+ { NULL, 0 },
+};
+
+static const struct tok status_flags[] = {
+#ifdef PCAP_IF_UP
+ { PCAP_IF_UP, "Up" },
+#endif
+#ifdef PCAP_IF_RUNNING
+ { PCAP_IF_RUNNING, "Running" },
+#endif
+ { PCAP_IF_LOOPBACK, "Loopback" },
+ { 0, NULL }
+};
+
+if_printer
+lookup_printer(int type)
+{
+ const struct printer *p;
+
+ for (p = printers; p->f; ++p)
+ if (type == p->type)
+ return p->f;
+
+ return NULL;
+ /* NOTREACHED */
+}
+
+if_ndo_printer
+lookup_ndo_printer(int type)
+{
+ const struct ndo_printer *p;
+
+ for (p = ndo_printers; p->f; ++p)
+ if (type == p->type)
+ return p->f;
+
+#if defined(DLT_USER2) && defined(DLT_PKTAP)
+ /*
+ * Apple incorrectly chose to use DLT_USER2 for their PKTAP
+ * header.
+ *
+ * We map DLT_PKTAP, whether it's DLT_USER2 as it is on Darwin-
+ * based OSes or the same value as LINKTYPE_PKTAP as it is on
+ * other OSes, to LINKTYPE_PKTAP, so files written with
+ * this version of libpcap for a DLT_PKTAP capture have a link-
+ * layer header type of LINKTYPE_PKTAP.
+ *
+ * However, files written on OS X Mavericks for a DLT_PKTAP
+ * capture have a link-layer header type of LINKTYPE_USER2.
+ * If we don't have a printer for DLT_USER2, and type is
+ * DLT_USER2, we look up the printer for DLT_PKTAP and use
+ * that.
+ */
+ if (type == DLT_USER2) {
+ for (p = ndo_printers; p->f; ++p)
+ if (DLT_PKTAP == p->type)
+ return p->f;
+ }
+#endif
+
+ return NULL;
+ /* NOTREACHED */
+}
+
+static pcap_t *pd;
+
+static int supports_monitor_mode;
+
+extern int optind;
+extern int opterr;
+extern char *optarg;
+
+struct print_info {
+ netdissect_options *ndo;
+ union {
+ if_printer printer;
+ if_ndo_printer ndo_printer;
+ } p;
+ int ndo_type;
+};
+
+struct dump_info {
+ char *WFileName;
+ char *CurrentFileName;
+ pcap_t *pd;
+ pcap_dumper_t *p;
+#ifdef HAVE_CAPSICUM
+ int dirfd;
+#endif
+};
+
+#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)
+{
+ int n_dlts;
+ int *dlts = 0;
+ const char *dlt_name;
+
+ n_dlts = pcap_list_datalinks(pd, &dlts);
+ if (n_dlts < 0)
+ error("%s", pcap_geterr(pd));
+ else if (n_dlts == 0 || !dlts)
+ error("No data link types.");
+
+ /*
+ * If the interface is known to support monitor mode, indicate
+ * whether these are the data link types available when not in
+ * monitor mode, if -I wasn't specified, or when in monitor mode,
+ * when -I was specified (the link-layer types available in
+ * monitor mode might be different from the ones available when
+ * not in monitor mode).
+ */
+ if (supports_monitor_mode)
+ (void) fprintf(stderr, "Data link types for %s %s (use option -y to set):\n",
+ device,
+ Iflag ? "when in monitor mode" : "when not in monitor mode");
+ else
+ (void) fprintf(stderr, "Data link types for %s (use option -y to set):\n",
+ device);
+
+ while (--n_dlts >= 0) {
+ dlt_name = pcap_datalink_val_to_name(dlts[n_dlts]);
+ if (dlt_name != NULL) {
+ (void) fprintf(stderr, " %s (%s)", dlt_name,
+ pcap_datalink_val_to_description(dlts[n_dlts]));
+
+ /*
+ * OK, does tcpdump handle that type?
+ */
+ if (lookup_printer(dlts[n_dlts]) == NULL
+ && lookup_ndo_printer(dlts[n_dlts]) == NULL)
+ (void) fprintf(stderr, " (printing not supported)");
+ fprintf(stderr, "\n");
+ } else {
+ (void) fprintf(stderr, " DLT %d (printing not supported)\n",
+ dlts[n_dlts]);
+ }
+ }
+#ifdef HAVE_PCAP_FREE_DATALINKS
+ pcap_free_datalinks(dlts);
+#endif
+ exit(0);
+}
+
+#ifdef HAVE_PCAP_FINDALLDEVS
+static void
+show_devices_and_exit (void)
+{
+ pcap_if_t *devpointer;
+ char ebuf[PCAP_ERRBUF_SIZE];
+ int i;
+
+ if (pcap_findalldevs(&devpointer, ebuf) < 0)
+ error("%s", ebuf);
+ else {
+ for (i = 0; devpointer != NULL; i++) {
+ printf("%d.%s", i+1, devpointer->name);
+ if (devpointer->description != NULL)
+ printf(" (%s)", devpointer->description);
+ if (devpointer->flags != 0)
+ printf(" [%s]", bittok2str(status_flags, "none", devpointer->flags));
+ printf("\n");
+ devpointer = devpointer->next;
+ }
+ }
+ exit(0);
+}
+#endif /* HAVE_PCAP_FINDALLDEVS */
+
+/*
+ * Short options.
+ *
+ * Note that there we use all letters for short options except for g, k,
+ * o, and P, and those are used by other versions of tcpdump, and we should
+ * only use them for the same purposes that the other versions of tcpdump
+ * use them:
+ *
+ * OS X tcpdump uses -g to force non--v output for IP to be on one
+ * line, making it more "g"repable;
+ *
+ * OS X tcpdump uses -k tospecify that packet comments in pcap-ng files
+ * should be printed;
+ *
+ * OpenBSD tcpdump uses -o to indicate that OS fingerprinting should be done
+ * for hosts sending TCP SYN packets;
+ *
+ * OS X tcpdump uses -P to indicate that -w should write pcap-ng rather
+ * than pcap files.
+ *
+ * OS X tcpdump also uses -Q to specify expressions that match packet
+ * metadata, including but not limited to the packet direction.
+ * The expression syntax is different from a simple "in|out|inout",
+ * and those expressions aren't accepted by OS X tcpdump, but the
+ * equivalents would be "in" = "dir=in", "out" = "dir=out", and
+ * "inout" = "dir=in or dir=out", and the parser could conceivably
+ * special-case "in", "out", and "inout" as expressions for backwards
+ * compatibility, so all is not (yet) lost.
+ */
+
+/*
+ * Set up flags that might or might not be supported depending on the
+ * version of libpcap we're using.
+ */
+#if defined(HAVE_PCAP_CREATE) || defined(WIN32)
+#define B_FLAG "B:"
+#define B_FLAG_USAGE " [ -B size ]"
+#else /* defined(HAVE_PCAP_CREATE) || defined(WIN32) */
+#define B_FLAG
+#define B_FLAG_USAGE
+#endif /* defined(HAVE_PCAP_CREATE) || defined(WIN32) */
+
+#ifdef HAVE_PCAP_CREATE
+#define I_FLAG "I"
+#else /* HAVE_PCAP_CREATE */
+#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
+#define D_FLAG "D"
+#else
+#define D_FLAG
+#endif
+
+#ifdef HAVE_PCAP_DUMP_FLUSH
+#define U_FLAG "U"
+#else
+#define U_FLAG
+#endif
+
+#ifdef HAVE_PCAP_SETDIRECTION
+#define Q_FLAG "Q:"
+#else
+#define Q_FLAG
+#endif
+
+#define SHORTOPTS "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hHi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOpq" Q_FLAG "r:Rs:StT:u" U_FLAG "vV:w:W:xXy:Yz:Z:#"
+
+/*
+ * Long options.
+ *
+ * We do not currently have long options corresponding to all short
+ * options; we should probably pick appropriate option names for them.
+ *
+ * However, the short options where the number of times the option is
+ * specified matters, such as -v and -d and -t, should probably not
+ * just map to a long option, as saying
+ *
+ * tcpdump --verbose --verbose
+ *
+ * doesn't make sense; it should be --verbosity={N} or something such
+ * as that.
+ *
+ * For long options with no corresponding short options, we define values
+ * outside the range of ASCII graphic characters, make that the last
+ * component of the entry for the long option, and have a case for that
+ * option in the switch statement.
+ */
+#define OPTION_VERSION 128
+#define OPTION_TSTAMP_PRECISION 129
+#define OPTION_IMMEDIATE_MODE 130
+
+static const struct option longopts[] = {
+#if defined(HAVE_PCAP_CREATE) || defined(WIN32)
+ { "buffer-size", required_argument, NULL, 'B' },
+#endif
+ { "list-interfaces", no_argument, NULL, 'D' },
+ { "help", no_argument, NULL, 'h' },
+ { "interface", required_argument, NULL, 'i' },
+#ifdef HAVE_PCAP_CREATE
+ { "monitor-mode", no_argument, NULL, 'I' },
+#endif
+#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
+ { "time-stamp-type", required_argument, NULL, 'j' },
+ { "list-time-stamp-types", no_argument, NULL, 'J' },
+#endif
+#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
+ { "time-stamp-precision", required_argument, NULL, OPTION_TSTAMP_PRECISION},
+#endif
+ { "dont-verify-checksums", no_argument, NULL, 'K' },
+ { "list-data-link-types", no_argument, NULL, 'L' },
+ { "no-optimize", no_argument, NULL, 'O' },
+ { "no-promiscuous-mode", no_argument, NULL, 'p' },
+#ifdef HAVE_PCAP_SETDIRECTION
+ { "direction", required_argument, NULL, 'Q' },
+#endif
+ { "snapshot-length", required_argument, NULL, 's' },
+ { "absolute-tcp-sequence-numbers", no_argument, NULL, 'S' },
+#ifdef HAVE_PCAP_DUMP_FLUSH
+ { "packet-buffered", no_argument, NULL, 'U' },
+#endif
+ { "linktype", required_argument, NULL, 'y' },
+#ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
+ { "immediate-mode", no_argument, NULL, OPTION_IMMEDIATE_MODE },
+#endif
+#if defined(HAVE_PCAP_DEBUG) || defined(HAVE_YYDEBUG)
+ { "debug-filter-parser", no_argument, NULL, 'Y' },
+#endif
+ { "relinquish-privileges", required_argument, NULL, 'Z' },
+ { "number", no_argument, NULL, '#' },
+ { "version", no_argument, NULL, OPTION_VERSION },
+ { NULL, 0, NULL, 0 }
+};
+
+#ifndef WIN32
+/* Drop root privileges and chroot if necessary */
+static void
+droproot(const char *username, const char *chroot_dir)
+{
+ struct passwd *pw = NULL;
+
+ if (chroot_dir && !username) {
+ fprintf(stderr, "tcpdump: Chroot without dropping root is insecure\n");
+ exit(1);
+ }
+
+ pw = getpwnam(username);
+ if (pw) {
+ if (initgroups(pw->pw_name, pw->pw_gid) != 0) {
+ fprintf(stderr, "tcpdump: Couldn't initgroups to "
+ "'%.32s' gid=%lu: %s\n", pw->pw_name,
+ (unsigned long)pw->pw_gid,
+ pcap_strerror(errno));
+ exit(1);
+ }
+ if (chroot_dir) {
+ setprotoent(1);
+ res_init();
+ if (chroot(chroot_dir) != 0 || chdir ("/") != 0) {
+ fprintf(stderr, "tcpdump: Couldn't chroot/chdir to '%.64s': %s\n",
+ chroot_dir, pcap_strerror(errno));
+ exit(1);
+ }
+ }
+#ifdef HAVE_LIBCAP_NG
+ int ret = capng_change_id(pw->pw_uid, pw->pw_gid, CAPNG_NO_FLAG);
+ if (ret < 0) {
+ fprintf(stderr, "error : ret %d\n", ret);
+ }
+ else {
+// fprintf(stderr, "dropped privs to %s\n", username);
+ }
+#else
+ if (initgroups(pw->pw_name, pw->pw_gid) != 0 ||
+ setgid(pw->pw_gid) != 0 || setuid(pw->pw_uid) != 0) {
+ fprintf(stderr, "tcpdump: Couldn't change to '%.32s' uid=%lu gid=%lu: %s\n",
+ username,
+ (unsigned long)pw->pw_uid,
+ (unsigned long)pw->pw_gid,
+ pcap_strerror(errno));
+ exit(1);
+ }
+ else {
+// fprintf(stderr, "dropped privs to %s\n", username);
+ }
+#endif /* HAVE_LIBCAP_NG */
+ }
+ else {
+ fprintf(stderr, "tcpdump: Couldn't find user '%.32s'\n",
+ username);
+ exit(1);
+ }
+#ifdef HAVE_LIBCAP_NG
+ /* We don't need CAP_SETUID and CAP_SETGID any more. */
+ capng_updatev(
+ CAPNG_DROP,
+ CAPNG_EFFECTIVE | CAPNG_PERMITTED,
+ CAP_SETUID,
+ CAP_SETGID,
+ -1);
+ capng_apply(CAPNG_SELECT_BOTH);
+#endif /* HAVE_LIBCAP_NG */
+
+}
+#endif /* WIN32 */
+
+static int
+getWflagChars(int x)
+{
+ int c = 0;
+
+ x -= 1;
+ while (x > 0) {
+ c += 1;
+ x /= 10;
+ }
+
+ return c;
+}
+
+
+static void
+MakeFilename(char *buffer, char *orig_name, int cnt, int max_chars)
+{
+ char *filename = malloc(PATH_MAX + 1);
+ if (filename == NULL)
+ error("Makefilename: malloc");
+
+ /* Process with strftime if Gflag is set. */
+ if (Gflag != 0) {
+ struct tm *local_tm;
+
+ /* Convert Gflag_time to a usable format */
+ if ((local_tm = localtime(&Gflag_time)) == NULL) {
+ error("MakeTimedFilename: localtime");
+ }
+
+ /* There's no good way to detect an error in strftime since a return
+ * value of 0 isn't necessarily failure.
+ */
+ strftime(filename, PATH_MAX, orig_name, local_tm);
+ } else {
+ strncpy(filename, orig_name, PATH_MAX);
+ }
+
+ if (cnt == 0 && max_chars == 0)
+ strncpy(buffer, filename, PATH_MAX + 1);
+ else
+ if (snprintf(buffer, PATH_MAX + 1, "%s%0*d", filename, max_chars, cnt) > PATH_MAX)
+ /* Report an error if the filename is too large */
+ error("too many output files or filename is too long (> %d)", PATH_MAX);
+ free(filename);
+}
+
+static int tcpdump_printf(netdissect_options *ndo _U_,
+ const char *fmt, ...)
+{
+
+ va_list args;
+ int ret;
+
+ va_start(args, fmt);
+ ret=vfprintf(stdout, fmt, args);
+ va_end(args);
+
+ return ret;
+}
+
+static struct print_info
+get_print_info(int type)
+{
+ struct print_info printinfo;
+
+ printinfo.ndo_type = 1;
+ printinfo.ndo = gndo;
+ printinfo.p.ndo_printer = lookup_ndo_printer(type);
+ if (printinfo.p.ndo_printer == NULL) {
+ printinfo.p.printer = lookup_printer(type);
+ printinfo.ndo_type = 0;
+ if (printinfo.p.printer == NULL) {
+ gndo->ndo_dltname = pcap_datalink_val_to_name(type);
+ if (gndo->ndo_dltname != NULL)
+ error("packet printing is not supported for link type %s: use -w",
+ gndo->ndo_dltname);
+ else
+ error("packet printing is not supported for link type %d: use -w", type);
+ }
+ }
+ return (printinfo);
+}
+
+static char *
+get_next_file(FILE *VFile, char *ptr)
+{
+ char *ret;
+
+ ret = fgets(ptr, PATH_MAX, VFile);
+ if (!ret)
+ return NULL;
+
+ if (ptr[strlen(ptr) - 1] == '\n')
+ ptr[strlen(ptr) - 1] = '\0';
+
+ return ret;
+}
+
+#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
+static int
+tstamp_precision_from_string(const char *precision)
+{
+ if (strncmp(precision, "nano", strlen("nano")) == 0)
+ return PCAP_TSTAMP_PRECISION_NANO;
+
+ if (strncmp(precision, "micro", strlen("micro")) == 0)
+ return PCAP_TSTAMP_PRECISION_MICRO;
+
+ return -EINVAL;
+}
+
+static const char *
+tstamp_precision_to_string(int precision)
+{
+ switch (precision) {
+
+ case PCAP_TSTAMP_PRECISION_MICRO:
+ return "micro";
+
+ case PCAP_TSTAMP_PRECISION_NANO:
+ return "nano";
+
+ default:
+ return "unknown";
+ }
+}
+#endif
+
+#ifdef HAVE_CAPSICUM
+/*
+ * Ensure that, on a dump file's descriptor, we have all the rights
+ * necessary to make the standard I/O library work with an fdopen()ed
+ * FILE * from that descriptor.
+ *
+ * A long time ago, in a galaxy far far away, AT&T decided that, instead
+ * of providing separate APIs for getting and setting the FD_ flags on a
+ * descriptor, getting and setting the O_ flags on a descriptor, and
+ * locking files, they'd throw them all into a kitchen-sink fcntl() call
+ * along the lines of ioctl(), the fact that ioctl() operations are
+ * largely specific to particular character devices but fcntl() operations
+ * are either generic to all descriptors or generic to all descriptors for
+ * regular files nonwithstanding.
+ *
+ * The Capsicum people decided that fine-grained control of descriptor
+ * operations was required, so that you need to grant permission for
+ * reading, writing, seeking, and fcntl-ing. The latter, courtesy of
+ * AT&T's decision, means that "fcntl-ing" isn't a thing, but a motley
+ * collection of things, so there are *individual* fcntls for which
+ * permission needs to be granted.
+ *
+ * The FreeBSD standard I/O people implemented some optimizations that
+ * requires that the standard I/O routines be able to determine whether
+ * the descriptor for the FILE * is open append-only or not; as that
+ * descriptor could have come from an open() rather than an fopen(),
+ * that requires that it be able to do an F_GETFL fcntl() to read
+ * the O_ flags.
+ *
+ * Tcpdump uses ftell() to determine how much data has been written
+ * to a file in order to, when used with -C, determine when it's time
+ * to rotate capture files. ftell() therefore needs to do an lseek()
+ * to find out the file offset and must, thanks to the aforementioned
+ * optimization, also know whether the descriptor is open append-only
+ * or not.
+ *
+ * The net result of all the above is that we need to grant CAP_SEEK,
+ * CAP_WRITE, and CAP_FCNTL with the CAP_FCNTL_GETFL subcapability.
+ *
+ * Perhaps this is the universe's way of saying that either
+ *
+ * 1) there needs to be an fopenat() call and a pcap_dump_openat() call
+ * using it, so that Capsicum-capable tcpdump wouldn't need to do
+ * an fdopen()
+ *
+ * or
+ *
+ * 2) there needs to be a cap_fdopen() call in the FreeBSD standard
+ * I/O library that knows what rights are needed by the standard
+ * I/O library, based on the open mode, and assigns them, perhaps
+ * with an additional argument indicating, for example, whether
+ * seeking should be allowed, so that tcpdump doesn't need to know
+ * what the standard I/O library happens to require this week.
+ */
+static void
+set_dumper_capsicum_rights(pcap_dumper_t *p)
+{
+ int fd = fileno(pcap_dump_file(p));
+ cap_rights_t rights;
+
+ cap_rights_init(&rights, CAP_SEEK, CAP_WRITE, CAP_FCNTL);
+ if (cap_rights_limit(fd, &rights) < 0 && errno != ENOSYS) {
+ error("unable to limit dump descriptor");
+ }
+ if (cap_fcntls_limit(fd, CAP_FCNTL_GETFL) < 0 && errno != ENOSYS) {
+ error("unable to limit dump descriptor fcntls");
+ }
+}
+#endif
+
+int
+main(int argc, char **argv)
+{
+ register int cnt, op, i;
+ bpf_u_int32 localnet =0 , netmask = 0;
+ register char *cp, *infile, *cmdbuf, *device, *RFileName, *VFileName, *WFileName;
+ pcap_handler callback;
+ int type;
+ int dlt;
+ int new_dlt;
+ const char *dlt_name;
+ struct bpf_program fcode;
+#ifndef WIN32
+ RETSIGTYPE (*oldhandler)(int);
+#endif
+ struct print_info printinfo;
+ struct dump_info dumpinfo;
+ u_char *pcap_userdata;
+ char ebuf[PCAP_ERRBUF_SIZE];
+ char VFileLine[PATH_MAX + 1];
+ char *username = NULL;
+ char *chroot_dir = NULL;
+ char *ret = NULL;
+ char *end;
+#ifdef HAVE_PCAP_FINDALLDEVS
+ pcap_if_t *devpointer;
+ int devnum;
+#endif
+ int status;
+ FILE *VFile;
+#ifdef HAVE_CAPSICUM
+ cap_rights_t rights;
+ int cansandbox;
+#endif /* HAVE_CAPSICUM */
+
+#ifdef WIN32
+ if(wsockinit() != 0) return 1;
+#endif /* WIN32 */
+
+ jflag=-1; /* not set */
+ gndo->ndo_Oflag=1;
+ gndo->ndo_Rflag=1;
+ gndo->ndo_dlt=-1;
+ gndo->ndo_default_print=ndo_default_print;
+ gndo->ndo_printf=tcpdump_printf;
+ gndo->ndo_error=ndo_error;
+ gndo->ndo_warning=ndo_warning;
+ gndo->ndo_snaplen = DEFAULT_SNAPLEN;
+ gndo->ndo_immediate = 0;
+
+ cnt = -1;
+ device = NULL;
+ infile = NULL;
+ RFileName = NULL;
+ VFileName = NULL;
+ VFile = NULL;
+ WFileName = NULL;
+ dlt = -1;
+ if ((cp = strrchr(argv[0], '/')) != NULL)
+ program_name = cp + 1;
+ else
+ program_name = argv[0];
+
+ /*
+ * On platforms where the CPU doesn't support unaligned loads,
+ * force unaligned accesses to abort with SIGBUS, rather than
+ * being fixed up (slowly) by the OS kernel; on those platforms,
+ * misaligned accesses are bugs, and we want tcpdump to crash so
+ * that the bugs are reported.
+ */
+ if (abort_on_misalignment(ebuf, sizeof(ebuf)) < 0)
+ error("%s", ebuf);
+
+#ifdef USE_LIBSMI
+ smiInit("tcpdump");
+#endif
+
+ while (
+ (op = getopt_long(argc, argv, SHORTOPTS, longopts, NULL)) != -1)
+ switch (op) {
+
+ case 'a':
+ /* compatibility for old -a */
+ break;
+
+ case 'A':
+ ++Aflag;
+ break;
+
+ case 'b':
+ ++bflag;
+ break;
+
+#if defined(HAVE_PCAP_CREATE) || defined(WIN32)
+ case 'B':
+ Bflag = atoi(optarg)*1024;
+ if (Bflag <= 0)
+ error("invalid packet buffer size %s", optarg);
+ break;
+#endif /* defined(HAVE_PCAP_CREATE) || defined(WIN32) */
+
+ case 'c':
+ cnt = atoi(optarg);
+ if (cnt <= 0)
+ error("invalid packet count %s", optarg);
+ break;
+
+ case 'C':
+ Cflag = atoi(optarg) * 1000000;
+ if (Cflag < 0)
+ error("invalid file size %s", optarg);
+ break;
+
+ case 'd':
+ ++dflag;
+ break;
+
+ case 'D':
+ Dflag++;
+ break;
+
+ case 'L':
+ Lflag++;
+ break;
+
+ case 'e':
+ ++eflag;
+ break;
+
+ case 'E':
+#ifndef HAVE_LIBCRYPTO
+ warning("crypto code not compiled in");
+#endif
+ gndo->ndo_espsecret = optarg;
+ break;
+
+ case 'f':
+ ++fflag;
+ break;
+
+ case 'F':
+ infile = optarg;
+ break;
+
+ case 'G':
+ Gflag = atoi(optarg);
+ if (Gflag < 0)
+ error("invalid number of seconds %s", optarg);
+
+ /* We will create one file initially. */
+ Gflag_count = 0;
+
+ /* Grab the current time for rotation use. */
+ if ((Gflag_time = time(NULL)) == (time_t)-1) {
+ error("main: can't get current time: %s",
+ pcap_strerror(errno));
+ }
+ break;
+
+ case 'h':
+ print_usage();
+ exit(0);
+ break;
+
+ case 'H':
+ ++Hflag;
+ break;
+
+ case 'i':
+ if (optarg[0] == '0' && optarg[1] == 0)
+ error("Invalid adapter index");
+
+#ifdef HAVE_PCAP_FINDALLDEVS
+ /*
+ * If the argument is a number, treat it as
+ * an index into the list of adapters, as
+ * printed by "tcpdump -D".
+ *
+ * This should be OK on UNIX systems, as interfaces
+ * shouldn't have names that begin with digits.
+ * It can be useful on Windows, where more than
+ * one interface can have the same name.
+ */
+ devnum = strtol(optarg, &end, 10);
+ if (optarg != end && *end == '\0') {
+ if (devnum < 0)
+ error("Invalid adapter index");
+
+ if (pcap_findalldevs(&devpointer, ebuf) < 0)
+ error("%s", ebuf);
+ else {
+ /*
+ * Look for the devnum-th entry
+ * in the list of devices
+ * (1-based).
+ */
+ for (i = 0;
+ i < devnum-1 && devpointer != NULL;
+ i++, devpointer = devpointer->next)
+ ;
+ if (devpointer == NULL)
+ error("Invalid adapter index");
+ }
+ device = devpointer->name;
+ break;
+ }
+#endif /* HAVE_PCAP_FINDALLDEVS */
+ device = optarg;
+ break;
+
+#ifdef HAVE_PCAP_CREATE
+ case 'I':
+ ++Iflag;
+ 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
+ /*
+ * _IOLBF is the same as _IOFBF in Microsoft's C
+ * libraries; the only alternative they offer
+ * is _IONBF.
+ *
+ * XXX - this should really be checking for MSVC++,
+ * not WIN32, if, for example, MinGW has its own
+ * C library that is more UNIX-compatible.
+ */
+ setvbuf(stdout, NULL, _IONBF, 0);
+#else /* WIN32 */
+#ifdef HAVE_SETLINEBUF
+ setlinebuf(stdout);
+#else
+ setvbuf(stdout, NULL, _IOLBF, 0);
+#endif
+#endif /* WIN32 */
+ break;
+
+ case 'K':
+ ++Kflag;
+ break;
+
+ case 'm':
+#ifdef USE_LIBSMI
+ if (smiLoadModule(optarg) == 0) {
+ error("could not load MIB module %s", optarg);
+ }
+ sflag = 1;
+#else
+ (void)fprintf(stderr, "%s: ignoring option `-m %s' ",
+ program_name, optarg);
+ (void)fprintf(stderr, "(no libsmi support)\n");
+#endif
+ break;
+
+ case 'M':
+ /* TCP-MD5 shared secret */
+#ifndef HAVE_LIBCRYPTO
+ warning("crypto code not compiled in");
+#endif
+ sigsecret = optarg;
+ break;
+
+ case 'n':
+ ++nflag;
+ break;
+
+ case 'N':
+ ++Nflag;
+ break;
+
+ case 'O':
+ Oflag = 0;
+ break;
+
+ case 'p':
+ ++pflag;
+ break;
+
+ case 'q':
+ ++qflag;
+ ++suppress_default_print;
+ break;
+
+#ifdef HAVE_PCAP_SETDIRECTION
+ case 'Q':
+ if (strcasecmp(optarg, "in") == 0)
+ Qflag = PCAP_D_IN;
+ else if (strcasecmp(optarg, "out") == 0)
+ Qflag = PCAP_D_OUT;
+ else if (strcasecmp(optarg, "inout") == 0)
+ Qflag = PCAP_D_INOUT;
+ else
+ error("unknown capture direction `%s'", optarg);
+ break;
+#endif /* HAVE_PCAP_SETDIRECTION */
+
+ case 'r':
+ RFileName = optarg;
+ break;
+
+ case 'R':
+ Rflag = 0;
+ break;
+
+ case 's':
+ snaplen = strtol(optarg, &end, 0);
+ if (optarg == end || *end != '\0'
+ || snaplen < 0 || snaplen > MAXIMUM_SNAPLEN)
+ error("invalid snaplen %s", optarg);
+ else if (snaplen == 0)
+ snaplen = MAXIMUM_SNAPLEN;
+ break;
+
+ case 'S':
+ ++Sflag;
+ break;
+
+ case 't':
+ ++tflag;
+ break;
+
+ case 'T':
+ if (strcasecmp(optarg, "vat") == 0)
+ packettype = PT_VAT;
+ else if (strcasecmp(optarg, "wb") == 0)
+ packettype = PT_WB;
+ else if (strcasecmp(optarg, "rpc") == 0)
+ packettype = PT_RPC;
+ else if (strcasecmp(optarg, "rtp") == 0)
+ packettype = PT_RTP;
+ else if (strcasecmp(optarg, "rtcp") == 0)
+ packettype = PT_RTCP;
+ else if (strcasecmp(optarg, "snmp") == 0)
+ packettype = PT_SNMP;
+ else if (strcasecmp(optarg, "cnfp") == 0)
+ packettype = PT_CNFP;
+ else if (strcasecmp(optarg, "tftp") == 0)
+ packettype = PT_TFTP;
+ else if (strcasecmp(optarg, "aodv") == 0)
+ packettype = PT_AODV;
+ else if (strcasecmp(optarg, "carp") == 0)
+ packettype = PT_CARP;
+ else if (strcasecmp(optarg, "radius") == 0)
+ packettype = PT_RADIUS;
+ else if (strcasecmp(optarg, "zmtp1") == 0)
+ packettype = PT_ZMTP1;
+ else if (strcasecmp(optarg, "vxlan") == 0)
+ packettype = PT_VXLAN;
+ else if (strcasecmp(optarg, "pgm") == 0)
+ packettype = PT_PGM;
+ else if (strcasecmp(optarg, "pgm_zmtp1") == 0)
+ packettype = PT_PGM_ZMTP1;
+ else if (strcasecmp(optarg, "lmp") == 0)
+ packettype = PT_LMP;
+ else
+ error("unknown packet type `%s'", optarg);
+ break;
+
+ case 'u':
+ ++uflag;
+ break;
+
+#ifdef HAVE_PCAP_DUMP_FLUSH
+ case 'U':
+ ++Uflag;
+ break;
+#endif
+
+ case 'v':
+ ++vflag;
+ break;
+
+ case 'V':
+ VFileName = optarg;
+ break;
+
+ case 'w':
+ WFileName = optarg;
+ break;
+
+ case 'W':
+ Wflag = atoi(optarg);
+ if (Wflag < 0)
+ error("invalid number of output files %s", optarg);
+ WflagChars = getWflagChars(Wflag);
+ break;
+
+ case 'x':
+ ++xflag;
+ ++suppress_default_print;
+ break;
+
+ case 'X':
+ ++Xflag;
+ ++suppress_default_print;
+ break;
+
+ case 'y':
+ gndo->ndo_dltname = optarg;
+ gndo->ndo_dlt =
+ pcap_datalink_name_to_val(gndo->ndo_dltname);
+ if (gndo->ndo_dlt < 0)
+ error("invalid data link type %s", gndo->ndo_dltname);
+ break;
+
+#if defined(HAVE_PCAP_DEBUG) || defined(HAVE_YYDEBUG)
+ case 'Y':
+ {
+ /* Undocumented flag */
+#ifdef HAVE_PCAP_DEBUG
+ extern int pcap_debug;
+ pcap_debug = 1;
+#else
+ extern int yydebug;
+ yydebug = 1;
+#endif
+ }
+ break;
+#endif
+ case 'z':
+ zflag = strdup(optarg);
+ break;
+
+ case 'Z':
+ username = strdup(optarg);
+ break;
+
+ case '#':
+ gndo->ndo_packet_number = 1;
+ break;
+
+ case OPTION_VERSION:
+ print_version();
+ exit(0);
+ break;
+
+#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
+ case OPTION_TSTAMP_PRECISION:
+ gndo->ndo_tstamp_precision = tstamp_precision_from_string(optarg);
+ if (gndo->ndo_tstamp_precision < 0)
+ error("unsupported time stamp precision");
+ break;
+#endif
+
+#ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
+ case OPTION_IMMEDIATE_MODE:
+ gndo->ndo_immediate = 1;
+ break;
+#endif
+
+ default:
+ print_usage();
+ exit(1);
+ /* NOTREACHED */
+ }
+
+#ifdef HAVE_PCAP_FINDALLDEVS
+ if (Dflag)
+ show_devices_and_exit();
+#endif
+
+ switch (tflag) {
+
+ case 0: /* Default */
+ case 4: /* Default + Date*/
+ thiszone = gmt2local(0);
+ break;
+
+ case 1: /* No time stamp */
+ case 2: /* Unix timeval style */
+ case 3: /* Microseconds since previous packet */
+ case 5: /* Microseconds since first packet */
+ break;
+
+ default: /* Not supported */
+ error("only -t, -tt, -ttt, -tttt and -ttttt are supported");
+ break;
+ }
+
+ if (fflag != 0 && (VFileName != NULL || RFileName != NULL))
+ error("-f can not be used with -V or -r");
+
+ if (VFileName != NULL && RFileName != NULL)
+ error("-V and -r are mutually exclusive.");
+
+#ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
+ /*
+ * If we're printing dissected packets to the standard output
+ * rather than saving raw packets to a file, and the standard
+ * output is a terminal, use immediate mode, as the user's
+ * probably expecting to see packets pop up immediately.
+ */
+ if (WFileName == NULL && isatty(1))
+ gndo->ndo_immediate = 1;
+#endif
+
+#ifdef WITH_CHROOT
+ /* if run as root, prepare for chrooting */
+ if (getuid() == 0 || geteuid() == 0) {
+ /* future extensibility for cmd-line arguments */
+ if (!chroot_dir)
+ chroot_dir = WITH_CHROOT;
+ }
+#endif
+
+#ifdef WITH_USER
+ /* if run as root, prepare for dropping root privileges */
+ if (getuid() == 0 || geteuid() == 0) {
+ /* Run with '-Z root' to restore old behaviour */
+ if (!username)
+ username = WITH_USER;
+ }
+#endif
+
+ if (RFileName != NULL || VFileName != NULL) {
+ /*
+ * If RFileName is non-null, it's the pathname of a
+ * savefile to read. If VFileName is non-null, it's
+ * the pathname of a file containing a list of pathnames
+ * (one per line) of savefiles to read.
+ *
+ * In either case, we're reading a savefile, not doing
+ * a live capture.
+ */
+#ifndef WIN32
+ /*
+ * We don't need network access, so relinquish any set-UID
+ * or set-GID privileges we have (if any).
+ *
+ * We do *not* want set-UID privileges when opening a
+ * trace file, as that might let the user read other
+ * people's trace files (especially if we're set-UID
+ * root).
+ */
+ if (setgid(getgid()) != 0 || setuid(getuid()) != 0 )
+ fprintf(stderr, "Warning: setgid/setuid failed !\n");
+#endif /* WIN32 */
+ if (VFileName != NULL) {
+ if (VFileName[0] == '-' && VFileName[1] == '\0')
+ VFile = stdin;
+ else
+ VFile = fopen(VFileName, "r");
+
+ if (VFile == NULL)
+ error("Unable to open file: %s\n", strerror(errno));
+
+ ret = get_next_file(VFile, VFileLine);
+ if (!ret)
+ error("Nothing in %s\n", VFileName);
+ RFileName = VFileLine;
+ }
+
+#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
+ pd = pcap_open_offline_with_tstamp_precision(RFileName,
+ gndo->ndo_tstamp_precision, ebuf);
+#else
+ pd = pcap_open_offline(RFileName, ebuf);
+#endif
+
+ if (pd == NULL)
+ error("%s", ebuf);
+#ifdef HAVE_CAPSICUM
+ cap_rights_init(&rights, CAP_READ);
+ if (cap_rights_limit(fileno(pcap_file(pd)), &rights) < 0 &&
+ errno != ENOSYS) {
+ error("unable to limit pcap descriptor");
+ }
+#endif
+ dlt = pcap_datalink(pd);
+ dlt_name = pcap_datalink_val_to_name(dlt);
+ if (dlt_name == NULL) {
+ fprintf(stderr, "reading from file %s, link-type %u\n",
+ RFileName, dlt);
+ } else {
+ fprintf(stderr,
+ "reading from file %s, link-type %s (%s)\n",
+ RFileName, dlt_name,
+ pcap_datalink_val_to_description(dlt));
+ }
+ } else {
+ /*
+ * We're doing a live capture.
+ */
+ if (device == NULL) {
+ device = pcap_lookupdev(ebuf);
+ if (device == NULL)
+ error("%s", ebuf);
+ }
+#ifdef WIN32
+ /*
+ * Print a message to the standard error on Windows.
+ * XXX - why do it here, with a different message?
+ */
+ if(strlen(device) == 1) /* we assume that an ASCII string is always longer than 1 char */
+ { /* a Unicode string has a \0 as second byte (so strlen() is 1) */
+ fprintf(stderr, "%s: listening on %ws\n", program_name, device);
+ }
+ else
+ {
+ fprintf(stderr, "%s: listening on %s\n", program_name, device);
+ }
+
+ fflush(stderr);
+#endif /* WIN32 */
+#ifdef HAVE_PCAP_CREATE
+ 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
+#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
+ status = pcap_set_tstamp_precision(pd, gndo->ndo_tstamp_precision);
+ if (status != 0)
+ error("%s: Can't set %ssecond time stamp precision: %s",
+ device,
+ tstamp_precision_to_string(gndo->ndo_tstamp_precision),
+ pcap_statustostr(status));
+#endif
+
+#ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
+ if (gndo->ndo_immediate) {
+ status = pcap_set_immediate_mode(pd, 1);
+ if (status != 0)
+ error("%s: Can't set immediate mode: %s",
+ device,
+ pcap_statustostr(status));
+ }
+#endif
+ /*
+ * Is this an interface that supports monitor mode?
+ */
+ if (pcap_can_set_rfmon(pd) == 1)
+ supports_monitor_mode = 1;
+ else
+ supports_monitor_mode = 0;
+ status = pcap_set_snaplen(pd, snaplen);
+ if (status != 0)
+ error("%s: Can't set snapshot length: %s",
+ device, pcap_statustostr(status));
+ status = pcap_set_promisc(pd, !pflag);
+ if (status != 0)
+ 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: Can't set monitor mode: %s",
+ device, pcap_statustostr(status));
+ }
+ status = pcap_set_timeout(pd, 1000);
+ if (status != 0)
+ error("%s: pcap_set_timeout failed: %s",
+ device, pcap_statustostr(status));
+ if (Bflag != 0) {
+ status = pcap_set_buffer_size(pd, Bflag);
+ if (status != 0)
+ 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) {
+ /*
+ * pcap_activate() failed.
+ */
+ cp = pcap_geterr(pd);
+ if (status == PCAP_ERROR)
+ error("%s", cp);
+ else if ((status == PCAP_ERROR_NO_SUCH_DEVICE ||
+ status == PCAP_ERROR_PERM_DENIED) &&
+ *cp != '\0')
+ error("%s: %s\n(%s)", device,
+ pcap_statustostr(status), cp);
+ else
+ error("%s: %s", device,
+ pcap_statustostr(status));
+ } else if (status > 0) {
+ /*
+ * pcap_activate() succeeded, but it's warning us
+ * of a problem it had.
+ */
+ cp = pcap_geterr(pd);
+ if (status == PCAP_WARNING)
+ warning("%s", cp);
+ else if (status == PCAP_WARNING_PROMISC_NOTSUP &&
+ *cp != '\0')
+ warning("%s: %s\n(%s)", device,
+ pcap_statustostr(status), cp);
+ else
+ warning("%s: %s", device,
+ pcap_statustostr(status));
+ }
+#ifdef HAVE_PCAP_SETDIRECTION
+ if (Qflag != -1) {
+ status = pcap_setdirection(pd, Qflag);
+ if (status != 0)
+ error("%s: pcap_setdirection() failed: %s",
+ device, pcap_geterr(pd));
+ }
+#endif /* HAVE_PCAP_SETDIRECTION */
+#else
+ *ebuf = '\0';
+ pd = pcap_open_live(device, snaplen, !pflag, 1000, ebuf);
+ if (pd == NULL)
+ error("%s", ebuf);
+ else if (*ebuf)
+ warning("%s", ebuf);
+#endif /* HAVE_PCAP_CREATE */
+ /*
+ * Let user own process after socket has been opened.
+ */
+#ifndef WIN32
+ if (setgid(getgid()) != 0 || setuid(getuid()) != 0)
+ fprintf(stderr, "Warning: setgid/setuid failed !\n");
+#endif /* WIN32 */
+#if !defined(HAVE_PCAP_CREATE) && defined(WIN32)
+ if(Bflag != 0)
+ if(pcap_setbuff(pd, Bflag)==-1){
+ error("%s", pcap_geterr(pd));
+ }
+#endif /* !defined(HAVE_PCAP_CREATE) && defined(WIN32) */
+ if (Lflag)
+ show_dlts_and_exit(device, pd);
+ if (gndo->ndo_dlt >= 0) {
+#ifdef HAVE_PCAP_SET_DATALINK
+ if (pcap_set_datalink(pd, gndo->ndo_dlt) < 0)
+ error("%s", pcap_geterr(pd));
+#else
+ /*
+ * We don't actually support changing the
+ * data link type, so we only let them
+ * set it to what it already is.
+ */
+ if (gndo->ndo_dlt != pcap_datalink(pd)) {
+ error("%s is not one of the DLTs supported by this device\n",
+ gndo->ndo_dltname);
+ }
+#endif
+ (void)fprintf(stderr, "%s: data link type %s\n",
+ program_name, gndo->ndo_dltname);
+ (void)fflush(stderr);
+ }
+ i = pcap_snapshot(pd);
+ if (snaplen < i) {
+ warning("snaplen raised from %d to %d", snaplen, i);
+ snaplen = i;
+ }
+ if(fflag != 0) {
+ if (pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) {
+ warning("foreign (-f) flag used but: %s", ebuf);
+ }
+ }
+
+ }
+ if (infile)
+ cmdbuf = read_infile(infile);
+ else
+ cmdbuf = copy_argv(&argv[optind]);
+
+ if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
+ error("%s", pcap_geterr(pd));
+ if (dflag) {
+ bpf_dump(&fcode, dflag);
+ pcap_close(pd);
+ free(cmdbuf);
+ exit(0);
+ }
+ init_addrtoname(gndo, localnet, netmask);
+ init_checksum();
+
+#ifndef WIN32
+ (void)setsignal(SIGPIPE, cleanup);
+ (void)setsignal(SIGTERM, cleanup);
+ (void)setsignal(SIGINT, 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) {
+#ifdef HAVE_LIBCAP_NG
+ /* Initialize capng */
+ capng_clear(CAPNG_SELECT_BOTH);
+ if (username) {
+ capng_updatev(
+ CAPNG_ADD,
+ CAPNG_PERMITTED | CAPNG_EFFECTIVE,
+ CAP_SETUID,
+ CAP_SETGID,
+ -1);
+ }
+
+ if (WFileName) {
+ capng_update(
+ CAPNG_ADD,
+ CAPNG_PERMITTED | CAPNG_EFFECTIVE,
+ CAP_DAC_OVERRIDE
+ );
+ }
+ capng_apply(CAPNG_SELECT_BOTH);
+#endif /* HAVE_LIBCAP_NG */
+ if (username || chroot_dir) {
+#ifndef HAVE_LIBCAP_NG
+ if (!WFileName)
+#endif
+ droproot(username, chroot_dir);
+ }
+ }
+#endif /* WIN32 */
+
+ if (pcap_setfilter(pd, &fcode) < 0)
+ error("%s", pcap_geterr(pd));
+#ifdef HAVE_CAPSICUM
+ if (RFileName == NULL && VFileName == NULL) {
+ static const unsigned long cmds[] = { BIOCGSTATS };
+
+ cap_rights_init(&rights, CAP_IOCTL, CAP_READ);
+ if (cap_rights_limit(pcap_fileno(pd), &rights) < 0 &&
+ errno != ENOSYS) {
+ error("unable to limit pcap descriptor");
+ }
+ if (cap_ioctls_limit(pcap_fileno(pd), cmds,
+ sizeof(cmds) / sizeof(cmds[0])) < 0 && errno != ENOSYS) {
+ error("unable to limit ioctls on pcap descriptor");
+ }
+ }
+#endif
+ if (WFileName) {
+ pcap_dumper_t *p;
+ /* Do not exceed the default PATH_MAX for files. */
+ dumpinfo.CurrentFileName = (char *)malloc(PATH_MAX + 1);
+
+ if (dumpinfo.CurrentFileName == NULL)
+ error("malloc of dumpinfo.CurrentFileName");
+
+ /* We do not need numbering for dumpfiles if Cflag isn't set. */
+ if (Cflag != 0)
+ MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, WflagChars);
+ else
+ MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, 0);
+
+ p = pcap_dump_open(pd, dumpinfo.CurrentFileName);
+#ifdef HAVE_LIBCAP_NG
+ /* Give up CAP_DAC_OVERRIDE capability.
+ * Only allow it to be restored if the -C or -G flag have been
+ * set since we may need to create more files later on.
+ */
+ capng_update(
+ CAPNG_DROP,
+ (Cflag || Gflag ? 0 : CAPNG_PERMITTED)
+ | CAPNG_EFFECTIVE,
+ CAP_DAC_OVERRIDE
+ );
+ capng_apply(CAPNG_SELECT_BOTH);
+#endif /* HAVE_LIBCAP_NG */
+ if (p == NULL)
+ error("%s", pcap_geterr(pd));
+#ifdef HAVE_CAPSICUM
+ set_dumper_capsicum_rights(p);
+#endif
+ if (Cflag != 0 || Gflag != 0) {
+#ifdef HAVE_CAPSICUM
+ dumpinfo.WFileName = strdup(basename(WFileName));
+ dumpinfo.dirfd = open(dirname(WFileName),
+ O_DIRECTORY | O_RDONLY);
+ if (dumpinfo.dirfd < 0) {
+ error("unable to open directory %s",
+ dirname(WFileName));
+ }
+ cap_rights_init(&rights, CAP_CREATE, CAP_FCNTL,
+ CAP_FTRUNCATE, CAP_LOOKUP, CAP_SEEK, CAP_WRITE);
+ if (cap_rights_limit(dumpinfo.dirfd, &rights) < 0 &&
+ errno != ENOSYS) {
+ error("unable to limit directory rights");
+ }
+ if (cap_fcntls_limit(dumpinfo.dirfd, CAP_FCNTL_GETFL) < 0 &&
+ errno != ENOSYS) {
+ error("unable to limit dump descriptor fcntls");
+ }
+#else /* !HAVE_CAPSICUM */
+ dumpinfo.WFileName = WFileName;
+#endif
+ callback = dump_packet_and_trunc;
+ dumpinfo.pd = pd;
+ dumpinfo.p = p;
+ pcap_userdata = (u_char *)&dumpinfo;
+ } else {
+ 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 = get_print_info(type);
+ callback = print_packet;
+ pcap_userdata = (u_char *)&printinfo;
+ }
+
+#ifdef SIGNAL_REQ_INFO
+ /*
+ * We can't get statistics when reading from a file rather
+ * than capturing from a device.
+ */
+ if (RFileName == NULL)
+ (void)setsignal(SIGNAL_REQ_INFO, requestinfo);
+#endif
+
+ if (vflag > 0 && WFileName) {
+ /*
+ * When capturing to a file, "-v" means tcpdump should,
+ * every 10 secodns, "v"erbosely report the number of
+ * packets captured.
+ */
+#ifdef USE_WIN32_MM_TIMER
+ /* call verbose_stats_dump() each 1000 +/-100msec */
+ timer_id = timeSetEvent(1000, 100, verbose_stats_dump, 0, TIME_PERIODIC);
+ setvbuf(stderr, NULL, _IONBF, 0);
+#elif defined(HAVE_ALARM)
+ (void)setsignal(SIGALRM, verbose_stats_dump);
+ alarm(1);
+#endif
+ }
+
+#ifndef WIN32
+ if (RFileName == NULL) {
+ /*
+ * Live capture (if -V was specified, we set RFileName
+ * to a file from the -V file). Print a message to
+ * the standard error on UN*X.
+ */
+ if (!vflag && !WFileName) {
+ (void)fprintf(stderr,
+ "%s: verbose output suppressed, use -v or -vv for full protocol decode\n",
+ program_name);
+ } else
+ (void)fprintf(stderr, "%s: ", program_name);
+ dlt = pcap_datalink(pd);
+ dlt_name = pcap_datalink_val_to_name(dlt);
+ if (dlt_name == NULL) {
+ (void)fprintf(stderr, "listening on %s, link-type %u, capture size %u bytes\n",
+ device, dlt, snaplen);
+ } else {
+ (void)fprintf(stderr, "listening on %s, link-type %s (%s), capture size %u bytes\n",
+ device, dlt_name,
+ pcap_datalink_val_to_description(dlt), snaplen);
+ }
+ (void)fflush(stderr);
+ }
+
+ /*
+ * 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 */
+
+#ifdef HAVE_CAPSICUM
+ cansandbox = (nflag && VFileName == NULL && zflag == NULL);
+ if (cansandbox && cap_enter() < 0 && errno != ENOSYS)
+ error("unable to enter the capability mode");
+ if (cap_sandboxed())
+ fprintf(stderr, "capability mode sandbox enabled\n");
+#endif /* HAVE_CAPSICUM */
+
+ do {
+ status = pcap_loop(pd, cnt, callback, pcap_userdata);
+ if (WFileName == NULL) {
+ /*
+ * We're printing packets. Flush the printed output,
+ * so it doesn't get intermingled with error output.
+ */
+ if (status == -2) {
+ /*
+ * We got interrupted, so perhaps we didn't
+ * manage to finish a line we were printing.
+ * Print an extra newline, just in case.
+ */
+ putchar('\n');
+ }
+ (void)fflush(stdout);
+ }
+ if (status == -2) {
+ /*
+ * We got interrupted. If we are reading multiple
+ * files (via -V) set these so that we stop.
+ */
+ VFileName = NULL;
+ ret = NULL;
+ }
+ if (status == -1) {
+ /*
+ * Error. Report it.
+ */
+ (void)fprintf(stderr, "%s: pcap_loop: %s\n",
+ program_name, pcap_geterr(pd));
+ }
+ if (RFileName == NULL) {
+ /*
+ * We're doing a live capture. Report the capture
+ * statistics.
+ */
+ info(1);
+ }
+ pcap_close(pd);
+ if (VFileName != NULL) {
+ ret = get_next_file(VFile, VFileLine);
+ if (ret) {
+ RFileName = VFileLine;
+ pd = pcap_open_offline(RFileName, ebuf);
+ if (pd == NULL)
+ error("%s", ebuf);
+#ifdef HAVE_CAPSICUM
+ cap_rights_init(&rights, CAP_READ);
+ if (cap_rights_limit(fileno(pcap_file(pd)),
+ &rights) < 0 && errno != ENOSYS) {
+ error("unable to limit pcap descriptor");
+ }
+#endif
+ new_dlt = pcap_datalink(pd);
+ if (WFileName && new_dlt != dlt)
+ error("%s: new dlt does not match original", RFileName);
+ printinfo = get_print_info(new_dlt);
+ dlt_name = pcap_datalink_val_to_name(new_dlt);
+ if (dlt_name == NULL) {
+ fprintf(stderr, "reading from file %s, link-type %u\n",
+ RFileName, new_dlt);
+ } else {
+ fprintf(stderr,
+ "reading from file %s, link-type %s (%s)\n",
+ RFileName, dlt_name,
+ pcap_datalink_val_to_description(new_dlt));
+ }
+ if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
+ error("%s", pcap_geterr(pd));
+ if (pcap_setfilter(pd, &fcode) < 0)
+ error("%s", pcap_geterr(pd));
+ }
+ }
+ }
+ while (ret != NULL);
+
+ free(cmdbuf);
+ exit(status == -1 ? 1 : 0);
+}
+
+/* make a clean exit on interrupts */
+static RETSIGTYPE
+cleanup(int signo _U_)
+{
+#ifdef USE_WIN32_MM_TIMER
+ if (timer_id)
+ timeKillEvent(timer_id);
+ timer_id = 0;
+#elif defined(HAVE_ALARM)
+ alarm(0);
+#endif
+
+#ifdef HAVE_PCAP_BREAKLOOP
+ /*
+ * We have "pcap_breakloop()"; use it, so that we do as little
+ * as possible in the signal handler (it's probably not safe
+ * to do anything with standard I/O streams in a signal handler -
+ * the ANSI C standard doesn't say it is).
+ */
+ pcap_breakloop(pd);
+#else
+ /*
+ * We don't have "pcap_breakloop()"; this isn't safe, but
+ * it's the best we can do. Print the summary if we're
+ * not reading from a savefile - i.e., if we're doing a
+ * live capture - and exit.
+ */
+ if (pd != NULL && pcap_file(pd) == NULL) {
+ /*
+ * We got interrupted, so perhaps we didn't
+ * manage to finish a line we were printing.
+ * Print an extra newline, just in case.
+ */
+ putchar('\n');
+ (void)fflush(stdout);
+ info(1);
+ }
+ exit(0);
+#endif
+}
+
+/*
+ On windows, we do not use a fork, so we do not care less about
+ waiting a child processes to die
+ */
+#if defined(HAVE_FORK) || defined(HAVE_VFORK)
+static RETSIGTYPE
+child_cleanup(int signo _U_)
+{
+ wait(NULL);
+}
+#endif /* HAVE_FORK && HAVE_VFORK */
+
+static void
+info(register int verbose)
+{
+ struct pcap_stat stat;
+
+ /*
+ * Older versions of libpcap didn't set ps_ifdrop on some
+ * platforms; initialize it to 0 to handle that.
+ */
+ stat.ps_ifdrop = 0;
+ if (pcap_stats(pd, &stat) < 0) {
+ (void)fprintf(stderr, "pcap_stats: %s\n", pcap_geterr(pd));
+ infoprint = 0;
+ return;
+ }
+
+ if (!verbose)
+ fprintf(stderr, "%s: ", program_name);
+
+ (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 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 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 packet%s dropped by interface\n",
+ stat.ps_ifdrop, PLURAL_SUFFIX(stat.ps_ifdrop));
+ } else
+ putc('\n', stderr);
+ infoprint = 0;
+}
+
+#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
+ */
+#ifdef NZERO
+ setpriority(PRIO_PROCESS, 0, NZERO - 1);
+#else
+ setpriority(PRIO_PROCESS, 0, 19);
+#endif
+ if (execlp(zflag, zflag, filename, (char *)NULL) == -1)
+ fprintf(stderr,
+ "compress_savefile:execlp(%s, %s): %s\n",
+ zflag,
+ filename,
+ strerror(errno));
+# ifdef HAVE_FORK
+ exit(1);
+# else
+ _exit(1);
+# endif
+}
+#else /* HAVE_FORK && HAVE_VFORK */
+static void
+compress_savefile(const char *filename)
+{
+ fprintf(stderr,
+ "compress_savefile failed. Functionality not implemented under your system\n");
+}
+#endif /* HAVE_FORK && HAVE_VFORK */
+
+static void
+dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
+{
+ struct dump_info *dump_info;
+#ifdef HAVE_CAPSICUM
+ cap_rights_t rights;
+#endif
+
+ ++packets_captured;
+
+ ++infodelay;
+
+ dump_info = (struct dump_info *)user;
+
+ /*
+ * XXX - this won't force the file to rotate on the specified time
+ * boundary, but it will rotate on the first packet received after the
+ * specified Gflag number of seconds. Note: if a Gflag time boundary
+ * and a Cflag size boundary coincide, the time rotation will occur
+ * first thereby cancelling the Cflag boundary (since the file should
+ * be 0).
+ */
+ if (Gflag != 0) {
+ /* Check if it is time to rotate */
+ time_t t;
+
+ /* Get the current time */
+ if ((t = time(NULL)) == (time_t)-1) {
+ error("dump_and_trunc_packet: can't get current_time: %s",
+ pcap_strerror(errno));
+ }
+
+
+ /* If the time is greater than the specified window, rotate */
+ if (t - Gflag_time >= Gflag) {
+#ifdef HAVE_CAPSICUM
+ FILE *fp;
+ int fd;
+#endif
+
+ /* Update the Gflag_time */
+ Gflag_time = t;
+ /* Update Gflag_count */
+ Gflag_count++;
+ /*
+ * Close the current file and open a new one.
+ */
+ pcap_dump_close(dump_info->p);
+
+ /*
+ * Compress the file we just closed, if the user asked for it
+ */
+ if (zflag != NULL)
+ compress_savefile(dump_info->CurrentFileName);
+
+ /*
+ * Check to see if we've exceeded the Wflag (when
+ * not using Cflag).
+ */
+ if (Cflag == 0 && Wflag > 0 && Gflag_count >= Wflag) {
+ (void)fprintf(stderr, "Maximum file limit reached: %d\n",
+ Wflag);
+ exit(0);
+ /* NOTREACHED */
+ }
+ if (dump_info->CurrentFileName != NULL)
+ free(dump_info->CurrentFileName);
+ /* Allocate space for max filename + \0. */
+ dump_info->CurrentFileName = (char *)malloc(PATH_MAX + 1);
+ if (dump_info->CurrentFileName == NULL)
+ error("dump_packet_and_trunc: malloc");
+ /*
+ * Gflag was set otherwise we wouldn't be here. Reset the count
+ * so multiple files would end with 1,2,3 in the filename.
+ * The counting is handled with the -C flow after this.
+ */
+ Cflag_count = 0;
+
+ /*
+ * This is always the first file in the Cflag
+ * rotation: e.g. 0
+ * We also don't need numbering if Cflag is not set.
+ */
+ if (Cflag != 0)
+ MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0,
+ WflagChars);
+ else
+ MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0, 0);
+
+#ifdef HAVE_LIBCAP_NG
+ capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
+ capng_apply(CAPNG_SELECT_BOTH);
+#endif /* HAVE_LIBCAP_NG */
+#ifdef HAVE_CAPSICUM
+ fd = openat(dump_info->dirfd,
+ dump_info->CurrentFileName,
+ O_CREAT | O_WRONLY | O_TRUNC, 0644);
+ if (fd < 0) {
+ error("unable to open file %s",
+ dump_info->CurrentFileName);
+ }
+ fp = fdopen(fd, "w");
+ if (fp == NULL) {
+ error("unable to fdopen file %s",
+ dump_info->CurrentFileName);
+ }
+ dump_info->p = pcap_dump_fopen(dump_info->pd, fp);
+#else /* !HAVE_CAPSICUM */
+ dump_info->p = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
+#endif
+#ifdef HAVE_LIBCAP_NG
+ capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
+ capng_apply(CAPNG_SELECT_BOTH);
+#endif /* HAVE_LIBCAP_NG */
+ if (dump_info->p == NULL)
+ error("%s", pcap_geterr(pd));
+#ifdef HAVE_CAPSICUM
+ set_dumper_capsicum_rights(dump_info->p);
+#endif
+ }
+ }
+
+ /*
+ * XXX - this won't prevent capture files from getting
+ * larger than Cflag - the last packet written to the
+ * file could put it over Cflag.
+ */
+ if (Cflag != 0) {
+ long size = pcap_dump_ftell(dump_info->p);
+
+ if (size == -1)
+ error("ftell fails on output file");
+ if (size > Cflag) {
+#ifdef HAVE_CAPSICUM
+ FILE *fp;
+ int fd;
+#endif
+
+ /*
+ * Close the current file and open a new one.
+ */
+ pcap_dump_close(dump_info->p);
+
+ /*
+ * Compress the file we just closed, if the user
+ * asked for it.
+ */
+ if (zflag != NULL)
+ compress_savefile(dump_info->CurrentFileName);
+
+ Cflag_count++;
+ if (Wflag > 0) {
+ if (Cflag_count >= Wflag)
+ Cflag_count = 0;
+ }
+ if (dump_info->CurrentFileName != NULL)
+ free(dump_info->CurrentFileName);
+ dump_info->CurrentFileName = (char *)malloc(PATH_MAX + 1);
+ if (dump_info->CurrentFileName == NULL)
+ error("dump_packet_and_trunc: malloc");
+ MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, Cflag_count, WflagChars);
+#ifdef HAVE_LIBCAP_NG
+ capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
+ capng_apply(CAPNG_SELECT_BOTH);
+#endif /* HAVE_LIBCAP_NG */
+#ifdef HAVE_CAPSICUM
+ fd = openat(dump_info->dirfd, dump_info->CurrentFileName,
+ O_CREAT | O_WRONLY | O_TRUNC, 0644);
+ if (fd < 0) {
+ error("unable to open file %s",
+ dump_info->CurrentFileName);
+ }
+ fp = fdopen(fd, "w");
+ if (fp == NULL) {
+ error("unable to fdopen file %s",
+ dump_info->CurrentFileName);
+ }
+ dump_info->p = pcap_dump_fopen(dump_info->pd, fp);
+#else /* !HAVE_CAPSICUM */
+ dump_info->p = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
+#endif
+#ifdef HAVE_LIBCAP_NG
+ capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
+ capng_apply(CAPNG_SELECT_BOTH);
+#endif /* HAVE_LIBCAP_NG */
+ if (dump_info->p == NULL)
+ error("%s", pcap_geterr(pd));
+#ifdef HAVE_CAPSICUM
+ set_dumper_capsicum_rights(dump_info->p);
+#endif
+ }
+ }
+
+ pcap_dump((u_char *)dump_info->p, h, sp);
+#ifdef HAVE_PCAP_DUMP_FLUSH
+ if (Uflag)
+ pcap_dump_flush(dump_info->p);
+#endif
+
+ --infodelay;
+ if (infoprint)
+ info(0);
+}
+
+static void
+dump_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
+{
+ ++packets_captured;
+
+ ++infodelay;
+
+ pcap_dump(user, h, sp);
+#ifdef HAVE_PCAP_DUMP_FLUSH
+ if (Uflag)
+ pcap_dump_flush((pcap_dumper_t *)user);
+#endif
+
+ --infodelay;
+ if (infoprint)
+ info(0);
+}
+
+static void
+print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
+{
+ struct print_info *print_info;
+ u_int hdrlen;
+ netdissect_options *ndo;
+
+ ++packets_captured;
+
+ ++infodelay;
+
+ print_info = (struct print_info *)user;
+ ndo = print_info->ndo;
+
+ if(ndo->ndo_packet_number)
+ ND_PRINT((ndo, "%5u ", packets_captured));
+
+ ts_print(ndo, &h->ts);
+
+ /*
+ * Some printers want to check that they're not walking off the
+ * end of the packet.
+ * Rather than pass it all the way down, we set this member
+ * of the netdissect_options structure.
+ */
+ ndo->ndo_snapend = sp + h->caplen;
+
+ if(print_info->ndo_type) {
+ hdrlen = (*print_info->p.ndo_printer)(print_info->ndo, h, sp);
+ } else {
+ hdrlen = (*print_info->p.printer)(h, sp);
+ }
+
+ /*
+ * Restore the original snapend, as a printer might have
+ * changed it.
+ */
+ ndo->ndo_snapend = sp + h->caplen;
+ if (ndo->ndo_Xflag) {
+ /*
+ * Print the raw packet data in hex and ASCII.
+ */
+ if (ndo->ndo_Xflag > 1) {
+ /*
+ * Include the link-layer header.
+ */
+ hex_and_ascii_print(ndo, "\n\t", sp, h->caplen);
+ } else {
+ /*
+ * Don't include the link-layer header - and if
+ * we have nothing past the link-layer header,
+ * print nothing.
+ */
+ if (h->caplen > hdrlen)
+ hex_and_ascii_print(ndo, "\n\t", sp + hdrlen,
+ h->caplen - hdrlen);
+ }
+ } else if (ndo->ndo_xflag) {
+ /*
+ * Print the raw packet data in hex.
+ */
+ if (ndo->ndo_xflag > 1) {
+ /*
+ * Include the link-layer header.
+ */
+ hex_print(ndo, "\n\t", sp, h->caplen);
+ } else {
+ /*
+ * Don't include the link-layer header - and if
+ * we have nothing past the link-layer header,
+ * print nothing.
+ */
+ if (h->caplen > hdrlen)
+ hex_print(ndo, "\n\t", sp + hdrlen,
+ h->caplen - hdrlen);
+ }
+ } else if (ndo->ndo_Aflag) {
+ /*
+ * Print the raw packet data in ASCII.
+ */
+ if (ndo->ndo_Aflag > 1) {
+ /*
+ * Include the link-layer header.
+ */
+ ascii_print(ndo, sp, h->caplen);
+ } else {
+ /*
+ * Don't include the link-layer header - and if
+ * we have nothing past the link-layer header,
+ * print nothing.
+ */
+ if (h->caplen > hdrlen)
+ ascii_print(ndo, sp + hdrlen, h->caplen - hdrlen);
+ }
+ }
+
+ putchar('\n');
+
+ --infodelay;
+ if (infoprint)
+ info(0);
+}
+
+#ifdef WIN32
+ /*
+ * XXX - there should really be libpcap calls to get the version
+ * number as a string (the string would be generated from #defines
+ * at run time, so that it's not generated from string constants
+ * in the library, as, on many UNIX systems, those constants would
+ * be statically linked into the application executable image, and
+ * would thus reflect the version of libpcap on the system on
+ * which the application was *linked*, not the system on which it's
+ * *running*.
+ *
+ * That routine should be documented, unlike the "version[]"
+ * string, so that UNIX vendors providing their own libpcaps
+ * don't omit it (as a couple of vendors have...).
+ *
+ * Packet.dll should perhaps also export a routine to return the
+ * version number of the Packet.dll code, to supply the
+ * "Wpcap_version" information on Windows.
+ */
+ char WDversion[]="current-git.tcpdump.org";
+#if !defined(HAVE_GENERATED_VERSION)
+ char version[]="current-git.tcpdump.org";
+#endif
+ char pcap_version[]="current-git.tcpdump.org";
+ char Wpcap_version[]="3.1";
+#endif
+
+/*
+ * By default, print the specified data out in hex and ASCII.
+ */
+static void
+ndo_default_print(netdissect_options *ndo, const u_char *bp, u_int length)
+{
+ hex_and_ascii_print(ndo, "\n\t", bp, length); /* pass on lf and indentation string */
+}
+
+void
+default_print(const u_char *bp, u_int length)
+{
+ ndo_default_print(gndo, bp, length);
+}
+
+#ifdef SIGNAL_REQ_INFO
+RETSIGTYPE requestinfo(int signo _U_)
+{
+ if (infodelay)
+ ++infoprint;
+ else
+ info(0);
+}
+#endif
+
+/*
+ * Called once each second in verbose mode while dumping to file
+ */
+#ifdef USE_WIN32_MM_TIMER
+void CALLBACK verbose_stats_dump (UINT timer_id _U_, UINT msg _U_, DWORD_PTR arg _U_,
+ DWORD_PTR dw1 _U_, DWORD_PTR dw2 _U_)
+{
+ struct pcap_stat stat;
+
+ if (infodelay == 0 && pcap_stats(pd, &stat) >= 0)
+ fprintf(stderr, "Got %u\r", packets_captured);
+}
+#elif defined(HAVE_ALARM)
+static void verbose_stats_dump(int sig _U_)
+{
+ struct pcap_stat stat;
+
+ if (infodelay == 0 && pcap_stats(pd, &stat) >= 0)
+ fprintf(stderr, "Got %u\r", packets_captured);
+ alarm(1);
+}
+#endif
+
+USES_APPLE_DEPRECATED_API
+static void
+print_version(void)
+{
+ extern char version[];
+#ifndef HAVE_PCAP_LIB_VERSION
+#if defined(WIN32) || defined(HAVE_PCAP_VERSION)
+ extern char pcap_version[];
+#else /* defined(WIN32) || defined(HAVE_PCAP_VERSION) */
+ static char pcap_version[] = "unknown";
+#endif /* defined(WIN32) || defined(HAVE_PCAP_VERSION) */
+#endif /* HAVE_PCAP_LIB_VERSION */
+
+#ifdef HAVE_PCAP_LIB_VERSION
+#ifdef WIN32
+ (void)fprintf(stderr, "%s version %s, based on tcpdump version %s\n", program_name, WDversion, version);
+#else /* WIN32 */
+ (void)fprintf(stderr, "%s version %s\n", program_name, version);
+#endif /* WIN32 */
+ (void)fprintf(stderr, "%s\n",pcap_lib_version());
+#else /* HAVE_PCAP_LIB_VERSION */
+#ifdef WIN32
+ (void)fprintf(stderr, "%s version %s, based on tcpdump version %s\n", program_name, WDversion, version);
+ (void)fprintf(stderr, "WinPcap version %s, based on libpcap version %s\n",Wpcap_version, pcap_version);
+#else /* WIN32 */
+ (void)fprintf(stderr, "%s version %s\n", program_name, version);
+ (void)fprintf(stderr, "libpcap version %s\n", pcap_version);
+#endif /* WIN32 */
+#endif /* HAVE_PCAP_LIB_VERSION */
+
+#if defined(HAVE_LIBCRYPTO) && defined(SSLEAY_VERSION)
+ (void)fprintf (stderr, "%s\n", SSLeay_version(SSLEAY_VERSION));
+#endif
+
+#ifdef USE_LIBSMI
+ (void)fprintf (stderr, "SMI-library: %s\n", smi_version_string);
+#endif
+}
+USES_APPLE_RST
+
+static void
+print_usage(void)
+{
+ print_version();
+ (void)fprintf(stderr,
+"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 ]" j_FLAG_USAGE " [ -M secret ] [ --number ]\n");
+#ifdef HAVE_PCAP_SETDIRECTION
+ (void)fprintf(stderr,
+"\t\t[ -Q in|out|inout ]\n");
+#endif
+ (void)fprintf(stderr,
+"\t\t[ -r file ] [ -s snaplen ] ");
+#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
+ (void)fprintf(stderr, "[ --time-stamp-precision precision ]\n");
+ (void)fprintf(stderr,
+"\t\t");
+#endif
+#ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
+ (void)fprintf(stderr, "[ --immediate-mode ] ");
+#endif
+ (void)fprintf(stderr, "[ -T type ] [ --version ] [ -V file ]\n");
+ (void)fprintf(stderr,
+"\t\t[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z command ]\n");
+ (void)fprintf(stderr,
+"\t\t[ -Z user ] [ expression ]\n");
+}
+
+
+
+/* VARARGS */
+static void
+ndo_error(netdissect_options *ndo _U_, const char *fmt, ...)
+{
+ va_list ap;
+
+ (void)fprintf(stderr, "%s: ", program_name);
+ va_start(ap, fmt);
+ (void)vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ if (*fmt) {
+ fmt += strlen(fmt);
+ if (fmt[-1] != '\n')
+ (void)fputc('\n', stderr);
+ }
+ exit(1);
+ /* NOTREACHED */
+}
+
+/* VARARGS */
+static void
+ndo_warning(netdissect_options *ndo _U_, const char *fmt, ...)
+{
+ va_list ap;
+
+ (void)fprintf(stderr, "%s: WARNING: ", program_name);
+ va_start(ap, fmt);
+ (void)vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ if (*fmt) {
+ fmt += strlen(fmt);
+ if (fmt[-1] != '\n')
+ (void)fputc('\n', stderr);
+ }
+}
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
--- /dev/null
+#! /bin/sh
+#
+# $NetBSD: tcpdump2netbsd,v 1.2 2011/10/08 19:28:39 christos Exp $
+#
+# Copyright (c) 2000 The NetBSD Foundation, Inc.
+# 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.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+#
+# amd2netbsd: convert an amd source tree into a
+# netbsd amd source tree, under src/dist,
+# based on bind2netbsd by Bernd Ernesti and changes by Simon Burge
+#
+# Rough instructions for importing new amd release:
+#
+# $ cd /some/where/temporary
+# $ tar xpfz /new/amd/release/tar/file
+# $ sh /usr/src/external/bsd/tcpdump/dist/tcpdump2netbsd tcpdump-4.1.1 `pwd`
+# $ cd src/dist/am-utils
+# $ cvs -d cvs.netbsd.org:/cvsroot import -m "Import tcpdump 4.1.1" src/external/bsd/tcpdump/dist TCPDUMP tcpdump-4_1_1
+# $ cd ../../../tcpdump-4.1.1
+# $ run ./configure
+# copy newly generated config.h with /usr/src/external/bsd/tcpdump/include/config.h
+# - check makefiles to see if any extra sources have been added.
+# - update distrib/sets if necessary.
+
+if [ $# -ne 2 ]; then echo "tcpdump2netbsd src dest"; exit 1; fi
+
+r=$1
+d=$2/src/external/bsd/tcpdump/dist
+
+case "$d" in
+ /*)
+ ;;
+ *)
+ d=`/bin/pwd`/$d
+ ;;
+esac
+
+case "$r" in
+ /*)
+ ;;
+ *)
+ r=`/bin/pwd`/$r
+ ;;
+esac
+
+echo preparing directory $d
+rm -rf $d
+mkdir -p $d
+
+### Copy the files and directories
+echo copying $r to $d
+cd $r
+pax -rw * $d
+
+### Remove the $'s around RCS tags
+cleantags $d
+
+### Clean up any CVS directories that might be around.
+echo "cleaning up CVS residue."
+(
+ cd $d
+ find . -type d -name "CVS" -print | xargs rm -r
+)
+echo done
+
+### Fixing file and directory permissions.
+echo "Fixing file/directory permissions."
+(
+ cd $d
+ find . -type f -print | xargs chmod u+rw,go+r
+ find . -type d -print | xargs chmod u+rwx,go+rx
+)
+echo done
+
+exit 0
--- /dev/null
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 (6f:6e:02:63:61:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 (6f:6e:02:63:61:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548
--- /dev/null
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51417, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696a090, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51427, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696a090, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51435, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696a090, secs 12, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51451, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696a090, secs 28, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51482, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696a090, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51486, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696a090, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51493, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696a090, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51509, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696a090, secs 27, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51540, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696a015, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51551, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696a015, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51558, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696a015, secs 10, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51574, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696a015, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51605, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696a015, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51608, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696a015, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51616, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696a015, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51632, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696a015, secs 27, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51664, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969f99, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51675, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969f99, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51683, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969f99, secs 12, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51699, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969f99, secs 28, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51731, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969f99, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51734, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969f99, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51742, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969f99, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51757, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969f99, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51788, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969f1d, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 (6f:6e:02:63:61:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51802, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969f1d, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51809, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969f1d, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51824, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969f1d, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51855, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969f1d, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51859, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969f1d, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51867, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969f1d, secs 12, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51883, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969f1d, secs 28, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51915, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969e9e, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51925, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969e9e, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51932, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969e9e, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51947, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969e9e, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51979, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969e9e, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51983, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969e9e, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 51990, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969e9e, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52006, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969e9e, secs 27, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52037, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969e24, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52048, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969e24, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52056, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969e24, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52072, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969e24, secs 27, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52104, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969e24, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52107, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969e24, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52115, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969e24, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52130, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969e24, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52162, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969da7, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52167, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969da7, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52175, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969da7, secs 12, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52191, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969da7, secs 28, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52223, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969da7, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52227, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969da7, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52234, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969da7, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52250, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969da7, secs 27, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52281, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969d30, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52289, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969d30, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 (6f:6e:02:63:61:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52297, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969d30, secs 12, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52312, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969d30, secs 27, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52343, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969d30, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52347, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969d30, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52355, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969d30, secs 12, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52371, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969d30, secs 28, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52403, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969cb6, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52413, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969cb6, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52420, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969cb6, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52435, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969cb6, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52467, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969cb6, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52470, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969cb6, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52478, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969cb6, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52493, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969cb6, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52524, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969c3d, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52534, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969c3d, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52541, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969c3d, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52556, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969c3d, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52588, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969c3d, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52591, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969c3d, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52598, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969c3d, secs 10, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52613, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969c3d, secs 25, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52645, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969bc4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52649, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969bc4, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52656, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969bc4, secs 10, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52672, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969bc4, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52704, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969bc4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52708, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969bc4, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52715, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969bc4, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52731, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969bc4, secs 27, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52762, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969b4f, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52772, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969b4f, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52779, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969b4f, secs 10, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52794, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969b4f, secs 25, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52825, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969b4f, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52829, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969b4f, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52836, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969b4f, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52851, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969b4f, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52882, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969ad7, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52893, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969ad7, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52900, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969ad7, secs 10, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52915, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969ad7, secs 25, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52947, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969ad7, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52950, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969ad7, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52957, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969ad7, secs 10, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 52973, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969ad7, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53004, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969a5d, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53010, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969a5d, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53018, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969a5d, secs 12, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53034, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x96969a5d, secs 28, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53065, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969a5d, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53068, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969a5d, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53075, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969a5d, secs 10, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53090, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x96969a5d, secs 25, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53122, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x969699e7, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53134, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x969699e7, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53141, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x969699e7, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53156, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x969699e7, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53187, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x969699e7, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53191, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x969699e7, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53198, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x969699e7, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53214, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x969699e7, secs 27, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53246, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696996b, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 (03:6f:72:67:00:00) tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53250, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696996b, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53257, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696996b, secs 10, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53273, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696996b, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53304, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696996b, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53307, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696996b, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53314, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696996b, secs 10, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53329, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696996b, secs 25, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53360, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x969698f9, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53372, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x969698f9, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53379, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x969698f9, secs 10, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53395, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x969698f9, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53426, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x969698f9, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53430, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x969698f9, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53437, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x969698f9, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53453, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x969698f9, secs 27, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53485, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696987c, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53492, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696987c, secs 4, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53499, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696987c, secs 11, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 344: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53514, offset 0, flags [DF], proto UDP (17), length 326)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 298, xid 0x9696987c, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 64: vlan 200, p 0, ethertype ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.17.0.2 tell 172.17.0.20, length 46
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53545, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696987c, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53548, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696987c, secs 3, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53555, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696987c, secs 10, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
+00:08:5d:23:0c:3f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q-QinQ (0x88a8), length 594: vlan 200, p 0, ethertype IPv4, (tos 0x0, ttl 32, id 53571, offset 0, flags [DF], proto UDP (17), length 576)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:08:5d:23:0c:3f, length 548, xid 0x9696987c, secs 26, Flags [none]
+ Client-Ethernet-Address 00:08:5d:23:0c:3f
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ MSZ Option 57, length 2: 1500
+ Parameter-Request Option 55, length 9:
+ Subnet-Mask, Default-Gateway, Domain-Name-Server, NTP
+ Vendor-Option, Time-Zone, TFTP, Option 159
+ Option 160
+ Hostname Option 12, length 17: "6731i00085D230C3F"
+ Vendor-Class Option 60, length 18: "AastraIPPhone6731i"
--- /dev/null
+# Various flags applied to a TCP session.
+#
+# We cannot rely on, for example, "print-x.out" and
+# "print-X.out" being different files - we might be running
+# this on a case-insensitive file system, e.g. a Windows
+# file system or a case-insensitive HFS+ file system on
+# Mac OS X.
+#
+# Therefore, for "X" and "XX", we have "print-capX.out"
+# and "print-capXX.out".
+#
+print-x print-flags.pcap print-x.out -t -x
+print-xx print-flags.pcap print-xx.out -t -xx
+print-X print-flags.pcap print-capX.out -t -X
+print-XX print-flags.pcap print-capXX.out -t -XX
+print-A print-flags.pcap print-A.out -t -A
+print-AA print-flags.pcap print-AA.out -t -AA
+
+# BGP tests
+bgp_vpn_attrset bgp_vpn_attrset.pcap bgp_vpn_attrset.out -t -v
+mpbgp-linklocal-nexthop mpbgp-linklocal-nexthop.pcap mpbgp-linklocal-nexthop.out -t -v
+bgp_infloop-v bgp-infinite-loop.pcap bgp_infloop-v.out -t -v
+
+# EAP tests
+eapon1 eapon1.pcap eapon1.out -t
+
+# ESP tests
+esp0 02-sunrise-sunset-esp.pcap esp0.out -t -n
+# more ESP tests in crypto.sh
+
+# 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 is in crypto.sh
+isakmp5-v ISAKMP_sa_setup.pcap isakmp5-v.out -t -v
+
+# Link Management Protocol tests
+lmp lmp.pcap lmp.out -t -T lmp
+# lmp-v is now conditionally handled by lmp-v.sh
+
+# MPLS tests
+mpls-ldp-hello mpls-ldp-hello.pcap mpls-ldp-hello.out -t -v
+ldp_infloop ldp-infinite-loop.pcap ldp_infloop.out -t
+
+# OSPF tests
+ospf-gmpls ospf-gmpls.pcap ospf-gmpls.out -t -v
+ospf3_ah-vv OSPFv3_with_AH.pcap ospf3_ah-vv.out -t -v -v
+ospf3_auth-vv ospf3_auth.pcap ospf3_auth-vv.out -t -v -v
+ospf3_bc-vv OSPFv3_broadcast_adjacency.pcap ospf3_bc-vv.out -t -v -v
+ospf3_mp-vv OSPFv3_multipoint_adjacencies.pcap ospf3_mp-vv.out -t -v -v
+ospf3_nbma-vv OSPFv3_NBMA_adjacencies.pcap ospf3_nbma-vv.out -t -v -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 test in crypto.sh
+
+# IETF ROLL RPL packets
+dio02 rpl-19-pickdag.pcap rpl-19-pickdag.out -t -v -v
+dio03 rpl-19-pickdag.pcap rpl-19-pickdagvvv.out -t -v -v -v
+dao01 rpl-14-dao.pcap rpl-14-daovvv.out -t -v -v -v
+daoack01 rpl-26-senddaoack.pcap rpl-26-senddaovv.out -t -v -v -v
+
+# IPNET encapsulated site
+e1000g e1000g.pcap e1000g.out -t
+
+# IETF FORCES WG packets and printer
+forces01 forces1.pcap forces1.out -t
+forces01vvv forces1.pcap forces1vvv.out -t -v -v -v
+forces01vvvv forces1.pcap forces1vvvv.out -t -v -v -v -v
+# need new pcap file, not sure what the differences were?
+#forces02 forces2.pcap forces2.out -t
+#forces02v forces2.pcap forces2v.out -t -v
+#forces02vv forces2.pcap forces2vv.out -t -v -v
+
+# 802.1ad, QinQ tests
+qinq QinQpacket.pcap QinQpacket.out -t -e
+qinqv QinQpacket.pcap QinQpacketv.out -t -e -v
+
+# now SFLOW tests
+sflow1 sflow_multiple_counter_30_pdus.pcap sflow_multiple_counter_30_pdus.out -t -v
+sflow2 sflow_multiple_counter_30_pdus.pcap sflow_multiple_counter_30_pdus-nv.out -t
+
+# AHCP and Babel tests
+ahcp-vv ahcp.pcap ahcp-vv.out -t -vv
+babel1 babel.pcap babel1.out -t
+babel1v babel.pcap babel1v.out -t -v
+babel_auth babel_auth.pcap babel_auth.out -t -v
+babel_pad1 babel_pad1.pcap babel_pad1.out -t
+babel_rtt babel_rtt.pcap babel_rtt.out -t -v
+
+# PPPoE tests
+pppoe pppoe.pcap pppoe.out -t
+pppoes pppoes.pcap pppoes.out -t
+pppoes_id pppoes.pcap pppoes_id.out -t pppoes 0x3b
+
+# IGMP tests
+igmpv1 IGMP_V1.pcap igmpv1.out -t
+igmpv2 IGMP_V2.pcap igmpv2.out -t
+igmpv3-queries igmpv3-queries.pcap igmpv3-queries.out -t
+mtrace mtrace.pcap mtrace.out -t
+dvmrp mrinfo_query.pcap dvmrp.out -t
+
+# ICMPv6
+icmpv6 icmpv6.pcap icmpv6.out -t -vv
+icmpv6_opt24-v icmpv6_opt24.pcap icmpv6_opt24-v.out -t -v
+
+# SPB tests
+spb spb.pcap spb.out -t
+
+# SPB BPDUv4 tests
+spb_bpduv4 spb_bpduv4.pcap spb_bpduv4.out -t
+
+# DCB Tests
+dcb_ets dcb_ets.pcap dcb_ets.out -t -vv
+dcb_pfc dcb_pfc.pcap dcb_pfc.out -t -vv
+dcb_qcn dcb_qcn.pcap dcb_qcn.out -t -vv
+
+# EVB tests
+evb evb.pcap evb.out -t -vv
+
+# STP tests
+mstp-v MSTP_Intra-Region_BPDUs.pcap mstp-v.out -t -v
+stp-v 802.1D_spanning_tree.pcap stp-v.out -t -v
+rstp-v 802.1w_rapid_STP.pcap rstp-v.out -t -v
+rpvst-v rpvstp-trunk-native-vid5.pcap rpvst-v.out -t -v
+
+# RIP tests
+ripv1v2 ripv1v2.pcap ripv1v2.out -t -v
+ripv2_auth ripv2_auth.pcap ripv2_auth.out -t -v
+
+# DHCPv6 tests
+dhcpv6-aftr-name dhcpv6-AFTR-Name-RFC6334.pcap dhcpv6-AFTR-Name-RFC6334.out -t -v
+dhcpv6-ia-na dhcpv6-ia-na.pcap dhcpv6-ia-na.out -t -v
+dhcpv6-ia-pd dhcpv6-ia-pd.pcap dhcpv6-ia-pd.out -t -v
+dhcpv6-ia-ta dhcpv6-ia-ta.pcap dhcpv6-ia-ta.out -t -v
+dhcpv6-ntp-server dhcpv6-ntp-server.pcap dhcpv6-ntp-server.out -t -v
+dhcpv6-sip-server-d dhcpv6-sip-server-d.pcap dhcpv6-sip-server-d.out -t -v
+dhcpv6-domain-list dhcpv6-domain-list.pcap dhcpv6-domain-list.out -t -v
+
+# ZeroMQ/PGM tests
+# ZMTP/1.0 over TCP
+zmtp1v zmtp1.pcap zmtp1.out -t -v -T zmtp1
+# native PGM
+pgmv pgm_zmtp1.pcap pgmv.out -t -v
+# UDP-encapsulated PGM
+epgmv epgm_zmtp1.pcap epgmv.out -t -v -T pgm
+# ZMTP/1.0 inside native PGM
+pgm_zmtp1v pgm_zmtp1.pcap pgm_zmtp1v.out -t -v -T pgm_zmtp1
+# ZMTP/1.0 inside UDP-encapsulated PGM
+epgm_zmtp1v epgm_zmtp1.pcap epgm_zmtp1v.out -t -v -T pgm_zmtp1
+
+# MS NLB tests
+msnlb msnlb.pcap msnlb.out -t
+msnlb2 msnlb2.pcap msnlb2.out -t
+
+# MPTCP tests
+mptcp mptcp.pcap mptcp.out -t
+mptcp-fclose mptcp-fclose.pcap mptcp-fclose.out -t
+# TFO tests
+tfo tfo-5c1fa7f9ae91.pcap tfo.out -t
+
+# IEEE 802.11 tests
+802.11_exthdr ieee802.11_exthdr.pcap ieee802.11_exthdr.out -t -v
+802.11_rx-stbc ieee802.11_rx-stbc.pcap ieee802.11_rx-stbc.out -t
+
+# OpenFlow tests
+of10_p3295-vv of10_p3295.pcap of10_p3295-vv.out -t -vv
+of10_s4810-vvvv of10_s4810.pcap of10_s4810-vvvv.out -t -vvvv
+of10_pf5240-vv of10_pf5240.pcap of10_pf5240-vv.out -t -vv
+of10_7050q-v of10_7050q.pcap of10_7050q-v.out -t -v
+of10_7050sx_bsn-vv of10_7050sx_bsn.pcap of10_7050sx_bsn-vv.out -t -vv
+
+# GeoNetworking and CALM FAST tests
+geonet-calm-fast geonet_and_calm_fast.pcap geonet_and_calm_fast.out -t -vv -n
+
+# M3UA tests
+m3ua isup.pcap isup.out -t
+m3ua-vv isup.pcap isupvv.out -t -vv
+
+# NFLOG test case moved to nflog-e.sh
+
+# syslog test case
+syslog-v syslog_udp.pcap syslog-v.out -t -v
+
+#IPv6 tests
+ipv6-bad-version.pcap ipv6-bad-version.pcap ipv6-bad-version.out -t
+ipv6-routing-header ipv6-routing-header.pcap ipv6-routing-header.out -t -v
+
+# Loopback/CTP test case
+loopback loopback.pcap loopback.out -t
+
+# DCCP partial checksums tests
+dccp_partial_csum_v4_simple dccp_partial_csum_v4_simple.pcap dccp_partial_csum_v4_simple.out -t -vv
+dccp_partial_csum_v4_longer dccp_partial_csum_v4_longer.pcap dccp_partial_csum_v4_longer.out -t -vv
+dccp_partial_csum_v6_simple dccp_partial_csum_v6_simple.pcap dccp_partial_csum_v6_simple.out -t -vv
+dccp_partial_csum_v6_longer dccp_partial_csum_v6_longer.pcap dccp_partial_csum_v6_longer.out -t -vv
+
+# VRRP tests
+vrrp vrrp.pcap vrrp.out -t
+vrrp-v vrrp.pcap vrrp-v.out -t -v
+
+# HSRP tests
+hsrp_1 HSRP_coup.pcap hsrp_1.out -t
+hsrp_1-v HSRP_coup.pcap hsrp_1-v.out -t -v
+hsrp_2-v HSRP_election.pcap hsrp_2-v.out -t -v
+hsrp_3-v HSRP_failover.pcap hsrp_3-v.out -t -v
+
+# PIMv2 tests
+pimv2_dm-v PIM-DM_pruning.pcap pimv2_dm-v.out -t -v
+pimv2_register-v PIM_register_register-stop.pcap pimv2_register-v.out -t -v
+pimv2_sm-v PIM-SM_join_prune.pcap pimv2_sm-v.out -t -v
+pimv2_bootstrap-v PIMv2_bootstrap.pcap pimv2_bootstrap-v.out -t -v
+pimv2_hellos-v PIMv2_hellos.pcap pimv2_hellos-v.out -t -v
+
+# IS-IS tests
+isis_infloop-v isis-infinite-loop.pcap isis_infloop-v.out -t -v
+
+# RSVP tests
+rsvp_infloop-v rsvp-infinite-loop.pcap rsvp_infloop-v.out -t -v
+
+# HDLC tests
+hdlc1 chdlc-slarp.pcap hdlc1.out -t
+hdlc2 chdlc-slarp-short.pcap hdlc2.out -t
+hdlc3 HDLC.pcap hdlc3.out -t
+hdlc4 hdlc_slarp.pcap hdlc4.out -t
+
+# DECnet test case
+decnet DECnet_Phone.pcap decnet.out -t
+
+# RADIUS tests
+radius-v RADIUS.pcap radius-v.out -t -v
+radius-rfc4675 RADIUS-RFC4675.pcap radius-rfc4675-v.out -t -v
+radius-rfc5176 RADIUS-RFC5176.pcap radius-rfc5176-v.out -t -v
+
+# link-level protocols
+dtp-v DTP.pcap dtp-v.out -t -v
+lacp-ev LACP.pcap lacp-ev.out -t -e -v
+lldp_cdp-ev LLDP_and_CDP.pcap lldp_cdp-ev.out -t -e -v
+cdp-v 3560_CDP.pcap cdp-v.out -t -v
+udld-v UDLD.pcap udld-v.out -t -v
+
+# EIGRP tests
+eigrp1-v EIGRP_adjacency.pcap eigrp1-v.out -t -v
+eigrp2-v EIGRP_goodbye.pcap eigrp2-v.out -t -v
+eigrp3-v EIGRP_subnet_down.pcap eigrp3-v.out -t -v
+eigrp4-v EIGRP_subnet_up.pcap eigrp4-v.out -t -v
+
+# IS-IS tests
+isis_1 ISIS_external_lsp.pcap isis_1.out -t
+isis_1-v ISIS_external_lsp.pcap isis_1-v.out -t -v
+isis_2-v ISIS_level1_adjacency.pcap isis_2-v.out -t -v
+isis_3-v ISIS_level2_adjacency.pcap isis_3-v.out -t -v
+isis_4-v ISIS_p2p_adjacency.pcap isis_4-v.out -t -v
+
+# ATA-over-Ethernet tests
+aoe_1 AoE_Linux.pcap aoe_1.out -t
+aoe_1-v AoE_Linux.pcap aoe_1-v.out -t -v
+
+# Geneve tests
+geneve-v geneve.pcap geneve-vv.out -t -vv
+geneve-vni geneve.pcap geneve-vni.out -t geneve 0xb
+geneve-tcp geneve.pcap geneve-tcp.out -t "geneve && tcp"
+
+# DHCP tests
+dhcp-rfc3004 dhcp-rfc3004.pcap dhcp-rfc3004-v.out -t -v
+dhcp-rfc5859 dhcp-rfc5859.pcap dhcp-rfc5859-v.out -t -v
+
+# bad packets from Kevin Day
+# cve-2015-2155 -- futz testing on FORCES printer
+kday1 kday1.pcap kday1.out -t -v
+# cve-2015-2153 -- futz testing on TCP printer
+kday2 kday2.pcap kday2.out -t -v
+# cve-2015-2153 -- futz testing on TCP printer
+kday3 kday3.pcap kday3.out -t -v
+# cve-2015-2153 -- futz testing on TCP printer
+kday4 kday4.pcap kday4.out -t -v
+# cve-2015-2153 -- futz testing on TCP printer
+kday5 kday5.pcap kday5.out -t -v
+# cve-2015-2154 -- ethernet printer
+kday6 kday6.pcap kday6.out -t -v
+# cve-2015-2153 -- futz testing on TCP printer
+kday7 kday7.pcap kday7.out -t -v
+# cve-2015-2153 -- futz testing on TCP printer
+kday8 kday8.pcap kday8.out -t -v
+
+# bad packets from reversex86.
+cve2015-0261_01 cve2015-0261-ipv6.pcap cve2015-0261-ipv6.out -t -v
+cve2015-0261_02 cve2015-0261-crash.pcap cve2015-0261-crash.out -t -v
--- /dev/null
+#!/usr/bin/env perl
+
+system("mkdir -p NEW DIFF");
+
+if(@ARGV != 4) {
+ print "Usage: TESTonce name input output options\n";
+ exit 20;
+}
+
+$name=$ARGV[0];
+$input=$ARGV[1];
+$output=$ARGV[2];
+$options=$ARGV[3];
+
+my $r;
+
+if ($^O eq 'MSWin32') {
+ $r = system "..\\windump -n -r $input $options 2>NUL | sed 's/\\r//' | tee NEW/$output | diff $output - >DIFF/$output.diff";
+ # need to do same as below for Cygwin.
+}
+else {
+ # we used to do this as a nice pipeline, but the problem is that $r fails to
+ # to be set properly if the tcpdump core dumps.
+ $r = system "../tcpdump 2>/dev/null -n -r $input $options >NEW/$output";
+ if($r == 0x100) {
+ # this means tcpdump exited with code 1.
+ open(OUTPUT, ">>"."NEW/$output") || die "fail to open $output\n";
+ printf OUTPUT "EXIT CODE %08x\n", $r;
+ close(OUTPUT);
+ $r = 0;
+ }
+ if($r == 0) {
+ $r = system "cat NEW/$output | diff $output - >DIFF/$output.diff";
+ }
+ #print sprintf("END: %08x\n", $r);
+}
+
+if($r == 0) {
+ printf " %-30s: passed\n", $name;
+ unlink "DIFF/$output.diff";
+ exit 0;
+}
+printf " %-30s: TEST FAILED", $name;
+open FOUT, '>>failure-outputs.txt';
+printf FOUT "Failed test: $name\n\n";
+close FOUT;
+if(-f "DIFF/$output.diff") {
+ system "cat DIFF/$output.diff >> failure-outputs.txt";
+}
+
+if($r == -1) {
+ print " (failed to execute: $!)\n";
+ exit 30;
+}
+
+# this is not working right, $r == 0x8b00 when there is a core dump.
+# clearly, we need some platform specific perl magic to take this apart, so look for "core"
+# too.
+if($r & 127 || -f "core") {
+ my $with = ($r & 128) ? 'with' : 'without';
+ if(-f "core") {
+ $with = "with";
+ }
+ printf " (terminated with signal %u, %s coredump)\n", ($r & 127), $with;
+ exit ($r & 128) ? 10 : 20;
+}
+print "\n";
+exit $r >> 8;
--- /dev/null
+#!/bin/sh
+
+mkdir -p NEW
+mkdir -p DIFF
+passed=0
+failed=0
+cat /dev/null > failure-outputs.txt
+
+runComplexTests()
+{
+ for i in *.sh
+ do
+ case $i in TEST*.sh) continue;; esac
+ if sh ./$i
+ then
+ passed=`expr $passed + 1`
+ else
+ failed=`expr $failed + 1`
+ fi
+ done
+}
+
+runSimpleTests()
+{
+ only=$1
+ echo $passed >.passed
+ echo $failed >.failed
+ cat TESTLIST | while read name input output options
+ do
+ case $name in
+ \#*) continue;;
+ '') continue;;
+ esac
+ rm -f core
+ [ "$only" != "" -a "$name" != "$only" ] && continue
+ if ./TESTonce $name $input $output "$options"
+ then
+ passed=`expr $passed + 1`
+ echo $passed >.passed
+ else
+ failed=`expr $failed + 1`
+ echo $failed >.failed
+ fi
+ [ "$only" != "" -a "$name" = "$only" ] && break
+ done
+ # I hate shells with their stupid, useless subshells.
+ passed=`cat .passed`
+ failed=`cat .failed`
+}
+
+if [ $# -eq 0 ]
+then
+ runComplexTests
+ runSimpleTests
+elif [ $# -eq 1 ]
+then
+ runSimpleTests $1
+else
+ echo "Usage: $0 [test_name]"
+ exit 30
+fi
+
+# exit with number of failing tests.
+echo '------------------------------------------------'
+printf "%4u tests failed\n" $failed
+printf "%4u tests passed\n" $passed
+echo
+echo
+cat failure-outputs.txt
+echo
+echo
+exit $failed
--- /dev/null
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 60) fe80::6aa3:c4ff:fef4:841e.5359 > ff02::cca6:c0f9:e182:5359.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 1, Nonce 0x7ce31135, Source Id 6a:a3:c4:ff:fe:f4:84:1e, Destination Id ff:ff:ff:ff:ff:ff:ff:ff
+ Discover, Length 24
+ Origin Time: 2013-11-10 07:59:42 UTC
+ Expires: 418s
+ IPv4 Address: 0.0.0.0
+ IPv6 Prefix
+ Name Server
+ NTP Server
+IP6 (class 0xc0, hlim 64, next-header UDP (17) payload length: 193) fe80::22cf:30ff:fe02:b052.5359 > fe80::6aa3:c4ff:fef4:841e.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 1, Nonce 0x9dccbd40, Source Id 08:4b:37:1e:f3:6e:1e:dc, Destination Id 6a:a3:c4:ff:fe:f4:84:1e
+ Offer, Length 157
+ Origin Time: 2013-11-10 07:59:44 UTC
+ Mandatory
+ Expires: 512s
+ IPv4 Address: 10.100.0.1
+ Name Server: ::ffff:89.233.43.71, ::ffff:89.104.194.142, 2002:d596:2a92:1:71:53::, 2002:5968:c28e::53
+ NTP Server: ::ffff:195.234.155.124, ::ffff:78.156.97.78, ::ffff:80.71.132.103, ::ffff:83.151.158.44
+ My-IPv4-Address: 10.0.0.80
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 56) fe80::6aa3:c4ff:fef4:841e.5359 > ff02::cca6:c0f9:e182:5359.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 1, Nonce 0x7de31135, Source Id 6a:a3:c4:ff:fe:f4:84:1e, Destination Id 08:4b:37:1e:f3:6e:1e:dc
+ Request, Length 20
+ Origin Time: 2013-11-10 07:59:42 UTC
+ Expires: 405s
+ IPv4 Address
+ IPv6 Prefix
+ Name Server
+ NTP Server
+IP6 (class 0xc0, hlim 64, next-header UDP (17) payload length: 193) fe80::22cf:30ff:fe02:b052.5359 > fe80::6aa3:c4ff:fef4:841e.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 1, Nonce 0x9eccbd40, Source Id 08:4b:37:1e:f3:6e:1e:dc, Destination Id 6a:a3:c4:ff:fe:f4:84:1e
+ Ack, Length 157
+ Origin Time: 2013-11-10 07:59:44 UTC
+ Mandatory
+ Expires: 524s
+ IPv4 Address: 10.100.0.1
+ Name Server: ::ffff:89.233.43.71, ::ffff:89.104.194.142, 2002:d596:2a92:1:71:53::, 2002:5968:c28e::53
+ NTP Server: ::ffff:195.234.155.124, ::ffff:78.156.97.78, ::ffff:80.71.132.103, ::ffff:83.151.158.44
+ My-IPv4-Address: 10.0.0.80
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 56) fe80::6aa3:c4ff:fef4:841e.5359 > ff02::cca6:c0f9:e182:5359.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 1, Nonce 0x7ee31135, Source Id 6a:a3:c4:ff:fe:f4:84:1e, Destination Id ff:ff:ff:ff:ff:ff:ff:ff
+ Discover, Length 20
+ Origin Time: 2013-11-10 08:00:09 UTC
+ Expires: 415s
+ IPv4 Address
+ IPv6 Prefix
+ Name Server
+ NTP Server
+IP6 (class 0xc0, hlim 64, next-header UDP (17) payload length: 193) fe80::22cf:30ff:fe02:b052.5359 > fe80::6aa3:c4ff:fef4:841e.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 1, Nonce 0x9fccbd40, Source Id 08:4b:37:1e:f3:6e:1e:dc, Destination Id 6a:a3:c4:ff:fe:f4:84:1e
+ Offer, Length 157
+ Origin Time: 2013-11-10 08:00:11 UTC
+ Mandatory
+ Expires: 505s
+ IPv4 Address: 10.100.0.1
+ Name Server: ::ffff:89.233.43.71, ::ffff:89.104.194.142, 2002:d596:2a92:1:71:53::, 2002:5968:c28e::53
+ NTP Server: ::ffff:195.234.155.124, ::ffff:78.156.97.78, ::ffff:80.71.132.103, ::ffff:83.151.158.44
+ My-IPv4-Address: 10.0.0.80
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 56) fe80::6aa3:c4ff:fef4:841e.5359 > ff02::cca6:c0f9:e182:5359.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 1, Nonce 0x7fe31135, Source Id 6a:a3:c4:ff:fe:f4:84:1e, Destination Id 08:4b:37:1e:f3:6e:1e:dc
+ Request, Length 20
+ Origin Time: 2013-11-10 08:00:09 UTC
+ Expires: 409s
+ IPv4 Address
+ IPv6 Prefix
+ Name Server
+ NTP Server
+IP6 (class 0xc0, hlim 64, next-header UDP (17) payload length: 193) fe80::22cf:30ff:fe02:b052.5359 > fe80::6aa3:c4ff:fef4:841e.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 1, Nonce 0xa0ccbd40, Source Id 08:4b:37:1e:f3:6e:1e:dc, Destination Id 6a:a3:c4:ff:fe:f4:84:1e
+ Ack, Length 157
+ Origin Time: 2013-11-10 08:00:12 UTC
+ Mandatory
+ Expires: 518s
+ IPv4 Address: 10.100.0.1
+ Name Server: ::ffff:89.233.43.71, ::ffff:89.104.194.142, 2002:d596:2a92:1:71:53::, 2002:5968:c28e::53
+ NTP Server: ::ffff:195.234.155.124, ::ffff:78.156.97.78, ::ffff:80.71.132.103, ::ffff:83.151.158.44
+ My-IPv4-Address: 10.0.0.80
--- /dev/null
+AoE length 18, Ver 1, Flags: [none]
+ Major: 0xffff, Minor: 0xff, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 0, Firmware Version: 0, Sector Count: 0, AoE: 0, CCmd: read config string
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0xffff, Minor: 0xff, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 0, Firmware Version: 0, Sector Count: 0, AoE: 0, CCmd: read config string
+AoE length 18, Ver 0
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0001cd4a
+ AFlags: [none], Err/Feature: 0, Sector Count: 1, Cmd/Status: 236
+ lba0: 0, lba1: 0, lba2: 0, lba3: 160, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 534, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0001cd4a
+ AFlags: [none], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 0, lba1: 0, lba2: 0, lba3: 160, lba4: 0, lba5: 0
+ Data: 512 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0002cd63
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 0, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0003cd63
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0004cd63
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 4, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0005cd64
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 6, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0002cd63
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 0, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0003cd63
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0004cd63
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 4, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0005cd64
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 6, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0006cd68
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 8, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0007cd68
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 10, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0008cd68
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 12, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0009cd68
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 14, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0006cd68
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 8, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0007cd68
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 10, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0008cd68
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 12, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0009cd68
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 14, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x000acd71
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 0, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x000acd71
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 0, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x000bcd71
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x000ccd71
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 4, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x000dcd71
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 6, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x000bcd71
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x000ccd71
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 4, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x000dcd71
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 6, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x000ecd74
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 24, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x000fcd74
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 26, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0010cd74
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 28, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x000ecd74
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 24, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x000fcd74
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 26, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0010cd74
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 28, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0011cd74
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 30, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0011cd74
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 30, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0012cd7b
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 8, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0013cd7b
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 10, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0014cd7b
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 12, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0015cd7b
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 14, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0012cd7b
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 8, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0013cd7b
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 10, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0014cd7b
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 12, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0015cd7b
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 14, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0016cd8f
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 56, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0017cd8f
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 58, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0018cd8f
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 60, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0019cd8f
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 62, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0016cd8f
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 56, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0017cd8f
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 58, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0018cd8f
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 60, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0019cd8f
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 62, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 0, Firmware Version: 0, Sector Count: 0, AoE: 0, CCmd: read config string
+AoE length 18, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 16, Firmware Version: 16405, Sector Count: 2, AoE: 1, CCmd: read config string
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x001acd97
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 120, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x001bcd97
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 122, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x001ccd97
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 124, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x001dcd97
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 126, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x001acd97
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 120, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x001bcd97
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 122, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x001ccd97
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 124, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x001dcd97
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 126, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 0, Firmware Version: 0, Sector Count: 0, AoE: 0, CCmd: read config string
+AoE length 18, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 16, Firmware Version: 16405, Sector Count: 2, AoE: 1, CCmd: read config string
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x001ecdfb
+ AFlags: [none], Err/Feature: 0, Sector Count: 1, Cmd/Status: 236
+ lba0: 0, lba1: 0, lba2: 0, lba3: 160, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 534, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x001ecdfb
+ AFlags: [none], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 0, lba1: 0, lba2: 0, lba3: 160, lba4: 0, lba5: 0
+ Data: 512 bytes
+AoE length 18, Ver 1, Flags: [none]
+ Major: 0xffff, Minor: 0xff, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 0, Firmware Version: 0, Sector Count: 0, AoE: 0, CCmd: read config string
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x001f6eeb
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 8, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x001f6eeb
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 8, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00206eeb
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 10, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00216eeb
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 12, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00226eeb
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 14, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00206eeb
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 10, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00216eeb
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 12, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00226eeb
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 14, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00236ef0
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 0, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00236ef0
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 0, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00246ef0
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00256ef0
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 4, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00266ef0
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 6, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00246ef0
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00256ef0
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 4, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00266ef0
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 6, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00276ef3
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 24, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00286ef3
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 26, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00296ef3
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 28, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x002a6ef3
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 30, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00276ef3
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 24, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00286ef3
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 26, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00296ef3
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 28, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x002a6ef3
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 30, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x002b6ef7
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 56, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x002b6ef7
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 56, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x002c6ef7
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 58, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x002d6ef7
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 60, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x002e6ef7
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 62, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x002c6ef7
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 58, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x002d6ef7
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 60, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x002e6ef7
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 62, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x002f6efa
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 120, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00306efa
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 122, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00316efa
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 124, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00326efa
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 126, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x002f6efa
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 120, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00306efa
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 122, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00316efa
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 124, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00326efa
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 126, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00336f01
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00336f01
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00346f07
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 4, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00346f07
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 4, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00356f09
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 18, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00366f09
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 20, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00376f09
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 22, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00386f09
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 24, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00356f09
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 18, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00396f09
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 26, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x003a6f09
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 28, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x003b6f0a
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 30, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x003c6f0a
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 32, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00366f09
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 20, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00376f09
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 22, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00386f09
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 24, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00396f09
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 26, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x003a6f09
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 28, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x003b6f0a
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 30, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x003c6f0a
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 32, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x003d6f0f
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 34, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x003e6f12
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 16, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x003f6f12
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 36, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x003d6f0f
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 34, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x003e6f12
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 16, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x003f6f12
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 36, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00406f12
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 38, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00416f12
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 40, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00406f12
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 38, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00426f13
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 42, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00436f13
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 44, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00446f13
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 46, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00416f12
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 40, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00426f13
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 42, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00436f13
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 44, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00446f13
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 46, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00456f15
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 48, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00456f15
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 48, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00466f16
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 2, Cmd/Status: 52
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00466f16
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 0, Firmware Version: 0, Sector Count: 0, AoE: 0, CCmd: read config string
+AoE length 18, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 16, Firmware Version: 16405, Sector Count: 2, AoE: 1, CCmd: read config string
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0xffff, Minor: 0xff, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 0, Firmware Version: 0, Sector Count: 0, AoE: 0, CCmd: read config string
+AoE length 18, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 16, Firmware Version: 16405, Sector Count: 2, AoE: 1, CCmd: read config string
+AoE length 1046, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0047e470
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 2, Cmd/Status: 52
+ lba0: 4, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x0047e470
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 4, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 18, Ver 1, Flags: [none]
+ Major: 0xffff, Minor: 0xff, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 0, Firmware Version: 0, Sector Count: 0, AoE: 0, CCmd: read config string
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0xffff, Minor: 0xff, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 0, Firmware Version: 0, Sector Count: 0, AoE: 0, CCmd: read config string
+AoE length 18, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 16, Firmware Version: 16405, Sector Count: 2, AoE: 1, CCmd: read config string
+AoE length 18, Ver 1, Flags: [none]
+ Major: 0xffff, Minor: 0xff, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 0, Firmware Version: 0, Sector Count: 0, AoE: 0, CCmd: read config string
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0xffff, Minor: 0xff, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 0, Firmware Version: 0, Sector Count: 0, AoE: 0, CCmd: read config string
+AoE length 18, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 16, Firmware Version: 16405, Sector Count: 2, AoE: 1, CCmd: read config string
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00484ae0
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 14, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00484ae0
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 14, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00494ae2
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 2, Cmd/Status: 36
+ lba0: 12, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00494ae2
+ AFlags: [Ext48], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 12, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 1046, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x004a5ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 2, Cmd/Status: 52
+ lba0: 76, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x004a5ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 76, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x004b5ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 2, Cmd/Status: 52
+ lba0: 48, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x004b5ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 48, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x004c5ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 2, Cmd/Status: 52
+ lba0: 12, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x004c5ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 12, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x004d5ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 2, Cmd/Status: 52
+ lba0: 14, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x004d5ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 14, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x004e5ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 2, Cmd/Status: 52
+ lba0: 16, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x004e5ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 16, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x004f5ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 2, Cmd/Status: 52
+ lba0: 18, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x004f5ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 18, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00505ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 2, Cmd/Status: 52
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00505ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00515ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 2, Cmd/Status: 52
+ lba0: 4, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00515ecd
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 4, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 1046, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00525ed2
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 2, Cmd/Status: 52
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 1024 bytes
+AoE length 46, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00525ed2
+ AFlags: [Ext48, Write], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 2, lba1: 0, lba2: 0, lba3: 0, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 0, Firmware Version: 0, Sector Count: 0, AoE: 0, CCmd: read config string
+AoE length 18, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Query Config Information, Tag: 0x00000000
+ Buffer Count: 16, Firmware Version: 16405, Sector Count: 2, AoE: 1, CCmd: read config string
+AoE length 46, Ver 1, Flags: [none]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00535f2f
+ AFlags: [none], Err/Feature: 0, Sector Count: 1, Cmd/Status: 236
+ lba0: 0, lba1: 0, lba2: 0, lba3: 160, lba4: 0, lba5: 0
+ Data: 24 bytes
+AoE length 534, Ver 1, Flags: [Response]
+ Major: 0x0014, Minor: 0x00, Command: Issue ATA Command, Tag: 0x00535f2f
+ AFlags: [none], Err/Feature: 0, Sector Count: 0, Cmd/Status: 64
+ lba0: 0, lba1: 0, lba2: 0, lba3: 160, lba4: 0, lba5: 0
+ Data: 512 bytes
--- /dev/null
+AoE length 18, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 18, Ver 0
+AoE length 46, Ver 1, Flags: [none]
+AoE length 534, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 18, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 18, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 534, Ver 1, Flags: [Response]
+AoE length 18, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 18, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 18, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [Response]
+AoE length 18, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 18, Ver 1, Flags: [Response]
+AoE length 18, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 18, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 1046, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [Response]
+AoE length 1046, Ver 1, Flags: [none]
+AoE length 46, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 18, Ver 1, Flags: [Response]
+AoE length 46, Ver 1, Flags: [none]
+AoE length 534, Ver 1, Flags: [Response]
--- /dev/null
+IP6 fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: babel 2 (8) hello
+IP6 fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: babel 2 (8) hello
+IP6 fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: babel 2 (110) update/prefix/id nh update update/prefix/id update update
+IP6 fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: babel 2 (24) hello ihu
+IP6 fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: babel 2 (8) hello
+IP6 fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: babel 2 (8) hello
+IP6 fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: babel 2 (24) hello ihu
+IP6 fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: babel 2 (8) hello
+IP6 fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: babel 2 (8) hello
+IP6 fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: babel 2 (52) update/prefix/id update/prefix update/prefix
+IP6 fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: babel 2 (32) mh-request
+IP6 fe80::68d3:1235:d068:1f9e.5359 > ff02::cca6:c0f9:e182:5359.5359: AHCP Version 1
+IP6 fe80::68d3:1235:d068:1f9e.5359 > ff02::cca6:c0f9:e182:5359.5359: AHCP Version 1
+IP6 fe80::3428:af91:251:d626.5359 > fe80::68d3:1235:d068:1f9e.5359: AHCP Version 1
+IP6 fe80::68d3:1235:d068:1f9e.5359 > ff02::cca6:c0f9:e182:5359.5359: AHCP Version 1
+IP6 fe80::3428:af91:251:d626.5359 > ff02::cca6:c0f9:e182:5359.5359: AHCP Version 1
+IP6 fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: babel 2 (28) update/prefix/id
+IP6 fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: babel 2 (32) mh-request
+IP6 fe80::3428:af91:251:d626.5359 > fe80::68d3:1235:d068:1f9e.5359: AHCP Version 1
+IP6 fe80::68d3:1235:d068:1f9e.5359 > ff02::cca6:c0f9:e182:5359.5359: AHCP Version 1
+IP6 fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: babel 2 (24) hello ihu
+IP6 fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: babel 2 (28) update/prefix/id
+IP6 fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: babel 2 (32) mh-request
+IP6 fe80::3428:af91:251:d626.5359 > fe80::68d3:1235:d068:1f9e.5359: AHCP Version 1
+IP6 fe80::68d3:1235:d068:1f9e > ff02::16: HBH ICMP6, multicast listener report v2, 2 group record(s), length 48
--- /dev/null
+IP6 (hlim 1, next-header UDP (17) payload length: 20) fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (8)
+ Hello seqno 8042 interval 20.00s
+IP6 (hlim 1, next-header UDP (17) payload length: 20) fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (8)
+ Hello seqno 40102 interval 20.00s
+IP6 (hlim 1, next-header UDP (17) payload length: 122) fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (110)
+ Update/prefix/id 2001:660:3301:8063:218:84ff:fe1a:615d/128 metric 1 seqno 32272 interval 80.00s sub-diversity 6
+ Next Hop 192.168.4.25
+ Update 192.168.4.195/32 metric 1 seqno 32272 interval 80.00s sub-diversity 6
+ Update/prefix/id 2001:660:3301:8063:218:f3ff:fea9:914e/128 metric 0 seqno 40149 interval 80.00s sub-diversity empty
+ Update ::/0 metric 196 seqno 40149 interval 80.00s sub-diversity empty
+ Update 192.168.4.25/32 metric 0 seqno 40149 interval 80.00s sub-diversity empty
+IP6 (hlim 1, next-header UDP (17) payload length: 36) fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (24)
+ Hello seqno 8043 interval 20.00s
+ IHU fe80::3428:af91:251:d626 txcost 96 interval 60.00s
+IP6 (hlim 1, next-header UDP (17) payload length: 20) fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (8)
+ Hello seqno 40103 interval 20.00s
+IP6 (hlim 1, next-header UDP (17) payload length: 20) fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (8)
+ Hello seqno 8044 interval 20.00s
+IP6 (hlim 1, next-header UDP (17) payload length: 36) fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (24)
+ Hello seqno 40104 interval 20.00s
+ IHU fe80::68d3:1235:d068:1f9e txcost 96 interval 60.00s
+IP6 (hlim 1, next-header UDP (17) payload length: 20) fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (8)
+ Hello seqno 8045 interval 20.00s
+IP6 (hlim 1, next-header UDP (17) payload length: 20) fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (8)
+ Hello seqno 40105 interval 20.00s
+IP6 (hlim 1, next-header UDP (17) payload length: 64) fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (52)
+ Update/prefix/id 2001:660:3301:8063:218:f3ff:fea9:914e/128 metric 65535 seqno 40149 interval 80.00s
+ Update/prefix 2001:660:3301:8063:218:f3ff:fea9:914e/128 metric 65535 seqno 40149 interval 80.00s
+ Update/prefix 2001:660:3301:8063:218:f3ff:fea9:914e/128 metric 65535 seqno 40149 interval 80.00s
+IP6 (hlim 1, next-header UDP (17) payload length: 44) fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (32)
+ MH-Request (127 hops) for 2001:660:3301:8063:218:f3ff:fea9:914e/128 seqno 40150 id 02:18:f3:ff:fe:a9:91:4e
+IP6 (hlim 1, next-header UDP (17) payload length: 50) fe80::68d3:1235:d068:1f9e.5359 > ff02::cca6:c0f9:e182:5359.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 1, Nonce 0xde3e5127, Source Id 02:18:f3:ff:fe:a9:91:4e, Destination Id ff:ff:ff:ff:ff:ff:ff:ff
+ Discover, Length 14
+IP6 (hlim 1, next-header UDP (17) payload length: 50) fe80::68d3:1235:d068:1f9e.5359 > ff02::cca6:c0f9:e182:5359.5359: [udp sum ok] AHCP Version 1
+ Hopcount 2, Original Hopcount 2, Nonce 0xdf3e5127, Source Id 02:18:f3:ff:fe:a9:91:4e, Destination Id ff:ff:ff:ff:ff:ff:ff:ff
+ Discover, Length 14
+IP6 (hlim 64, next-header UDP (17) payload length: 188) fe80::3428:af91:251:d626.5359 > fe80::68d3:1235:d068:1f9e.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 1, Nonce 0xc9b83d0d, Source Id 79:40:14:7f:b6:6d:c3:29, Destination Id 02:18:f3:ff:fe:a9:91:4e
+ Offer, Length 152
+IP6 (hlim 1, next-header UDP (17) payload length: 50) fe80::68d3:1235:d068:1f9e.5359 > ff02::cca6:c0f9:e182:5359.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 1, Nonce 0xe03e5127, Source Id 02:18:f3:ff:fe:a9:91:4e, Destination Id 79:40:14:7f:b6:6d:c3:29
+ Request, Length 14
+IP6 (hlim 1, next-header UDP (17) payload length: 50) fe80::3428:af91:251:d626.5359 > ff02::cca6:c0f9:e182:5359.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 2, Nonce 0xdf3e5127, Source Id 02:18:f3:ff:fe:a9:91:4e, Destination Id ff:ff:ff:ff:ff:ff:ff:ff
+ Discover, Length 14
+IP6 (hlim 1, next-header UDP (17) payload length: 40) fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (28)
+ Update/prefix/id 2001:660:3301:8063:218:f3ff:fea9:914e/128 metric 65535 seqno 40149 interval 80.00s
+IP6 (hlim 1, next-header UDP (17) payload length: 44) fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (32)
+ MH-Request (127 hops) for 2001:660:3301:8063:218:f3ff:fea9:914e/128 seqno 40150 id 02:18:f3:ff:fe:a9:91:4e
+IP6 (hlim 64, next-header UDP (17) payload length: 188) fe80::3428:af91:251:d626.5359 > fe80::68d3:1235:d068:1f9e.5359: [udp sum ok] AHCP Version 1
+ Hopcount 2, Original Hopcount 2, Nonce 0xcab83d0d, Source Id 79:40:14:7f:b6:6d:c3:29, Destination Id 02:18:f3:ff:fe:a9:91:4e
+ Offer, Length 152
+IP6 (hlim 1, next-header UDP (17) payload length: 50) fe80::68d3:1235:d068:1f9e.5359 > ff02::cca6:c0f9:e182:5359.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 1, Nonce 0xe13e5127, Source Id 02:18:f3:ff:fe:a9:91:4e, Destination Id 79:40:14:7f:b6:6d:c3:29
+ Request, Length 14
+IP6 (hlim 1, next-header UDP (17) payload length: 36) fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (24)
+ Hello seqno 8046 interval 20.00s
+ IHU fe80::3428:af91:251:d626 txcost 96 interval 60.00s
+IP6 (hlim 1, next-header UDP (17) payload length: 40) fe80::68d3:1235:d068:1f9e.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (28)
+ Update/prefix/id 2001:660:3301:8063:218:f3ff:fea9:914e/128 metric 65535 seqno 40149 interval 80.00s
+IP6 (hlim 1, next-header UDP (17) payload length: 44) fe80::3428:af91:251:d626.6697 > ff02::1:6.6697: [udp sum ok] babel 2 (32)
+ MH-Request (127 hops) for 2001:660:3301:8063:218:f3ff:fea9:914e/128 seqno 40150 id 02:18:f3:ff:fe:a9:91:4e
+IP6 (hlim 64, next-header UDP (17) payload length: 188) fe80::3428:af91:251:d626.5359 > fe80::68d3:1235:d068:1f9e.5359: [udp sum ok] AHCP Version 1
+ Hopcount 1, Original Hopcount 1, Nonce 0xcbb83d0d, Source Id 79:40:14:7f:b6:6d:c3:29, Destination Id 02:18:f3:ff:fe:a9:91:4e
+ Ack, Length 152
+IP6 (hlim 1, next-header Options (0) payload length: 56) fe80::68d3:1235:d068:1f9e > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 2 group record(s) [gaddr ff02::1:6 to_ex, 0 source(s)] [gaddr ff02::cca6:c0f9:e182:5359 to_ex, 0 source(s)]
--- /dev/null
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 436) fe80::b299:28ff:fec8:d646.6696 > ff02::1:6.6696: [udp sum ok] babel 2 (424)
+ Hello seqno 58134 interval 4.00s
+ Update/id ::/0 metric 65535 seqno 41391 interval infinity
+ Request for any
+ TS/PC timestamp 1339081200 packetcounter 2
+ HMAC key-id 30 digest-20 AD0FA7CD8D5A1898EC5409C8EDDA68B3ACA21B80
+ HMAC key-id 50 digest-32 8239F283D985047FA4B88597FDE3246455C6E4DD917B1441C2F3A82B9F737674
+ HMAC key-id 1000 digest-64 6718CB4C2BB0976C127AB3CCCBFA1105A1D158F035BC9FAD86B0610A7ACD27E5A3D5A3090FFB0312D7CBB31834E5D3EA2B68CD1FEC3CFB9CE731D16BA8FEBA8C
+ HMAC key-id 1000 digest-48 D2A5B80FF9D006907E3B6601C0C255D7D12D6EC61815E413A334E2A0D9271C75AFBC086C070C714E3EFF3496C20C56FB
+ HMAC key-id 100 digest-20 7213CED66FE7154034EC64CD14AE4142A092DF33
+ HMAC key-id 2000 digest-64 2A5D9D55393B19E440FAC49BDA521E18A7FE77F7AB4A90377009E46E2FFE49336435C7E4E7BE215996DF4F59C167EA1CCCDB4FF788DA29A30E34D974307ADFF4
+ HMAC key-id 2000 digest-48 FE91AF27EEE137EF489F37FEE449100CDA8CCB3E794D0C4A225D12724A8CE2FFC85811B879CC566FD172269847091ED1
+ HMAC key-id 3000 digest-64 38C4D82883A5778500D728D1E243E7579DE96FA726C9DB7F0805C52E96FEFDCE7A5FB9AF2CB845703926EAAB43C3E44989D6CCB158FC06DB455E9F8D0550B54F
--- /dev/null
+IP6 fe80::b299:28ff:fec8:d646.6696 > ff02::1:6.6696: babel 2 (9) hello pad1
+IP6 fe80::b299:28ff:fec8:d646.6696 > ff02::1:6.6696: babel 2 (60) hello pad1 nh pad1 router-id pad1 update pad1 update pad1
--- /dev/null
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 26) fe80::5054:ff:fe85:5da9.6696 > ff02::1:6.6696: [udp sum ok] babel 2 (14)
+ Hello seqno 58805 interval 4.00s sub-timestamp 2222.954827s
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 52) fe80::5054:ff:fe23:4567.6696 > ff02::1:6.6696: [udp sum ok] babel 2 (40)
+ Hello seqno 15585 interval 4.00s sub-timestamp 94.665527s
+ IHU fe80::5054:ff:fe85:5da9 txcost 96 interval 12.00s sub-timestamp 2222.954827s|91.378052s
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 52) fe80::5054:ff:fe85:5da9.6696 > ff02::1:6.6696: [udp sum ok] babel 2 (40)
+ Hello seqno 58806 interval 4.00s sub-timestamp 2226.449854s
+ IHU fe80::5054:ff:fe23:4567 txcost 96 interval 12.00s sub-timestamp 90.173759s|2222.137366s
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 26) fe80::5054:ff:fe85:5da9.6696 > ff02::1:6.6696: [udp sum ok] babel 2 (14)
+ Hello seqno 58807 interval 4.00s sub-timestamp 2229.725353s
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 26) fe80::5054:ff:fe23:4567.6696 > ff02::1:6.6696: [udp sum ok] babel 2 (14)
+ Hello seqno 15586 interval 4.00s sub-timestamp 98.956759s
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 26) fe80::5054:ff:fe23:4567.6696 > ff02::1:6.6696: [udp sum ok] babel 2 (14)
+ Hello seqno 15587 interval 4.00s sub-timestamp 102.558329s
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 26) fe80::5054:ff:fe85:5da9.6696 > ff02::1:6.6696: [udp sum ok] babel 2 (14)
+ Hello seqno 58808 interval 4.00s sub-timestamp 2234.612063s
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 52) fe80::5054:ff:fe23:4567.6696 > ff02::1:6.6696: [udp sum ok] babel 2 (40)
+ Hello seqno 15588 interval 4.00s sub-timestamp 106.492002s
+ IHU fe80::5054:ff:fe85:5da9 txcost 96 interval 12.00s sub-timestamp 2234.612063s|103.034525s
+IP6 (class 0xc0, hlim 1, next-header UDP (17) payload length: 88) fe80::5054:ff:fe85:5da9.6696 > ff02::1:6.6696: [udp sum ok] babel 2 (76)
+ Hello seqno 58809 interval 4.00s sub-timestamp 2239.274046s
+ IHU fe80::5054:ff:fe23:4567 txcost 96 interval 12.00s sub-timestamp 98.956759s|2230.863572s
+ Next Hop 192.168.42.1
+ Router Id 48:5f:08:26:dc:36:6d:ad
+ Update 192.168.42.1/32 metric 0 seqno 61070 interval 16.00s
--- /dev/null
+IP (tos 0x0, ttl 128, id 1467, offset 0, flags [DF], proto TCP (6), length 74)
+ 196.59.48.65.14214 > 192.168.1.1.179: Flags [P.], cksum 0xbec1 (correct), seq 2470159403:2470159437, ack 160570221, win 8192, length 34: BGP
+ Update Message (2), length: 19[|BGP]
+IP (tos 0x0, ttl 64, id 39449, offset 0, flags [DF], proto TCP (6), length 74)
+ 235.101.90.12.60082 > 192.168.1.1.179: Flags [P.], cksum 0x742d (correct), seq 1978178:1978212, ack 2473062416, win 4096, length 34: BGP
+ Update Message (2), length: 19[|BGP]
+IP (tos 0x0, ttl 128, id 43331, offset 0, flags [DF], proto TCP (6), length 74)
+ 179.110.109.87.40936 > 192.168.1.1.179: Flags [P.], cksum 0xd82d (correct), seq 3014673177:3014673211, ack 1498443316, win 4096, length 34: BGP
+ Update Message (2), length: 19[|BGP]
+IP (tos 0x0, ttl 64, id 51082, offset 0, flags [DF], proto TCP (6), length 74)
+ 114.227.144.98.32757 > 192.168.1.1.179: Flags [P.], cksum 0xb456 (correct), seq 1117364848:1117364882, ack 3778435416, win 4096, length 34: BGP
+ Update Message (2), length: 19[|BGP]
+IP (tos 0x0, ttl 64, id 51082, offset 0, flags [DF], proto TCP (6), length 74)
+ 114.227.144.98.32757 > 192.168.1.1.179: Flags [P.], cksum 0xb456 (correct), seq 0:34, ack 1, win 4096, length 34: BGP
+ Update Message (2), length: 19[|BGP]
--- /dev/null
+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
+ 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)
--- /dev/null
+CDPv2, ttl: 180s, checksum: 0xb0bd (unverified), length 378
+ Device-ID (0x01), value length: 6 bytes: 'Switch'
+ Version String (0x05), value length: 192 bytes:
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(25)SEB4, RELEASE SOFTWARE (fc1)
+ Copyright (c) 1986-2005 by Cisco Systems, Inc.
+ Compiled Tue 30-Aug-05 17:56 by yenanh
+ Platform (0x06), value length: 20 bytes: 'cisco WS-C3560G-24PS'
+ Address (0x02), value length: 13 bytes: IPv4 (1) 192.168.0.1
+ Port-ID (0x03), value length: 18 bytes: 'GigabitEthernet0/5'
+ Capability (0x04), value length: 4 bytes: (0x00000028): L2 Switch, IGMP snooping
+ Protocol-Hello option (0x08), value length: 32 bytes:
+ VTP Management Domain (0x09), value length: 3 bytes: 'Lab'
+ Native VLAN ID (0x0a), value length: 2 bytes: 1
+ Duplex (0x0b), value length: 1 byte: full
+ AVVID trust bitmap (0x12), value length: 1 byte: 0x00
+ AVVID untrusted ports CoS (0x13), value length: 1 byte: 0x00
+ Management Addresses (0x16), value length: 13 bytes: IPv4 (1) 192.168.0.1
+ unknown field type (0x1a), value length: 12 bytes:
+ 0x0000: 0000 0001 0000 0000 ffff ffff
+CDPv2, ttl: 180s, checksum: 0xb0bd (unverified), length 378
+ Device-ID (0x01), value length: 6 bytes: 'Switch'
+ Version String (0x05), value length: 192 bytes:
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(25)SEB4, RELEASE SOFTWARE (fc1)
+ Copyright (c) 1986-2005 by Cisco Systems, Inc.
+ Compiled Tue 30-Aug-05 17:56 by yenanh
+ Platform (0x06), value length: 20 bytes: 'cisco WS-C3560G-24PS'
+ Address (0x02), value length: 13 bytes: IPv4 (1) 192.168.0.1
+ Port-ID (0x03), value length: 18 bytes: 'GigabitEthernet0/5'
+ Capability (0x04), value length: 4 bytes: (0x00000028): L2 Switch, IGMP snooping
+ Protocol-Hello option (0x08), value length: 32 bytes:
+ VTP Management Domain (0x09), value length: 3 bytes: 'Lab'
+ Native VLAN ID (0x0a), value length: 2 bytes: 1
+ Duplex (0x0b), value length: 1 byte: full
+ AVVID trust bitmap (0x12), value length: 1 byte: 0x00
+ AVVID untrusted ports CoS (0x13), value length: 1 byte: 0x00
+ Management Addresses (0x16), value length: 13 bytes: IPv4 (1) 192.168.0.1
+ unknown field type (0x1a), value length: 12 bytes:
+ 0x0000: 0000 0001 0000 0000 ffff ffff
+CDPv2, ttl: 180s, checksum: 0xb0bd (unverified), length 378
+ Device-ID (0x01), value length: 6 bytes: 'Switch'
+ Version String (0x05), value length: 192 bytes:
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(25)SEB4, RELEASE SOFTWARE (fc1)
+ Copyright (c) 1986-2005 by Cisco Systems, Inc.
+ Compiled Tue 30-Aug-05 17:56 by yenanh
+ Platform (0x06), value length: 20 bytes: 'cisco WS-C3560G-24PS'
+ Address (0x02), value length: 13 bytes: IPv4 (1) 192.168.0.1
+ Port-ID (0x03), value length: 18 bytes: 'GigabitEthernet0/5'
+ Capability (0x04), value length: 4 bytes: (0x00000028): L2 Switch, IGMP snooping
+ Protocol-Hello option (0x08), value length: 32 bytes:
+ VTP Management Domain (0x09), value length: 3 bytes: 'Lab'
+ Native VLAN ID (0x0a), value length: 2 bytes: 1
+ Duplex (0x0b), value length: 1 byte: full
+ AVVID trust bitmap (0x12), value length: 1 byte: 0x00
+ AVVID untrusted ports CoS (0x13), value length: 1 byte: 0x00
+ Management Addresses (0x16), value length: 13 bytes: IPv4 (1) 192.168.0.1
+ unknown field type (0x1a), value length: 12 bytes:
+ 0x0000: 0000 0001 0000 0000 ffff ffff
--- /dev/null
+#!/bin/sh
+
+# Only attempt OpenSSL-specific tests when compiled with the library.
+
+if grep '^#define HAVE_LIBCRYPTO 1$' ../config.h >/dev/null
+then
+ ./TESTonce esp1 02-sunrise-sunset-esp.pcap esp1.out '-t -E "0x12345678@192.1.2.45 3des-cbc-hmac96:0x4043434545464649494a4a4c4c4f4f515152525454575758"'
+ ./TESTonce 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"'
+ ./TESTonce esp3 02-sunrise-sunset-esp.pcap esp1.out '-t -E "3des-cbc-hmac96:0x4043434545464649494a4a4c4c4f4f515152525454575758"'
+ # Reading the secret(s) from a file does not work with Capsicum.
+ if grep '^#define HAVE_CAPSICUM 1$' ../config.h >/dev/null
+ then
+ FORMAT=' %-30s: TEST SKIPPED (compiled w/Capsicum)\n'
+ printf "$FORMAT" esp4
+ printf "$FORMAT" esp5
+ printf "$FORMAT" espudp1
+ printf "$FORMAT" ikev2pI2
+ printf "$FORMAT" isakmp4
+ else
+ ./TESTonce esp4 08-sunrise-sunset-esp2.pcap esp2.out '-t -E "file esp-secrets.txt"'
+ ./TESTonce esp5 08-sunrise-sunset-aes.pcap esp5.out '-t -E "file esp-secrets.txt"'
+ ./TESTonce espudp1 espudp1.pcap espudp1.out '-nnnn -t -E "file esp-secrets.txt"'
+ ./TESTonce ikev2pI2 ikev2pI2.pcap ikev2pI2.out '-t -E "file ikev2pI2-secrets.txt" -v -v -v -v'
+ ./TESTonce isakmp4 isakmp4500.pcap isakmp4.out '-t -E "file esp-secrets.txt"'
+ fi
+else
+ FORMAT=' %-30s: TEST SKIPPED (compiled w/o OpenSSL)\n'
+ printf "$FORMAT" esp1
+ printf "$FORMAT" esp2
+ printf "$FORMAT" esp3
+ printf "$FORMAT" esp4
+ printf "$FORMAT" esp5
+ printf "$FORMAT" espudp1
+ printf "$FORMAT" ikev2pI2
+ printf "$FORMAT" isakmp4
+fi
--- /dev/null
+IP6 (class 0x03, flowlabel 0x03030, hlim 48, next-header Options (0) payload length: 12336) 3030:3030:3030:3030:3030:3030:3030:3030 > 130:3030:3030:3030:3030:3030:3030:3030: HBH [trunc] (header length 8 is too small for type 1)[|MOBILITY]
--- /dev/null
+IP6 truncated-ip6 - 26325 bytes missing!(class 0x76, flowlabel 0x76767, hlim 103, next-header Mobility (135) payload length: 26470) 6767:6767:6767:6767:6767:6767:6767:6767 > 6767:6767:6767:6767:6767:6767:6767:6705: mobility: BU seq#=26471 HL lifetime=105884(type-0x67: len=103)[trunc]
+IP6 truncated-ip6 - 26325 bytes missing!(class 0x76, flowlabel 0x76767, hlim 103, next-header Mobility (135) payload length: 26470) 6767:6767:6767:6767:6767:6767:6767:6767 > 6767:6767:4f67:6767:6767:6767:6767:6767: (header length 8 is too small for type 6)[|MOBILITY]
+EXIT CODE 00000100
--- /dev/null
+IP6 (hlim 1, next-header Options (0) payload length: 36) fe80::a00:27ff:fe46:e884 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 1 group record(s) [gaddr ff02::1:ff00:0 to_ex { }]
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xd60c7466, secs 13, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xd60c7466, secs 24, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xd60c7466, secs 36, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP6 (hlim 1, next-header Options (0) payload length: 76) :: > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 3 group record(s) [gaddr ff02::1:ff46:e884 to_ex { }] [gaddr ff02::2 to_ex { }] [gaddr ff02::202 to_ex { }]
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0x3c41e764, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP6 (hlim 255, next-header ICMPv6 (58) payload length: 24) :: > ff02::1:ff46:e884: [icmp6 sum ok] ICMP6, neighbor solicitation, length 24, who has fe80::a00:27ff:fe46:e884
+IP6 (hlim 255, next-header ICMPv6 (58) payload length: 16) fe80::a00:27ff:fe46:e884 > ff02::2: [icmp6 sum ok] ICMP6, router solicitation, length 16
+ source link-address option (1), length 8 (1): 08:00:27:46:e8:84
+ 0x0000: 0800 2746 e884
+IP6 (hlim 1, next-header Options (0) payload length: 96) fe80::a00:27ff:fe46:e884 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 4 group record(s) [gaddr ff02::1:ff00:0 to_ex { }] [gaddr ff02::1:ff46:e884 to_ex { }] [gaddr ff02::2 to_ex { }] [gaddr ff02::202 to_ex { }]
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+IP6 (hlim 1, next-header Options (0) payload length: 76) :: > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 3 group record(s) [gaddr ff02::1:ff42:ba59 to_ex { }] [gaddr ff02::2 to_ex { }] [gaddr ff02::202 to_ex { }]
+IP6 (hlim 255, next-header ICMPv6 (58) payload length: 24) :: > ff02::1:ff42:ba59: [icmp6 sum ok] ICMP6, neighbor solicitation, length 24, who has fe80::a00:27ff:fe42:ba59
+IP6 (hlim 1, next-header Options (0) payload length: 96) fe80::a00:27ff:fe42:ba59 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 4 group record(s) [gaddr ff02::1:ff00:0 to_ex { }] [gaddr ff02::1:ff42:ba59 to_ex { }] [gaddr ff02::2 to_ex { }] [gaddr ff02::202 to_ex { }]
+IP6 (hlim 1, next-header Options (0) payload length: 36) fe80::a00:27ff:fe46:e884 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 1 group record(s) [gaddr ff02::1:ff00:0 to_ex { }]
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0x3c41e764, secs 8, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP6 (hlim 1, next-header Options (0) payload length: 36) fe80::a00:27ff:fe42:ba59 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 1 group record(s) [gaddr ff02::1:ff00:0 to_ex { }]
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0x3c41e764, secs 20, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0x3c41e764, secs 41, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP6 (hlim 1, next-header Options (0) payload length: 76) :: > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 3 group record(s) [gaddr ff02::1:ff46:e884 to_ex { }] [gaddr ff02::2 to_ex { }] [gaddr ff02::202 to_ex { }]
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xc1fb0d77, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP6 (hlim 255, next-header ICMPv6 (58) payload length: 24) :: > ff02::1:ff46:e884: [icmp6 sum ok] ICMP6, neighbor solicitation, length 24, who has fe80::a00:27ff:fe46:e884
+IP6 (hlim 255, next-header ICMPv6 (58) payload length: 16) fe80::a00:27ff:fe46:e884 > ff02::2: [icmp6 sum ok] ICMP6, router solicitation, length 16
+ source link-address option (1), length 8 (1): 08:00:27:46:e8:84
+ 0x0000: 0800 2746 e884
+IP6 (hlim 1, next-header Options (0) payload length: 96) fe80::a00:27ff:fe46:e884 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 4 group record(s) [gaddr ff02::1:ff00:0 to_ex { }] [gaddr ff02::1:ff46:e884 to_ex { }] [gaddr ff02::2 to_ex { }] [gaddr ff02::202 to_ex { }]
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xc1fb0d77, secs 3, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP6 (hlim 1, next-header Options (0) payload length: 36) fe80::a00:27ff:fe46:e884 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 1 group record(s) [gaddr ff02::1:ff00:0 to_ex { }]
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 15 15 15 15 15 15 15
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c209 00ff ffff ff00 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 15 15 15 15 15 15 15
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c20a 00ff ffff ff00 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 15 15 15 15 15 15 15
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c209 00ff ffff ff00 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 15 15 15 15 15 15 15
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c20a 00ff ffff ff00 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ End TLV (0), length 0
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xc1fb0d77, secs 11, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xc1fb0d77, secs 23, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xc1fb0d77, secs 36, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 1 15 15 15 1 15 1
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c209 00f1 fff1 f100 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 1 15 15 15 1 15 1
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c20a 00f1 fff1 f100 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 1 15 15 15 1 15 1
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c209 00f1 fff1 f100 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 1 15 15 15 1 15 1
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c20a 00f1 fff1 f100 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+IP6 (hlim 1, next-header Options (0) payload length: 76) :: > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 3 group record(s) [gaddr ff02::1:ff46:e884 to_ex { }] [gaddr ff02::2 to_ex { }] [gaddr ff02::202 to_ex { }]
+IP6 (hlim 255, next-header ICMPv6 (58) payload length: 24) :: > ff02::1:ff46:e884: [icmp6 sum ok] ICMP6, neighbor solicitation, length 24, who has fe80::a00:27ff:fe46:e884
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xf0059f6c, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP6 (hlim 255, next-header ICMPv6 (58) payload length: 16) fe80::a00:27ff:fe46:e884 > ff02::2: [icmp6 sum ok] ICMP6, router solicitation, length 16
+ source link-address option (1), length 8 (1): 08:00:27:46:e8:84
+ 0x0000: 0800 2746 e884
+IP6 (hlim 1, next-header Options (0) payload length: 96) fe80::a00:27ff:fe46:e884 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 4 group record(s) [gaddr ff02::1:ff00:0 to_ex { }] [gaddr ff02::1:ff46:e884 to_ex { }] [gaddr ff02::2 to_ex { }] [gaddr ff02::202 to_ex { }]
+IP6 (hlim 1, next-header Options (0) payload length: 36) fe80::a00:27ff:fe46:e884 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 1 group record(s) [gaddr ff02::1:ff00:0 to_ex { }]
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xf0059f6c, secs 5, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xf0059f6c, secs 17, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 15 15 15 15 15 15 15
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c209 00ff ffff ff00 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 15 15 15 15 15 15 15
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c20a 00ff ffff ff00 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 15 15 15 15 15 15 15
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c209 00ff ffff ff00 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 15 15 15 15 15 15 15
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c20a 00ff ffff ff00 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xf0059f6c, secs 36, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 15 1 1 15 15 1 15
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c209 00ff 11ff 1f00 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 15 1 1 15 15 1 15
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c20a 00ff 11ff 1f00 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 15 1 1 15 15 1 15
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c209 00ff 11ff 1f00 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 15 1 1 15 15 1 15
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c20a 00ff 11ff 1f00 0000 0000 0000
+ 0x0010: 0000 0000 0000 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
+LLDP, length 135
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Configuration Subtype (9)
+ Willing:0, CBS:0, RES:0, Max TCs:0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c209 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
+ ETS Recommendation Subtype (10)
+ RES: 0
+ Priority Assignment Table
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 15 4 1 1 15 4 1 4
+ TC Bandwidth Table
+ TC% : 0 1 2 3 4 5 6 7
+ Value : 0 50 0 0 50 0 0 0
+ TSA Assignment Table
+ Traffic Class: 0 1 2 3 4 5 6 7
+ Value : 0 2 0 0 2 0 0 0
+ 0x0000: 0080 c20a 00f4 11f4 1400 3200 0032 0000
+ 0x0010: 0000 0200 0002 0000 00
+ End TLV (0), length 0
--- /dev/null
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0x85bfaf7d, secs 31, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+LLDP, length 87
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Priority Flow Control Configuration Subtype (11)
+ Willing: 0, MBC: 0, RES: 0, PFC cap:4
+ PFC Enable
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 0 0 1 0 1 1 0 0
+ 0x0000: 0080 c20b 0434
+ End TLV (0), length 0
+LLDP, length 87
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Priority Flow Control Configuration Subtype (11)
+ Willing: 0, MBC: 0, RES: 0, PFC cap:4
+ PFC Enable
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 0 0 1 0 1 1 0 0
+ 0x0000: 0080 c20b 0434
+ End TLV (0), length 0
+LLDP, length 87
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Priority Flow Control Configuration Subtype (11)
+ Willing: 0, MBC: 0, RES: 0, PFC cap:4
+ PFC Enable
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 0 0 1 0 1 1 0 0
+ 0x0000: 0080 c20b 0434
+ End TLV (0), length 0
+LLDP, length 87
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Priority Flow Control Configuration Subtype (11)
+ Willing: 0, MBC: 0, RES: 0, PFC cap:4
+ PFC Enable
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 0 0 1 0 1 1 0 0
+ 0x0000: 0080 c20b 0434
+ End TLV (0), length 0
--- /dev/null
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xfddb5251, secs 7, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xfddb5251, secs 17, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+LLDP, length 86
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 5: OUI Ethernet bridged (0x0080c2)
+ Application Priority Subtype (12)
+ RES: 0
+ 0x0000: 0080 c20c 00
+ End TLV (0), length 0
+LLDP, length 86
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 5: OUI Ethernet bridged (0x0080c2)
+ Application Priority Subtype (12)
+ RES: 0
+ 0x0000: 0080 c20c 00
+ End TLV (0), length 0
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xfddb5251, secs 25, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+LLDP, length 94
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Congestion Notification Subtype (8)
+ Pre-Priority CNPV Indicator
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 1 0 0
+ Pre-Priority Ready Indicator
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c208 2000
+ Organization specific TLV (127), length 5: OUI Ethernet bridged (0x0080c2)
+ Application Priority Subtype (12)
+ RES: 0
+ 0x0000: 0080 c20c 00
+ End TLV (0), length 0
+LLDP, length 94
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Congestion Notification Subtype (8)
+ Pre-Priority CNPV Indicator
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 1 0 0
+ Pre-Priority Ready Indicator
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c208 2000
+ Organization specific TLV (127), length 5: OUI Ethernet bridged (0x0080c2)
+ Application Priority Subtype (12)
+ RES: 0
+ 0x0000: 0080 c20c 00
+ End TLV (0), length 0
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xfddb5251, secs 40, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP6 (hlim 1, next-header Options (0) payload length: 76) :: > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 3 group record(s) [gaddr ff02::1:ff46:e884 to_ex { }] [gaddr ff02::2 to_ex { }] [gaddr ff02::202 to_ex { }]
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xbb58bf40, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP6 (hlim 255, next-header ICMPv6 (58) payload length: 24) :: > ff02::1:ff46:e884: [icmp6 sum ok] ICMP6, neighbor solicitation, length 24, who has fe80::a00:27ff:fe46:e884
+IP6 (hlim 255, next-header ICMPv6 (58) payload length: 16) fe80::a00:27ff:fe46:e884 > ff02::2: [icmp6 sum ok] ICMP6, router solicitation, length 16
+ source link-address option (1), length 8 (1): 08:00:27:46:e8:84
+ 0x0000: 0800 2746 e884
+IP6 (hlim 1, next-header Options (0) payload length: 96) fe80::a00:27ff:fe46:e884 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 4 group record(s) [gaddr ff02::1:ff00:0 to_ex { }] [gaddr ff02::1:ff46:e884 to_ex { }] [gaddr ff02::2 to_ex { }] [gaddr ff02::202 to_ex { }]
+LLDP, length 86
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 5: OUI Ethernet bridged (0x0080c2)
+ Application Priority Subtype (12)
+ RES: 0
+ 0x0000: 0080 c20c 00
+ End TLV (0), length 0
+LLDP, length 86
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:42:ba:59
+ 0x0000: 0408 0027 42ba 59
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:42:ba:59
+ 0x0000: 0308 0027 42ba 59
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 5: OUI Ethernet bridged (0x0080c2)
+ Application Priority Subtype (12)
+ RES: 0
+ 0x0000: 0080 c20c 00
+ End TLV (0), length 0
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:46:e8:84, length 300, xid 0xbb58bf40, secs 7, Flags [none] (0x0000)
+ Client-Ethernet-Address 08:00:27:46:e8:84
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 17:
+ Subnet-Mask, BR, Time-Zone, Classless-Static-Route
+ Domain-Name, Domain-Name-Server, Hostname, YD
+ YS, NTP, MTU, Option 119
+ Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Option 252
+ NTP
+IP6 (hlim 1, next-header Options (0) payload length: 36) fe80::a00:27ff:fe46:e884 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 1 group record(s) [gaddr ff02::1:ff00:0 to_ex { }]
+LLDP, length 94
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Congestion Notification Subtype (8)
+ Pre-Priority CNPV Indicator
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 1 0 0
+ Pre-Priority Ready Indicator
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c208 2000
+ Organization specific TLV (127), length 5: OUI Ethernet bridged (0x0080c2)
+ Application Priority Subtype (12)
+ RES: 0
+ 0x0000: 0080 c20c 00
+ End TLV (0), length 0
+LLDP, length 94
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 00
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Congestion Notification Subtype (8)
+ Pre-Priority CNPV Indicator
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 1 0 0
+ Pre-Priority Ready Indicator
+ Priority : 0 1 2 3 4 5 6 7
+ Value : 0 0 0 0 0 0 0 0
+ 0x0000: 0080 c208 2000
+ Organization specific TLV (127), length 5: OUI Ethernet bridged (0x0080c2)
+ Application Priority Subtype (12)
+ RES: 0
+ 0x0000: 0080 c20c 00
+ End TLV (0), length 0
--- /dev/null
+IP (tos 0x0, ttl 64, id 65312, offset 0, flags [DF], proto DCCP (33), length 52)
+ 139.133.209.176.39420 > 139.133.209.65.5001: DCCP (CCVal 0, CsCov 0, cksum 0xaaf3 (correct)) DCCP-Request (service=0) seq 38464816766 <change_l ack_ratio 2, change_r ccid 2, change_l ccid 2>
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto DCCP (33), length 68)
+ 139.133.209.65.5001 > 139.133.209.176.39420: DCCP (CCVal 0, CsCov 0, cksum 0xb04b (correct)) DCCP-Response (service=0) (ack=38464816766) seq 1960341146 <nop, nop, change_l ack_ratio 2, confirm_r ccid 2 2, confirm_l ccid 2 2, confirm_r ack_ratio 2>
+IP (tos 0x0, ttl 64, id 65313, offset 0, flags [DF], proto DCCP (33), length 56)
+ 139.133.209.176.39420 > 139.133.209.65.5001: DCCP (CCVal 0, CsCov 0, cksum 0xf53a (correct)) DCCP-Ack (ack=1960341146) seq 38464816767 <nop, confirm_r ack_ratio 2, ack_vector0 0x00, elapsed_time 1>
+IP (tos 0x0, ttl 64, id 65314, offset 0, flags [DF], proto DCCP (33), length 152)
+ 139.133.209.176.39420 > 139.133.209.65.5001: DCCP (CCVal 0, CsCov 6, cksum 0x7d28 (correct)) DCCP-DataAck (ack=1960341146) seq 38464816768 <nop, nop, ack_vector0 0x00, elapsed_time 1249, ndp_count 1>
+IP (tos 0x0, ttl 64, id 3176, offset 0, flags [DF], proto DCCP (33), length 52)
+ 139.133.209.65.5001 > 139.133.209.176.39420: DCCP (CCVal 0, CsCov 0, cksum 0xfc63 (correct)) DCCP-Ack (ack=38464816768) seq 1960341147 <nop, ack_vector0 0x01, elapsed_time 1>
+IP (tos 0x0, ttl 64, id 65315, offset 0, flags [DF], proto DCCP (33), length 148)
+ 139.133.209.176.39420 > 139.133.209.65.5001: DCCP (CCVal 0, CsCov 6, cksum 0x5e05 (correct)) DCCP-DataAck (ack=1960341147) seq 38464816769 <nop, ack_vector0 0x00, elapsed_time 84>
+IP (tos 0x0, ttl 64, id 3177, offset 0, flags [DF], proto DCCP (33), length 52)
+ 139.133.209.65.5001 > 139.133.209.176.39420: DCCP (CCVal 0, CsCov 0, cksum 0x0165 (correct)) DCCP-Ack (ack=38464816769) seq 1960341148 <nop, nop, ack_vector0 0x00, ndp_count 1>
+IP (tos 0x0, ttl 64, id 65316, offset 0, flags [DF], proto DCCP (33), length 148)
+ 139.133.209.176.39420 > 139.133.209.65.5001: DCCP (CCVal 0, CsCov 6, cksum 0x5e1e (correct)) DCCP-DataAck (ack=1960341148) seq 38464816770 <nop, ack_vector0 0x00, elapsed_time 57>
+IP (tos 0x0, ttl 64, id 65317, offset 0, flags [DF], proto DCCP (33), length 148)
+ 139.133.209.176.39420 > 139.133.209.65.5001: DCCP (CCVal 0, CsCov 6, cksum 0x5e15 (correct)) DCCP-DataAck (ack=1960341148) seq 38464816771 <nop, ack_vector0 0x00, elapsed_time 65>
+IP (tos 0x0, ttl 64, id 3178, offset 0, flags [DF], proto DCCP (33), length 56)
+ 139.133.209.65.5001 > 139.133.209.176.39420: DCCP (CCVal 0, CsCov 0, cksum 0xfb32 (correct)) DCCP-Ack (ack=38464816770) seq 1960341149 <nop, nop, ack_vector0 0x00, elapsed_time 1, ndp_count 2>
+IP (tos 0x0, ttl 64, id 3179, offset 0, flags [DF], proto DCCP (33), length 56)
+ 139.133.209.65.5001 > 139.133.209.176.39420: DCCP (CCVal 0, CsCov 0, cksum 0xfa2f (correct)) DCCP-Ack (ack=38464816771) seq 1960341150 <nop, nop, ack_vector0 0x01, elapsed_time 1, ndp_count 3>
+IP (tos 0x0, ttl 64, id 65318, offset 0, flags [DF], proto DCCP (33), length 148)
+ 139.133.209.176.39420 > 139.133.209.65.5001: DCCP (CCVal 0, CsCov 6, cksum 0x5e35 (correct)) DCCP-DataAck (ack=1960341150) seq 38464816772 <nop, ack_vector0 0x00, elapsed_time 30>
+IP (tos 0x0, ttl 64, id 65319, offset 0, flags [DF], proto DCCP (33), length 52)
+ 139.133.209.176.39420 > 139.133.209.65.5001: DCCP (CCVal 0, CsCov 0, cksum 0xf638 (correct)) DCCP-Close (ack=1960341150) seq 38464816773 <nop, ack_vector0 0x00, elapsed_time 37>
+IP (tos 0x0, ttl 64, id 3180, offset 0, flags [DF], proto DCCP (33), length 56)
+ 139.133.209.65.5001 > 139.133.209.176.39420: DCCP (CCVal 0, CsCov 0, cksum 0xfb2c (correct)) DCCP-Ack (ack=38464816772) seq 1960341151 <nop, nop, ack_vector0 0x00, elapsed_time 1, ndp_count 4>
+IP (tos 0x0, ttl 64, id 3181, offset 0, flags [DF], proto DCCP (33), length 60)
+ 139.133.209.65.5001 > 139.133.209.176.39420: DCCP (CCVal 0, CsCov 0, cksum 0xef25 (correct)) DCCP-Reset (code=closed) (ack=38464816773) seq 1960341152 <nop, nop, ack_vector0 0x01, elapsed_time 2, ndp_count 5>
--- /dev/null
+IP (tos 0x0, ttl 64, id 30095, offset 0, flags [DF], proto DCCP (33), length 52)
+ 139.133.209.176.52667 > 139.133.209.65.5001: DCCP (CCVal 0, CsCov 0, cksum 0xa766 (correct)) DCCP-Request (service=0) seq 33164071488 <change_l ack_ratio 2, change_r ccid 2, change_l ccid 2>
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto DCCP (33), length 68)
+ 139.133.209.65.5001 > 139.133.209.176.52667: DCCP (CCVal 0, CsCov 0, cksum 0x9a1a (correct)) DCCP-Response (service=0) (ack=33164071488) seq 1925546833 <nop, nop, change_l ack_ratio 2, confirm_r ccid 2 2, confirm_l ccid 2 2, confirm_r ack_ratio 2>
+IP (tos 0x0, ttl 64, id 30096, offset 0, flags [DF], proto DCCP (33), length 56)
+ 139.133.209.176.52667 > 139.133.209.65.5001: DCCP (CCVal 0, CsCov 0, cksum 0xdf09 (correct)) DCCP-Ack (ack=1925546833) seq 33164071489 <nop, confirm_r ack_ratio 2, ack_vector0 0x00, elapsed_time 1>
+IP (tos 0x0, ttl 64, id 30097, offset 0, flags [DF], proto DCCP (33), length 68)
+ 139.133.209.176.52667 > 139.133.209.65.5001: DCCP (CCVal 0, CsCov 1, cksum 0x9dfa (correct)) DCCP-DataAck (ack=1925546833) seq 33164071490 <nop, nop, ack_vector0 0x00, elapsed_time 70, ndp_count 1>
+IP (tos 0x0, ttl 64, id 24713, offset 0, flags [DF], proto DCCP (33), length 52)
+ 139.133.209.65.5001 > 139.133.209.176.52667: DCCP (CCVal 0, CsCov 0, cksum 0xe632 (correct)) DCCP-Ack (ack=33164071490) seq 1925546834 <nop, ack_vector0 0x01, elapsed_time 1>
+IP (tos 0x0, ttl 64, id 30098, offset 0, flags [DF], proto DCCP (33), length 52)
+ 139.133.209.176.52667 > 139.133.209.65.5001: DCCP (CCVal 0, CsCov 0, cksum 0xdf8d (correct)) DCCP-Close (ack=1925546834) seq 33164071491 <nop, ack_vector0 0x00, elapsed_time 166>
+IP (tos 0x0, ttl 64, id 24714, offset 0, flags [DF], proto DCCP (33), length 60)
+ 139.133.209.65.5001 > 139.133.209.176.52667: DCCP (CCVal 0, CsCov 0, cksum 0xd900 (correct)) DCCP-Reset (code=closed) (ack=33164071491) seq 1925546835 <nop, nop, ack_vector0 0x00, elapsed_time 3, ndp_count 1>
--- /dev/null
+IP6 (hlim 64, next-header DCCP (33) payload length: 32) 3ffe::1.55024 > 3ffe::2.5001: DCCP (CCVal 0, CsCov 0, cksum 0xd538 (correct)) DCCP-Request (service=0) seq 1559687427 <change_l ack_ratio 2, change_r ccid 2, change_l ccid 2>
+IP6 (hlim 64, next-header DCCP (33) payload length: 48) 3ffe::2.5001 > 3ffe::1.55024: DCCP (CCVal 0, CsCov 0, cksum 0x81a3 (correct)) DCCP-Response (service=0) (ack=1559687427) seq 1585962456 <nop, nop, change_l ack_ratio 2, confirm_r ccid 2 2, confirm_l ccid 2 2, confirm_r ack_ratio 2>
+IP6 (hlim 64, next-header DCCP (33) payload length: 36) 3ffe::1.55024 > 3ffe::2.5001: DCCP (CCVal 0, CsCov 0, cksum 0xc692 (correct)) DCCP-Ack (ack=1585962456) seq 1559687428 <nop, confirm_r ack_ratio 2, ack_vector0 0x00, elapsed_time 1>
+IP6 (hlim 64, next-header DCCP (33) payload length: 164) 3ffe::1.55024 > 3ffe::2.5001: DCCP (CCVal 0, CsCov 10, cksum 0xe362 (correct)) DCCP-DataAck (ack=1585962456) seq 1559687429 <nop, nop, ack_vector0 0x00, elapsed_time 7282, ndp_count 1>
+IP6 (hlim 64, next-header DCCP (33) payload length: 32) 3ffe::2.5001 > 3ffe::1.55024: DCCP (CCVal 0, CsCov 0, cksum 0xcdbb (correct)) DCCP-Ack (ack=1559687429) seq 1585962457 <nop, ack_vector0 0x01, elapsed_time 1>
+IP6 (hlim 64, next-header DCCP (33) payload length: 160) 3ffe::1.55024 > 3ffe::2.5001: DCCP (CCVal 0, CsCov 10, cksum 0x5574 (correct)) DCCP-DataAck (ack=1585962457) seq 1559687430 <nop, ack_vector0 0x00, elapsed_time 55>
+IP6 (hlim 64, next-header DCCP (33) payload length: 32) 3ffe::1.55024 > 3ffe::2.5001: DCCP (CCVal 0, CsCov 0, cksum 0xc778 (correct)) DCCP-Close (ack=1585962457) seq 1559687431 <nop, ack_vector0 0x00, elapsed_time 67>
+IP6 (hlim 64, next-header DCCP (33) payload length: 32) 3ffe::2.5001 > 3ffe::1.55024: DCCP (CCVal 0, CsCov 0, cksum 0xd2bc (correct)) DCCP-Ack (ack=1559687430) seq 1585962458 <nop, nop, ack_vector0 0x00, ndp_count 1>
+IP6 (hlim 64, next-header DCCP (33) payload length: 40) 3ffe::2.5001 > 3ffe::1.55024: DCCP (CCVal 0, CsCov 0, cksum 0xc186 (correct)) DCCP-Reset (code=closed) (ack=1559687431) seq 1585962459 <nop, nop, ack_vector0 0x01, elapsed_time 1, ndp_count 2>
--- /dev/null
+IP6 (hlim 64, next-header DCCP (33) payload length: 32) 3ffe::1.52921 > 3ffe::2.5001: DCCP (CCVal 0, CsCov 0, cksum 0xef1a (correct)) DCCP-Request (service=0) seq 1337846929 <change_l ack_ratio 2, change_r ccid 2, change_l ccid 2>
+IP6 (hlim 64, next-header DCCP (33) payload length: 48) 3ffe::2.5001 > 3ffe::1.52921: DCCP (CCVal 0, CsCov 0, cksum 0x0b73 (correct)) DCCP-Response (service=0) (ack=1337846929) seq 1385331168 <nop, nop, change_l ack_ratio 2, confirm_r ccid 2 2, confirm_l ccid 2 2, confirm_r ack_ratio 2>
+IP6 (hlim 64, next-header DCCP (33) payload length: 36) 3ffe::1.52921 > 3ffe::2.5001: DCCP (CCVal 0, CsCov 0, cksum 0x5062 (correct)) DCCP-Ack (ack=1385331168) seq 1337846930 <nop, confirm_r ack_ratio 2, ack_vector0 0x00, elapsed_time 1>
+IP6 (hlim 64, next-header DCCP (33) payload length: 48) 3ffe::1.52921 > 3ffe::2.5001: DCCP (CCVal 0, CsCov 1, cksum 0x8792 (correct)) DCCP-DataAck (ack=1385331168) seq 1337846931 <nop, nop, ack_vector0 0x00, elapsed_time 49357, ndp_count 1>
+IP6 (hlim 64, next-header DCCP (33) payload length: 32) 3ffe::2.5001 > 3ffe::1.52921: DCCP (CCVal 0, CsCov 0, cksum 0x578b (correct)) DCCP-Ack (ack=1337846931) seq 1385331169 <nop, ack_vector0 0x01, elapsed_time 1>
+IP6 (hlim 64, next-header DCCP (33) payload length: 32) 3ffe::1.52921 > 3ffe::2.5001: DCCP (CCVal 0, CsCov 0, cksum 0x61e0 (correct)) DCCP-Close (ack=1385331169) seq 1337846932 <nop, ack_vector0 0x00, elapsed_time 61355>
+IP6 (hlim 64, next-header DCCP (33) payload length: 40) 3ffe::2.5001 > 3ffe::1.52921: DCCP (CCVal 0, CsCov 0, cksum 0x4b59 (correct)) DCCP-Reset (code=closed) (ack=1337846932) seq 1385331170 <nop, nop, ack_vector0 0x00, elapsed_time 2, ndp_count 1>
--- /dev/null
+endnode-hello endnode vers 2 eco 0 ueco 0 src 1.1 blksize 16434 rtr 0.0 hello 10 data 2
+endnode-hello endnode vers 2 eco 0 ueco 0 src 1.1 blksize 16434 rtr 0.0 hello 10 data 2
+endnode-hello endnode vers 2 eco 0 ueco 0 src 1.1 blksize 16434 rtr 0.0 hello 10 data 2
+endnode-hello endnode vers 2 eco 0 ueco 0 src 1.1 blksize 16434 rtr 0.0 hello 10 data 2
+endnode-hello endnode vers 2 eco 0 ueco 0 src 1.1 blksize 16434 rtr 0.0 hello 10 data 2
+1.1 > 1.1 34 conn-initiate 8195>0 ver 4.1 segsize 16403
+1.1 > 1.1 9 [|decnet]
+1.1 > 1.1 16 conn-confirm 8196>8195 ver 4.1 segsize 16403
+1.1 > 1.1 19 link-service 8195>8196 ack 0 ackdat 0 seg 1 dat seg count 0
+1.1 > 1.1 15 ils-ack 8196>8195 ack 1 ackdat 0
+1.1 > 1.1 45 data 8195>8196 ack 0 oack 0 seg 1
+1.1 > 1.1 15 data-ack 8196>8195 ack 1 oack 1
+1.1 > 1.1 18 data 8196>8195 ack 1 oack 1 seg 1
+1.1 > 1.1 15 data-ack 8195>8196 ack 1 oack 0
+1.1 > 1.1 33 data 8195>8196 ack 1 oack 0 seg 2
+1.1 > 1.1 15 data-ack 8196>8195 ack 2 oack 1
+1.1 > 1.1 18 data 8196>8195 ack 2 oack 1 seg 2
+1.1 > 1.1 15 data-ack 8195>8196 ack 2 oack 0
+endnode-hello endnode vers 2 eco 0 ueco 0 src 1.1 blksize 16434 rtr 0.0 hello 10 data 2
+1.1 > 1.1 34 conn-initiate 8197>0 ver 4.1 segsize 16403
+1.1 > 1.1 9 [|decnet]
+1.1 > 1.1 16 conn-confirm 8198>8197 ver 4.1 segsize 16403
+1.1 > 1.1 19 link-service 8197>8198 ack 0 ackdat 0 seg 1 dat seg count 0
+1.1 > 1.1 15 ils-ack 8198>8197 ack 1 ackdat 0
+1.1 > 1.1 45 data 8197>8198 ack 0 oack 0 seg 1
+1.1 > 1.1 15 data-ack 8198>8197 ack 1 oack 1
+1.1 > 1.1 32 data 8197>8198 ack 0 oack 0 seg 2
+1.1 > 1.1 15 data-ack 8198>8197 ack 2 oack 1
+1.1 > 1.1 18 data 8198>8197 ack 2 oack 1 seg 1
+1.1 > 1.1 15 data-ack 8197>8198 ack 1 oack 0
+1.1 > 1.1 19 link-service 8195>8196 ack 0 ackdat 2 seg 2 dat seg count 0
+1.1 > 1.1 15 ils-ack 8196>8195 ack 2 ackdat 2
+endnode-hello endnode vers 2 eco 0 ueco 0 src 1.1 blksize 16434 rtr 0.0 hello 10 data 2
+1.1 > 1.1 19 link-service 8197>8198 ack 0 ackdat 1 seg 2 dat seg count 0
+1.1 > 1.1 19 link-service 8198>8197 ack 1 ackdat 2 seg 1 dat seg count 0
+1.1 > 1.1 15 ils-ack 8198>8197 ack 2 ackdat 2
+1.1 > 1.1 15 ils-ack 8197>8198 ack 1 ackdat 1
+1.1 > 1.1 19 link-service 8195>8196 ack 0 ackdat 2 seg 3 dat seg count 0
+1.1 > 1.1 15 ils-ack 8196>8195 ack 3 ackdat 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 3
+1.1 > 1.1 15 data-ack 8198>8197 ack 3 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 4
+1.1 > 1.1 15 data-ack 8198>8197 ack 4 oack 2
+endnode-hello endnode vers 2 eco 0 ueco 0 src 1.1 blksize 16434 rtr 0.0 hello 10 data 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 5
+1.1 > 1.1 15 data-ack 8198>8197 ack 5 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 6
+1.1 > 1.1 15 data-ack 8198>8197 ack 6 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 7
+1.1 > 1.1 15 data-ack 8198>8197 ack 7 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 8
+1.1 > 1.1 15 data-ack 8198>8197 ack 8 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 9
+1.1 > 1.1 15 data-ack 8198>8197 ack 9 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 10
+1.1 > 1.1 15 data-ack 8198>8197 ack 10 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 11
+1.1 > 1.1 15 data-ack 8198>8197 ack 11 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 12
+1.1 > 1.1 15 data-ack 8198>8197 ack 12 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 13
+1.1 > 1.1 15 data-ack 8198>8197 ack 13 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 14
+1.1 > 1.1 15 data-ack 8198>8197 ack 14 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 15
+1.1 > 1.1 15 data-ack 8198>8197 ack 15 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 16
+1.1 > 1.1 15 data-ack 8198>8197 ack 16 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 17
+1.1 > 1.1 15 data-ack 8198>8197 ack 17 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 18
+1.1 > 1.1 15 data-ack 8198>8197 ack 18 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 19
+1.1 > 1.1 15 data-ack 8198>8197 ack 19 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 20
+1.1 > 1.1 15 data-ack 8198>8197 ack 20 oack 2
+1.1 > 1.1 33 data 8197>8198 ack 1 oack 1 seg 21
+1.1 > 1.1 15 data-ack 8198>8197 ack 21 oack 2
+1.1 > 1.1 19 link-service 8195>8196 ack 0 ackdat 2 seg 4 dat seg count 0
+1.1 > 1.1 15 ils-ack 8196>8195 ack 4 ackdat 2
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 3
+1.1 > 1.1 15 data-ack 8196>8195 ack 3 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 4
+1.1 > 1.1 15 data-ack 8196>8195 ack 4 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 5
+1.1 > 1.1 15 data-ack 8196>8195 ack 5 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 6
+1.1 > 1.1 15 data-ack 8196>8195 ack 6 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 7
+1.1 > 1.1 15 data-ack 8196>8195 ack 7 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 8
+1.1 > 1.1 15 data-ack 8196>8195 ack 8 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 9
+1.1 > 1.1 15 data-ack 8196>8195 ack 9 oack 4
+endnode-hello endnode vers 2 eco 0 ueco 0 src 1.1 blksize 16434 rtr 0.0 hello 10 data 2
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 10
+1.1 > 1.1 15 data-ack 8196>8195 ack 10 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 11
+1.1 > 1.1 15 data-ack 8196>8195 ack 11 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 12
+1.1 > 1.1 15 data-ack 8196>8195 ack 12 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 13
+1.1 > 1.1 15 data-ack 8196>8195 ack 13 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 14
+1.1 > 1.1 15 data-ack 8196>8195 ack 14 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 15
+1.1 > 1.1 15 data-ack 8196>8195 ack 15 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 16
+1.1 > 1.1 15 data-ack 8196>8195 ack 16 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 17
+1.1 > 1.1 15 data-ack 8196>8195 ack 17 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 18
+1.1 > 1.1 15 data-ack 8196>8195 ack 18 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 19
+1.1 > 1.1 15 data-ack 8196>8195 ack 19 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 20
+1.1 > 1.1 15 data-ack 8196>8195 ack 20 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 21
+1.1 > 1.1 15 data-ack 8196>8195 ack 21 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 22
+1.1 > 1.1 15 data-ack 8196>8195 ack 22 oack 4
+1.1 > 1.1 33 data 8195>8196 ack 2 oack 0 seg 23
+1.1 > 1.1 15 data-ack 8196>8195 ack 23 oack 4
+1.1 > 1.1 19 link-service 8197>8198 ack 1 ackdat 1 seg 3 dat seg count 0
+1.1 > 1.1 19 link-service 8198>8197 ack 2 ackdat 21 seg 2 dat seg count 0
+1.1 > 1.1 15 ils-ack 8198>8197 ack 3 ackdat 21
+1.1 > 1.1 15 ils-ack 8197>8198 ack 2 ackdat 1
+endnode-hello endnode vers 2 eco 0 ueco 0 src 1.1 blksize 16434 rtr 0.0 hello 10 data 2
+1.1 > 1.1 32 data 8197>8198 ack 1 oack 2 seg 22
+1.1 > 1.1 15 data-ack 8198>8197 ack 22 oack 3
+1.1 > 1.1 32 data 8197>8198 ack 1 oack 2 seg 23
+1.1 > 1.1 15 data-ack 8198>8197 ack 23 oack 3
+1.1 > 1.1 14 disconn-initiate 8196>8195 object rejected connect
+1.1 > 1.1 13 disconn-confirm 8195>8196 disconnect complete
+1.1 > 1.1 14 disconn-initiate 8197>8198 object rejected connect
+1.1 > 1.1 13 disconn-confirm 8198>8197 disconnect complete
+1.1 > 1.1 13 disconn-confirm 8198>8197 disconnect complete
+1.1 > 1.1 13 disconn-confirm 8195>8196 disconnect complete
+endnode-hello endnode vers 2 eco 0 ueco 0 src 1.1 blksize 16434 rtr 0.0 hello 10 data 2
--- /dev/null
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:0c:29:1f:74:06, length 300, xid 0x6e32864, Flags [none]
+ Client-Ethernet-Address 00:0c:29:1f:74:06
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Requested-IP Option 50, length 4: 192.168.1.4
+ Parameter-Request Option 55, length 7:
+ Subnet-Mask, BR, Time-Zone, Default-Gateway
+ Domain-Name, Domain-Name-Server, Hostname
+ User-Class Option 77, length 37:
+ instance#1: "subopt1", length 7
+ instance#2: "subopt2-123456789", length 17
+ instance#3: "subopt3-12", length 10
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 308)
+ 192.168.1.1.67 > 192.168.1.4.68: BOOTP/DHCP, Reply, length 280, xid 0x6e32864, Flags [none]
+ Your-IP 192.168.1.4
+ Client-Ethernet-Address 00:0c:29:1f:74:06
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Offer
+ Server-ID Option 54, length 4: 192.168.1.1
+ Lease-Time Option 51, length 4: 86400
+ Subnet-Mask Option 1, length 4: 255.255.255.0
+ Default-Gateway Option 3, length 4: 192.168.1.1
+ Domain-Name-Server Option 6, length 4: 192.168.1.1
+ Domain-Name Option 15, length 4: "Home"
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 332)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:0c:29:1f:74:06, length 304, xid 0x6e32864, Flags [none]
+ Client-Ethernet-Address 00:0c:29:1f:74:06
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Request
+ Server-ID Option 54, length 4: 192.168.1.1
+ Requested-IP Option 50, length 4: 192.168.1.4
+ Parameter-Request Option 55, length 7:
+ Subnet-Mask, BR, Time-Zone, Default-Gateway
+ Domain-Name, Domain-Name-Server, Hostname
+ User-Class Option 77, length 37:
+ instance#1: "subopt1", length 7
+ instance#2: "subopt2-123456789", length 17
+ instance#3: "subopt3-12", length 10
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 308)
+ 192.168.1.1.67 > 192.168.1.4.68: BOOTP/DHCP, Reply, length 280, xid 0x6e32864, Flags [none]
+ Your-IP 192.168.1.4
+ Client-Ethernet-Address 00:0c:29:1f:74:06
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: ACK
+ Server-ID Option 54, length 4: 192.168.1.1
+ Lease-Time Option 51, length 4: 86400
+ Subnet-Mask Option 1, length 4: 255.255.255.0
+ Default-Gateway Option 3, length 4: 192.168.1.1
+ Domain-Name-Server Option 6, length 4: 192.168.1.1
+ Domain-Name Option 15, length 4: "Home"
--- /dev/null
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:0c:29:1f:74:06, length 300, xid 0xde549277, Flags [none]
+ Client-Ethernet-Address 00:0c:29:1f:74:06
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Discover
+ Parameter-Request Option 55, length 8:
+ Subnet-Mask, BR, Time-Zone, Default-Gateway
+ Domain-Name, Domain-Name-Server, Hostname, TFTP-Server-Address
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 192.168.1.1.67 > 192.168.1.4.68: BOOTP/DHCP, Reply, length 300, xid 0xde549277, Flags [none]
+ Your-IP 192.168.1.4
+ Client-Ethernet-Address 00:0c:29:1f:74:06
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Offer
+ Server-ID Option 54, length 4: 192.168.1.1
+ Lease-Time Option 51, length 4: 43200
+ Subnet-Mask Option 1, length 4: 255.255.255.0
+ Default-Gateway Option 3, length 4: 192.168.1.1
+ TFTP-Server-Address Option 150, length 8: 192.168.1.10,192.168.1.11
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:0c:29:1f:74:06, length 300, xid 0xde549277, Flags [none]
+ Client-Ethernet-Address 00:0c:29:1f:74:06
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: Request
+ Server-ID Option 54, length 4: 192.168.1.1
+ Requested-IP Option 50, length 4: 192.168.1.4
+ Parameter-Request Option 55, length 8:
+ Subnet-Mask, BR, Time-Zone, Default-Gateway
+ Domain-Name, Domain-Name-Server, Hostname, TFTP-Server-Address
+IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
+ 192.168.1.1.67 > 192.168.1.4.68: BOOTP/DHCP, Reply, length 300, xid 0xde549277, Flags [none]
+ Your-IP 192.168.1.4
+ Client-Ethernet-Address 00:0c:29:1f:74:06
+ Vendor-rfc1048 Extensions
+ Magic Cookie 0x63825363
+ DHCP-Message Option 53, length 1: ACK
+ Server-ID Option 54, length 4: 192.168.1.1
+ Lease-Time Option 51, length 4: 43200
+ Subnet-Mask Option 1, length 4: 255.255.255.0
+ Default-Gateway Option 3, length 4: 192.168.1.1
+ TFTP-Server-Address Option 150, length 8: 192.168.1.10,192.168.1.11
--- /dev/null
+IP6 (class 0xc0, hlim 64, next-header UDP (17) payload length: 56) fe80::201:2ff:fe03:405.546 > ff02::1:2.547: [udp sum ok] dhcp6 solicit (xid=d81eb8 (client-ID hwaddr type 1 000102030405) (option-request DNS-server AFTR-Name) (elapsed-time 0) (IA_PD IAID:33752069 T1:3600 T2:5400))
+IP6 (hlim 64, next-header UDP (17) payload length: 142) fe80::211:22ff:fe33:4455.547 > fe80::201:2ff:fe03:405.546: [udp sum ok] dhcp6 advertise (xid=d81eb8 (IA_PD IAID:33752069 T1:150 T2:250 (IA_PD-prefix 2a00:1:1:100::/56 pltime:250 vltime:300)) (client-ID hwaddr type 1 000102030405) (server-ID hwaddr/time type 1 time 406802160 001122334455) (preference 10) (DNS-server 2a01::1) (AFTR-Name aftr-name.mydomain.net))
+IP6 (class 0xc0, hlim 64, next-header UDP (17) payload length: 103) fe80::201:2ff:fe03:405.546 > ff02::1:2.547: [udp sum ok] dhcp6 request (xid=1e291d (client-ID hwaddr type 1 000102030405) (server-ID hwaddr/time type 1 time 406802160 001122334455) (option-request DNS-server AFTR-Name) (elapsed-time 0) (IA_PD IAID:33752069 T1:3600 T2:5400 (IA_PD-prefix 2a00:1:1:100::/56 pltime:7200 vltime:7500)))
+IP6 (hlim 64, next-header UDP (17) payload length: 142) fe80::211:22ff:fe33:4455.547 > fe80::201:2ff:fe03:405.546: [udp sum ok] dhcp6 reply (xid=1e291d (IA_PD IAID:33752069 T1:150 T2:250 (IA_PD-prefix 2a00:1:1:100::/56 pltime:250 vltime:300)) (client-ID hwaddr type 1 000102030405) (server-ID hwaddr/time type 1 time 406802160 001122334455) (preference 10) (DNS-server 2a01::1) (AFTR-Name aftr-name.mydomain.net))
--- /dev/null
+IP6 (hlim 64, next-header UDP (17) payload length: 101) fe80::20c:29ff:fe9b:a15d.547 > fe80::20c:29ff:fe38:f368.546: [udp sum ok] dhcp6 reply (xid=aa56ce (client-ID hwaddr/time type 1 time 418384703 000c2938f368) (server-ID hwaddr/time type 1 time 418354459 000c299ba153) (DNS-search-list example.com. sales.example.com. eng.example.com.))
--- /dev/null
+IP6 (class 0xc0, hlim 64, next-header UDP (17) payload length: 56) fe80::201:2ff:fe03:405.546 > ff02::1:2.547: [udp sum ok] dhcp6 solicit (xid=90b45c (client-ID hwaddr type 1 000102030405) (option-request DNS-server DNS-search-list) (elapsed-time 0) (IA_NA IAID:33752069 T1:3600 T2:5400))
+IP6 (hlim 64, next-header UDP (17) payload length: 88) fe80::211:22ff:fe33:4455.547 > fe80::201:2ff:fe03:405.546: [udp sum ok] dhcp6 advertise (xid=90b45c (IA_NA IAID:33752069 T1:3600 T2:5400 (IA_ADDR 2a00:1:1:200:38e6:b22e:c440:acdf pltime:4500 vltime:7200)) (client-ID hwaddr type 1 000102030405) (server-ID hwaddr/time type 1 time 407259276 001122334455))
+IP6 (class 0xc0, hlim 64, next-header UDP (17) payload length: 102) fe80::201:2ff:fe03:405.546 > ff02::1:2.547: [udp sum ok] dhcp6 request (xid=2ffdd1 (client-ID hwaddr type 1 000102030405) (server-ID hwaddr/time type 1 time 407259276 001122334455) (option-request DNS-server DNS-search-list) (elapsed-time 0) (IA_NA IAID:33752069 T1:3600 T2:5400 (IA_ADDR 2a00:1:1:200:38e6:b22e:c440:acdf pltime:7200 vltime:7500)))
+IP6 (hlim 64, next-header UDP (17) payload length: 88) fe80::211:22ff:fe33:4455.547 > fe80::201:2ff:fe03:405.546: [udp sum ok] dhcp6 reply (xid=2ffdd1 (IA_NA IAID:33752069 T1:3600 T2:5400 (IA_ADDR 2a00:1:1:200:38e6:b22e:c440:acdf pltime:4500 vltime:7200)) (client-ID hwaddr type 1 000102030405) (server-ID hwaddr/time type 1 time 407259276 001122334455))
--- /dev/null
+IP6 (class 0xc0, hlim 64, next-header UDP (17) payload length: 56) fe80::201:2ff:fe03:405.546 > ff02::1:2.547: [udp sum ok] dhcp6 solicit (xid=e1e093 (client-ID hwaddr type 1 000102030405) (option-request DNS-server DNS-search-list) (elapsed-time 0) (IA_PD IAID:33752069 T1:3600 T2:5400))
+IP6 (hlim 64, next-header UDP (17) payload length: 89) fe80::211:22ff:fe33:4455.547 > fe80::201:2ff:fe03:405.546: [udp sum ok] dhcp6 advertise (xid=e1e093 (IA_PD IAID:33752069 T1:3600 T2:5400 (IA_PD-prefix 2a00:1:1:100::/56 pltime:4500 vltime:7200)) (client-ID hwaddr type 1 000102030405) (server-ID hwaddr/time type 1 time 407259545 001122334455))
+IP6 (class 0xc0, hlim 64, next-header UDP (17) payload length: 103) fe80::201:2ff:fe03:405.546 > ff02::1:2.547: [udp sum ok] dhcp6 request (xid=12b08a (client-ID hwaddr type 1 000102030405) (server-ID hwaddr/time type 1 time 407259545 001122334455) (option-request DNS-server DNS-search-list) (elapsed-time 0) (IA_PD IAID:33752069 T1:3600 T2:5400 (IA_PD-prefix 2a00:1:1:100::/56 pltime:7200 vltime:7500)))
+IP6 (hlim 64, next-header UDP (17) payload length: 89) fe80::211:22ff:fe33:4455.547 > fe80::201:2ff:fe03:405.546: [udp sum ok] dhcp6 reply (xid=12b08a (IA_PD IAID:33752069 T1:3600 T2:5400 (IA_PD-prefix 2a00:1:1:100::/56 pltime:4500 vltime:7200)) (client-ID hwaddr type 1 000102030405) (server-ID hwaddr/time type 1 time 407259545 001122334455))
--- /dev/null
+IP6 (class 0xc0, hlim 64, next-header UDP (17) payload length: 48) fe80::201:2ff:fe03:405.546 > ff02::1:2.547: [udp sum ok] dhcp6 solicit (xid=28b040 (client-ID hwaddr type 1 000102030405) (option-request DNS-server DNS-search-list) (elapsed-time 0) (IA_TA IAID:33752069))
+IP6 (hlim 64, next-header UDP (17) payload length: 80) fe80::211:22ff:fe33:4455.547 > fe80::201:2ff:fe03:405.546: [udp sum ok] dhcp6 advertise (xid=28b040 (IA_TA IAID:33752069 (IA_ADDR 2a00:1:1:200:5da2:f920:84c4:88cc pltime:4500 vltime:7200)) (client-ID hwaddr type 1 000102030405) (server-ID hwaddr/time type 1 time 407259120 001122334455))
+IP6 (class 0xc0, hlim 64, next-header UDP (17) payload length: 94) fe80::201:2ff:fe03:405.546 > ff02::1:2.547: [udp sum ok] dhcp6 request (xid=2b0e45 (client-ID hwaddr type 1 000102030405) (server-ID hwaddr/time type 1 time 407259120 001122334455) (option-request DNS-server DNS-search-list) (elapsed-time 0) (IA_TA IAID:33752069 (IA_ADDR 2a00:1:1:200:5da2:f920:84c4:88cc pltime:7200 vltime:7500)))
+IP6 (hlim 64, next-header UDP (17) payload length: 80) fe80::211:22ff:fe33:4455.547 > fe80::201:2ff:fe03:405.546: [udp sum ok] dhcp6 reply (xid=2b0e45 (IA_TA IAID:33752069 (IA_ADDR 2a00:1:1:200:5da2:f920:84c4:88cc pltime:4500 vltime:7200)) (client-ID hwaddr type 1 000102030405) (server-ID hwaddr/time type 1 time 407259120 001122334455))
--- /dev/null
+IP6 (hlim 64, next-header UDP (17) payload length: 113) fe80::20c:29ff:fe9b:a15d.547 > fe80::20c:29ff:fe38:f368.546: [udp sum ok] dhcp6 reply (xid=f69b57 (client-ID hwaddr/time type 1 time 418384703 000c2938f368) (server-ID hwaddr/time type 1 time 418354459 000c299ba153) (NTP-server subopt:1 2a01::1 subopt:2 ff05::101 subopt:3 ntp.example.com.))
--- /dev/null
+IP6 (hlim 64, next-header UDP (17) payload length: 114) fe80::20c:29ff:fe9b:a15d.547 > fe80::20c:29ff:fe38:f368.546: [udp sum ok] dhcp6 reply (xid=6890d8 (client-ID hwaddr/time type 1 time 418384703 000c2938f368) (server-ID hwaddr/time type 1 time 418354459 000c299ba153) (SIP-servers-domain sip1.my-domain.net. sip2.example.com. sip3.sub.my-domain.org.))
--- /dev/null
+DTPv1, length 38
+ Domain TLV (0x0001) TLV, length 8, Lab
+ Status TLV (0x0002) TLV, length 5, 0x4
+ DTP type TLV (0x0003) TLV, length 5, 0x40
+ Neighbor TLV (0x0004) TLV, length 10, 00:19:06:ea:b8:85
+00:19:06:ea:b8:85 > 01:00:0c:00:00:00 SNAP Unnumbered, ui, Flags [Command], length 76
+DTPv1, length 38
+ Domain TLV (0x0001) TLV, length 8, Lab
+ Status TLV (0x0002) TLV, length 5, 0x4
+ DTP type TLV (0x0003) TLV, length 5, 0x40
+ Neighbor TLV (0x0004) TLV, length 10, 00:19:06:ea:b8:85
+00:19:06:ea:b8:85 > 01:00:0c:00:00:00 SNAP Unnumbered, ui, Flags [Command], length 76
+DTPv1, length 38
+ Domain TLV (0x0001) TLV, length 8, Lab
+ Status TLV (0x0002) TLV, length 5, 0x4
+ DTP type TLV (0x0003) TLV, length 5, 0x40
+ Neighbor TLV (0x0004) TLV, length 10, 00:19:06:ea:b8:85
+00:19:06:ea:b8:85 > 01:00:0c:00:00:00 SNAP Unnumbered, ui, Flags [Command], length 76
+DTPv1, length 38
+ Domain TLV (0x0001) TLV, length 8, Lab
+ Status TLV (0x0002) TLV, length 5, 0x4
+ DTP type TLV (0x0003) TLV, length 5, 0x40
+ Neighbor TLV (0x0004) TLV, length 10, 00:19:06:ea:b8:85
+00:19:06:ea:b8:85 > 01:00:0c:00:00:00 SNAP Unnumbered, ui, Flags [Command], length 76
+DTPv1, length 38
+ Domain TLV (0x0001) TLV, length 8, Lab
+ Status TLV (0x0002) TLV, length 5, 0x4
+ DTP type TLV (0x0003) TLV, length 5, 0x40
+ Neighbor TLV (0x0004) TLV, length 10, 00:19:06:ea:b8:85
+00:19:06:ea:b8:85 > 01:00:0c:00:00:00 SNAP Unnumbered, ui, Flags [Command], length 76
--- /dev/null
+IP 10.0.0.1 > 2.2.2.2: igmp dvmrp Ask-neighbors2
+IP 2.2.2.2 > 10.0.0.1: igmp dvmrp Neighbors2 (v 12.4): [10.0.0.2 -> 10.0.0.1 (1/0/querier)] [10.0.0.9 -> 10.0.0.10 (1/0)]
--- /dev/null
+IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 0, length 64
+IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 0, length 64
+IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 1, length 64
+IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 1, length 64
+IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 2, length 64
+IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 2, length 64
+IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 3, length 64
+IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 3, length 64
+IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 4, length 64
+IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 4, length 64
+IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 5, length 64
+IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 5, length 64
+IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 6, length 64
+IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 6, length 64
+IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 7, length 64
+IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 7, length 64
+IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 8, length 64
+IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 8, length 64
+IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 9, length 64
+IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 9, length 64
--- /dev/null
+set args -r eapon1.pcap
--- /dev/null
+IP 192.168.1.249.138 > 192.168.1.255.138: NBT UDP PACKET(138)
+IP 192.168.1.249.138 > 192.168.1.255.138: NBT UDP PACKET(138)
+IP 192.168.1.249.138 > 192.168.1.255.138: NBT UDP PACKET(138)
+IP 192.168.1.249.137 > 192.168.1.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
+IP 192.168.1.249.137 > 192.168.1.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
+IP 192.168.1.249.137 > 192.168.1.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
+IP 192.168.1.249.138 > 192.168.1.255.138: NBT UDP PACKET(138)
+IP 192.168.1.249.137 > 192.168.1.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
+IP 192.168.1.249.137 > 192.168.1.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
+IP 192.168.1.249.137 > 192.168.1.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
+ARP, Request who-has 192.168.1.1 tell 192.168.1.249, length 28
+ARP, Reply 192.168.1.1 is-at 00:0d:88:4f:25:91, length 46
+IP 192.168.1.249.68 > 192.168.1.1.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300
+EAP packet (0) v1, len 5
+IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300
+IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300
+EAPOL start (1) v1, len 0
+EAP packet (0) v1, len 5
+EAP packet (0) v1, len 45
+EAP packet (0) v1, len 20
+EAP packet (0) v1, len 76
+EAP packet (0) v1, len 80
+EAP packet (0) v1, len 28
+EAP packet (0) v1, len 4
+EAPOL key (3) v1, len 57
+EAPOL key (3) v1, len 44
+IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300
+IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300
+IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300
+EAPOL start (1) v1, len 0
+EAP packet (0) v1, len 5
+EAP packet (0) v1, len 45
+EAP packet (0) v1, len 20
+EAP packet (0) v1, len 76
+EAP packet (0) v1, len 80
+EAP packet (0) v1, len 28
+EAP packet (0) v1, len 4
+EAPOL key (3) v1, len 57
+EAPOL key (3) v1, len 44
+ARP, Request who-has 169.254.67.194 tell 169.254.67.194, length 28
+ARP, Request who-has 169.254.67.194 tell 169.254.67.194, length 28
+ARP, Request who-has 169.254.67.194 tell 169.254.67.194, length 28
+IP 169.254.67.194.4299 > 239.255.255.250.1900: UDP, length 133
+IP 169.254.67.194 > 224.0.0.22: igmp v3 report, 1 group record(s)
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194 > 224.0.0.22: igmp v3 report, 1 group record(s)
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.4299 > 239.255.255.250.1900: UDP, length 133
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+EAPOL start (1) v1, len 0
+EAP packet (0) v1, len 5
+EAP packet (0) v1, len 45
+EAP packet (0) v1, len 20
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+EAP packet (0) v1, len 76
+EAP packet (0) v1, len 80
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+EAP packet (0) v1, len 28
+EAP packet (0) v1, len 4
+EAPOL key (3) v1, len 57
+EAPOL key (3) v1, len 44
+IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300
+IP 169.254.67.194.4299 > 239.255.255.250.1900: UDP, length 133
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138)
+IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138)
+IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138)
+IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138)
+IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138)
+IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300
+IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138)
+IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138)
+IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138)
+IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138)
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST
+IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138)
+IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138)
+IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138)
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
+IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
+IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300
+EAPOL start (1) v1, len 0
+EAP packet (0) v1, len 5
+EAP packet (0) v1, len 45
+EAP packet (0) v1, len 20
+IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138)
+EAP packet (0) v1, len 76
+EAP packet (0) v1, len 80
+EAP packet (0) v1, len 28
+EAP packet (0) v1, len 4
+EAPOL key (3) v1, len 57
+EAPOL key (3) v1, len 44
--- /dev/null
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.1 > 10.0.0.2:
+ EIGRP v2, opcode: Update (1), chksum: 0xfd82, Flags: [Init]
+ seq: 0x00000017, ack: 0x00000000, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.1 > 10.0.0.2:
+ EIGRP v2, opcode: Update (1), chksum: 0xfd82, Flags: [Init]
+ seq: 0x00000017, ack: 0x00000000, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.2 > 10.0.0.1:
+ EIGRP v2, opcode: Update (1), chksum: 0xfd6b, Flags: [Init]
+ seq: 0x00000017, ack: 0x00000017, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 239)
+ 10.0.0.1 > 10.0.0.2:
+ EIGRP v2, opcode: Update (1), chksum: 0x24b9, Flags: [none]
+ seq: 0x00000018, ack: 0x00000017, AS: 100, length: 199
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.1.0/24, nexthop: self
+ delay 25 ms, bandwidth 25600 Kbps, mtu 1500, hop 0, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 29
+ IPv4 prefix: 10.0.0.4/30, nexthop: self
+ delay 256 ms, bandwidth 256000 Kbps, mtu 1500, hop 0, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.3.0/24, nexthop: self
+ delay 281 ms, bandwidth 256000 Kbps, mtu 1500, hop 1, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 29
+ IPv4 prefix: 10.0.0.12/30, nexthop: self
+ delay 512 ms, bandwidth 256000 Kbps, mtu 1500, hop 1, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.4.0/24, nexthop: self
+ delay 537 ms, bandwidth 256000 Kbps, mtu 1500, hop 2, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 29
+ IPv4 prefix: 10.0.0.8/30, nexthop: self
+ delay 768 ms, bandwidth 256000 Kbps, mtu 1500, hop 2, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.2.0/24, nexthop: self
+ delay 793 ms, bandwidth 256000 Kbps, mtu 1500, hop 3, reliability 255, load 1
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 154)
+ 10.0.0.2 > 10.0.0.1:
+ EIGRP v2, opcode: Update (1), chksum: 0x7d9b, Flags: [none]
+ seq: 0x00000018, ack: 0x00000018, AS: 100, length: 114
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.2.0/24, nexthop: self
+ delay 25 ms, bandwidth 25600 Kbps, mtu 1500, hop 0, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 29
+ IPv4 prefix: 10.0.0.8/30, nexthop: self
+ delay 256 ms, bandwidth 256000 Kbps, mtu 1500, hop 0, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.4.0/24, nexthop: self
+ delay 281 ms, bandwidth 256000 Kbps, mtu 1500, hop 1, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 29
+ IPv4 prefix: 10.0.0.12/30, nexthop: self
+ delay 512 ms, bandwidth 256000 Kbps, mtu 1500, hop 1, reliability 255, load 1
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.1 > 10.0.0.2:
+ EIGRP v2, opcode: Hello (5), chksum: 0xfd7e, Flags: [none]
+ seq: 0x00000000, ack: 0x00000018, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 77)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xc352, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 37
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+ Sequence TLV (0x0003), length: 9
+ 0x0000: 040a 0000 01
+ Next Multicast Sequence TLV (0x0005), length: 8
+ 0x0000: 0000 0019
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 125)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Update (1), chksum: 0xa2d8, Flags: [Conditionally Received]
+ seq: 0x00000019, ack: 0x00000000, AS: 100, length: 85
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.1.0/24, nexthop: self
+ delay 42949672 ms, bandwidth 256000 Kbps, mtu 1500, hop 1, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 29
+ IPv4 prefix: 10.0.0.4/30, nexthop: self
+ delay 42949672 ms, bandwidth 256000 Kbps, mtu 1500, hop 1, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.3.0/24, nexthop: self
+ delay 42949672 ms, bandwidth 256000 Kbps, mtu 1500, hop 2, reliability 255, load 1
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 125)
+ 10.0.0.2 > 10.0.0.1:
+ EIGRP v2, opcode: Update (1), chksum: 0xa2c2, Flags: [none]
+ seq: 0x00000019, ack: 0x00000018, AS: 100, length: 85
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.1.0/24, nexthop: self
+ delay 42949672 ms, bandwidth 256000 Kbps, mtu 1500, hop 1, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 29
+ IPv4 prefix: 10.0.0.4/30, nexthop: self
+ delay 42949672 ms, bandwidth 256000 Kbps, mtu 1500, hop 1, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.3.0/24, nexthop: self
+ delay 42949672 ms, bandwidth 256000 Kbps, mtu 1500, hop 2, reliability 255, load 1
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.1 > 10.0.0.2:
+ EIGRP v2, opcode: Hello (5), chksum: 0xfd7d, Flags: [none]
+ seq: 0x00000000, ack: 0x00000019, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 125)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Update (1), chksum: 0x9dd9, Flags: [none]
+ seq: 0x00000019, ack: 0x00000000, AS: 100, length: 85
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.2.0/24, nexthop: self
+ delay 42949672 ms, bandwidth 256000 Kbps, mtu 1500, hop 1, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 29
+ IPv4 prefix: 10.0.0.8/30, nexthop: self
+ delay 42949672 ms, bandwidth 256000 Kbps, mtu 1500, hop 1, reliability 255, load 1
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.4.0/24, nexthop: self
+ delay 42949672 ms, bandwidth 256000 Kbps, mtu 1500, hop 2, reliability 255, load 1
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.2 > 10.0.0.1:
+ EIGRP v2, opcode: Hello (5), chksum: 0xfd7d, Flags: [none]
+ seq: 0x00000000, ack: 0x00000019, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
--- /dev/null
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xf167, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 255, k2 255, k3 255, k4 255, k5 255
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
--- /dev/null
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 68)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Update (1), chksum: 0x7876, Flags: [none]
+ seq: 0x00000034, ack: 0x00000000, AS: 100, length: 28
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.4.0/24, nexthop: self
+ delay 42949672 ms, bandwidth 256000 Kbps, mtu 1500, hop 2, reliability 255, load 1
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.2 > 10.0.0.1:
+ EIGRP v2, opcode: Hello (5), chksum: 0xfd62, Flags: [none]
+ seq: 0x00000000, ack: 0x00000034, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 68)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Query (3), chksum: 0x5f7e, Flags: [none]
+ seq: 0x0000002e, ack: 0x00000000, AS: 100, length: 28
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.4.0/24, nexthop: self
+ delay 42949672 ms, bandwidth 0 Kbps, mtu 1500, hop 0, reliability 0, load 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.1 > 10.0.0.2:
+ EIGRP v2, opcode: Hello (5), chksum: 0xfd68, Flags: [none]
+ seq: 0x00000000, ack: 0x0000002e, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 68)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Query (3), chksum: 0x5f75, Flags: [none]
+ seq: 0x00000037, ack: 0x00000000, AS: 100, length: 28
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.4.0/24, nexthop: self
+ delay 42949672 ms, bandwidth 0 Kbps, mtu 1500, hop 0, reliability 0, load 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.2 > 10.0.0.1:
+ EIGRP v2, opcode: Hello (5), chksum: 0xfd5f, Flags: [none]
+ seq: 0x00000000, ack: 0x00000037, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 68)
+ 10.0.0.2 > 10.0.0.1:
+ EIGRP v2, opcode: Reply (4), chksum: 0x5f44, Flags: [none]
+ seq: 0x00000030, ack: 0x00000037, AS: 100, length: 28
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.4.0/24, nexthop: self
+ delay 42949672 ms, bandwidth 0 Kbps, mtu 1500, hop 0, reliability 0, load 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.1 > 10.0.0.2:
+ EIGRP v2, opcode: Hello (5), chksum: 0xfd66, Flags: [none]
+ seq: 0x00000000, ack: 0x00000030, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 68)
+ 10.0.0.1 > 10.0.0.2:
+ EIGRP v2, opcode: Reply (4), chksum: 0x5f46, Flags: [none]
+ seq: 0x00000039, ack: 0x00000030, AS: 100, length: 28
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.4.0/24, nexthop: self
+ delay 42949672 ms, bandwidth 0 Kbps, mtu 1500, hop 0, reliability 0, load 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.2 > 10.0.0.1:
+ EIGRP v2, opcode: Hello (5), chksum: 0xfd5d, Flags: [none]
+ seq: 0x00000000, ack: 0x00000039, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
--- /dev/null
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 68)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Update (1), chksum: 0x0a7e, Flags: [none]
+ seq: 0x0000002d, ack: 0x00000000, AS: 100, length: 28
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.4.0/24, nexthop: self
+ delay 281 ms, bandwidth 256000 Kbps, mtu 1500, hop 1, reliability 255, load 1
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 68)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Update (1), chksum: 0xa67a, Flags: [none]
+ seq: 0x0000002f, ack: 0x00000000, AS: 100, length: 28
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.4.0/24, nexthop: self
+ delay 537 ms, bandwidth 256000 Kbps, mtu 1500, hop 2, reliability 255, load 1
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.1 > 10.0.0.2:
+ EIGRP v2, opcode: Hello (5), chksum: 0xfd69, Flags: [none]
+ seq: 0x00000000, ack: 0x0000002d, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.2 > 10.0.0.1:
+ EIGRP v2, opcode: Hello (5), chksum: 0xfd67, Flags: [none]
+ seq: 0x00000000, ack: 0x0000002f, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 68)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Update (1), chksum: 0x7878, Flags: [none]
+ seq: 0x00000032, ack: 0x00000000, AS: 100, length: 28
+ IP Internal routes TLV (0x0102), length: 28
+ IPv4 prefix: 192.168.4.0/24, nexthop: self
+ delay 42949672 ms, bandwidth 256000 Kbps, mtu 1500, hop 2, reliability 255, load 1
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 40)
+ 10.0.0.2 > 10.0.0.1:
+ EIGRP v2, opcode: Hello (5), chksum: 0xfd64, Flags: [none]
+ seq: 0x00000000, ack: 0x00000032, AS: 100, length: 0
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.1 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
+IP (tos 0xc0, ttl 2, id 0, offset 0, flags [none], proto EIGRP (88), length 60)
+ 10.0.0.2 > 224.0.0.10:
+ EIGRP v2, opcode: Hello (5), chksum: 0xee68, Flags: [none]
+ seq: 0x00000000, ack: 0x00000000, AS: 100, length: 20
+ General Parameters TLV (0x0001), length: 12
+ holdtime: 15s, k1 1, k2 0, k3 1, k4 0, k5 0
+ Software Version TLV (0x0004), length: 8
+ IOS version: 12.4, EIGRP version 1.2
--- /dev/null
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 471 trail 0 lead 281 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 472 trail 0 lead 281 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 473 trail 0 lead 281 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 474 trail 0 lead 281 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 475 trail 0 lead 281 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 1480)
+ 10.0.0.45.40251 > 239.255.0.16.5563: 39236 > 5563: PGM, length 1428 0x47e3fdad9a9c ODATA trail 0 seq 282 [1452]
+ frame offset 0x0000
+ frame flags+body (8-bit) length 116, flags 0x00 (-|-|-|-|-|-|-|-), first 115 byte(s) of body:
+ 0x0000: 5468 6973 2069 7320 6120 7368 6f72 7420 This.is.a.short.
+ 0x0010: 4153 4349 4920 6d65 7373 6167 6520 666f ASCII.message.fo
+ 0x0020: 6c6c 6f77 6564 2062 7920 6120 7368 6f72 llowed.by.a.shor
+ 0x0030: 7420 6269 6e61 7279 206d 6573 7361 6765 t.binary.message
+ 0x0040: 2c20 6120 6c6f 6e67 6572 2041 5343 4949 ,.a.longer.ASCII
+ 0x0050: 206d 6573 7361 6765 2061 6e64 2061 2073 .message.and.a.s
+ 0x0060: 686f 7274 2041 5343 4949 206d 6573 7361 hort.ASCII.messa
+ 0x0070: 6765 2e ge.
+
+ frame flags+body (8-bit) length 17, flags 0x00 (-|-|-|-|-|-|-|-), first 16 byte(s) of body:
+ 0x0000: 0001 0203 0405 0607 0809 0a0b 0c0d 0e0f ................
+
+ frame flags+body (64-bit) length 2790 (1282 captured), flags 0x00 (-|-|-|-|-|-|-|-), first 128 byte(s) of body:
+ 0x0000: 5468 6520 7175 6963 6b20 6272 6f77 6e20 The.quick.brown.
+ 0x0010: 666f 7820 6a75 6d70 7320 6f76 6572 2074 fox.jumps.over.t
+ 0x0020: 6865 206c 617a 7920 646f 672e 2054 6865 he.lazy.dog..The
+ 0x0030: 2071 7569 636b 2062 726f 776e 2066 6f78 .quick.brown.fox
+ 0x0040: 206a 756d 7073 206f 7665 7220 7468 6520 .jumps.over.the.
+ 0x0050: 6c61 7a79 2064 6f67 2e20 5468 6520 7175 lazy.dog..The.qu
+ 0x0060: 6963 6b20 6272 6f77 6e20 666f 7820 6a75 ick.brown.fox.ju
+ 0x0070: 6d70 7320 6f76 6572 2074 6865 206c 617a mps.over.the.laz
+ [|zmtp1]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 1480)
+ 10.0.0.45.40251 > 239.255.0.16.5563: 39236 > 5563: PGM, length 1428 0x47e3fdad9a9c ODATA trail 0 seq 283 [1452]
+ frame offset 0xffff
+ frame intermediate part, 1426 bytes, first 128 byte(s):
+ 0x0000: 756d 7073 206f 7665 7220 7468 6520 6c61 umps.over.the.la
+ 0x0010: 7a79 2064 6f67 2e20 5468 6520 7175 6963 zy.dog..The.quic
+ 0x0020: 6b20 6272 6f77 6e20 666f 7820 6a75 6d70 k.brown.fox.jump
+ 0x0030: 7320 6f76 6572 2074 6865 206c 617a 7920 s.over.the.lazy.
+ 0x0040: 646f 672e 2054 6865 2071 7569 636b 2062 dog..The.quick.b
+ 0x0050: 726f 776e 2066 6f78 206a 756d 7073 206f rown.fox.jumps.o
+ 0x0060: 7665 7220 7468 6520 6c61 7a79 2064 6f67 ver.the.lazy.dog
+ 0x0070: 2e20 5468 6520 7175 6963 6b20 6272 6f77 ..The.quick.brow
+
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 173)
+ 10.0.0.45.40251 > 239.255.0.16.5563: 39236 > 5563: PGM, length 121 0x47e3fdad9a9c ODATA trail 0 seq 284 [145]
+ frame offset 0x0052
+ frame intermediate part, 82 bytes, first 82 byte(s):
+ 0x0000: 636b 2062 726f 776e 2066 6f78 206a 756d ck.brown.fox.jum
+ 0x0010: 7073 206f 7665 7220 7468 6520 6c61 7a79 ps.over.the.lazy
+ 0x0020: 2064 6f67 2e20 5468 6520 7175 6963 6b20 .dog..The.quick.
+ 0x0030: 6272 6f77 6e20 666f 7820 6a75 6d70 7320 brown.fox.jumps.
+ 0x0040: 6f76 6572 2074 6865 206c 617a 7920 646f over.the.lazy.do
+ 0x0050: 672e g.
+
+ frame flags+body (8-bit) length 36, flags 0x00 (-|-|-|-|-|-|-|-), first 35 byte(s) of body:
+ 0x0000: 5468 6973 2069 7320 7468 6520 7472 6169 This.is.the.trai
+ 0x0010: 6c69 6e67 2041 5343 4949 206d 6573 7361 ling.ASCII.messa
+ 0x0020: 6765 2e ge.
+
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 476 trail 0 lead 284 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 44)
+ 10.0.0.45.46357 > 239.255.0.16.5563: 5563 > 39236: PGM, length 0 0x47e3fdad9a9c SPMR [16]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 477 trail 0 lead 284 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 478 trail 0 lead 284 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 479 trail 0 lead 284 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 480 trail 0 lead 284 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 481 trail 0 lead 284 nla 10.0.0.45 [36]
--- /dev/null
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 471 trail 0 lead 281 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 472 trail 0 lead 281 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 473 trail 0 lead 281 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 474 trail 0 lead 281 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 475 trail 0 lead 281 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 1480)
+ 10.0.0.45.40251 > 239.255.0.16.5563: 39236 > 5563: PGM, length 1428 0x47e3fdad9a9c ODATA trail 0 seq 282 [1452]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 1480)
+ 10.0.0.45.40251 > 239.255.0.16.5563: 39236 > 5563: PGM, length 1428 0x47e3fdad9a9c ODATA trail 0 seq 283 [1452]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 173)
+ 10.0.0.45.40251 > 239.255.0.16.5563: 39236 > 5563: PGM, length 121 0x47e3fdad9a9c ODATA trail 0 seq 284 [145]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 476 trail 0 lead 284 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 44)
+ 10.0.0.45.46357 > 239.255.0.16.5563: 5563 > 39236: PGM, length 0 0x47e3fdad9a9c SPMR [16]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 477 trail 0 lead 284 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 478 trail 0 lead 284 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 479 trail 0 lead 284 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 480 trail 0 lead 284 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto UDP (17), length 64)
+ 10.0.0.45.33280 > 239.255.0.16.5563: 39236 > 5563: PGM, length 0 0x47e3fdad9a9c SPM seq 481 trail 0 lead 284 nla 10.0.0.45 [36]
--- /dev/null
+# a comment
+
+0x12345678@192.1.2.45 3des-cbc-hmac96:0x43434545464649494a4a4c4c4f4f51515252545457575840
+0xabcdabcd@192.0.1.1 3des-cbc-hmac96:0x434545464649494a4a4c4c4f4f5151525254545757584043
+0xd1234567@192.1.2.45 aes256-cbc-hmac96:0xaaaabbbbccccdddd4043434545464649494a4a4c4c4f4f515152525454575758
--- /dev/null
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x1), length 116
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x2), length 116
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x3), length 116
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x4), length 116
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x5), length 116
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x6), length 116
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x7), length 116
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x8), length 116
--- /dev/null
+set args -t -n -E "0x12345678@192.1.2.45 3des-cbc-hmac96:0x4043434545464649494a4a4c4c4f4f515152525454575758" -r 02-sunrise-sunset-esp.pcap
--- /dev/null
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x1), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1280, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x2), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1536, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x3), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1792, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x4), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2048, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x5), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2304, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x6), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2560, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x7), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2816, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x8), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 3072, length 64 (ipip-proto-4)
--- /dev/null
+set args -t -n -E "0x12345678@192.1.2.45 3des-cbc-hmac96:0x43434545464649494a4a4c4c4f4f51515252545457575840,0xabcdabcd@192.0.1.1 3des-cbc-hmac96:0x434545464649494a4a4c4c4f4f5151525254545757584043" -r 08-sunrise-sunset-esp2.pcap
--- /dev/null
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x1), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x1), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1280, length 64 (ipip-proto-4) (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x2), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x2), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1536, length 64 (ipip-proto-4) (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x3), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x3), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1792, length 64 (ipip-proto-4) (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x4), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x4), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2048, length 64 (ipip-proto-4) (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x5), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x5), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2304, length 64 (ipip-proto-4) (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x6), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x6), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2560, length 64 (ipip-proto-4) (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x7), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x7), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2816, length 64 (ipip-proto-4) (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x8), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x8), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 3072, length 64 (ipip-proto-4) (ipip-proto-4)
--- /dev/null
+set args -t -n -E "3des-cbc-hmac96:0x43434545464649494a4a4c4c4f4f51515252545457575840" -r 08-sunrise-sunset-esp2.pcap
--- /dev/null
+set args -t -n -E "file esp-secrets.txt" -r 08-sunrise-sunset-esp2.pcap
+
--- /dev/null
+set args -t -n -E "file esp-secrets.txt" -r 08-sunrise-sunset-aes.pcap
+
+
--- /dev/null
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x1), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1280, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x2), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1536, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x3), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1792, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x4), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2048, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x5), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2304, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x6), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2560, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x7), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2816, length 64 (ipip-proto-4)
+IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x8), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 3072, length 64 (ipip-proto-4)
--- /dev/null
+IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x1), length 116
+IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x2), length 116: ip-proto-227 49
+IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x3), length 116: PIMv13, length 10
+IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x4), length 116
+IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x5), length 116
+IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x6), length 116: ip-proto-183 28
+IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x7), length 116: ip-proto-72 34
+IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x8), length 116: ip-proto-224 59
--- /dev/null
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+LLDP, length 103
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 08:00:27:0d:f1:3c
+ 0x0000: 0408 0027 0df1 3c
+ Port ID TLV (2), length 7
+ Subtype MAC address (3): 08:00:27:0d:f1:3c
+ 0x0000: 0308 0027 0df1 3c
+ Time to Live TLV (3), length 2: TTL 120s
+ 0x0000: 0078
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ 0x0000: 0080 c201 0001
+ Organization specific TLV (127), length 7: OUI Ethernet bridged (0x0080c2)
+ Port and Protocol VLAN ID Subtype (2)
+ port and protocol vlan id (PPVID): 0, flags [supported] (0x02)
+ 0x0000: 0080 c202 0200 00
+ Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
+ VLAN name Subtype (3)
+ vlan id (VID): 1
+ vlan name: default
+ 0x0000: 0080 c203 0001 0764 6566 6175 6c74
+ Organization specific TLV (127), length 13: OUI Ethernet bridged (0x0080c2)
+ Protocol Identity Subtype (4)
+ protocol identity:
+ 0x0000: 0080 c204 0800 0042 4203 0000 03
+ Organization specific TLV (127), length 9: OUI Ethernet bridged (0x0080c2)
+ EVB Subtype (13)
+ EVB Bridge Status
+ RES: 0, BGID: 0, RRCAP: 1, RRCTR: 0
+ EVB Station Status
+ RES: 0, SGID: 0, RRREQ: 0,RRSTAT: 0
+ R: 7, RTE: 20, EVB Mode: EVB Bridge [1]
+ ROL: 0, RWD: 31, RES: 0, ROL: 0, RKA: 31
+ 0x0000: 0080 c20d 0200 f45f 1f
+ Organization specific TLV (127), length 11: OUI Ethernet bridged (0x0080c2)
+ CDCP Subtype (14)
+ Role: 0, RES: 0, Scomp: 0 ChnCap: 167
+ SCID: 1, SVID: 1
+ 0x0000: 0080 c20e 0000 00a7 0010 01
+ End TLV (0), length 0
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 102
+ port-role Designated, CIST root-id 8000.08:00:27:0d:f1:3c, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:00:27:0d:f1:3c, CIST port-id 8003,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name Default, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:00:27:0d:f1:3c, CIST remaining-hops 20
--- /dev/null
+IP 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 1048037094] [SID: 0] [SSEQ 1] [PPID 0x0]
+ ForCES Query Response
+
+IP 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 18398476] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES HeartBeat
+
+IP 150.140.254.202.48316 > 211.129.72.8.6706: sctp[ForCES LP] (1) [SACK] [cum ack 18398476] [a_rwnd 57320] [#gap acks 0] [#dup tsns 0]
+IP 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 167996938] [SID: 0] [SSEQ 2] [PPID 0x0]
+ ForCES Query
+
+IP 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 167996939] [SID: 0] [SSEQ 3] [PPID 0x0]
+ ForCES Config
+
+IP 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP] (1) [SACK] [cum ack 167996939] [a_rwnd 57228] [#gap acks 0] [#dup tsns 0]
+IP 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 167996940] [SID: 0] [SSEQ 4] [PPID 0x0]
+ ForCES Config
+
+IP 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 167996941] [SID: 0] [SSEQ 5] [PPID 0x0]
+ ForCES Config
+
+IP 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP] (1) [SACK] [cum ack 167996941] [a_rwnd 57100] [#gap acks 0] [#dup tsns 0]
+IP 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 167996942] [SID: 0] [SSEQ 6] [PPID 0x0]
+ ForCES Config
+
+IP 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP] (1) [SACK] [cum ack 1830592459] [a_rwnd 55272] [#gap acks 0] [#dup tsns 0]
+IP 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP] (1) [HB REQ]
+IP 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP] (1) [HB REQ]
+IP 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP] (1) [HB ACK]
+IP 150.140.254.202.48316 > 211.129.72.8.6706: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1830592460] [SID: 0] [SSEQ 30] [PPID 0x0]
+ ForCES HeartBeat
+
+IP 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP] (1) [HB ACK]
+IP 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 18398553] [SID: 0] [SSEQ 77] [PPID 0x0]
+ ForCES HeartBeat
+
+IP 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 18398573] [SID: 0] [SSEQ 97] [PPID 0x0]
+ ForCES HeartBeat
+
+IP 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP] (1) [SACK] [cum ack 1830592477] [a_rwnd 55272] [#gap acks 0] [#dup tsns 0]
+IP 150.140.254.202.48316 > 211.129.72.8.6706: sctp[ForCES LP] (1) [SACK] [cum ack 18398573] [a_rwnd 56144] [#gap acks 0] [#dup tsns 0]
--- /dev/null
+IP (tos 0x2,ECT(0), ttl 64, id 4, offset 0, flags [DF], proto SCTP (132), length 380)
+ 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1048037094] [SID: 0] [SSEQ 1] [PPID 0x0]
+ ForCES Query Response
+ ForCES Version 1 len 332B flags 0x38400000
+ SrcID 0x2(FE) DstID 0x40000001(CE) Correlator 0x1
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 308 (data length 304 Bytes)
+ FEObj LFB(Classid 1) instance 1
+ Oper TLV GetResp(0x9) length 296
+ PATH-DATA TLV, length 292 (data encapsulated 288 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ FULLDATA TLV (Length 280 DataLen 276 Bytes)
+ [
+ 0x0000: 0000 0000 0000 0001 0000 0001 0000 0001
+ 0x0010: 0000 0002 0000 0001 0000 0002 0000 0003
+ 0x0020: 0000 0001 0000 0003 0000 0003 0000 0002
+ 0x0030: 0000 0004 0000 0004 0000 0001 0000 0005
+ 0x0040: 0000 0004 0000 0002 0000 0006 0000 0005
+ 0x0050: 0000 0001 0000 0007 0000 0005 0000 0002
+ 0x0060: 0000 0008 0000 0006 0000 0001 0000 0009
+ 0x0070: 0000 0007 0000 0001 0000 000a 0000 0007
+ 0x0080: 0000 0002 0000 000b 0000 0008 0000 0001
+ 0x0090: 0000 000c 0000 0009 0000 0001 0000 000d
+ 0x00a0: 0000 000a 0000 0001 0000 000e 0000 000b
+ 0x00b0: 0000 0001 0000 000f 0000 000c 0000 0001
+ 0x00c0: 0000 0010 0000 000d 0000 0001 0000 0011
+ 0x00d0: 0000 000e 0000 0001 0000 0012 0000 000f
+ 0x00e0: 0000 0001 0000 0013 0000 0010 0000 0001
+ 0x00f0: 0000 0014 0000 0011 0000 0001 0000 0015
+ 0x0100: 0000 0012 0000 0001 0000 0016 0000 0013
+ 0x0110: 0000 0001
+ ]
+
+
+IP (tos 0x0, ttl 46, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 18398476] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x2
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 48)
+ 150.140.254.202.48316 > 211.129.72.8.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 18398476] [a_rwnd 57320] [#gap acks 0] [#dup tsns 0]
+IP (tos 0x0, ttl 46, id 3, offset 0, flags [DF], proto SCTP (132), length 100)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 167996938] [SID: 0] [SSEQ 2] [PPID 0x0]
+ ForCES Query
+ ForCES Version 1 len 52B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x3
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 28 (data length 24 Bytes)
+ FEObj LFB(Classid 1) instance 1
+ Oper TLV Get(0x7) length 16
+ PATH-DATA TLV, length 12 (data encapsulated 8 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+
+
+IP (tos 0x0, ttl 46, id 4, offset 0, flags [DF], proto SCTP (132), length 112)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 167996939] [SID: 0] [SSEQ 3] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 64B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x4
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 40 (data length 36 Bytes)
+ #3(Classid 3) instance 1
+ Oper TLV SetProp(0x2) length 28
+ PATH-DATA TLV, length 24 (data encapsulated 20 Bytes)
+ Pathdata: Flags 0x0 ID count 2
+ ID#01: 60
+ ID#02: 1
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 0000 0001
+ ]
+
+
+IP (tos 0x2,ECT(0), ttl 64, id 5, offset 0, flags [DF], proto SCTP (132), length 48)
+ 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP]
+ 1) [SACK] [cum ack 167996939] [a_rwnd 57228] [#gap acks 0] [#dup tsns 0]
+IP (tos 0x0, ttl 46, id 5, offset 0, flags [DF], proto SCTP (132), length 112)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 167996940] [SID: 0] [SSEQ 4] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 64B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x5
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 40 (data length 36 Bytes)
+ #3(Classid 3) instance 1
+ Oper TLV SetProp(0x2) length 28
+ PATH-DATA TLV, length 24 (data encapsulated 20 Bytes)
+ Pathdata: Flags 0x0 ID count 2
+ ID#01: 60
+ ID#02: 2
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 0000 0001
+ ]
+
+
+IP (tos 0x0, ttl 46, id 6, offset 0, flags [DF], proto SCTP (132), length 112)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 167996941] [SID: 0] [SSEQ 5] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 64B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x6
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 40 (data length 36 Bytes)
+ #3(Classid 3) instance 1
+ Oper TLV SetProp(0x2) length 28
+ PATH-DATA TLV, length 24 (data encapsulated 20 Bytes)
+ Pathdata: Flags 0x0 ID count 2
+ ID#01: 60
+ ID#02: 3
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 0000 0001
+ ]
+
+
+IP (tos 0x2,ECT(0), ttl 64, id 6, offset 0, flags [DF], proto SCTP (132), length 48)
+ 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP]
+ 1) [SACK] [cum ack 167996941] [a_rwnd 57100] [#gap acks 0] [#dup tsns 0]
+IP (tos 0x0, ttl 46, id 7, offset 0, flags [DF], proto SCTP (132), length 112)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 167996942] [SID: 0] [SSEQ 6] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 64B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x7
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 40 (data length 36 Bytes)
+ #3(Classid 3) instance 2
+ Oper TLV SetProp(0x2) length 28
+ PATH-DATA TLV, length 24 (data encapsulated 20 Bytes)
+ Pathdata: Flags 0x0 ID count 2
+ ID#01: 60
+ ID#02: 1
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 0000 0001
+ ]
+
+
+IP (tos 0x0, ttl 46, id 110, offset 0, flags [DF], proto SCTP (132), length 48)
+ 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP]
+ 1) [SACK] [cum ack 1830592459] [a_rwnd 55272] [#gap acks 0] [#dup tsns 0]
+IP (tos 0x2,ECT(0), ttl 64, id 90, offset 0, flags [DF], proto SCTP (132), length 80)
+ 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP]
+ 1) [HB REQ]
+IP (tos 0x0, ttl 46, id 111, offset 0, flags [DF], proto SCTP (132), length 80)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [HB REQ]
+IP (tos 0x2,ECT(0), ttl 64, id 91, offset 0, flags [DF], proto SCTP (132), length 80)
+ 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP]
+ 1) [HB ACK]
+IP (tos 0x2,ECT(0), ttl 64, id 111, offset 0, flags [DF], proto SCTP (132), length 72)
+ 150.140.254.202.48316 > 211.129.72.8.6706: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 1830592460] [SID: 0] [SSEQ 30] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x00000000
+ SrcID 0x2(FE) DstID 0x40000001(CE) Correlator 0x53
+ ForCES flags:
+ NoACK(0x0), prio=0, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+IP (tos 0x0, ttl 46, id 112, offset 0, flags [DF], proto SCTP (132), length 80)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [HB ACK]
+IP (tos 0x0, ttl 46, id 111, offset 0, flags [DF], proto SCTP (132), length 72)
+ 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 18398553] [SID: 0] [SSEQ 77] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x83
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+IP (tos 0x0, ttl 46, id 148, offset 0, flags [DF], proto SCTP (132), length 72)
+ 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 18398573] [SID: 0] [SSEQ 97] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x97
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+IP (tos 0x0, ttl 46, id 149, offset 0, flags [DF], proto SCTP (132), length 48)
+ 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP]
+ 1) [SACK] [cum ack 1830592477] [a_rwnd 55272] [#gap acks 0] [#dup tsns 0]
+IP (tos 0x2,ECT(0), ttl 64, id 147, offset 0, flags [DF], proto SCTP (132), length 48)
+ 150.140.254.202.48316 > 211.129.72.8.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 18398573] [a_rwnd 56144] [#gap acks 0] [#dup tsns 0]
--- /dev/null
+IP (tos 0x2,ECT(0), ttl 64, id 4, offset 0, flags [DF], proto SCTP (132), length 380)
+ 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1048037094] [SID: 0] [SSEQ 1] [PPID 0x0]
+ ForCES Query Response
+ ForCES Version 1 len 332B flags 0x38400000
+ SrcID 0x2(FE) DstID 0x40000001(CE) Correlator 0x1
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 308 (data length 304 Bytes)
+ FEObj LFB(Classid 1) instance 1
+ Oper TLV GetResp(0x9) length 296
+ PATH-DATA TLV, length 292 (data encapsulated 288 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ FULLDATA TLV (Length 280 DataLen 276 Bytes)
+ [
+ 0x0000: 0000 0000 0000 0001 0000 0001 0000 0001
+ 0x0010: 0000 0002 0000 0001 0000 0002 0000 0003
+ 0x0020: 0000 0001 0000 0003 0000 0003 0000 0002
+ 0x0030: 0000 0004 0000 0004 0000 0001 0000 0005
+ 0x0040: 0000 0004 0000 0002 0000 0006 0000 0005
+ 0x0050: 0000 0001 0000 0007 0000 0005 0000 0002
+ 0x0060: 0000 0008 0000 0006 0000 0001 0000 0009
+ 0x0070: 0000 0007 0000 0001 0000 000a 0000 0007
+ 0x0080: 0000 0002 0000 000b 0000 0008 0000 0001
+ 0x0090: 0000 000c 0000 0009 0000 0001 0000 000d
+ 0x00a0: 0000 000a 0000 0001 0000 000e 0000 000b
+ 0x00b0: 0000 0001 0000 000f 0000 000c 0000 0001
+ 0x00c0: 0000 0010 0000 000d 0000 0001 0000 0011
+ 0x00d0: 0000 000e 0000 0001 0000 0012 0000 000f
+ 0x00e0: 0000 0001 0000 0013 0000 0010 0000 0001
+ 0x00f0: 0000 0014 0000 0011 0000 0001 0000 0015
+ 0x0100: 0000 0012 0000 0001 0000 0016 0000 0013
+ 0x0110: 0000 0001
+ ]
+
+ Raw ForCES message
+ [
+ 0x0000: 1014 0053 0000 0002 4000 0001 0000 0000
+ 0x0010: 0000 0001 3840 0000 1000 0134 0000 0001
+ 0x0020: 0000 0001 0009 0128 0110 0124 0000 0001
+ 0x0030: 0000 0002 0112 0118 0000 0000 0000 0001
+ 0x0040: 0000 0001 0000 0001 0000 0002 0000 0001
+ 0x0050: 0000 0002 0000 0003 0000 0001 0000 0003
+ 0x0060: 0000 0003 0000 0002 0000 0004 0000 0004
+ 0x0070: 0000 0001 0000 0005 0000 0004 0000 0002
+ 0x0080: 0000 0006 0000 0005 0000 0001 0000 0007
+ 0x0090: 0000 0005 0000 0002 0000 0008 0000 0006
+ 0x00a0: 0000 0001 0000 0009 0000 0007 0000 0001
+ 0x00b0: 0000 000a 0000 0007 0000 0002 0000 000b
+ 0x00c0: 0000 0008 0000 0001 0000 000c 0000 0009
+ 0x00d0: 0000 0001 0000 000d 0000 000a 0000 0001
+ 0x00e0: 0000 000e 0000 000b 0000 0001 0000 000f
+ 0x00f0: 0000 000c 0000 0001 0000 0010 0000 000d
+ 0x0100: 0000 0001 0000 0011 0000 000e 0000 0001
+ 0x0110: 0000 0012 0000 000f 0000 0001 0000 0013
+ 0x0120: 0000 0010 0000 0001 0000 0014 0000 0011
+ 0x0130: 0000 0001 0000 0015 0000 0012 0000 0001
+ 0x0140: 0000 0016 0000 0013 0000 0001
+ ]
+
+IP (tos 0x0, ttl 46, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 18398476] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x2
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+ Raw ForCES message
+ [
+ 0x0000: 100f 0006 4000 0001 0000 0002 0000 0000
+ 0x0010: 0000 0002 c040 0000
+ ]
+
+IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 48)
+ 150.140.254.202.48316 > 211.129.72.8.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 18398476] [a_rwnd 57320] [#gap acks 0] [#dup tsns 0]
+IP (tos 0x0, ttl 46, id 3, offset 0, flags [DF], proto SCTP (132), length 100)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 167996938] [SID: 0] [SSEQ 2] [PPID 0x0]
+ ForCES Query
+ ForCES Version 1 len 52B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x3
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 28 (data length 24 Bytes)
+ FEObj LFB(Classid 1) instance 1
+ Oper TLV Get(0x7) length 16
+ PATH-DATA TLV, length 12 (data encapsulated 8 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+
+ Raw ForCES message
+ [
+ 0x0000: 1004 000d 4000 0001 0000 0002 0000 0000
+ 0x0010: 0000 0003 f840 0000 1000 001c 0000 0001
+ 0x0020: 0000 0001 0007 0010 0110 000c 0000 0001
+ 0x0030: 0000 0001
+ ]
+
+IP (tos 0x0, ttl 46, id 4, offset 0, flags [DF], proto SCTP (132), length 112)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 167996939] [SID: 0] [SSEQ 3] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 64B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x4
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 40 (data length 36 Bytes)
+ #3(Classid 3) instance 1
+ Oper TLV SetProp(0x2) length 28
+ PATH-DATA TLV, length 24 (data encapsulated 20 Bytes)
+ Pathdata: Flags 0x0 ID count 2
+ ID#01: 60
+ ID#02: 1
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 0000 0001
+ ]
+
+ Raw ForCES message
+ [
+ 0x0000: 1003 0010 4000 0001 0000 0002 0000 0000
+ 0x0010: 0000 0004 f840 0000 1000 0028 0000 0003
+ 0x0020: 0000 0001 0002 001c 0110 0018 0000 0002
+ 0x0030: 0000 003c 0000 0001 0112 0008 0000 0001
+ ]
+
+IP (tos 0x2,ECT(0), ttl 64, id 5, offset 0, flags [DF], proto SCTP (132), length 48)
+ 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP]
+ 1) [SACK] [cum ack 167996939] [a_rwnd 57228] [#gap acks 0] [#dup tsns 0]
+IP (tos 0x0, ttl 46, id 5, offset 0, flags [DF], proto SCTP (132), length 112)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 167996940] [SID: 0] [SSEQ 4] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 64B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x5
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 40 (data length 36 Bytes)
+ #3(Classid 3) instance 1
+ Oper TLV SetProp(0x2) length 28
+ PATH-DATA TLV, length 24 (data encapsulated 20 Bytes)
+ Pathdata: Flags 0x0 ID count 2
+ ID#01: 60
+ ID#02: 2
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 0000 0001
+ ]
+
+ Raw ForCES message
+ [
+ 0x0000: 1003 0010 4000 0001 0000 0002 0000 0000
+ 0x0010: 0000 0005 f840 0000 1000 0028 0000 0003
+ 0x0020: 0000 0001 0002 001c 0110 0018 0000 0002
+ 0x0030: 0000 003c 0000 0002 0112 0008 0000 0001
+ ]
+
+IP (tos 0x0, ttl 46, id 6, offset 0, flags [DF], proto SCTP (132), length 112)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 167996941] [SID: 0] [SSEQ 5] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 64B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x6
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 40 (data length 36 Bytes)
+ #3(Classid 3) instance 1
+ Oper TLV SetProp(0x2) length 28
+ PATH-DATA TLV, length 24 (data encapsulated 20 Bytes)
+ Pathdata: Flags 0x0 ID count 2
+ ID#01: 60
+ ID#02: 3
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 0000 0001
+ ]
+
+ Raw ForCES message
+ [
+ 0x0000: 1003 0010 4000 0001 0000 0002 0000 0000
+ 0x0010: 0000 0006 f840 0000 1000 0028 0000 0003
+ 0x0020: 0000 0001 0002 001c 0110 0018 0000 0002
+ 0x0030: 0000 003c 0000 0003 0112 0008 0000 0001
+ ]
+
+IP (tos 0x2,ECT(0), ttl 64, id 6, offset 0, flags [DF], proto SCTP (132), length 48)
+ 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP]
+ 1) [SACK] [cum ack 167996941] [a_rwnd 57100] [#gap acks 0] [#dup tsns 0]
+IP (tos 0x0, ttl 46, id 7, offset 0, flags [DF], proto SCTP (132), length 112)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 167996942] [SID: 0] [SSEQ 6] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 64B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x7
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 40 (data length 36 Bytes)
+ #3(Classid 3) instance 2
+ Oper TLV SetProp(0x2) length 28
+ PATH-DATA TLV, length 24 (data encapsulated 20 Bytes)
+ Pathdata: Flags 0x0 ID count 2
+ ID#01: 60
+ ID#02: 1
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 0000 0001
+ ]
+
+ Raw ForCES message
+ [
+ 0x0000: 1003 0010 4000 0001 0000 0002 0000 0000
+ 0x0010: 0000 0007 f840 0000 1000 0028 0000 0003
+ 0x0020: 0000 0002 0002 001c 0110 0018 0000 0002
+ 0x0030: 0000 003c 0000 0001 0112 0008 0000 0001
+ ]
+
+IP (tos 0x0, ttl 46, id 110, offset 0, flags [DF], proto SCTP (132), length 48)
+ 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP]
+ 1) [SACK] [cum ack 1830592459] [a_rwnd 55272] [#gap acks 0] [#dup tsns 0]
+IP (tos 0x2,ECT(0), ttl 64, id 90, offset 0, flags [DF], proto SCTP (132), length 80)
+ 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP]
+ 1) [HB REQ]
+IP (tos 0x0, ttl 46, id 111, offset 0, flags [DF], proto SCTP (132), length 80)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [HB REQ]
+IP (tos 0x2,ECT(0), ttl 64, id 91, offset 0, flags [DF], proto SCTP (132), length 80)
+ 150.140.254.202.57077 > 211.129.72.8.6704: sctp[ForCES HP]
+ 1) [HB ACK]
+IP (tos 0x2,ECT(0), ttl 64, id 111, offset 0, flags [DF], proto SCTP (132), length 72)
+ 150.140.254.202.48316 > 211.129.72.8.6706: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 1830592460] [SID: 0] [SSEQ 30] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x00000000
+ SrcID 0x2(FE) DstID 0x40000001(CE) Correlator 0x53
+ ForCES flags:
+ NoACK(0x0), prio=0, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+ Raw ForCES message
+ [
+ 0x0000: 100f 0006 0000 0002 4000 0001 0000 0000
+ 0x0010: 0000 0053 0000 0000
+ ]
+
+IP (tos 0x0, ttl 46, id 112, offset 0, flags [DF], proto SCTP (132), length 80)
+ 211.129.72.8.6704 > 150.140.254.202.57077: sctp[ForCES HP]
+ 1) [HB ACK]
+IP (tos 0x0, ttl 46, id 111, offset 0, flags [DF], proto SCTP (132), length 72)
+ 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 18398553] [SID: 0] [SSEQ 77] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x83
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+ Raw ForCES message
+ [
+ 0x0000: 100f 0006 4000 0001 0000 0002 0000 0000
+ 0x0010: 0000 0083 c040 0000
+ ]
+
+IP (tos 0x0, ttl 46, id 148, offset 0, flags [DF], proto SCTP (132), length 72)
+ 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 18398573] [SID: 0] [SSEQ 97] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0400000
+ SrcID 0x40000001(CE) DstID 0x2(FE) Correlator 0x97
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+ Raw ForCES message
+ [
+ 0x0000: 100f 0006 4000 0001 0000 0002 0000 0000
+ 0x0010: 0000 0097 c040 0000
+ ]
+
+IP (tos 0x0, ttl 46, id 149, offset 0, flags [DF], proto SCTP (132), length 48)
+ 211.129.72.8.6706 > 150.140.254.202.48316: sctp[ForCES LP]
+ 1) [SACK] [cum ack 1830592477] [a_rwnd 55272] [#gap acks 0] [#dup tsns 0]
+IP (tos 0x2,ECT(0), ttl 64, id 147, offset 0, flags [DF], proto SCTP (132), length 48)
+ 150.140.254.202.48316 > 211.129.72.8.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 18398573] [a_rwnd 56144] [#gap acks 0] [#dup tsns 0]
--- /dev/null
+05:05:09.298782 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 68)
+ 192.168.1.142.33985 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [INIT] [init tag: 2496668056] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 3848071494]
+05:05:09.303686 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 292)
+ 192.168.1.143.6704 > 192.168.1.142.33985: sctp[ForCES HP]
+ 1) [INIT ACK] [init tag: 970400624] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 918167005]
+05:05:09.304939 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 264)
+ 192.168.1.142.33985 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [COOKIE ECHO]
+05:05:09.306408 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6704 > 192.168.1.142.33985: sctp[ForCES HP]
+ 1) [COOKIE ACK]
+05:05:10.309380 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 68)
+ 192.168.1.142.39555 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [INIT] [init tag: 2044981539] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 2236306515]
+05:05:10.309715 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 292)
+ 192.168.1.143.6705 > 192.168.1.142.39555: sctp[ForCES MP]
+ 1) [INIT ACK] [init tag: 3835501490] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 2895206285]
+05:05:10.309749 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 264)
+ 192.168.1.142.39555 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [COOKIE ECHO]
+05:05:10.309952 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6705 > 192.168.1.142.39555: sctp[ForCES MP]
+ 1) [COOKIE ACK]
+05:05:11.310417 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 68)
+ 192.168.1.142.34521 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [INIT] [init tag: 3379268938] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 4164546507]
+05:05:11.310768 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 292)
+ 192.168.1.143.6706 > 192.168.1.142.34521: sctp[ForCES LP]
+ 1) [INIT ACK] [init tag: 1840401365] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 1469124988]
+05:05:11.310801 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 264)
+ 192.168.1.142.34521 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [COOKIE ECHO]
+05:05:11.311000 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6706 > 192.168.1.142.34521: sctp[ForCES LP]
+ 1) [COOKIE ACK]
+05:05:12.312310 IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.142.33985 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 3848071494] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES Association Setup
+ ForCES Version 1 len 24B flags 0xf8000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x1
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:05:12.314195 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6704 > 192.168.1.142.33985: sctp[ForCES HP]
+ 1) [SACK] [cum ack 3848071494] [a_rwnd 57320] [#gap acks 0] [#dup tsns 0]
+05:05:12.416220 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.33985: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 918167005] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES Association Response
+ ForCES Version 1 len 32B flags 0x38100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x1
+ ForCES flags:
+ NoACK(0x0), prio=7, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:05:12.416942 IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.33985 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SACK] [cum ack 918167005] [a_rwnd 57312] [#gap acks 0] [#dup tsns 0]
+05:05:20.347682 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.34521: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 1469124988] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0500000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x1
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, execute-all-or-none(0x1),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:05:20.352187 IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.34521 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 1469124988] [a_rwnd 57320] [#gap acks 0] [#dup tsns 0]
+05:05:21.248574 IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.142.34521 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 4164546507] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x1
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:05:21.249024 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.34521: sctp[ForCES LP]
+ 1) [SACK] [cum ack 4164546507] [a_rwnd 57320] [#gap acks 0] [#dup tsns 0]
+05:05:32.421106 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.34521: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 1469124989] [SID: 0] [SSEQ 1] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x2
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:05:32.621031 IP (tos 0x2,ECT(0), ttl 64, id 3, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.34521 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 1469124989] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:05:33.263419 IP (tos 0x2,ECT(0), ttl 64, id 4, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.142.34521 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 4164546508] [SID: 0] [SSEQ 1] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x2
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:05:33.464155 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.34521: sctp[ForCES LP]
+ 1) [SACK] [cum ack 4164546508] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:05:43.022434 IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.39555 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB REQ]
+05:05:43.023282 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.39555: sctp[ForCES MP]
+ 1) [HB ACK]
+05:05:43.196617 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.39555: sctp[ForCES MP]
+ 1) [HB REQ]
+05:05:43.197037 IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.39555 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB ACK]
+05:05:44.604199 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.33985: sctp[ForCES HP]
+ 1) [HB REQ]
+05:05:44.604244 IP (tos 0x2,ECT(0), ttl 64, id 3, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.33985 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB ACK]
+05:05:46.350074 IP (tos 0x2,ECT(0), ttl 64, id 4, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.33985 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB REQ]
+05:05:46.350436 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.33985: sctp[ForCES HP]
+ 1) [HB ACK]
+05:05:52.435455 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.34521: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 1469124990] [SID: 0] [SSEQ 2] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x3
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:05:52.635909 IP (tos 0x2,ECT(0), ttl 64, id 5, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.34521 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 1469124990] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:05:53.285747 IP (tos 0x2,ECT(0), ttl 64, id 6, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.142.34521 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 4164546509] [SID: 0] [SSEQ 2] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x3
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:05:53.486513 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.34521: sctp[ForCES LP]
+ 1) [SACK] [cum ack 4164546509] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:05:57.511596 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 184)
+ 192.168.1.143.6704 > 192.168.1.142.33985: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 918167006] [SID: 0] [SSEQ 1] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 136B flags 0xf8500000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x4
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:05:57.712372 IP (tos 0x2,ECT(0), ttl 64, id 5, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.33985 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SACK] [cum ack 918167006] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:05:58.292051 IP (tos 0x2,ECT(0), ttl 64, id 6, offset 0, flags [DF], proto SCTP (132), length 144)
+ 192.168.1.142.33985 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 3848071495] [SID: 0] [SSEQ 1] [PPID 0x0]
+ ForCES Config Response
+ ForCES Version 1 len 96B flags 0x38500000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x4
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:05:58.492214 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6704 > 192.168.1.142.33985: sctp[ForCES HP]
+ 1) [SACK] [cum ack 3848071495] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:05:58.519224 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 128)
+ 192.168.1.143.6704 > 192.168.1.142.33985: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 918167007] [SID: 0] [SSEQ 2] [PPID 0x0]
+ ForCES Query
+ ForCES Version 1 len 80B flags 0xf8500000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x5
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:05:58.719328 IP (tos 0x2,ECT(0), ttl 64, id 7, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.33985 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SACK] [cum ack 918167007] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:05:59.293832 IP (tos 0x2,ECT(0), ttl 64, id 8, offset 0, flags [DF], proto SCTP (132), length 196)
+ 192.168.1.142.33985 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 3848071496] [SID: 0] [SSEQ 2] [PPID 0x0]
+ ForCES Query Response
+ ForCES Version 1 len 148B flags 0x38500000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x5
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:05:59.494322 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6704 > 192.168.1.142.33985: sctp[ForCES HP]
+ 1) [SACK] [cum ack 3848071496] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:06:12.447511 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.34521: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 1469124991] [SID: 0] [SSEQ 3] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x6
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:06:12.613268 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.33985: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 918167008] [SID: 0] [SSEQ 3] [PPID 0x0]
+ ForCES Association TearDown
+ ForCES Version 1 len 32B flags 0x38100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x0
+ ForCES flags:
+ NoACK(0x0), prio=7, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:06:12.646587 IP (tos 0x2,ECT(0), ttl 64, id 7, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.34521 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 1469124991] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:06:12.812720 IP (tos 0x2,ECT(0), ttl 64, id 9, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.33985 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SACK] [cum ack 918167008] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:06:13.617136 IP (tos 0x2,ECT(0), ttl 64, id 10, offset 0, flags [DF], proto SCTP (132), length 40)
+ 192.168.1.142.33985 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SHUTDOWN]
+05:06:13.617464 IP (tos 0x2,ECT(0), ttl 64, id 3, offset 0, flags [DF], proto SCTP (132), length 40)
+ 192.168.1.142.39555 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [SHUTDOWN]
+05:06:13.617602 IP (tos 0x2,ECT(0), ttl 64, id 8, offset 0, flags [DF], proto SCTP (132), length 40)
+ 192.168.1.142.34521 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SHUTDOWN]
+05:06:13.617922 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6704 > 192.168.1.142.33985: sctp[ForCES HP]
+ 1) [SHUTDOWN ACK]
+05:06:13.618337 IP (tos 0x2,ECT(0), ttl 64, id 11, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.142.33985 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SHUTDOWN COMPLETE]
+05:06:13.619459 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6705 > 192.168.1.142.39555: sctp[ForCES MP]
+ 1) [SHUTDOWN ACK]
+05:06:13.619484 IP (tos 0x2,ECT(0), ttl 64, id 4, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.142.39555 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [SHUTDOWN COMPLETE]
+05:06:13.619537 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6706 > 192.168.1.142.34521: sctp[ForCES LP]
+ 1) [SHUTDOWN ACK]
+05:06:13.619550 IP (tos 0x2,ECT(0), ttl 64, id 9, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.142.34521 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SHUTDOWN COMPLETE]
+05:06:14.310789 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 68)
+ 192.168.1.142.59807 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [INIT] [init tag: 648920342] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 3143112306]
+05:06:14.311204 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 292)
+ 192.168.1.143.6704 > 192.168.1.142.59807: sctp[ForCES HP]
+ 1) [INIT ACK] [init tag: 3977131441] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 3691296472]
+05:06:14.312029 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 264)
+ 192.168.1.142.59807 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [COOKIE ECHO]
+05:06:14.312276 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6704 > 192.168.1.142.59807: sctp[ForCES HP]
+ 1) [COOKIE ACK]
+05:06:15.314129 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 68)
+ 192.168.1.142.55497 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [INIT] [init tag: 3941704218] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 2908637682]
+05:06:15.314897 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 292)
+ 192.168.1.143.6705 > 192.168.1.142.55497: sctp[ForCES MP]
+ 1) [INIT ACK] [init tag: 2312011763] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 3797683222]
+05:06:15.314939 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 264)
+ 192.168.1.142.55497 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [COOKIE ECHO]
+05:06:15.315192 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6705 > 192.168.1.142.55497: sctp[ForCES MP]
+ 1) [COOKIE ACK]
+05:06:16.316012 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 68)
+ 192.168.1.142.37985 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [INIT] [init tag: 738970165] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 2249629206]
+05:06:16.316410 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 292)
+ 192.168.1.143.6706 > 192.168.1.142.37985: sctp[ForCES LP]
+ 1) [INIT ACK] [init tag: 1998517320] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 1397847889]
+05:06:16.316444 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 264)
+ 192.168.1.142.37985 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [COOKIE ECHO]
+05:06:16.316679 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6706 > 192.168.1.142.37985: sctp[ForCES LP]
+ 1) [COOKIE ACK]
+05:06:17.317412 IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.142.59807 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 3143112306] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES Association Setup
+ ForCES Version 1 len 24B flags 0xf8000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x2
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:06:17.318437 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6704 > 192.168.1.142.59807: sctp[ForCES HP]
+ 1) [SACK] [cum ack 3143112306] [a_rwnd 57320] [#gap acks 0] [#dup tsns 0]
+05:06:17.332703 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.59807: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 3691296472] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES Association Response
+ ForCES Version 1 len 32B flags 0x38100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x2
+ ForCES flags:
+ NoACK(0x0), prio=7, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:06:17.332763 IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.59807 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SACK] [cum ack 3691296472] [a_rwnd 57312] [#gap acks 0] [#dup tsns 0]
+05:06:17.334067 IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.142.37985 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 2249629206] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x6
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:06:17.334681 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.37985: sctp[ForCES LP]
+ 1) [SACK] [cum ack 2249629206] [a_rwnd 57320] [#gap acks 0] [#dup tsns 0]
--- /dev/null
+05:12:46.942414 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 68)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [INIT] [init tag: 2926667004] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 1498547998]
+05:12:46.943161 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 292)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [INIT ACK] [init tag: 3861163764] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 2413889661]
+05:12:46.943242 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 264)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [COOKIE ECHO]
+05:12:46.943643 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [COOKIE ACK]
+05:12:47.944776 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 68)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [INIT] [init tag: 3153359751] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 3738337023]
+05:12:47.946163 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 292)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [INIT ACK] [init tag: 562272820] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 2275981483]
+05:12:47.946319 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 264)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [COOKIE ECHO]
+05:12:47.947214 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [COOKIE ACK]
+05:12:48.948471 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 68)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [INIT] [init tag: 1637919099] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 922703190]
+05:12:48.949179 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 292)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [INIT ACK] [init tag: 2538997808] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 2244318871]
+05:12:48.949212 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 264)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [COOKIE ECHO]
+05:12:48.950191 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [COOKIE ACK]
+05:12:49.951610 IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1498547998] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES Association Setup
+ ForCES Version 1 len 24B flags 0xf8000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x1
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:12:49.952213 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [SACK] [cum ack 1498547998] [a_rwnd 57320] [#gap acks 0] [#dup tsns 0]
+05:12:49.983328 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2413889661] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES Association Response
+ ForCES Version 1 len 32B flags 0x38100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x1
+ ForCES flags:
+ NoACK(0x0), prio=7, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:12:49.983414 IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2413889661] [a_rwnd 57312] [#gap acks 0] [#dup tsns 0]
+05:13:09.990457 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 2244318871] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x1
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:13:09.990576 IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 2244318871] [a_rwnd 57320] [#gap acks 0] [#dup tsns 0]
+05:13:10.977285 IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 922703190] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x1
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:13:10.977790 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [SACK] [cum ack 922703190] [a_rwnd 57320] [#gap acks 0] [#dup tsns 0]
+05:13:20.110083 IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB REQ]
+05:13:20.110531 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB ACK]
+05:13:20.668242 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB REQ]
+05:13:20.668307 IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB ACK]
+05:13:21.822790 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB REQ]
+05:13:21.822849 IP (tos 0x2,ECT(0), ttl 64, id 3, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB ACK]
+05:13:22.926155 IP (tos 0x2,ECT(0), ttl 64, id 4, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB REQ]
+05:13:22.926561 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB ACK]
+05:13:30.012956 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 2244318872] [SID: 0] [SSEQ 1] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x2
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:13:30.213362 IP (tos 0x2,ECT(0), ttl 64, id 3, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 2244318872] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:13:30.998747 IP (tos 0x2,ECT(0), ttl 64, id 4, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 922703191] [SID: 0] [SSEQ 1] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x2
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:13:31.199633 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [SACK] [cum ack 922703191] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:13:50.022950 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 2244318873] [SID: 0] [SSEQ 2] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x3
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:13:50.222804 IP (tos 0x2,ECT(0), ttl 64, id 5, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 2244318873] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:13:50.957859 IP (tos 0x2,ECT(0), ttl 64, id 3, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB REQ]
+05:13:50.958254 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB ACK]
+05:13:51.017217 IP (tos 0x2,ECT(0), ttl 64, id 6, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 922703192] [SID: 0] [SSEQ 2] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x3
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:13:51.218065 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [SACK] [cum ack 922703192] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:13:52.029041 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB REQ]
+05:13:52.029131 IP (tos 0x2,ECT(0), ttl 64, id 4, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB ACK]
+05:13:52.668078 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB REQ]
+05:13:52.668129 IP (tos 0x2,ECT(0), ttl 64, id 5, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB ACK]
+05:13:54.157975 IP (tos 0x2,ECT(0), ttl 64, id 6, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB REQ]
+05:13:54.158408 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB ACK]
+05:14:10.034601 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 2244318874] [SID: 0] [SSEQ 3] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x4
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:14:10.036750 IP (tos 0x2,ECT(0), ttl 64, id 7, offset 0, flags [DF], proto SCTP (132), length 88)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 2244318874] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+ 2) [DATA] (B)(E) [TSN: 922703193] [SID: 0] [SSEQ 3] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x4
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:14:10.237566 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [SACK] [cum ack 922703193] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:14:22.318623 IP (tos 0x2,ECT(0), ttl 64, id 5, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB REQ]
+05:14:22.319118 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB ACK]
+05:14:23.004801 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB REQ]
+05:14:23.004855 IP (tos 0x2,ECT(0), ttl 64, id 6, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB ACK]
+05:14:23.644941 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB REQ]
+05:14:23.645019 IP (tos 0x2,ECT(0), ttl 64, id 7, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB ACK]
+05:14:25.517659 IP (tos 0x2,ECT(0), ttl 64, id 8, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB REQ]
+05:14:25.518177 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB ACK]
+05:14:30.056428 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 2244318875] [SID: 0] [SSEQ 4] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x5
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:14:30.058780 IP (tos 0x2,ECT(0), ttl 64, id 8, offset 0, flags [DF], proto SCTP (132), length 88)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 2244318875] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+ 2) [DATA] (B)(E) [TSN: 922703194] [SID: 0] [SSEQ 4] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x5
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:14:30.260069 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [SACK] [cum ack 922703194] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:14:50.070392 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 2244318876] [SID: 0] [SSEQ 5] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x6
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:14:50.078619 IP (tos 0x2,ECT(0), ttl 64, id 9, offset 0, flags [DF], proto SCTP (132), length 88)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 2244318876] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+ 2) [DATA] (B)(E) [TSN: 922703195] [SID: 0] [SSEQ 5] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x6
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:14:50.278482 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [SACK] [cum ack 922703195] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:14:52.910320 IP (tos 0x2,ECT(0), ttl 64, id 7, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB REQ]
+05:14:52.910757 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB ACK]
+05:14:54.236596 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB REQ]
+05:14:54.236684 IP (tos 0x2,ECT(0), ttl 64, id 8, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB ACK]
+05:14:54.236747 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB REQ]
+05:14:54.236765 IP (tos 0x2,ECT(0), ttl 64, id 9, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB ACK]
+05:14:56.494447 IP (tos 0x2,ECT(0), ttl 64, id 10, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB REQ]
+05:14:56.494903 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB ACK]
+05:15:10.087164 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 2244318877] [SID: 0] [SSEQ 6] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x7
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:15:10.099646 IP (tos 0x2,ECT(0), ttl 64, id 10, offset 0, flags [DF], proto SCTP (132), length 88)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 2244318877] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+ 2) [DATA] (B)(E) [TSN: 922703196] [SID: 0] [SSEQ 6] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x7
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:15:10.300908 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [SACK] [cum ack 922703196] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:15:24.142057 IP (tos 0x2,ECT(0), ttl 64, id 9, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB REQ]
+05:15:24.142436 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB ACK]
+05:15:25.468346 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB REQ]
+05:15:25.468420 IP (tos 0x2,ECT(0), ttl 64, id 10, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB ACK]
+05:15:25.724070 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB REQ]
+05:15:25.724132 IP (tos 0x2,ECT(0), ttl 64, id 11, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB ACK]
+05:15:27.854217 IP (tos 0x2,ECT(0), ttl 64, id 12, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB REQ]
+05:15:27.854637 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB ACK]
+05:15:30.103924 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 2244318878] [SID: 0] [SSEQ 7] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x8
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:15:30.121626 IP (tos 0x2,ECT(0), ttl 64, id 11, offset 0, flags [DF], proto SCTP (132), length 88)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 2244318878] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+ 2) [DATA] (B)(E) [TSN: 922703197] [SID: 0] [SSEQ 7] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x8
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:15:30.322461 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [SACK] [cum ack 922703197] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:15:50.116903 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 2244318879] [SID: 0] [SSEQ 8] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x9
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:15:50.141079 IP (tos 0x2,ECT(0), ttl 64, id 12, offset 0, flags [DF], proto SCTP (132), length 88)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 2244318879] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+ 2) [DATA] (B)(E) [TSN: 922703198] [SID: 0] [SSEQ 8] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x9
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:15:50.341982 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [SACK] [cum ack 922703198] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:15:51.957705 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 140)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2413889662] [SID: 0] [SSEQ 1] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 92B flags 0x78400000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x10
+ ForCES flags:
+ SuccessACK(0x1), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:15:52.144354 IP (tos 0x2,ECT(0), ttl 64, id 13, offset 0, flags [DF], proto SCTP (132), length 156)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2413889662] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+ 2) [DATA] (B)(E) [TSN: 1498547999] [SID: 0] [SSEQ 1] [PPID 0x0]
+ ForCES Config Response
+ ForCES Version 1 len 92B flags 0x38400000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x10
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:15:52.344974 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [SACK] [cum ack 1498547999] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:15:55.629842 IP (tos 0x2,ECT(0), ttl 64, id 11, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB REQ]
+05:15:55.630342 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB ACK]
+05:15:56.189088 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB REQ]
+05:15:56.189160 IP (tos 0x2,ECT(0), ttl 64, id 12, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB ACK]
+05:16:11.972673 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 2244318880] [SID: 0] [SSEQ 9] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x11
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:16:12.163738 IP (tos 0x2,ECT(0), ttl 64, id 13, offset 0, flags [DF], proto SCTP (132), length 88)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 2244318880] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+ 2) [DATA] (B)(E) [TSN: 922703199] [SID: 0] [SSEQ 9] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x11
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:16:12.364365 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [SACK] [cum ack 922703199] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:16:22.766463 IP (tos 0x2,ECT(0), ttl 64, id 14, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB REQ]
+05:16:22.766888 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB ACK]
+05:16:22.812607 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB REQ]
+05:16:22.812641 IP (tos 0x2,ECT(0), ttl 64, id 15, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB ACK]
+05:16:26.908770 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB REQ]
+05:16:26.908850 IP (tos 0x2,ECT(0), ttl 64, id 13, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB ACK]
+05:16:27.118570 IP (tos 0x2,ECT(0), ttl 64, id 14, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB REQ]
+05:16:27.118998 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB ACK]
+05:16:31.990056 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 2244318881] [SID: 0] [SSEQ 10] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x12
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:16:32.184118 IP (tos 0x2,ECT(0), ttl 64, id 14, offset 0, flags [DF], proto SCTP (132), length 88)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 2244318881] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+ 2) [DATA] (B)(E) [TSN: 922703200] [SID: 0] [SSEQ 10] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x12
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:16:32.384948 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [SACK] [cum ack 922703200] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:16:52.009081 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [DATA] (B)(E) [TSN: 2244318882] [SID: 0] [SSEQ 11] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0xc0100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x13
+ ForCES flags:
+ AlwaysACK(0x3), prio=0, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:16:52.205727 IP (tos 0x2,ECT(0), ttl 64, id 15, offset 0, flags [DF], proto SCTP (132), length 88)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SACK] [cum ack 2244318882] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+ 2) [DATA] (B)(E) [TSN: 922703201] [SID: 0] [SSEQ 11] [PPID 0x0]
+ ForCES HeartBeat
+ ForCES Version 1 len 24B flags 0x08000000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x13
+ ForCES flags:
+ NoACK(0x0), prio=1, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:16:52.406443 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [SACK] [cum ack 922703201] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:16:53.532328 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB REQ]
+05:16:53.532396 IP (tos 0x2,ECT(0), ttl 64, id 16, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB ACK]
+05:16:53.998215 IP (tos 0x2,ECT(0), ttl 64, id 17, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [HB REQ]
+05:16:53.998632 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [HB ACK]
+05:16:57.965660 IP (tos 0x2,ECT(0), ttl 64, id 15, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB REQ]
+05:16:57.966179 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB ACK]
+05:16:58.268666 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [HB REQ]
+05:16:58.268737 IP (tos 0x2,ECT(0), ttl 64, id 16, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [HB ACK]
+05:16:58.751669 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 124)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2413889663] [SID: 0] [SSEQ 2] [PPID 0x0]
+ ForCES Query
+ ForCES Version 1 len 76B flags 0x78400000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x14
+ ForCES flags:
+ SuccessACK(0x1), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:16:58.952418 IP (tos 0x2,ECT(0), ttl 64, id 18, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2413889663] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:16:59.213890 IP (tos 0x2,ECT(0), ttl 64, id 19, offset 0, flags [DF], proto SCTP (132), length 140)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1498548000] [SID: 0] [SSEQ 2] [PPID 0x0]
+ ForCES Query Response
+ ForCES Version 1 len 92B flags 0x38400000
+ SrcID 0x2(FE) DstID 0x40000003(CE) Correlator 0x14
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:16:59.414572 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [SACK] [cum ack 1498548000] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:17:06.275584 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2413889664] [SID: 0] [SSEQ 3] [PPID 0x0]
+ ForCES Association TearDown
+ ForCES Version 1 len 32B flags 0x38100000
+ SrcID 0x40000003(CE) DstID 0x2(FE) Correlator 0x0
+ ForCES flags:
+ NoACK(0x0), prio=7, EMReserved(0x0),
+ Standalone(0x0), EndofTransaction(0x2)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+05:17:06.475558 IP (tos 0x2,ECT(0), ttl 64, id 20, offset 0, flags [DF], proto SCTP (132), length 48)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2413889664] [a_rwnd 57344] [#gap acks 0] [#dup tsns 0]
+05:17:07.278281 IP (tos 0x2,ECT(0), ttl 64, id 21, offset 0, flags [DF], proto SCTP (132), length 40)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SHUTDOWN]
+05:17:07.278648 IP (tos 0x2,ECT(0), ttl 64, id 17, offset 0, flags [DF], proto SCTP (132), length 40)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [SHUTDOWN]
+05:17:07.278805 IP (tos 0x2,ECT(0), ttl 64, id 16, offset 0, flags [DF], proto SCTP (132), length 40)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SHUTDOWN]
+05:17:07.278894 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6704 > 192.168.1.142.53333: sctp[ForCES HP]
+ 1) [SHUTDOWN ACK]
+05:17:07.278986 IP (tos 0x2,ECT(0), ttl 64, id 22, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.142.53333 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SHUTDOWN COMPLETE]
+05:17:07.279062 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6705 > 192.168.1.142.48432: sctp[ForCES MP]
+ 1) [SHUTDOWN ACK]
+05:17:07.279086 IP (tos 0x2,ECT(0), ttl 64, id 18, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.142.48432 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [SHUTDOWN COMPLETE]
+05:17:07.279125 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6706 > 192.168.1.142.57793: sctp[ForCES LP]
+ 1) [SHUTDOWN ACK]
+05:17:07.279383 IP (tos 0x2,ECT(0), ttl 64, id 17, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.142.57793 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SHUTDOWN COMPLETE]
+05:17:08.224255 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 68)
+ 192.168.1.142.60979 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [INIT] [init tag: 893123932] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 4001675829]
+05:17:08.224782 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 292)
+ 192.168.1.143.6704 > 192.168.1.142.60979: sctp[ForCES HP]
+ 1) [INIT ACK] [init tag: 3751052708] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 2904779402]
+05:17:08.224834 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 264)
+ 192.168.1.142.60979 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [COOKIE ECHO]
+05:17:08.225194 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6704 > 192.168.1.142.60979: sctp[ForCES HP]
+ 1) [COOKIE ACK]
+05:17:09.226814 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 68)
+ 192.168.1.142.41874 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [INIT] [init tag: 2631831000] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 3186084970]
+05:17:09.227378 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 292)
+ 192.168.1.143.6705 > 192.168.1.142.41874: sctp[ForCES MP]
+ 1) [INIT ACK] [init tag: 1025500394] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 492081856]
+05:17:09.227470 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 264)
+ 192.168.1.142.41874 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [COOKIE ECHO]
+05:17:09.227843 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6705 > 192.168.1.142.41874: sctp[ForCES MP]
+ 1) [COOKIE ACK]
+05:17:10.234920 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 68)
+ 192.168.1.142.43249 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [INIT] [init tag: 1071698335] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 1223456824]
+05:17:10.235259 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 292)
+ 192.168.1.143.6706 > 192.168.1.142.43249: sctp[ForCES LP]
+ 1) [INIT ACK] [init tag: 2401559485] [rwnd: 57344] [OS: 1] [MIS: 1] [init TSN: 4176597732]
+05:17:10.235295 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 264)
+ 192.168.1.142.43249 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [COOKIE ECHO]
+05:17:10.235559 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6706 > 192.168.1.142.43249: sctp[ForCES LP]
+ 1) [COOKIE ACK]
+05:17:10.432954 IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 40)
+ 192.168.1.142.60979 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SHUTDOWN]
+05:17:10.433287 IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 40)
+ 192.168.1.142.41874 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [SHUTDOWN]
+05:17:10.433473 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6704 > 192.168.1.142.60979: sctp[ForCES HP]
+ 1) [SHUTDOWN ACK]
+05:17:10.433517 IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.142.60979 > 192.168.1.143.6704: sctp[ForCES HP]
+ 1) [SHUTDOWN COMPLETE]
+05:17:10.433629 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6705 > 192.168.1.142.41874: sctp[ForCES MP]
+ 1) [SHUTDOWN ACK]
+05:17:10.433866 IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.142.41874 > 192.168.1.143.6705: sctp[ForCES MP]
+ 1) [SHUTDOWN COMPLETE]
+05:17:10.434075 IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 40)
+ 192.168.1.142.43249 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SHUTDOWN]
+05:17:10.434365 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.143.6706 > 192.168.1.142.43249: sctp[ForCES LP]
+ 1) [SHUTDOWN ACK]
+05:17:10.434388 IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 36)
+ 192.168.1.142.43249 > 192.168.1.143.6706: sctp[ForCES LP]
+ 1) [SHUTDOWN COMPLETE]
--- /dev/null
+23:38:56.018934 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 76)
+ 172.20.4.63.16702 > 172.20.4.93.6702: sctp[ForCES LP]
+ 1) [INIT] [init tag: 3355263363] [rwnd: 55296] [OS: 10] [MIS: 65535] [init TSN: 861291022]
+23:38:56.019037 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 236)
+ 172.20.4.93.6702 > 172.20.4.63.16702: sctp[ForCES LP]
+ 1) [INIT ACK] [init tag: 2807207095] [rwnd: 54784] [OS: 10] [MIS: 10] [init TSN: 2957773506]
+23:38:56.019110 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 200)
+ 172.20.4.63.16702 > 172.20.4.93.6702: sctp[ForCES LP]
+ 1) [COOKIE ECHO]
+23:38:56.019241 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 172.20.4.93.6702 > 172.20.4.63.16702: sctp[ForCES LP]
+ 1) [COOKIE ACK]
+23:38:56.019920 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 76)
+ 172.20.4.63.16701 > 172.20.4.93.6701: sctp[ForCES MP]
+ 1) [INIT] [init tag: 355895801] [rwnd: 55296] [OS: 10] [MIS: 65535] [init TSN: 1729985532]
+23:38:56.020061 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 236)
+ 172.20.4.93.6701 > 172.20.4.63.16701: sctp[ForCES MP]
+ 1) [INIT ACK] [init tag: 2960733132] [rwnd: 54784] [OS: 10] [MIS: 10] [init TSN: 777474576]
+23:38:56.020111 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 200)
+ 172.20.4.63.16701 > 172.20.4.93.6701: sctp[ForCES MP]
+ 1) [COOKIE ECHO]
+23:38:56.020235 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 172.20.4.93.6701 > 172.20.4.63.16701: sctp[ForCES MP]
+ 1) [COOKIE ACK]
+23:38:56.020433 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 76)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [INIT] [init tag: 3006905571] [rwnd: 55296] [OS: 10] [MIS: 65535] [init TSN: 2958179469]
+23:38:56.020578 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 236)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [INIT ACK] [init tag: 3515444933] [rwnd: 54784] [OS: 10] [MIS: 10] [init TSN: 1811362564]
+23:38:56.020617 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 200)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [COOKIE ECHO]
+23:38:56.020739 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 36)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [COOKIE ACK]
+23:38:57.240366 IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 72)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2958179469] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES Association Setup
+ ForCES Version 1 len 24B flags 0xf8000000
+ SrcID 0x3(FE) DstID 0x40000001(CE) Correlator 0x1
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, EMReserved(0x0),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+
+
+23:38:57.240474 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2958179469] [a_rwnd 54760] [#gap acks 0] [#dup tsns 0]
+23:38:57.241034 IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 80)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1811362564] [SID: 0] [SSEQ 0] [PPID 0x0]
+ ForCES Association Response
+ ForCES Version 1 len 32B flags 0x38400000
+ SrcID 0x40000001(CE) DstID 0x3(FE) Correlator 0x1
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ ASResult TLV, length 8 (data length 4 Bytes)
+ Success (0)
+
+
+23:38:57.241079 IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 1811362564] [a_rwnd 55264] [#gap acks 0] [#dup tsns 0]
+23:38:57.241047 IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 100)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1811362565] [SID: 0] [SSEQ 1] [PPID 0x0]
+ ForCES Query
+ ForCES Version 1 len 52B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x3(FE) Correlator 0x1
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 28 (data length 24 Bytes)
+ FEObj LFB(Classid 1) instance 1
+ Oper TLV Get(0x7) length 16
+ PATH-DATA TLV, length 12 (data encapsulated 8 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+
+
+23:38:57.244420 IP (tos 0x2,ECT(0), ttl 64, id 3, offset 0, flags [DF], proto SCTP (132), length 140)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2958179470] [SID: 0] [SSEQ 1] [PPID 0x0]
+ ForCES Query Response
+ ForCES Version 1 len 92B flags 0x38400000
+ SrcID 0x3(FE) DstID 0x40000001(CE) Correlator 0x1
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 68 (data length 64 Bytes)
+ FEObj LFB(Classid 1) instance 1
+ Oper TLV GetResp(0x9) length 56
+ PATH-DATA TLV, length 52 (data encapsulated 48 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ FULLDATA TLV (Length 40 DataLen 36 Bytes)
+ [
+ 0x0000: 0000 0000 0000 0001 0000 0001 0000 0001
+ 0x0010: 0000 0002 0000 0001 0000 0002 0000 000e
+ 0x0020: 0000 0001
+ ]
+
+
+23:38:57.440152 IP (tos 0x2,ECT(0), ttl 64, id 4, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 1811362565] [a_rwnd 55264] [#gap acks 0] [#dup tsns 0]
+23:38:57.444197 IP (tos 0x2,ECT(0), ttl 64, id 3, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2958179470] [a_rwnd 54760] [#gap acks 0] [#dup tsns 0]
+23:39:04.942310 IP (tos 0x2,ECT(0), ttl 64, id 4, offset 0, flags [DF], proto SCTP (132), length 100)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1811362566] [SID: 0] [SSEQ 2] [PPID 0x0]
+ ForCES Query
+ ForCES Version 1 len 52B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x3(FE) Correlator 0x2
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 28 (data length 24 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV Get(0x7) length 16
+ PATH-DATA TLV, length 12 (data encapsulated 8 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+
+
+23:39:04.943823 IP (tos 0x2,ECT(0), ttl 64, id 5, offset 0, flags [DF], proto SCTP (132), length 188)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2958179471] [SID: 0] [SSEQ 2] [PPID 0x0]
+ ForCES Query Response
+ ForCES Version 1 len 140B flags 0x38400000
+ SrcID 0x3(FE) DstID 0x40000001(CE) Correlator 0x2
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 116 (data length 112 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV GetResp(0x9) length 104
+ PATH-DATA TLV, length 100 (data encapsulated 96 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ FULLDATA TLV (Length 88 DataLen 84 Bytes)
+ [
+ 0x0000: 0112 0054 0000 0000 0000 0001 0112 0028
+ 0x0010: 0000 0000 0102 0304 0000 0018 0001 0203
+ 0x0020: 0405 0000 0001 1112 1314 0000 0019 0a0b
+ 0x0030: 0c0d 0e0f 0000 0001 0000 0002 0112 0018
+ 0x0040: 0000 0000 0807 0605 0000 0010 1415 1617
+ 0x0050: 1819 0000
+ ]
+
+
+23:39:05.141776 IP (tos 0x2,ECT(0), ttl 64, id 6, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 1811362566] [a_rwnd 55264] [#gap acks 0] [#dup tsns 0]
+23:39:05.143071 IP (tos 0x2,ECT(0), ttl 64, id 5, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2958179471] [a_rwnd 54760] [#gap acks 0] [#dup tsns 0]
+23:39:08.406266 IP (tos 0x2,ECT(0), ttl 64, id 6, offset 0, flags [DF], proto SCTP (132), length 156)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1811362567] [SID: 0] [SSEQ 3] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 108B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x3(FE) Correlator 0x3
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 84 (data length 80 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV Set(0x1) length 72
+ PATH-DATA TLV, length 68 (data encapsulated 64 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ PATH-DATA TLV, length 56 (data encapsulated 52 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 0
+ PATH-DATA TLV, length 44 (data encapsulated 40 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ PATH-DATA TLV, length 32 (data encapsulated 28 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 0
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 0a00 0001
+ ]
+
+
+23:39:08.410057 IP (tos 0x2,ECT(0), ttl 64, id 7, offset 0, flags [DF], proto SCTP (132), length 108)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2958179472] [SID: 0] [SSEQ 3] [PPID 0x0]
+ ForCES Config Response
+ ForCES Version 1 len 60B flags 0x38400000
+ SrcID 0x3(FE) DstID 0x40000001(CE) Correlator 0x3
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 36 (data length 32 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV SetResp(0x3) length 24
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ RESULT TLV (Length 8 DataLen 4 Bytes)
+ Result: SUCCESS (code 0x0)
+
+
+23:39:08.606148 IP (tos 0x2,ECT(0), ttl 64, id 8, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 1811362567] [a_rwnd 55264] [#gap acks 0] [#dup tsns 0]
+23:39:08.610452 IP (tos 0x2,ECT(0), ttl 64, id 7, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2958179472] [a_rwnd 54760] [#gap acks 0] [#dup tsns 0]
+23:39:10.517887 IP (tos 0x2,ECT(0), ttl 64, id 8, offset 0, flags [DF], proto SCTP (132), length 156)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1811362568] [SID: 0] [SSEQ 4] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 108B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x3(FE) Correlator 0x4
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 84 (data length 80 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV Set(0x1) length 72
+ PATH-DATA TLV, length 68 (data encapsulated 64 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ PATH-DATA TLV, length 56 (data encapsulated 52 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 0
+ PATH-DATA TLV, length 44 (data encapsulated 40 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ PATH-DATA TLV, length 32 (data encapsulated 28 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 0
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 0000 0008
+ ]
+
+
+23:39:10.521718 IP (tos 0x2,ECT(0), ttl 64, id 9, offset 0, flags [DF], proto SCTP (132), length 108)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2958179473] [SID: 0] [SSEQ 4] [PPID 0x0]
+ ForCES Config Response
+ ForCES Version 1 len 60B flags 0x38400000
+ SrcID 0x3(FE) DstID 0x40000001(CE) Correlator 0x4
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 36 (data length 32 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV SetResp(0x3) length 24
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ RESULT TLV (Length 8 DataLen 4 Bytes)
+ Result: SUCCESS (code 0x0)
+
+
+23:39:10.717774 IP (tos 0x2,ECT(0), ttl 64, id 10, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 1811362568] [a_rwnd 55264] [#gap acks 0] [#dup tsns 0]
+23:39:10.721988 IP (tos 0x2,ECT(0), ttl 64, id 9, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2958179473] [a_rwnd 54760] [#gap acks 0] [#dup tsns 0]
+23:39:12.997636 IP (tos 0x2,ECT(0), ttl 64, id 10, offset 0, flags [DF], proto SCTP (132), length 160)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1811362569] [SID: 0] [SSEQ 5] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 112B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x3(FE) Correlator 0x5
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 88 (data length 84 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV Set(0x1) length 76
+ PATH-DATA TLV, length 72 (data encapsulated 68 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ PATH-DATA TLV, length 60 (data encapsulated 56 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 0
+ PATH-DATA TLV, length 48 (data encapsulated 44 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ PATH-DATA TLV, length 36 (data encapsulated 32 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 0
+ PATH-DATA TLV, length 24 (data encapsulated 20 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 3
+ FULLDATA TLV (Length 10 DataLen 6 pad 2 Bytes)
+ [
+ 0x0000: 0002 0406 080a 0000
+ ]
+
+
+23:39:13.001457 IP (tos 0x2,ECT(0), ttl 64, id 11, offset 0, flags [DF], proto SCTP (132), length 108)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2958179474] [SID: 0] [SSEQ 5] [PPID 0x0]
+ ForCES Config Response
+ ForCES Version 1 len 60B flags 0x38400000
+ SrcID 0x3(FE) DstID 0x40000001(CE) Correlator 0x5
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 36 (data length 32 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV SetResp(0x3) length 24
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ RESULT TLV (Length 8 DataLen 4 Bytes)
+ Result: SUCCESS (code 0x0)
+
+
+23:39:13.197325 IP (tos 0x2,ECT(0), ttl 64, id 12, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 1811362569] [a_rwnd 55264] [#gap acks 0] [#dup tsns 0]
+23:39:13.201336 IP (tos 0x2,ECT(0), ttl 64, id 11, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2958179474] [a_rwnd 54760] [#gap acks 0] [#dup tsns 0]
+23:39:15.389357 IP (tos 0x2,ECT(0), ttl 64, id 12, offset 0, flags [DF], proto SCTP (132), length 200)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1811362570] [SID: 0] [SSEQ 6] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 152B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x3(FE) Correlator 0x6
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 128 (data length 124 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV Set(0x1) length 116
+ PATH-DATA TLV, length 112 (data encapsulated 108 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ PATH-DATA TLV, length 100 (data encapsulated 96 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 0
+ PATH-DATA TLV, length 88 (data encapsulated 84 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ PATH-DATA TLV, length 76 (data encapsulated 72 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 1400 0001
+ ]
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 0000 000c
+ ]
+ PATH-DATA TLV, length 24 (data encapsulated 20 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 3
+ FULLDATA TLV (Length 10 DataLen 6 pad 2 Bytes)
+ [
+ 0x0000: 0003 0609 0c0f 0000
+ ]
+
+
+23:39:15.393377 IP (tos 0x2,ECT(0), ttl 64, id 13, offset 0, flags [DF], proto SCTP (132), length 108)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2958179475] [SID: 0] [SSEQ 6] [PPID 0x0]
+ ForCES Config Response
+ ForCES Version 1 len 60B flags 0x38400000
+ SrcID 0x3(FE) DstID 0x40000001(CE) Correlator 0x6
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 36 (data length 32 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV SetResp(0x3) length 24
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ RESULT TLV (Length 8 DataLen 4 Bytes)
+ Result: SUCCESS (code 0x0)
+
+
+23:39:15.588896 IP (tos 0x2,ECT(0), ttl 64, id 14, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 1811362570] [a_rwnd 55264] [#gap acks 0] [#dup tsns 0]
+23:39:15.592787 IP (tos 0x2,ECT(0), ttl 64, id 13, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2958179475] [a_rwnd 54760] [#gap acks 0] [#dup tsns 0]
+23:39:18.045055 IP (tos 0x2,ECT(0), ttl 64, id 14, offset 0, flags [DF], proto SCTP (132), length 220)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1811362571] [SID: 0] [SSEQ 7] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 172B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x3(FE) Correlator 0x7
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 148 (data length 144 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV Set(0x1) length 136
+ PATH-DATA TLV, length 132 (data encapsulated 128 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ PATH-DATA TLV, length 120 (data encapsulated 116 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 0000 0003
+ ]
+ PATH-DATA TLV, length 88 (data encapsulated 84 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ PATH-DATA TLV, length 76 (data encapsulated 72 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 0
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 1e00 0001
+ ]
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ FULLDATA TLV (Length 8 DataLen 4 Bytes)
+ [
+ 0x0000: 0000 000d
+ ]
+ PATH-DATA TLV, length 24 (data encapsulated 20 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 3
+ FULLDATA TLV (Length 10 DataLen 6 pad 2 Bytes)
+ [
+ 0x0000: 0004 080c 1014 0000
+ ]
+
+
+23:39:18.049369 IP (tos 0x2,ECT(0), ttl 64, id 15, offset 0, flags [DF], proto SCTP (132), length 108)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2958179476] [SID: 0] [SSEQ 7] [PPID 0x0]
+ ForCES Config Response
+ ForCES Version 1 len 60B flags 0x38400000
+ SrcID 0x3(FE) DstID 0x40000001(CE) Correlator 0x7
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 36 (data length 32 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV SetResp(0x3) length 24
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ RESULT TLV (Length 8 DataLen 4 Bytes)
+ Result: SUCCESS (code 0x0)
+
+
+23:39:18.244425 IP (tos 0x2,ECT(0), ttl 64, id 16, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 1811362571] [a_rwnd 55264] [#gap acks 0] [#dup tsns 0]
+23:39:18.248927 IP (tos 0x2,ECT(0), ttl 64, id 15, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2958179476] [a_rwnd 54760] [#gap acks 0] [#dup tsns 0]
+23:39:20.060819 IP (tos 0x2,ECT(0), ttl 64, id 16, offset 0, flags [DF], proto SCTP (132), length 136)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1811362572] [SID: 0] [SSEQ 8] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 88B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x3(FE) Correlator 0x8
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 64 (data length 60 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV Del(0x5) length 52
+ PATH-DATA TLV, length 48 (data encapsulated 44 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ PATH-DATA TLV, length 36 (data encapsulated 32 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 0
+ PATH-DATA TLV, length 24 (data encapsulated 20 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+ PATH-DATA TLV, length 12 (data encapsulated 8 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+
+
+23:39:20.065279 IP (tos 0x2,ECT(0), ttl 64, id 17, offset 0, flags [DF], proto SCTP (132), length 108)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2958179477] [SID: 0] [SSEQ 8] [PPID 0x0]
+ ForCES Config Response
+ ForCES Version 1 len 60B flags 0x38400000
+ SrcID 0x3(FE) DstID 0x40000001(CE) Correlator 0x8
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 36 (data length 32 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV DelResp(0x6) length 24
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ RESULT TLV (Length 8 DataLen 4 Bytes)
+ Result: SUCCESS (code 0x0)
+
+
+23:39:20.260061 IP (tos 0x2,ECT(0), ttl 64, id 18, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 1811362572] [a_rwnd 55264] [#gap acks 0] [#dup tsns 0]
+23:39:20.265566 IP (tos 0x2,ECT(0), ttl 64, id 17, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2958179477] [a_rwnd 54760] [#gap acks 0] [#dup tsns 0]
+23:39:22.796350 IP (tos 0x2,ECT(0), ttl 64, id 18, offset 0, flags [DF], proto SCTP (132), length 112)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 1811362573] [SID: 0] [SSEQ 9] [PPID 0x0]
+ ForCES Config
+ ForCES Version 1 len 64B flags 0xf8400000
+ SrcID 0x40000001(CE) DstID 0x3(FE) Correlator 0x9
+ ForCES flags:
+ AlwaysACK(0x3), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 40 (data length 36 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV Del(0x5) length 28
+ PATH-DATA TLV, length 24 (data encapsulated 20 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ PATH-DATA TLV, length 12 (data encapsulated 8 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 2
+
+
+23:39:22.800525 IP (tos 0x2,ECT(0), ttl 64, id 19, offset 0, flags [DF], proto SCTP (132), length 108)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [DATA] (B)(E) [TSN: 2958179478] [SID: 0] [SSEQ 9] [PPID 0x0]
+ ForCES Config Response
+ ForCES Version 1 len 60B flags 0x38400000
+ SrcID 0x3(FE) DstID 0x40000001(CE) Correlator 0x9
+ ForCES flags:
+ NoACK(0x0), prio=7, execute-all-or-none(0x1),
+ Standalone(0x0), StartofTransaction(0x0)
+ Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0
+ LFBselect TLV, length 36 (data length 32 Bytes)
+ #14(Classid e) instance 1
+ Oper TLV DelResp(0x6) length 24
+ PATH-DATA TLV, length 20 (data encapsulated 16 Bytes)
+ Pathdata: Flags 0x0 ID count 1
+ ID#01: 1
+ RESULT TLV (Length 8 DataLen 4 Bytes)
+ Result: SUCCESS (code 0x0)
+
+
+23:39:22.995584 IP (tos 0x2,ECT(0), ttl 64, id 20, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.63.16700 > 172.20.4.93.6700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 1811362573] [a_rwnd 55264] [#gap acks 0] [#dup tsns 0]
+23:39:23.001212 IP (tos 0x2,ECT(0), ttl 64, id 19, offset 0, flags [DF], proto SCTP (132), length 48)
+ 172.20.4.93.6700 > 172.20.4.63.16700: sctp[ForCES HP]
+ 1) [SACK] [cum ack 2958179478] [a_rwnd 54760] [#gap acks 0] [#dup tsns 0]
--- /dev/null
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [S], seq 397610159, win 14600, options [mss 1460,sackOK,TS val 2876069566 ecr 0,nop,wscale 7], length 0
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [S.], seq 2910871522, ack 397610160, win 28960, options [mss 1460,sackOK,TS val 84248969 ecr 2876069566,nop,wscale 7], length 0
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], ack 1, win 115, options [nop,nop,TS val 2876069566 ecr 84248969], length 0
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], seq 1:40, ack 1, win 227, options [nop,nop,TS val 84248971 ecr 2876069566], length 39
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], ack 40, win 115, options [nop,nop,TS val 2876069573 ecr 84248971], length 0
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 1:22, ack 40, win 115, options [nop,nop,TS val 2876069573 ecr 84248971], length 21
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [.], ack 22, win 227, options [nop,nop,TS val 84248971 ecr 2876069573], length 0
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 22:814, ack 40, win 115, options [nop,nop,TS val 2876069573 ecr 84248971], length 792
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [.], ack 814, win 239, options [nop,nop,TS val 84248971 ecr 2876069573], length 0
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], seq 40:1024, ack 814, win 239, options [nop,nop,TS val 84248971 ecr 2876069573], length 984
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 814:838, ack 1024, win 130, options [nop,nop,TS val 2876069574 ecr 84248971], length 24
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], seq 1024:1176, ack 838, win 239, options [nop,nop,TS val 84248972 ecr 2876069574], length 152
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 838:982, ack 1176, win 145, options [nop,nop,TS val 2876069577 ecr 84248972], length 144
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], seq 1176:1896, ack 982, win 251, options [nop,nop,TS val 84248973 ecr 2876069577], length 720
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 982:998, ack 1896, win 161, options [nop,nop,TS val 2876069583 ecr 84248973], length 16
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [.], ack 998, win 251, options [nop,nop,TS val 84248983 ecr 2876069583], length 0
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 998:1046, ack 1896, win 161, options [nop,nop,TS val 2876069620 ecr 84248983], length 48
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [.], ack 1046, win 251, options [nop,nop,TS val 84248983 ecr 2876069620], length 0
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], seq 1896:1944, ack 1046, win 251, options [nop,nop,TS val 84248983 ecr 2876069620], length 48
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 1046:1110, ack 1944, win 161, options [nop,nop,TS val 2876069621 ecr 84248983], length 64
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], seq 1944:2008, ack 1110, win 251, options [nop,nop,TS val 84248983 ecr 2876069621], length 64
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], ack 2008, win 161, options [nop,nop,TS val 2876069662 ecr 84248983], length 0
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 1110:1254, ack 2008, win 161, options [nop,nop,TS val 2876070845 ecr 84248983], length 144
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], seq 2008:2040, ack 1254, win 264, options [nop,nop,TS val 84249289 ecr 2876070845], length 32
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], ack 2040, win 161, options [nop,nop,TS val 2876070846 ecr 84249289], length 0
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 1254:1382, ack 2040, win 161, options [nop,nop,TS val 2876070846 ecr 84249289], length 128
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], seq 2040:2088, ack 1382, win 276, options [nop,nop,TS val 84249292 ecr 2876070846], length 48
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 1382:1830, ack 2088, win 161, options [nop,nop,TS val 2876070859 ecr 84249292], length 448
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], seq 2088:2200, ack 1830, win 289, options [nop,nop,TS val 84249292 ecr 2876070859], length 112
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], seq 2200:2488, ack 1830, win 289, options [nop,nop,TS val 84249293 ecr 2876070859], length 288
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], ack 2488, win 176, options [nop,nop,TS val 2876070861 ecr 84249292], length 0
+IP 20.0.0.1.22540 > 20.0.0.2.6081: Geneve, Flags [C], vni 0xa, options [8 bytes]: IP 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], seq 2488:2568, ack 1830, win 289, options [nop,nop,TS val 84249351 ecr 2876070861], length 80
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], ack 2568, win 176, options [nop,nop,TS val 2876071133 ecr 84249351], length 0
--- /dev/null
+IP 20.0.0.2.50525 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2 > 30.0.0.1: ICMP echo reply, id 10578, seq 23, length 64
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [S], seq 397610159, win 14600, options [mss 1460,sackOK,TS val 2876069566 ecr 0,nop,wscale 7], length 0
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], ack 2910871523, win 115, options [nop,nop,TS val 2876069566 ecr 84248969], length 0
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], ack 40, win 115, options [nop,nop,TS val 2876069573 ecr 84248971], length 0
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 0:21, ack 40, win 115, options [nop,nop,TS val 2876069573 ecr 84248971], length 21
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 21:813, ack 40, win 115, options [nop,nop,TS val 2876069573 ecr 84248971], length 792
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 813:837, ack 1024, win 130, options [nop,nop,TS val 2876069574 ecr 84248971], length 24
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 837:981, ack 1176, win 145, options [nop,nop,TS val 2876069577 ecr 84248972], length 144
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 981:997, ack 1896, win 161, options [nop,nop,TS val 2876069583 ecr 84248973], length 16
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 997:1045, ack 1896, win 161, options [nop,nop,TS val 2876069620 ecr 84248983], length 48
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 1045:1109, ack 1944, win 161, options [nop,nop,TS val 2876069621 ecr 84248983], length 64
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], ack 2008, win 161, options [nop,nop,TS val 2876069662 ecr 84248983], length 0
+IP 20.0.0.2.50525 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2 > 30.0.0.1: ICMP echo reply, id 10578, seq 24, length 64
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 1109:1253, ack 2008, win 161, options [nop,nop,TS val 2876070845 ecr 84248983], length 144
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], ack 2040, win 161, options [nop,nop,TS val 2876070846 ecr 84249289], length 0
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 1253:1381, ack 2040, win 161, options [nop,nop,TS val 2876070846 ecr 84249289], length 128
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], seq 1381:1829, ack 2088, win 161, options [nop,nop,TS val 2876070859 ecr 84249292], length 448
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], ack 2488, win 176, options [nop,nop,TS val 2876070861 ecr 84249292], length 0
+IP 20.0.0.2.43443 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], ack 2568, win 176, options [nop,nop,TS val 2876071133 ecr 84249351], length 0
+IP 20.0.0.2.50525 > 20.0.0.1.6081: Geneve, Flags [none], vni 0xb: IP 30.0.0.2 > 30.0.0.1: ICMP echo reply, id 10578, seq 25, length 64
--- /dev/null
+IP (tos 0x0, ttl 64, id 57261, offset 0, flags [DF], proto UDP (17), length 142)
+ 20.0.0.1.12618 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 48546, offset 0, flags [DF], proto ICMP (1), length 84)
+ 30.0.0.1 > 30.0.0.2: ICMP echo request, id 10578, seq 23, length 64
+IP (tos 0x0, ttl 64, id 34821, offset 0, flags [DF], proto UDP (17), length 134)
+ 20.0.0.2.50525 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 4595, offset 0, flags [none], proto ICMP (1), length 84)
+ 30.0.0.2 > 30.0.0.1: ICMP echo reply, id 10578, seq 23, length 64
+IP (tos 0x0, ttl 64, id 34822, offset 0, flags [DF], proto UDP (17), length 110)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23057, offset 0, flags [DF], proto TCP (6), length 60)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [S], cksum 0xe437 (correct), seq 397610159, win 14600, options [mss 1460,sackOK,TS val 2876069566 ecr 0,nop,wscale 7], length 0
+IP (tos 0x0, ttl 64, id 57274, offset 0, flags [DF], proto UDP (17), length 118)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [S.], cksum 0x101d (correct), seq 2910871522, ack 397610160, win 28960, options [mss 1460,sackOK,TS val 84248969 ecr 2876069566,nop,wscale 7], length 0
+IP (tos 0x0, ttl 64, id 34823, offset 0, flags [DF], proto UDP (17), length 102)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23058, offset 0, flags [DF], proto TCP (6), length 52)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], cksum 0xaf96 (correct), seq 1, ack 1, win 115, options [nop,nop,TS val 2876069566 ecr 84248969], length 0
+IP (tos 0x0, ttl 64, id 57275, offset 0, flags [DF], proto UDP (17), length 149)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54890, offset 0, flags [DF], proto TCP (6), length 91)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], cksum 0xf103 (correct), seq 1:40, ack 1, win 227, options [nop,nop,TS val 84248971 ecr 2876069566], length 39
+IP (tos 0x0, ttl 64, id 34824, offset 0, flags [DF], proto UDP (17), length 102)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23059, offset 0, flags [DF], proto TCP (6), length 52)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], cksum 0xaf66 (correct), seq 1, ack 40, win 115, options [nop,nop,TS val 2876069573 ecr 84248971], length 0
+IP (tos 0x0, ttl 64, id 34825, offset 0, flags [DF], proto UDP (17), length 123)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23060, offset 0, flags [DF], proto TCP (6), length 73)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], cksum 0xeea0 (correct), seq 1:22, ack 40, win 115, options [nop,nop,TS val 2876069573 ecr 84248971], length 21
+IP (tos 0x0, ttl 64, id 57276, offset 0, flags [DF], proto UDP (17), length 110)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54891, offset 0, flags [DF], proto TCP (6), length 52)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [.], cksum 0xaee1 (correct), seq 40, ack 22, win 227, options [nop,nop,TS val 84248971 ecr 2876069573], length 0
+IP (tos 0x0, ttl 64, id 34826, offset 0, flags [DF], proto UDP (17), length 894)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23061, offset 0, flags [DF], proto TCP (6), length 844)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], cksum 0xe70f (correct), seq 22:814, ack 40, win 115, options [nop,nop,TS val 2876069573 ecr 84248971], length 792
+IP (tos 0x0, ttl 64, id 57277, offset 0, flags [DF], proto UDP (17), length 110)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54892, offset 0, flags [DF], proto TCP (6), length 52)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [.], cksum 0xabbd (correct), seq 40, ack 814, win 239, options [nop,nop,TS val 84248971 ecr 2876069573], length 0
+IP (tos 0x0, ttl 64, id 57278, offset 0, flags [DF], proto UDP (17), length 1094)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54893, offset 0, flags [DF], proto TCP (6), length 1036)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], cksum 0xb8b1 (correct), seq 40:1024, ack 814, win 239, options [nop,nop,TS val 84248971 ecr 2876069573], length 984
+IP (tos 0x0, ttl 64, id 34827, offset 0, flags [DF], proto UDP (17), length 126)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23062, offset 0, flags [DF], proto TCP (6), length 76)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], cksum 0x79fb (correct), seq 814:838, ack 1024, win 130, options [nop,nop,TS val 2876069574 ecr 84248971], length 24
+IP (tos 0x0, ttl 64, id 57279, offset 0, flags [DF], proto UDP (17), length 262)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54894, offset 0, flags [DF], proto TCP (6), length 204)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], cksum 0xa779 (correct), seq 1024:1176, ack 838, win 239, options [nop,nop,TS val 84248972 ecr 2876069574], length 152
+IP (tos 0x0, ttl 64, id 34828, offset 0, flags [DF], proto UDP (17), length 246)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23063, offset 0, flags [DF], proto TCP (6), length 196)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], cksum 0xecb6 (correct), seq 838:982, ack 1176, win 145, options [nop,nop,TS val 2876069577 ecr 84248972], length 144
+IP (tos 0x0, ttl 64, id 57280, offset 0, flags [DF], proto UDP (17), length 830)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54895, offset 0, flags [DF], proto TCP (6), length 772)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], cksum 0x6255 (correct), seq 1176:1896, ack 982, win 251, options [nop,nop,TS val 84248973 ecr 2876069577], length 720
+IP (tos 0x0, ttl 64, id 34829, offset 0, flags [DF], proto UDP (17), length 118)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23064, offset 0, flags [DF], proto TCP (6), length 68)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], cksum 0x99de (correct), seq 982:998, ack 1896, win 161, options [nop,nop,TS val 2876069583 ecr 84248973], length 16
+IP (tos 0x0, ttl 64, id 57288, offset 0, flags [DF], proto UDP (17), length 110)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54896, offset 0, flags [DF], proto TCP (6), length 52)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [.], cksum 0xa3a3 (correct), seq 1896, ack 998, win 251, options [nop,nop,TS val 84248983 ecr 2876069583], length 0
+IP (tos 0x0, ttl 64, id 34830, offset 0, flags [DF], proto UDP (17), length 150)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23065, offset 0, flags [DF], proto TCP (6), length 100)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], cksum 0xb953 (correct), seq 998:1046, ack 1896, win 161, options [nop,nop,TS val 2876069620 ecr 84248983], length 48
+IP (tos 0x0, ttl 64, id 57289, offset 0, flags [DF], proto UDP (17), length 110)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54897, offset 0, flags [DF], proto TCP (6), length 52)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [.], cksum 0xa34e (correct), seq 1896, ack 1046, win 251, options [nop,nop,TS val 84248983 ecr 2876069620], length 0
+IP (tos 0x0, ttl 64, id 57290, offset 0, flags [DF], proto UDP (17), length 158)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54898, offset 0, flags [DF], proto TCP (6), length 100)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], cksum 0xd5ed (correct), seq 1896:1944, ack 1046, win 251, options [nop,nop,TS val 84248983 ecr 2876069620], length 48
+IP (tos 0x0, ttl 64, id 34831, offset 0, flags [DF], proto UDP (17), length 166)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23066, offset 0, flags [DF], proto TCP (6), length 116)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], cksum 0xf2f0 (correct), seq 1046:1110, ack 1944, win 161, options [nop,nop,TS val 2876069621 ecr 84248983], length 64
+IP (tos 0x0, ttl 64, id 57291, offset 0, flags [DF], proto UDP (17), length 174)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54899, offset 0, flags [DF], proto TCP (6), length 116)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], cksum 0x4ac6 (correct), seq 1944:2008, ack 1110, win 251, options [nop,nop,TS val 84248983 ecr 2876069621], length 64
+IP (tos 0x0, ttl 64, id 34832, offset 0, flags [DF], proto UDP (17), length 102)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23067, offset 0, flags [DF], proto TCP (6), length 52)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], cksum 0xa2ce (correct), seq 1110, ack 2008, win 161, options [nop,nop,TS val 2876069662 ecr 84248983], length 0
+IP (tos 0x0, ttl 64, id 57466, offset 0, flags [DF], proto UDP (17), length 142)
+ 20.0.0.1.12618 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 48621, offset 0, flags [DF], proto ICMP (1), length 84)
+ 30.0.0.1 > 30.0.0.2: ICMP echo request, id 10578, seq 24, length 64
+IP (tos 0x0, ttl 64, id 34833, offset 0, flags [DF], proto UDP (17), length 134)
+ 20.0.0.2.50525 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 4596, offset 0, flags [none], proto ICMP (1), length 84)
+ 30.0.0.2 > 30.0.0.1: ICMP echo reply, id 10578, seq 24, length 64
+IP (tos 0x0, ttl 64, id 34834, offset 0, flags [DF], proto UDP (17), length 246)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23068, offset 0, flags [DF], proto TCP (6), length 196)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], cksum 0x318f (correct), seq 1110:1254, ack 2008, win 161, options [nop,nop,TS val 2876070845 ecr 84248983], length 144
+IP (tos 0x0, ttl 64, id 57567, offset 0, flags [DF], proto UDP (17), length 142)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54900, offset 0, flags [DF], proto TCP (6), length 84)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], cksum 0x3a95 (correct), seq 2008:2040, ack 1254, win 264, options [nop,nop,TS val 84249289 ecr 2876070845], length 32
+IP (tos 0x0, ttl 64, id 34835, offset 0, flags [DF], proto UDP (17), length 102)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23069, offset 0, flags [DF], proto TCP (6), length 52)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], cksum 0x9c4c (correct), seq 1254, ack 2040, win 161, options [nop,nop,TS val 2876070846 ecr 84249289], length 0
+IP (tos 0x0, ttl 64, id 34836, offset 0, flags [DF], proto UDP (17), length 230)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 23070, offset 0, flags [DF], proto TCP (6), length 180)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], cksum 0x31d7 (correct), seq 1254:1382, ack 2040, win 161, options [nop,nop,TS val 2876070846 ecr 84249289], length 128
+IP (tos 0x0, ttl 64, id 57570, offset 0, flags [DF], proto UDP (17), length 158)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54901, offset 0, flags [DF], proto TCP (6), length 100)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], cksum 0x8215 (correct), seq 2040:2088, ack 1382, win 276, options [nop,nop,TS val 84249292 ecr 2876070846], length 48
+IP (tos 0x0, ttl 64, id 34837, offset 0, flags [DF], proto UDP (17), length 550)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x10, ttl 64, id 23071, offset 0, flags [DF], proto TCP (6), length 500)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [P.], cksum 0x5e86 (correct), seq 1382:1830, ack 2088, win 161, options [nop,nop,TS val 2876070859 ecr 84249292], length 448
+IP (tos 0x0, ttl 64, id 57571, offset 0, flags [DF], proto UDP (17), length 222)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54902, offset 0, flags [DF], proto TCP (6), length 164)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], cksum 0x2c83 (correct), seq 2088:2200, ack 1830, win 289, options [nop,nop,TS val 84249292 ecr 2876070859], length 112
+IP (tos 0x0, ttl 64, id 57572, offset 0, flags [DF], proto UDP (17), length 398)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54903, offset 0, flags [DF], proto TCP (6), length 340)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], cksum 0xbe0e (correct), seq 2200:2488, ack 1830, win 289, options [nop,nop,TS val 84249293 ecr 2876070859], length 288
+IP (tos 0x0, ttl 64, id 34838, offset 0, flags [DF], proto UDP (17), length 102)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x10, ttl 64, id 23072, offset 0, flags [DF], proto TCP (6), length 52)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], cksum 0x982b (correct), seq 1830, ack 2488, win 176, options [nop,nop,TS val 2876070861 ecr 84249292], length 0
+IP (tos 0x0, ttl 64, id 57627, offset 0, flags [DF], proto UDP (17), length 190)
+ 20.0.0.1.22540 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 54904, offset 0, flags [DF], proto TCP (6), length 132)
+ 30.0.0.1.22 > 30.0.0.2.51225: Flags [P.], cksum 0x3d51 (correct), seq 2488:2568, ack 1830, win 289, options [nop,nop,TS val 84249351 ecr 2876070861], length 80
+IP (tos 0x0, ttl 64, id 34839, offset 0, flags [DF], proto UDP (17), length 102)
+ 20.0.0.2.43443 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x10, ttl 64, id 23073, offset 0, flags [DF], proto TCP (6), length 52)
+ 30.0.0.2.51225 > 30.0.0.1.22: Flags [.], cksum 0x9690 (correct), seq 1830, ack 2568, win 176, options [nop,nop,TS val 2876071133 ecr 84249351], length 0
+IP (tos 0x0, ttl 64, id 57691, offset 0, flags [DF], proto UDP (17), length 142)
+ 20.0.0.1.12618 > 20.0.0.2.6081: [no cksum] Geneve, Flags [C], vni 0xa, options [class Standard (0x0) type 0x80(C) len 8 data 0000000c]
+ IP (tos 0x0, ttl 64, id 48733, offset 0, flags [DF], proto ICMP (1), length 84)
+ 30.0.0.1 > 30.0.0.2: ICMP echo request, id 10578, seq 25, length 64
+IP (tos 0x0, ttl 64, id 34840, offset 0, flags [DF], proto UDP (17), length 134)
+ 20.0.0.2.50525 > 20.0.0.1.6081: [no cksum] Geneve, Flags [none], vni 0xb
+ IP (tos 0x0, ttl 64, id 4597, offset 0, flags [none], proto ICMP (1), length 84)
+ 30.0.0.2 > 30.0.0.1: ICMP echo reply, id 10578, seq 25, length 64
--- /dev/null
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769562 lon:56597275
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770788 lon:56598784
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769562 lon:56597275
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770788 lon:56598784
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769562 lon:56597275
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770822 lon:56598670
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769562 lon:56597275
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770711 lon:56598670
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769562 lon:56597275
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770711 lon:56598670
+GeoNet src:00:0c:42:69:68:be; v:0 NH:1-BTP-A HT:5-1-TopoScopeBcast-MH HopLim:2 Payload:29 GN_ADDR:c0:cc:00:0c:42:69:68:be lat:514775183 lon:56605966; BTP Dst:5000 Src:5000; ItsPduHeader v:0 t:0-CAM
+ 0x0000: 0000 013c f7d0 912d 0000 0019 8400 6bf4 ...<...-......k.
+ 0x0010: d607 abb5 6c80 09f6 00 ....l....
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769429 lon:56597103
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770711 lon:56598670
+CALM FAST src:00:0c:42:69:68:be; SrcNwref:0; DstNwref:0;
+ 0x0000: 0000 01ac 8005 4455 3540 1c02 a2b3 0290 ......DU5@......
+ 0x0010: 2035 6fa0 6041 a4b6 1737 4656 56c2 0547 .5o.`A...7FVV..G
+ 0x0020: 2617 6657 2736 52f5 a756 9646 5696 e646 &.fW'6R..V.FV..F
+ 0x0030: 5020 4047 063f 9300 0030 P.@G.?...0
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769429 lon:56597103
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770641 lon:56598655
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769429 lon:56597103
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770641 lon:56598655
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769429 lon:56597103
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770717 lon:56598526
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769415 lon:56597089
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770717 lon:56598526
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769415 lon:56597089
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770606 lon:56598526
+GeoNet src:00:0c:42:69:68:be; v:0 NH:1-BTP-A HT:5-1-TopoScopeBcast-MH HopLim:2 Payload:29 GN_ADDR:c0:cc:00:0c:42:69:68:be lat:514775183 lon:56605966; BTP Dst:5000 Src:5000; ItsPduHeader v:0 t:0-CAM
+ 0x0000: 0000 013c f7d0 9ce7 0000 0019 8400 6bf4 ...<..........k.
+ 0x0010: d607 abb5 6c80 09f6 00 ....l....
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769422 lon:56596946
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770606 lon:56598526
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769422 lon:56596946
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770620 lon:56598541
+GeoNet src:00:0c:42:69:68:be; v:0 NH:1-BTP-A HT:5-1-TopoScopeBcast-MH HopLim:2 Payload:29 GN_ADDR:c0:cc:00:0c:42:69:68:be lat:514775183 lon:56605966; BTP Dst:5000 Src:5000; ItsPduHeader v:0 t:0-CAM
+ 0x0000: 0000 013c f7d0 a0d0 0000 0019 8400 6bf4 ...<..........k.
+ 0x0010: d607 abb5 6c80 09f6 00 ....l....
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+CALM FAST src:00:0c:42:69:68:be; SrcNwref:0; DstNwref:0;
+ 0x0000: 0000 02dc 8005 4455 3540 1c02 0513 04f3 ......DU5@......
+ 0x0010: 0380 2030 0ff8 4020 356f a060 a010 2300 ...0..@.5o.`..#.
+ 0x0020: a020 4512 4d10 e020 202c 9300 c020 402b ..E.M....,....@+
+ 0x0030: 2fc1 5020 4188 be06 5300 6020 1000 2010 /.P.A...S.`.....
+ 0x0040: 0020 1000 2010 00a0 101a 1133 0000 2010 ...........3....
+ 0x0050: 0020 1000 a010 2020 1000 2010 0040 0060 .............@.`
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769408 lon:56596932
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770514 lon:56598397
+CALM FAST src:00:0c:42:69:68:be; SrcNwref:0; DstNwref:0;
+ 0x0000: 0000 01ac 8005 4455 3540 1c02 a2b3 0290 ......DU5@......
+ 0x0010: 2035 6fa0 6041 a4b6 1737 4656 56c2 0547 .5o.`A...7FVV..G
+ 0x0020: 2617 6657 2736 52f5 a756 9646 5696 e646 &.fW'6R..V.FV..F
+ 0x0030: 5020 4039 226f 5300 0030 P.@9"oS..0
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769408 lon:56596932
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770514 lon:56598397
+GeoNet src:00:0c:42:69:68:be; v:0 NH:1-BTP-A HT:5-1-TopoScopeBcast-MH HopLim:2 Payload:29 GN_ADDR:c0:cc:00:0c:42:69:68:be lat:514775183 lon:56605966; BTP Dst:5000 Src:5000; ItsPduHeader v:0 t:0-CAM
+ 0x0000: 0000 013c f7d0 a4b9 0000 0019 8400 6bf4 ...<..........k.
+ 0x0010: d607 abb5 6c80 09f6 00 ....l....
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769352 lon:56596932
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770514 lon:56598397
+CALM FAST src:00:0c:42:69:68:be; SrcNwref:0; DstNwref:0;
+ 0x0000: 0000 01ac 8005 4455 3540 1c02 a2b3 0290 ......DU5@......
+ 0x0010: 2035 6fa0 6041 a4b6 1737 4656 56c2 0547 .5o.`A...7FVV..G
+ 0x0020: 2617 6657 2736 52f5 a756 9646 5696 e646 &.fW'6R..V.FV..F
+ 0x0030: 5020 4039 226f 5300 0030 P.@9"oS..0
+GeoNet src:00:0c:42:69:68:be; v:0 NH:1-BTP-A HT:5-1-TopoScopeBcast-MH HopLim:2 Payload:138 GN_ADDR:c0:cc:00:0c:42:69:68:be lat:514775183 lon:56605966; BTP Dst:6103 Src:6103; ItsPduHeader v:0 t:106-ecoCAM
+ 0x0000: 006a 013c f7d0 a6aa 0000 0066 0026 013c .j.<.......f.&.<
+ 0x0010: f7d0 ba32 0080 0280 00cc 0407 d456 4c00 ...2.........VL.
+ 0x0020: 8000 9e7b e857 2100 9e7b e857 2100 00cc ...{.W!..{.W!...
+ 0x0030: 0407 d4ab cc00 8000 9e7b e85a ed00 9e7b .........{.Z...{
+ 0x0040: e85a ed00 00cc 0407 d501 cc00 8000 9e7b .Z.............{
+ 0x0050: e85e b900 9e7b e85e b900 00cc 0407 d557 .^...{.^.......W
+ 0x0060: 4c00 8000 9e7b e862 8500 9e7b e862 8500 L....{.b...{.b..
+ 0x0070: 00cc 0407 d5ad 4c00 8000 9e7b e866 5100 ......L....{.fQ.
+ 0x0080: 9e7b e866 5100 .{.fQ.
+GeoNet src:00:0c:42:69:68:be; v:0 NH:1-BTP-A HT:5-1-TopoScopeBcast-MH HopLim:2 Payload:29 GN_ADDR:c0:cc:00:0c:42:69:68:be lat:514775183 lon:56605966; BTP Dst:5000 Src:5000; ItsPduHeader v:0 t:0-CAM
+ 0x0000: 0000 013c f7d0 a6ae 0000 0019 8400 6bf4 ...<..........k.
+ 0x0010: d607 abb5 6c80 09f6 00 ....l....
+GeoNet src:00:0c:42:69:68:be; v:0 NH:1-BTP-A HT:5-1-TopoScopeBcast-MH HopLim:2 Payload:236 GN_ADDR:c0:cc:00:0c:42:69:68:be lat:514775183 lon:56605966; BTP Dst:6102 Src:6102; ItsPduHeader v:0 t:106-ecoCAM
+ 0x0000: 006a 013c f7d0 a6e1 0000 0066 fe7f 013c .j.<.......f...<
+ 0x0010: f7d0 ba69 0006 6000 b402 03e9 0004 4e34 ...i..`.......N4
+ 0x0020: 4030 000f de81 770f 4602 03ea 0204 4e4a @0....w.F.....NJ
+ 0x0030: 044e 4a80 3000 0fde 85dc 0f20 0004 0203 .NJ.0...........
+ 0x0040: eb00 044e 5c40 3000 0fde 8947 0f44 0207 ...N\@0....G.D..
+ 0x0050: d400 049c 9040 3000 0fde 80bb 8f44 0207 .....@0......D..
+ 0x0060: d500 049c a440 3000 0fde 8232 8f44 0207 .....@0....2.D..
+ 0x0070: d600 044e 9840 3000 0fde 8232 8f44 020b ...N.@0....2.D..
+ 0x0080: bf00 04ea ec40 3000 0fde 83a9 8f46 020b .....@0......F..
+ 0x0090: c002 04eb 0204 eb02 8030 000f de85 dc0f .........0......
+ 0x00a0: 2000 0602 0bc1 0004 eb14 4030 000f de86 ..........@0....
+ 0x00b0: 978f 4000 1402 0faa 0006 0139 4840 3000 ..@........9H@0.
+ 0x00c0: 0fde 86d6 0f44 020f ab00 0601 395c 4030 .....D......9\@0
+ 0x00d0: 000f de8a 7f8f 4402 0fac 0006 0139 7040 ......D......9p@
+ 0x00e0: 3000 0fde 8b3b 0f40 0....;.@
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769352 lon:56596932
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770473 lon:56598412
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769345 lon:56597075
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770473 lon:56598412
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+CALM FAST src:00:0c:42:69:68:be; SrcNwref:0; DstNwref:0;
+ 0x0000: 0000 02dc 8005 4455 3540 1c02 0513 04f3 ......DU5@......
+ 0x0010: 0380 2030 0ff8 9020 356f a060 a010 2300 ...0....5o.`..#.
+ 0x0020: a020 4512 4d11 1020 200d e300 c020 402b ..E.M.........@+
+ 0x0030: 2fc1 5020 4188 be06 5300 6020 1000 2010 /.P.A...S.`.....
+ 0x0040: 0020 1000 2010 00a0 101a 1133 0000 2010 ...........3....
+ 0x0050: 0020 1000 a010 2020 1000 2010 0040 0060 .............@.`
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769345 lon:56597075
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770528 lon:56598412
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769345 lon:56597075
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770528 lon:56598412
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769345 lon:56597075
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770473 lon:56598412
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769289 lon:56597075
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770473 lon:56598412
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769289 lon:56597075
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770486 lon:56598426
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769289 lon:56597075
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770486 lon:56598426
+GeoNet src:00:0c:42:69:68:be; v:0 NH:1-BTP-A HT:5-1-TopoScopeBcast-MH HopLim:2 Payload:29 GN_ADDR:c0:cc:00:0c:42:69:68:be lat:514775183 lon:56605966; BTP Dst:5000 Src:5000; ItsPduHeader v:0 t:0-CAM
+ 0x0000: 0000 013c f7d0 b651 0000 0019 8400 6bf4 ...<...Q......k.
+ 0x0010: d607 abb5 6c80 09f6 00 ....l....
+GeoNet src:00:0c:42:69:68:be; v:0 NH:1-BTP-A HT:5-1-TopoScopeBcast-MH HopLim:2 Payload:138 GN_ADDR:c0:cc:00:0c:42:69:68:be lat:514775183 lon:56605966; BTP Dst:6103 Src:6103; ItsPduHeader v:0 t:106-ecoCAM
+ 0x0000: 006a 013c f7d0 b650 0000 0066 002e 013c .j.<...P...f...<
+ 0x0010: f7d0 c9d8 0080 0280 00cc 0407 d456 4c00 .............VL.
+ 0x0020: 8000 9e7b e85e f400 9e7b e85e f400 00cc ...{.^...{.^....
+ 0x0030: 0407 d4ab cc00 8000 9e7b e862 c000 9e7b .........{.b...{
+ 0x0040: e862 c000 00cc 0407 d501 cc00 8000 9e7b .b.............{
+ 0x0050: e866 8c00 9e7b e866 8c00 00cc 0407 d557 .f...{.f.......W
+ 0x0060: 4c00 8000 9e7b e86a 5800 9e7b e86a 5800 L....{.jX..{.jX.
+ 0x0070: 00cc 0407 d5ad 4c00 8000 9e7b e86e 2400 ......L....{.n$.
+ 0x0080: 9e7b e86e 2400 .{.n$.
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769289 lon:56597075
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770486 lon:56598426
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769289 lon:56597075
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770486 lon:56598426
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769289 lon:56597075
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770592 lon:56598569
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769289 lon:56597075
+GeoNet src:00:0c:42:6d:54:df; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:df lat:514770592 lon:56598569
+GeoNet src:00:0c:42:6d:54:db; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:db lat:0 lon:0
+GeoNet src:00:0c:42:6d:54:d5; v:0 NH:0-Any HT:1-0-Beacon HopLim:1 Payload:0 GN_ADDR:00:00:00:0c:42:6d:54:d5 lat:514769289 lon:56597075
--- /dev/null
+SLARP (length: 18), keepalive: mineseen=0x000d0a31, yourseen=0x57405e26, reliability=0x04ff, link uptime=49d12h52m33s
--- /dev/null
+SLARP (length: 14), keepalive: mineseen=0x000d0a31, yourseen=0x57405e26, reliability=0x04ff
--- /dev/null
+SLARP (length: 20), keepalive: mineseen=0x00000005, yourseen=0x00000002, reliability=0xffff, link uptime=0d2h12m5s
+SLARP (length: 20), keepalive: mineseen=0x00000003, yourseen=0x00000005, reliability=0xffff, link uptime=0d6h51m44s
+SLARP (length: 20), keepalive: mineseen=0x00000006, yourseen=0x00000003, reliability=0xffff, link uptime=0d2h12m15s
+SLARP (length: 20), keepalive: mineseen=0x00000004, yourseen=0x00000006, reliability=0xffff, link uptime=0d6h51m54s
+SLARP (length: 20), keepalive: mineseen=0x00000007, yourseen=0x00000004, reliability=0xffff, link uptime=0d2h12m25s
+SLARP (length: 20), keepalive: mineseen=0x00000005, yourseen=0x00000007, reliability=0xffff, link uptime=0d6h52m4s
+IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 0, seq 0, length 80
+IP 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 0, seq 0, length 80
+IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 0, seq 1, length 80
+IP 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 0, seq 1, length 80
+IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 0, seq 2, length 80
+IP 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 0, seq 2, length 80
+IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 0, seq 3, length 80
+IP 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 0, seq 3, length 80
+IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 0, seq 4, length 80
+IP 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 0, seq 4, length 80
+unknown CHDLC protocol (0x2000)
+SLARP (length: 20), keepalive: mineseen=0x00000008, yourseen=0x00000005, reliability=0xffff, link uptime=0d2h12m35s
+SLARP (length: 20), keepalive: mineseen=0x00000006, yourseen=0x00000008, reliability=0xffff, link uptime=0d6h52m14s
+unknown CHDLC protocol (0x2000)
+SLARP (length: 20), keepalive: mineseen=0x00000009, yourseen=0x00000006, reliability=0xffff, link uptime=0d2h12m45s
+SLARP (length: 20), keepalive: mineseen=0x00000007, yourseen=0x00000009, reliability=0xffff, link uptime=0d6h52m24s
+SLARP (length: 20), keepalive: mineseen=0x0000000a, yourseen=0x00000007, reliability=0xffff, link uptime=0d2h12m55s
+SLARP (length: 20), keepalive: mineseen=0x00000008, yourseen=0x0000000a, reliability=0xffff, link uptime=0d6h52m34s
+SLARP (length: 20), keepalive: mineseen=0x0000000b, yourseen=0x00000008, reliability=0xffff, link uptime=0d2h13m5s
+SLARP (length: 20), keepalive: mineseen=0x00000009, yourseen=0x0000000b, reliability=0xffff, link uptime=0d6h52m44s
+SLARP (length: 20), keepalive: mineseen=0x0000000c, yourseen=0x00000009, reliability=0xffff, link uptime=0d2h13m15s
+SLARP (length: 20), keepalive: mineseen=0x0000000a, yourseen=0x0000000c, reliability=0xffff, link uptime=0d6h52m54s
+SLARP (length: 20), keepalive: mineseen=0x0000000d, yourseen=0x0000000a, reliability=0xffff, link uptime=0d2h13m25s
+SLARP (length: 20), keepalive: mineseen=0x0000000b, yourseen=0x0000000d, reliability=0xffff, link uptime=0d6h53m4s
+unknown CHDLC protocol (0x2000)
+SLARP (length: 20), keepalive: mineseen=0x0000000e, yourseen=0x0000000b, reliability=0xffff, link uptime=0d2h13m35s
+SLARP (length: 20), keepalive: mineseen=0x0000000c, yourseen=0x0000000e, reliability=0xffff, link uptime=0d6h53m14s
+unknown CHDLC protocol (0x2000)
+SLARP (length: 20), keepalive: mineseen=0x0000000f, yourseen=0x0000000c, reliability=0xffff, link uptime=0d2h13m45s
+SLARP (length: 20), keepalive: mineseen=0x0000000d, yourseen=0x0000000f, reliability=0xffff, link uptime=0d6h53m24s
+SLARP (length: 20), keepalive: mineseen=0x00000010, yourseen=0x0000000d, reliability=0xffff, link uptime=0d2h13m55s
+SLARP (length: 20), keepalive: mineseen=0x0000000e, yourseen=0x00000010, reliability=0xffff, link uptime=0d6h53m34s
--- /dev/null
+SLARP (length: 20), keepalive: mineseen=0x00000001, yourseen=0x00000000, reliability=0xffff, link uptime=1d0h1m32s
+SLARP (length: 20), request
+SLARP (length: 20), reply 15.0.0.1/255.255.255.252
+SLARP (length: 20), keepalive: mineseen=0x00000001, yourseen=0x00000000, reliability=0xffff, link uptime=1d0h1m42s
+SLARP (length: 20), keepalive: mineseen=0x00000001, yourseen=0x00000001, reliability=0xffff, link uptime=1d4h41m19s
+SLARP (length: 20), keepalive: mineseen=0x00000002, yourseen=0x00000001, reliability=0xffff, link uptime=1d0h1m52s
+SLARP (length: 20), keepalive: mineseen=0x00000002, yourseen=0x00000002, reliability=0xffff, link uptime=1d4h41m29s
--- /dev/null
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=3 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-coup 20: state=listen group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=3 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
--- /dev/null
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=3 [|hsrp]
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-coup 20: state=listen group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=3 [|hsrp]
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
+IP 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1
+IP 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1
--- /dev/null
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=3 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
--- /dev/null
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.10.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=200 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=3 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=speak group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=standby group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 44)
+ 192.168.0.20.1985 > 224.0.0.2.1985: HSRPv0-unknown (3) 16: state=initial group=2 [|hsrp]
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
+ 192.168.0.30.1985 > 224.0.0.2.1985: HSRPv0-hello 20: state=active group=1 addr=192.168.0.1 hellotime=3s holdtime=10s priority=100 auth="cisco^@^@^@"
--- /dev/null
+IP6 (hlim 255, next-header ICMPv6 (58) payload length: 176) fe80::b299:28ff:fec8:d66c > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 176
+ hop limit 64, Flags [home agent], pref medium, router lifetime 15s, reachable time 0s, retrans time 0s
+ prefix info option (3), length 32 (4): 2222:3333:4444:5555:6600::/72, Flags [onlink, auto], valid time 2592000s, pref. time 604800s
+ 0x0000: 48c0 0027 8d00 0009 3a80 0000 0000 2222
+ 0x0010: 3333 4444 5555 6600 0000 0000 0000
+ rdnss option (25), length 40 (5): lifetime 5s, addr: abcd::efef addr: 1234:5678::1
+ 0x0000: 0000 0000 0005 abcd 0000 0000 0000 0000
+ 0x0010: 0000 0000 efef 1234 5678 0000 0000 0000
+ 0x0020: 0000 0000 0001
+ dnssl option (31), length 56 (7): lifetime 5s, domain(s): example.com. example.org. dom1.dom2.tld.
+ 0x0000: 0000 0000 0005 0765 7861 6d70 6c65 0363
+ 0x0010: 6f6d 0007 6578 616d 706c 6503 6f72 6700
+ 0x0020: 0464 6f6d 3104 646f 6d32 0374 6c64 0000
+ 0x0030: 0000 0000 0000
+ mtu option (5), length 8 (1): 100
+ 0x0000: 0000 0000 0064
+ source link-address option (1), length 8 (1): b0:99:28:c8:d6:6c
+ 0x0000: b099 28c8 d66c
+ advertisement interval option (7), length 8 (1): 5000ms
+ 0x0000: 0000 0000 1388
+ homeagent information option (8), length 8 (1): preference 50001, lifetime 15
+ 0x0000: 0000 c351 000f
+IP6 (hlim 1, next-header Options (0) payload length: 36) fe80::215:17ff:fecc:e546 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 1 group record(s) [gaddr ff02::db8:1122:3344 to_ex { }]
+IP6 (hlim 1, next-header Options (0) payload length: 36) fe80::b2a8:6eff:fe0c:d4e8 > ff02::1: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener query v2 [max resp delay=10000] [gaddr :: robustness=2 qqi=60]
+IP6 (hlim 1, next-header Options (0) payload length: 96) fe80::215:17ff:fecc:e546 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 4 group record(s) [gaddr ff02::db8:1122:3344 is_ex { }] [gaddr ff02::1:ffcc:e546 is_ex { }] [gaddr ff02::1:ffa7:10ad is_ex { }] [gaddr ff02::1:ff00:2 is_ex { }]
+IP6 (hlim 1, next-header Options (0) payload length: 36) fe80::215:17ff:fecc:e546 > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 1 group record(s) [gaddr ff02::db8:1122:3344 to_in { }]
--- /dev/null
+IP6 (hlim 255, next-header ICMPv6 (58) payload length: 120) fe80::16cf:92ff:fe87:23d6 > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 120
+ hop limit 0, Flags [managed, other stateful], pref medium, router lifetime 0s, reachable time 0s, retrans time 0s
+ source link-address option (1), length 8 (1): 14:cf:92:87:23:d6
+ mtu option (5), length 8 (1): 1500
+ prefix info option (3), length 32 (4): fd8d:4fb3:5b2e::/64, Flags [onlink, auto], valid time 7200s, pref. time 1800s
+ route info option (24), length 16 (2): fd8d:4fb3:5b2e::/48, pref=medium, lifetime=7200s
+ rdnss option (25), length 24 (3): lifetime 1800s, addr: fd8d:4fb3:5b2e::1
+ dnssl option (31), length 16 (2): lifetime 1800s, domain(s): lan.
+IP6 (hlim 255, next-header ICMPv6 (58) payload length: 120) fe80::16cf:92ff:fe87:23d6 > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 120
+ hop limit 0, Flags [managed, other stateful], pref medium, router lifetime 0s, reachable time 0s, retrans time 0s
+ source link-address option (1), length 8 (1): 14:cf:92:87:23:d6
+ mtu option (5), length 8 (1): 1500
+ prefix info option (3), length 32 (4): fd8d:4fb3:5b2e::/64, Flags [onlink, auto], valid time 7200s, pref. time 1800s
+ route info option (24), length 16 (2): fd8d:4fb3:5b2e::/48, pref=medium, lifetime=7200s
+ rdnss option (25), length 24 (3): lifetime 1800s, addr: fd8d:4fb3:5b2e::1
+ dnssl option (31), length 16 (2): lifetime 1800s, domain(s): lan.
--- /dev/null
+10016360us tsft 1.0 Mb/s 2412 MHz 11b -22dB signal -86dB noise antenna 1 [bit 31] 0us Probe Request (omus) [1.0 2.0 5.5 11.0 6.0 9.0 12.0 18.0 Mbit]
+10018922us tsft 1.0 Mb/s 2412 MHz 11b -19dB signal -86dB noise antenna 0 [bit 31] 0us Acknowledgment RA:90:a4:de:c0:46:0a
+10017245us tsft 1.0 Mb/s -86dB noise 27dBm tx power [bit 15] 314us Probe Response (omus) [1.0* 2.0* 5.5* 11.0* 6.0 9.0 12.0 18.0 Mbit] CH: 1
+10085301us tsft 1.0 Mb/s 2412 MHz 11b -19dB signal -86dB noise antenna 1 [bit 31] 0us Probe Request (omus) [1.0 2.0 5.5 11.0 6.0 9.0 12.0 18.0 Mbit]
+10087718us tsft 1.0 Mb/s 2412 MHz 11b -18dB signal -86dB noise antenna 0 [bit 31] 0us Acknowledgment RA:90:a4:de:c0:46:0a
+10086042us tsft 1.0 Mb/s -86dB noise 27dBm tx power [bit 15] 314us Probe Response (omus) [1.0* 2.0* 5.5* 11.0* 6.0 9.0 12.0 18.0 Mbit] CH: 1
+10284358us tsft 1.0 Mb/s 2412 MHz 11b -61dB signal -86dB noise antenna 1 [bit 31] 0us Probe Request (omus) [1.0 2.0 5.5 11.0 6.0 9.0 12.0 18.0 Mbit]
+10288217us tsft 1.0 Mb/s 2412 MHz 11b -46dB signal -86dB noise antenna 0 [bit 31] 0us Acknowledgment RA:90:a4:de:c0:46:0a
+10286542us tsft 1.0 Mb/s -86dB noise 27dBm tx power [bit 15] 314us Probe Response (omus) [1.0* 2.0* 5.5* 11.0* 6.0 9.0 12.0 18.0 Mbit] CH: 1
+10351366us tsft 1.0 Mb/s 2412 MHz 11b -70dB signal -86dB noise antenna 1 [bit 31] 0us Probe Request (omus) [1.0 2.0 5.5 11.0 6.0 9.0 12.0 18.0 Mbit]
+10353769us tsft 1.0 Mb/s 2412 MHz 11b -57dB signal -86dB noise antenna 0 [bit 31] 0us Acknowledgment RA:90:a4:de:c0:46:0a
+10352092us tsft 1.0 Mb/s -86dB noise 27dBm tx power [bit 15] 314us Probe Response (omus) [1.0* 2.0* 5.5* 11.0* 6.0 9.0 12.0 18.0 Mbit] CH: 1
+10418368us tsft 1.0 Mb/s 2412 MHz 11b -67dB signal -86dB noise antenna 1 [bit 31] 0us Probe Request (omus) [1.0 2.0 5.5 11.0 6.0 9.0 12.0 18.0 Mbit]
+10420929us tsft 1.0 Mb/s 2412 MHz 11b -73dB signal -86dB noise antenna 0 [bit 31] 0us Acknowledgment RA:90:a4:de:c0:46:0a
+10419253us tsft 1.0 Mb/s -86dB noise 27dBm tx power [bit 15] 314us Probe Response (omus) [1.0* 2.0* 5.5* 11.0* 6.0 9.0 12.0 18.0 Mbit] CH: 1
+10485371us tsft 1.0 Mb/s 2412 MHz 11b -72dB signal -86dB noise antenna 1 [bit 31] 0us Probe Request (omus) [1.0 2.0 5.5 11.0 6.0 9.0 12.0 18.0 Mbit]
+10489278us tsft 1.0 Mb/s 2412 MHz 11b -74dB signal -86dB noise antenna 0 [bit 31] 0us Acknowledgment RA:90:a4:de:c0:46:0a
+10487602us tsft 1.0 Mb/s -86dB noise 27dBm tx power [bit 15] 314us Probe Response (omus) [1.0* 2.0* 5.5* 11.0* 6.0 9.0 12.0 18.0 Mbit] CH: 1
+13338508us tsft 1.0 Mb/s 2412 MHz 11b -14dB signal -86dB noise antenna 1 [bit 31] 314us Authentication (Open System)-1: Successful
+13340215us tsft 1.0 Mb/s 2412 MHz 11b -17dB signal -86dB noise antenna 0 [bit 31] 0us Acknowledgment RA:90:a4:de:c0:46:0a
+13339435us tsft 1.0 Mb/s -86dB noise 27dBm tx power [bit 15] 314us Authentication (Open System)-2:
+13341999us tsft 1.0 Mb/s 2412 MHz 11b -18dB signal -86dB noise antenna 1 [bit 31] 314us Assoc Request (omus) [1.0 2.0 5.5 11.0 6.0 9.0 12.0 18.0 Mbit]
+13346458us tsft 1.0 Mb/s 2412 MHz 11b -18dB signal -86dB noise antenna 0 [bit 31] 0us Acknowledgment RA:90:a4:de:c0:46:0a
+13344925us tsft 1.0 Mb/s -86dB noise 27dBm tx power [bit 15] 314us Assoc Response AID(1) :: Successful
+13355433us tsft 2412 MHz 11g -22dB signal -86dB noise antenna 1 19.5 Mb/s MCS 2 20 MHz lon GI [bit 31] 48us
+13454791us tsft 2412 MHz 11g -21dB signal -86dB noise antenna 1 52.0 Mb/s MCS 11 20 MHz lon GI [bit 31] Pwr Mgmt 44us
--- /dev/null
+7268us tsft 2462 MHz 11g -51dB signal antenna 1 150.0 Mb/s MCS 7 40 MHz short GI RX-STBC1 CF +QoS Data IV: 11 Pad 20 KeyID 0
+119738173us tsft 2462 MHz 11g -46dB signal antenna 1 135.0 Mb/s MCS 7 40 MHz lon GI RX-STBC2 CF +QoS Data IV: 1 Pad 20 KeyID 0
+470382336us tsft 2462 MHz 11g -45dB signal antenna 1 150.0 Mb/s MCS 7 40 MHz short GI RX-STBC3 CF +QoS Data IV: 5 Pad 20 KeyID 0
--- /dev/null
+IP 10.0.200.151 > 224.0.0.1: igmp query v1
+IP 10.0.200.163 > 224.0.0.252: igmp v1 report 224.0.0.252
+IP 192.168.1.3 > 239.255.255.250: igmp v1 report 239.255.255.250
+IP 10.0.200.108 > 224.0.1.24: igmp v1 report 224.0.1.24
+IP 10.0.200.100 > 224.0.1.60: igmp v1 report 224.0.1.60
+IP 10.0.200.144 > 224.0.0.9: igmp v1 report 224.0.0.9
+IP 10.0.200.108 > 239.255.255.254: igmp v1 report 239.255.255.254
+IP 10.0.200.10 > 224.0.0.251: igmp v1 report 224.0.0.251
+IP 10.0.200.151 > 224.0.0.1: igmp query v1
+IP 10.0.200.108 > 239.255.255.250: igmp v1 report 239.255.255.250
+IP 10.0.200.108 > 239.255.255.254: igmp v1 report 239.255.255.254
+IP 10.0.200.10 > 224.0.0.251: igmp v1 report 224.0.0.251
+IP 10.0.200.163 > 224.0.0.252: igmp v1 report 224.0.0.252
+IP 10.0.200.108 > 224.0.1.24: igmp v1 report 224.0.1.24
+IP 10.0.200.144 > 224.0.0.9: igmp v1 report 224.0.0.9
+IP 10.0.200.100 > 224.0.1.60: igmp v1 report 224.0.1.60
+IP 10.0.200.25 > 239.255.255.250: igmp v1 report 239.255.255.250
+IP 10.0.200.25 > 239.255.255.250: igmp v1 report 239.255.255.250
+IP 10.0.200.25 > 239.255.255.250: igmp v1 report 239.255.255.250
+IP 10.0.200.151 > 224.0.0.1: igmp query v1
+IP 10.0.200.163 > 239.255.255.250: igmp v1 report 239.255.255.250
+IP 10.0.200.144 > 224.0.0.9: igmp v1 report 224.0.0.9
+IP 10.0.200.163 > 224.0.0.252: igmp v1 report 224.0.0.252
+IP 10.0.200.100 > 224.0.1.60: igmp v1 report 224.0.1.60
+IP 10.0.200.108 > 224.0.1.24: igmp v1 report 224.0.1.24
+IP 10.0.200.108 > 239.255.255.254: igmp v1 report 239.255.255.254
+IP 10.0.200.10 > 224.0.0.251: igmp v1 report 224.0.0.251
--- /dev/null
+IP 192.168.1.2 > 224.0.0.1: igmp query v2
+IP 192.168.1.64 > 239.255.255.250: igmp v2 report 239.255.255.250
+IP 192.168.11.201 > 225.10.10.10: igmp v2 report 225.10.10.10
+IP 192.168.11.201 > 225.1.1.3: igmp v2 report 225.1.1.3
+IP 192.168.11.201 > 224.0.0.2: igmp leave 225.1.1.3
+IP 192.168.1.2 > 225.1.1.3: igmp query v2 [max resp time 10] [gaddr 225.1.1.3]
+IP 192.168.11.201 > 225.1.1.4: igmp v2 report 225.1.1.4
+IP 192.168.11.201 > 225.1.1.4: igmp v2 report 225.1.1.4
+IP 192.168.11.201 > 225.1.1.4: igmp v2 report 225.1.1.4
+IP 192.168.11.201 > 224.0.0.2: igmp leave 225.1.1.4
+IP 192.168.1.2 > 225.1.1.4: igmp query v2 [max resp time 10] [gaddr 225.1.1.4]
+IP 192.168.11.201 > 225.1.1.5: igmp v2 report 225.1.1.5
+IP 192.168.11.201 > 225.1.1.5: igmp v2 report 225.1.1.5
+IP 192.168.11.201 > 225.1.1.5: igmp v2 report 225.1.1.5
+IP 192.168.1.2 > 224.0.0.1: igmp query v2
+IP 192.168.11.201 > 225.10.10.10: igmp v2 report 225.10.10.10
+IP 192.168.1.64 > 239.255.255.250: igmp v2 report 239.255.255.250
+IP 192.168.11.201 > 225.1.1.5: igmp v2 report 225.1.1.5
--- /dev/null
+IP 192.2.0.2 > 224.0.0.1: igmp query v3
+IP 192.2.0.2 > 224.0.0.1: igmp query v3 [max resp time 51m12s]
+IP 192.2.0.2 > 224.0.0.1: igmp query v3 [max resp time 51m12s]
+IP 192.2.0.2 > 224.0.0.1: igmp query v3 [max resp time 1.0s]
+IP 192.2.0.2 > 224.0.0.1: igmp query v3 [max resp time 1.0s]
+IP 192.2.0.2 > 224.0.0.1: igmp query v3 [max resp time 1.0s]
--- /dev/null
+IP (tos 0x0, ttl 64, id 19908, offset 0, flags [none], proto UDP (17), length 404)
+ 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000000: parent_sa ikev2_init[I]:
+ (sa: len=116
+ (p: #1 protoid=isakmp transform=12 len=116
+ (t: #1 type=encr id=aes (type=keylen value=0080))
+ (t: #2 type=encr id=aes (type=keylen value=0100))
+ (t: #3 type=encr id=aes (type=keylen value=00c0))
+ (t: #4 type=encr id=3des )
+ (t: #5 type=prf id=hmac-sha )
+ (t: #6 type=prf id=hmac-md5 )
+ (t: #7 type=prf id=aes128_xcbc )
+ (t: #8 type=integ id=hmac-sha )
+ (t: #9 type=integ id=hmac-md5 )
+ (t: #10 type=integ id=aes-xcbc )
+ (t: #11 type=dh id=modp1024 )
+ (t: #12 type=dh id=modp2048 )))
+ (v2ke: len=128 group=modp1024)
+ (nonce: len=32 data=(6128ebd023a864e94a7f...ba041b5de59955900d818ac54e18b236739d9e8b))
+ (n: prot_id=#0 type=16388(nat_detection_source_ip))
+ (n: prot_id=#0 type=16389(nat_detection_destination_ip))
+IP (tos 0x0, ttl 64, id 19909, offset 0, flags [none], proto UDP (17), length 88)
+ 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000000: parent_sa ikev2_init[R]:
+ (n: prot_id=#0 type=16390(cookie) data=(00000001c2221e50c16e123f2b0c71aefcf0cb3b798782c6))
+IP (tos 0x0, ttl 64, id 19910, offset 0, flags [none], proto UDP (17), length 436)
+ 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000000: parent_sa ikev2_init[I]:
+ (n: prot_id=#0 type=16390(cookie) data=(00000001c2221e50c16e...ba041b5de59955900d818ac54e18b236739d9e8b))
+ (sa: len=116
+ (p: #1 protoid=isakmp transform=12 len=116
+ (t: #1 type=encr id=aes (type=keylen value=0080))
+ (t: #2 type=encr id=aes (type=keylen value=0100))
+ (t: #3 type=encr id=aes (type=keylen value=00c0))
+ (t: #4 type=encr id=3des )
+ (t: #5 type=prf id=hmac-sha )
+ (t: #6 type=prf id=hmac-md5 )
+ (t: #7 type=prf id=aes128_xcbc )
+ (t: #8 type=integ id=hmac-sha )
+ (t: #9 type=integ id=hmac-md5 )
+ (t: #10 type=integ id=aes-xcbc )
+ (t: #11 type=dh id=modp1024 )
+ (t: #12 type=dh id=modp2048 )))
+ (v2ke: len=128 group=modp1024)
+ (nonce: len=32 data=(6128ebd023a864e94a7f...ba041b5de59955900d818ac54e18b236739d9e8b))
+ (n: prot_id=#0 type=16388(nat_detection_source_ip))
+ (n: prot_id=#0 type=16389(nat_detection_destination_ip))
+IP (tos 0x0, ttl 64, id 19911, offset 0, flags [none], proto UDP (17), length 332)
+ 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000000: parent_sa ikev2_init[R]:
+ (sa: len=44
+ (p: #1 protoid=isakmp transform=4 len=44
+ (t: #1 type=encr id=aes (type=keylen value=0080))
+ (t: #2 type=prf id=hmac-sha )
+ (t: #3 type=integ id=hmac-sha )
+ (t: #4 type=dh id=modp1024 )))
+ (v2ke: len=128 group=modp1024)
+ (nonce: len=32 data=(b31c379f272ce2984bd1...905954a783be2c37e2ccc4fdd270a532dbe6f428))
+ (n: prot_id=#0 type=16388(nat_detection_source_ip))
+ (n: prot_id=#0 type=16389(nat_detection_destination_ip))
+IP (tos 0x0, ttl 64, id 19912, offset 0, flags [none], proto UDP (17), length 264)
+ 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000001: child_sa ikev2_auth[I]:
+ (v2e: len=204)
+IP (tos 0x0, ttl 64, id 19913, offset 0, flags [none], proto UDP (17), length 184)
+ 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000001: child_sa ikev2_auth[R]:
+ (v2e: len=124)
+IP (tos 0x0, ttl 64, id 19914, offset 0, flags [none], proto UDP (17), length 280)
+ 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000002: child_sa child_sa[I]:
+ (v2e: len=220)
+IP (tos 0x0, ttl 64, id 19915, offset 0, flags [none], proto UDP (17), length 248)
+ 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000003: child_sa child_sa[I]:
+ (v2e: len=188)
+IP (tos 0x0, ttl 64, id 19916, offset 0, flags [none], proto UDP (17), length 104)
+ 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000002: child_sa child_sa[R]:
+ (v2e: len=44)
+IP (tos 0x0, ttl 64, id 19917, offset 0, flags [none], proto UDP (17), length 104)
+ 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000003: child_sa child_sa[R]:
+ (v2e: len=44)
+IP (tos 0x0, ttl 64, id 19918, offset 0, flags [none], proto UDP (17), length 312)
+ 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000004: child_sa child_sa[I]:
+ (v2e: len=252)
+IP (tos 0x0, ttl 64, id 19919, offset 0, flags [none], proto UDP (17), length 280)
+ 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000005: child_sa child_sa[I]:
+ (v2e: len=220)
+IP (tos 0x0, ttl 64, id 19920, offset 0, flags [none], proto UDP (17), length 232)
+ 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000004: child_sa child_sa[R]:
+ (v2e: len=172)
+IP (tos 0x0, ttl 64, id 19921, offset 0, flags [none], proto UDP (17), length 232)
+ 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000005: child_sa child_sa[R]:
+ (v2e: len=172)
+IP (tos 0x0, ttl 64, id 19922, offset 0, flags [none], proto UDP (17), length 312)
+ 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000006: child_sa child_sa[I]:
+ (v2e: len=252)
+IP (tos 0x0, ttl 64, id 19923, offset 0, flags [none], proto UDP (17), length 280)
+ 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000007: child_sa child_sa[I]:
+ (v2e: len=220)
+IP (tos 0x0, ttl 64, id 19924, offset 0, flags [none], proto UDP (17), length 232)
+ 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000006: child_sa child_sa[R]:
+ (v2e: len=172)
+IP (tos 0x0, ttl 64, id 19925, offset 0, flags [none], proto UDP (17), length 232)
+ 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000007: child_sa child_sa[R]:
+ (v2e: len=172)
+IP (tos 0x0, ttl 64, id 19926, offset 0, flags [none], proto UDP (17), length 392)
+ 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000008: child_sa child_sa[I]:
+ (v2e: len=332)
+IP (tos 0x0, ttl 64, id 19927, offset 0, flags [none], proto UDP (17), length 344)
+ 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000008: child_sa child_sa[R]:
+ (v2e: len=284)
+IP (tos 0x0, ttl 64, id 19928, offset 0, flags [none], proto UDP (17), length 120)
+ 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000000: parent_sa inf2[I]:
+ (v2e: len=60)
--- /dev/null
+IP (tos 0x0, ttl 64, id 19908, offset 0, flags [none], proto UDP (17), length 404)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x0765 -> 0xf5df!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->0000000000000000: parent_sa ikev2_init[I]:
+ (sa: len=116
+ (p: #1 protoid=isakmp transform=12 len=116
+ (t: #1 type=encr id=aes (type=keylen value=0080))
+ (t: #2 type=encr id=aes (type=keylen value=0100))
+ (t: #3 type=encr id=aes (type=keylen value=00c0))
+ (t: #4 type=encr id=3des )
+ (t: #5 type=prf id=hmac-sha )
+ (t: #6 type=prf id=hmac-md5 )
+ (t: #7 type=prf id=aes128_xcbc )
+ (t: #8 type=integ id=hmac-sha )
+ (t: #9 type=integ id=hmac-md5 )
+ (t: #10 type=integ id=aes-xcbc )
+ (t: #11 type=dh id=modp1024 )
+ (t: #12 type=dh id=modp2048 )))
+ (v2ke: len=128 group=modp1024 b5445bd60cece6fdcd3c96a52cbb7bb426a8c7a0f56a9c38d1b1c4f0c3a6e8e7dba5c7339b6ed02e757119dfb5b6933ce93b604987fbbc77221b2a0c7cdd32787eff10572bef546c361462f9da34847969a42e51c755996beac42e6fba961a75de0fc1b23f099380896ee89202122dedac1bd54aa8494ac3d740be4d2a4cf39d)
+ (nonce: len=32 nonce=(6128ebd023a864e94a7ffb74bf7cce2fd4367322b8b073f942282bd52ebfe3e6) )
+ (n: prot_id=#0 type=16388(nat_detection_source_ip))
+ (n: prot_id=#0 type=16389(nat_detection_destination_ip))
+IP (tos 0x0, ttl 64, id 19909, offset 0, flags [none], proto UDP (17), length 88)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x0629 -> 0x0cd0!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->0000000000000000: parent_sa ikev2_init[R]:
+ (n: prot_id=#0 type=16390(cookie) data=(00000001c2221e50c16e123f2b0c71aefcf0cb3b798782c6))
+IP (tos 0x0, ttl 64, id 19910, offset 0, flags [none], proto UDP (17), length 436)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x0785 -> 0x7702!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->0000000000000000: parent_sa ikev2_init[I]:
+ (n: prot_id=#0 type=16390(cookie) data=(00000001c2221e50c16e...ba041b5de59955900d818ac54e18b236739d9e8b))
+ (sa: len=116
+ (p: #1 protoid=isakmp transform=12 len=116
+ (t: #1 type=encr id=aes (type=keylen value=0080))
+ (t: #2 type=encr id=aes (type=keylen value=0100))
+ (t: #3 type=encr id=aes (type=keylen value=00c0))
+ (t: #4 type=encr id=3des )
+ (t: #5 type=prf id=hmac-sha )
+ (t: #6 type=prf id=hmac-md5 )
+ (t: #7 type=prf id=aes128_xcbc )
+ (t: #8 type=integ id=hmac-sha )
+ (t: #9 type=integ id=hmac-md5 )
+ (t: #10 type=integ id=aes-xcbc )
+ (t: #11 type=dh id=modp1024 )
+ (t: #12 type=dh id=modp2048 )))
+ (v2ke: len=128 group=modp1024 b5445bd60cece6fdcd3c96a52cbb7bb426a8c7a0f56a9c38d1b1c4f0c3a6e8e7dba5c7339b6ed02e757119dfb5b6933ce93b604987fbbc77221b2a0c7cdd32787eff10572bef546c361462f9da34847969a42e51c755996beac42e6fba961a75de0fc1b23f099380896ee89202122dedac1bd54aa8494ac3d740be4d2a4cf39d)
+ (nonce: len=32 nonce=(6128ebd023a864e94a7ffb74bf7cce2fd4367322b8b073f942282bd52ebfe3e6) )
+ (n: prot_id=#0 type=16388(nat_detection_source_ip))
+ (n: prot_id=#0 type=16389(nat_detection_destination_ip))
+IP (tos 0x0, ttl 64, id 19911, offset 0, flags [none], proto UDP (17), length 332)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x071d -> 0x8650!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->71be8358efae7663: parent_sa ikev2_init[R]:
+ (sa: len=44
+ (p: #1 protoid=isakmp transform=4 len=44
+ (t: #1 type=encr id=aes (type=keylen value=0080))
+ (t: #2 type=prf id=hmac-sha )
+ (t: #3 type=integ id=hmac-sha )
+ (t: #4 type=dh id=modp1024 )))
+ (v2ke: len=128 group=modp1024 5a56714d3abf64e3a3f401ead9f5323ff0b77faa5f1e99199b13ac821f0a0c4f854786ca09b7a76aa508bcee11f16369a16d5fa041ca2d9a8dfa8228c61f2482d2175c5c1a9491fc221bec7a1fa69f656d4c98ba49ae9d721dedf4a02d7ecdfc201dc785a13ed74e4f3982762a2720ffdfc365ee4e37279af496cd86f881fd15)
+ (nonce: len=32 nonce=(b31c379f272ce2984bd17ca38c8729e1edbc081a14fb0f67cff81721dfeec1f9) )
+ (n: prot_id=#0 type=16388(nat_detection_source_ip))
+ (n: prot_id=#0 type=16389(nat_detection_destination_ip))
+IP (tos 0x0, ttl 64, id 19912, offset 0, flags [none], proto UDP (17), length 264)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x07d9 -> 0xb2d6!] isakmp 2.0 msgid 00000001 cookie a88875a8198992a6->71be8358efae7663: child_sa ikev2_auth[I]:
+ (v2e: len=204 f606135ad373e70836fda91b63ca4c608e1ad58218488c2647ff1e8a912958aa77efbc3068a2ae6ab7c3d0cb1e6fb864df99c62f2cc045708084708154a393c2f4cbefad1f6848525d49db563e13345a4e6e2fd066c04e2ce291f4714baec6bf328356c446247cab835bda3e8e1aae5967248f01eb3a1c02a541b4da09b3276b400d50a067542a678468c5f41e54017c00964f1003f8c88896a6f12215a5f1a060713cc83802cae3abee18417c0c35dc6f58a01adb96ed1c009c68e3069ae70f4b10afb7736c111ade4d826e)
+IP (tos 0x0, ttl 64, id 19913, offset 0, flags [none], proto UDP (17), length 184)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x0689 -> 0x0748!] isakmp 2.0 msgid 00000001 cookie a88875a8198992a6->71be8358efae7663: child_sa ikev2_auth[R]:
+ (v2e: len=124 6afe95bc5147b0ad7e4ccb9141c160a44f7c6eddc6b29d414ad5e2b882544fdc6c3ee6983ae1408b5764b1649343876454d1bf4d515aaf03c15eafe71be6b4cf51ab60630c45bcf0e2a2db8eee70095a4e010fdb342adb6d03dae5def9d4907cdfc8ccd6f3da9b7497c58e84a952d983bafb941ab1de1b0bb9ffad3b)
+IP (tos 0x0, ttl 64, id 19914, offset 0, flags [none], proto UDP (17), length 280)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x07e9 -> 0x35ac!] isakmp 2.0 msgid 00000002 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=220 53cc6c0b41f14e4fc057c7f6a3524adde8521f26f67c058430a902db1a52ed16d322630d2eb515372dc12d97dc7c20552607e2ed193d9b33939e10aa2fc37b6199f0a629c6b58135f5b6f9e07906cd30dc3cae7d55fe08d95d3e660a623731c396a325adbff11c490f9fd102224391a65fb7bbe862945b64cf1fb833b9ce68c83df0b9d2ce7bd54f650864af9445e547cdfe5caa393344ae5274933b7efcf616821ea7daa9c5a6e8275ad6c688700cb7f4bcd6fb8025e93bb6dd5f581faebcbecb798c87617a4ec1b06ba290ac5fc1d6e4c2725c1f9f0e10b144fbbe)
+IP (tos 0x0, ttl 64, id 19915, offset 0, flags [none], proto UDP (17), length 248)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x06c9 -> 0xdeaf!] isakmp 2.0 msgid 00000003 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=188 9603e03f280964782717da15a502f0a9e9f17dbf4487c6923cf00b7040d539bc947c705790e4e99b834a7ae2a8d79f5620e11615e0a762889aab821e0d03132dfb8cc6b3718582411bcd98c242a8b10a66274dae1ce055fb30a4d3e64c969be6e08b626958f4446c6e4a0c8d7a24522959c6152e63a575c06930c2097539bfbdff08c70533428cf6b452e0b8b0259c2292925d2ed62e8956bc7e3a911a61509be1ac8f7b7cd4636176e524f4d0f17573f2aeddce2251fd6d5d9cd54d)
+IP (tos 0x0, ttl 64, id 19916, offset 0, flags [none], proto UDP (17), length 104)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x0639 -> 0xc72b!] isakmp 2.0 msgid 00000002 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=44 5bd2d26cb43b6cec30dec13fa387359797baf7b41e783422bc4dabf5d03ab2420d277d3b2f28d1f003da98d1)
+IP (tos 0x0, ttl 64, id 19917, offset 0, flags [none], proto UDP (17), length 104)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x0639 -> 0x4119!] isakmp 2.0 msgid 00000003 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=44 38f60ab69110967961ae04af4e47a770260d61e29d18fb13ce093a47970068dacb342f7999cc3d0d59f77a94)
+IP (tos 0x0, ttl 64, id 19918, offset 0, flags [none], proto UDP (17), length 312)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x0709 -> 0x236f!] isakmp 2.0 msgid 00000004 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=252 c7f2f1cc4997b30a61623222d4bfb535baa302199c4d8c1fdcfa745b0b29b5e7618ff0356848444d25010e5ad420760890ede066c838269b22d9e30d4fec1a012e731a210c243f803b661970d32e998e919f573c5742d2288949052c5a46a0cd7c4a1a295ede296c4fd9839b64dc4944e11a35f42a8ce18b447200fd03dbd58a71583b3a27c380148c801ce14452f7d756b1f55b10b84a58cfa9526001fff7157154645022e4456085517ceed98b79e20ed33297cf5ad80287e782728a8c6b87d2b422e7eeda1c72b33ebc51a5b76def9a59ffd1b4f97dec88c22a4f5448a71aeedf20c87dae5b44cd2e7a519d719a509f83f3b2faf6f5c607da609f)
+IP (tos 0x0, ttl 64, id 19919, offset 0, flags [none], proto UDP (17), length 280)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x07e9 -> 0xd8ba!] isakmp 2.0 msgid 00000005 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=220 dae6134a9cff1a4e3cc59a79e019a93f8469dd4e2faaaad1c3afba22ecd128fdb1e8954c753f8f62aeb6aac9732f414b065ec39569a670be6980c81eb3e44bc93ec63e9a754d0456c6703cd718371edeef674928180f9d14c39e52cfa4a517368e7db2fa0bfdb41cf56d97006233103f22650fdcd5ffab8418e40903e4749e126d06e9dc2a18cfd5bfda0013e3e9eb53e79bbe30eadf0f4ddcefbab0c08e870b29d39b2401c75b68fc46a066782857ca48d547e410ac15cabb6738875200b535cbd9ae1e1ce99839c9c25639070e5ed977809c50b6bb9550b50b49bb)
+IP (tos 0x0, ttl 64, id 19920, offset 0, flags [none], proto UDP (17), length 232)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x06b9 -> 0x7194!] isakmp 2.0 msgid 00000004 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=172 1fd8516b57b1ab1bdbcdba1930a5097decc023c5c534497ca53f178b9d4d11228746454371b0cc6ec067e14e1e5c5652840cfdae0ea84c7f0a6e799ff7fb131d15763feef45e80f24716cde47d23527f68e055a7c3adc7225489295e1bc3f1029b63822872865df55c6c275dead8a6f64bda8ae44f42c318fa71eb04eed7312dafd2dd8665fd5d3225f3aae6f7335b581c3a89c07af1009871dea9927f046432cd01b04234204d01583baf3a)
+IP (tos 0x0, ttl 64, id 19921, offset 0, flags [none], proto UDP (17), length 232)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x06b9 -> 0x6053!] isakmp 2.0 msgid 00000005 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=172 f6fc8113f34b92eb7d595a048f57d46593441ad9a61919e5919e7de4454fa35882937d3b74c83ab959fd053c6a12a51b04a0e92e01683782658bb9af2bbcc7a4bd5e1eef2dbcdc7715cac6eaecfbcc051a46f2263d1b8387bdad7e68c6e4ba1be9794e163e484768995a9f4a18edcbc6a44f0a74cb01c318e7848562e0866f388b8d04f14f1af87de7de6cee1f889d4330d82932a7127b7d1a934e641c32b76e33b37706d50286f8cbe335ba)
+IP (tos 0x0, ttl 64, id 19922, offset 0, flags [none], proto UDP (17), length 312)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x0709 -> 0xfb68!] isakmp 2.0 msgid 00000006 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=252 0aa2636a3b897ff3fa8093282ad1724ec9f326b64bf998e781d6edbb77a369a8444dc47a4dc095ebd3ac3b1dc337570bc42c93cd6dcb7289bc99a90874e66cc4ede7a13a58ce17c65b185e86def83d66f4c4ddc433e66baf1834e54296671357a5139b0b63ebf32e652df0938badea5a960ee1758e00faa643bed85f7adee2e2e75baeec9e0df88857a67ca5f2a2f4919d0b272313d42c791eb75feca145756a0ccae3640ee98c16689df511443228846d2c5b8830ea6d149c1abed11ad0a28ca33993036e91965d48a82a898145ada994af55978696480ab6cb697e13e67968a7748c3338786efb77250e5411b3a7eac84cd221324bd7b9109d9a69)
+IP (tos 0x0, ttl 64, id 19923, offset 0, flags [none], proto UDP (17), length 280)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x07e9 -> 0x9881!] isakmp 2.0 msgid 00000007 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=220 02c703f4bdd83246adc67e1ca07d7e7cfe21b6bde94637680a332813b8a4ca47341abd3a9c37263896c08252bfb1ea6c7ea44783b92ac52acb4fbfec53f03554281c6377650c09208f3d778b11e77b5fbd983be1e96699232392ef31a501fda73c6150fcc2e80bab1e0d49845bd5d511f7c9285ec08352687a2ac8d70d0dec3476491c40b97cb9da405606fc5e8d46bbe199e6d91ae993b7faa0583ec4296a80812fb7e0ae88d3bd54c4a30e5edb2778c960f3e0cb5b1369e999f84de4dc72b5d006805efb7e2d2ed4033e11ff9578012d22942e3799c9382506a021)
+IP (tos 0x0, ttl 64, id 19924, offset 0, flags [none], proto UDP (17), length 232)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x06b9 -> 0x3549!] isakmp 2.0 msgid 00000006 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=172 7e2e6623c66e161de9641ac7e1b6dfdcf3a5f45bbed123be88f3754d12514404afc054b3c7f789eb52a432a438359dde31152c11b8d209203d62779ca064823d70536c40f846d43d6694a2f12a3176f57007a3506c82fffaf3dbb713bbdbb5f540b7b39aee3c97145671504356095f7ab0c5a84347c0268bce259ca51b4a2dd75a7e3a7ee79f3bffc58d2fc0ac36686229f2309b5cd0c0dcc2af798664c14f5f166ab5e3c1f693092121aa44)
+IP (tos 0x0, ttl 64, id 19925, offset 0, flags [none], proto UDP (17), length 232)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x06b9 -> 0xe402!] isakmp 2.0 msgid 00000007 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=172 7b545033a2d35df2ab9f26c4bc444713910a32e60fb04cb10a9e76634787f9ddc138c6792faa074be2ebcb43f83f444249679018ec6dc7d4e2247dd8cb915778d90fa5597f1ecba8471db53e3b4da8f73d1eb60c23ca9fb5fa599dc526a961364471b49e5288fcef6a24d02a084d29c4a5c5d1fa305310dba01d09c9c36c86c0af297e05d3fc8559a11666a4363bacc354e96c941349b3f60dd397eb4c2bb09f381831167c0b33686c6bb5d8)
+IP (tos 0x0, ttl 64, id 19926, offset 0, flags [none], proto UDP (17), length 392)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x0759 -> 0x3076!] isakmp 2.0 msgid 00000008 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=332 c4bf89ec6e7936ac98a432a525c2406de940b338c9149ce19cb1bf23a69dfd481df7b3ada1adbb70bf17074643edf97e63ade5ed07f74674f26c48d2d6a9044477ee9f203084c26e85405987ec8b9693deaea20ce78c2a451bf4e834d7bcc3c54c1322b5f28ba307f2ce31a00552b97b8fc103a29fee2e0040ccddfa10bf3ab3d1209e643c228dec575240c7bd750cf4d6d06c958f66bd8a79831df871f6fbd93e025b16bd03de35ffcdbabac65570d2367e624d9f8e8560da9bc3a2142b75008b7ceb8e839dbf425da74c4be15c9dc31735ef1ac6f65c2375042dcf9682df74259b8c4437d7ee8df19fea6ec1d5bd491409cc7276d70ee0ba9172b4177fbce7fa28171a236ca8e2e0c149e602c9c6a0a3ff5f054287f54b7c314b07cdf6d246241dd364c7419cc0647422d08f5511b13e7b5cb719616466e1c6966f5ccd4d2ca2b12dda7047c6f63af5dd47)
+IP (tos 0x0, ttl 64, id 19927, offset 0, flags [none], proto UDP (17), length 344)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x0729 -> 0xd64e!] isakmp 2.0 msgid 00000008 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=284 2c1ac864ae2c8499b3c7af8c61a8c4dc9e1af23577b588d6bb3fdef3e483cc2f0158c07071d6dfaef73dccb6cdcf7a5758e41778daceb71cf6733e17168beff6ef2015d670c0b6574fc72e97d4282909966f394a9f9e0fced8e269bbf60e93f0f2080f48dcd4e02ff1129b94f68b268ddd9cff436f38e78fa7986d87e622d1f3da3b3c2795570ebc27d3c3d51f29ef0fff01ae89bd71d2e10ab8faee7d7bb4b5be8a9ee0ea9b5e347bbaf3ebdfaf19735d75e6faa020d6ea72826c2aa5cb2ee648de6b36cbb25087428dea44bd34504e05f2d4fef43c48e2a690510e9278ca8ff2f775792af061b5ccbcf77b3fee658851289969c55edc6d561718a0c761b09b0f67c96e61d00a7fa2929023b5adcfdd33436f63a478141d51b52333)
+IP (tos 0x0, ttl 64, id 19928, offset 0, flags [none], proto UDP (17), length 120)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x0649 -> 0x85b7!] isakmp 2.0 msgid 00000000 cookie 1d9be9451d4f97a8->64a2a4b5d0e17b6a: parent_sa inf2[I]:
+ (v2e: len=60 691b48829b6c5d6dd93fa8e33c38dd4c00f5434dc22b4251c0876f0bdb5dbba3dd06283907559a272f07ec7709b9d596a24cd8fe69b82a1f65dbf6f2)
--- /dev/null
+IP (tos 0x0, ttl 64, id 19908, offset 0, flags [none], proto UDP (17), length 404)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x0765 -> 0xf5df!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->0000000000000000: parent_sa ikev2_init[I]:
+ (sa: len=116
+ (p: #1 protoid=isakmp transform=12 len=116
+ (t: #1 type=encr id=aes (type=keylen value=0080))
+ (t: #2 type=encr id=aes (type=keylen value=0100))
+ (t: #3 type=encr id=aes (type=keylen value=00c0))
+ (t: #4 type=encr id=3des )
+ (t: #5 type=prf id=hmac-sha )
+ (t: #6 type=prf id=hmac-md5 )
+ (t: #7 type=prf id=aes128_xcbc )
+ (t: #8 type=integ id=hmac-sha )
+ (t: #9 type=integ id=hmac-md5 )
+ (t: #10 type=integ id=aes-xcbc )
+ (t: #11 type=dh id=modp1024 )
+ (t: #12 type=dh id=modp2048 )))
+ (v2ke: len=128 group=modp1024 b5445bd60cece6fdcd3c96a52cbb7bb426a8c7a0f56a9c38d1b1c4f0c3a6e8e7dba5c7339b6ed02e757119dfb5b6933ce93b604987fbbc77221b2a0c7cdd32787eff10572bef546c361462f9da34847969a42e51c755996beac42e6fba961a75de0fc1b23f099380896ee89202122dedac1bd54aa8494ac3d740be4d2a4cf39d)
+ (nonce: len=32 nonce=(6128ebd023a864e94a7ffb74bf7cce2fd4367322b8b073f942282bd52ebfe3e6) )
+ (n: prot_id=#0 type=16388(nat_detection_source_ip) data=(442ffe5aea0cee4dbacc758e801233bdc09a0abf0000001c00004005ba041b5de59955900d818ac54e18b236739d9e8b))
+ (n: prot_id=#0 type=16389(nat_detection_destination_ip) data=(ba041b5de59955900d818ac54e18b236739d9e8b))
+IP (tos 0x0, ttl 64, id 19909, offset 0, flags [none], proto UDP (17), length 88)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x0629 -> 0x0cd0!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->0000000000000000: parent_sa ikev2_init[R]:
+ (n: prot_id=#0 type=16390(cookie) data=(00000001c2221e50c16e123f2b0c71aefcf0cb3b798782c6))
+IP (tos 0x0, ttl 64, id 19910, offset 0, flags [none], proto UDP (17), length 436)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x0785 -> 0x7702!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->0000000000000000: parent_sa ikev2_init[I]:
+ (n: prot_id=#0 type=16390(cookie) data=(00000001c2221e50c16e123f2b0c71aefcf0cb3b798782c622000078000000740101000c0300000c0100000c800e00800300000c0100000c800e01000300000c0100000c800e00c003000008010000030300000802000002030000080200000103000008020000040300000803000002030000080300000103000008030000050300000804000002000000080400000e2800008800020000b5445bd60cece6fdcd3c96a52cbb7bb426a8c7a0f56a9c38d1b1c4f0c3a6e8e7dba5c7339b6ed02e757119dfb5b6933ce93b604987fbbc77221b2a0c7cdd32787eff10572bef546c361462f9da34847969a42e51c755996beac42e6fba961a75de0fc1b23f099380896ee89202122dedac1bd54aa8494ac3d740be4d2a4cf39d290000246128ebd023a864e94a7ffb74bf7cce2fd4367322b8b073f942282bd52ebfe3e62900001c00004004442ffe5aea0cee4dbacc758e801233bdc09a0abf0000001c00004005ba041b5de59955900d818ac54e18b236739d9e8b))
+ (sa: len=116
+ (p: #1 protoid=isakmp transform=12 len=116
+ (t: #1 type=encr id=aes (type=keylen value=0080))
+ (t: #2 type=encr id=aes (type=keylen value=0100))
+ (t: #3 type=encr id=aes (type=keylen value=00c0))
+ (t: #4 type=encr id=3des )
+ (t: #5 type=prf id=hmac-sha )
+ (t: #6 type=prf id=hmac-md5 )
+ (t: #7 type=prf id=aes128_xcbc )
+ (t: #8 type=integ id=hmac-sha )
+ (t: #9 type=integ id=hmac-md5 )
+ (t: #10 type=integ id=aes-xcbc )
+ (t: #11 type=dh id=modp1024 )
+ (t: #12 type=dh id=modp2048 )))
+ (v2ke: len=128 group=modp1024 b5445bd60cece6fdcd3c96a52cbb7bb426a8c7a0f56a9c38d1b1c4f0c3a6e8e7dba5c7339b6ed02e757119dfb5b6933ce93b604987fbbc77221b2a0c7cdd32787eff10572bef546c361462f9da34847969a42e51c755996beac42e6fba961a75de0fc1b23f099380896ee89202122dedac1bd54aa8494ac3d740be4d2a4cf39d)
+ (nonce: len=32 nonce=(6128ebd023a864e94a7ffb74bf7cce2fd4367322b8b073f942282bd52ebfe3e6) )
+ (n: prot_id=#0 type=16388(nat_detection_source_ip) data=(442ffe5aea0cee4dbacc758e801233bdc09a0abf0000001c00004005ba041b5de59955900d818ac54e18b236739d9e8b))
+ (n: prot_id=#0 type=16389(nat_detection_destination_ip) data=(ba041b5de59955900d818ac54e18b236739d9e8b))
+IP (tos 0x0, ttl 64, id 19911, offset 0, flags [none], proto UDP (17), length 332)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x071d -> 0x8650!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->71be8358efae7663: parent_sa ikev2_init[R]:
+ (sa: len=44
+ (p: #1 protoid=isakmp transform=4 len=44
+ (t: #1 type=encr id=aes (type=keylen value=0080))
+ (t: #2 type=prf id=hmac-sha )
+ (t: #3 type=integ id=hmac-sha )
+ (t: #4 type=dh id=modp1024 )))
+ (v2ke: len=128 group=modp1024 5a56714d3abf64e3a3f401ead9f5323ff0b77faa5f1e99199b13ac821f0a0c4f854786ca09b7a76aa508bcee11f16369a16d5fa041ca2d9a8dfa8228c61f2482d2175c5c1a9491fc221bec7a1fa69f656d4c98ba49ae9d721dedf4a02d7ecdfc201dc785a13ed74e4f3982762a2720ffdfc365ee4e37279af496cd86f881fd15)
+ (nonce: len=32 nonce=(b31c379f272ce2984bd17ca38c8729e1edbc081a14fb0f67cff81721dfeec1f9) )
+ (n: prot_id=#0 type=16388(nat_detection_source_ip) data=(fe2bfb7c2c81ed0b61f756b57fac78a75ced8af60000001c00004005905954a783be2c37e2ccc4fdd270a532dbe6f428))
+ (n: prot_id=#0 type=16389(nat_detection_destination_ip) data=(905954a783be2c37e2ccc4fdd270a532dbe6f428))
+IP (tos 0x0, ttl 64, id 19912, offset 0, flags [none], proto UDP (17), length 264)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x07d9 -> 0xb2d6!] isakmp 2.0 msgid 00000001 cookie a88875a8198992a6->71be8358efae7663: child_sa ikev2_auth[I]:
+ (v2e: len=204 f606135ad373e70836fda91b63ca4c608e1ad58218488c2647ff1e8a912958aa77efbc3068a2ae6ab7c3d0cb1e6fb864df99c62f2cc045708084708154a393c2f4cbefad1f6848525d49db563e13345a4e6e2fd066c04e2ce291f4714baec6bf328356c446247cab835bda3e8e1aae5967248f01eb3a1c02a541b4da09b3276b400d50a067542a678468c5f41e54017c00964f1003f8c88896a6f12215a5f1a060713cc83802cae3abee18417c0c35dc6f58a01adb96ed1c009c68e3069ae70f4b10afb7736c111ade4d826e)
+IP (tos 0x0, ttl 64, id 19913, offset 0, flags [none], proto UDP (17), length 184)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x0689 -> 0x0748!] isakmp 2.0 msgid 00000001 cookie a88875a8198992a6->71be8358efae7663: child_sa ikev2_auth[R]:
+ (v2e: len=124 6afe95bc5147b0ad7e4ccb9141c160a44f7c6eddc6b29d414ad5e2b882544fdc6c3ee6983ae1408b5764b1649343876454d1bf4d515aaf03c15eafe71be6b4cf51ab60630c45bcf0e2a2db8eee70095a4e010fdb342adb6d03dae5def9d4907cdfc8ccd6f3da9b7497c58e84a952d983bafb941ab1de1b0bb9ffad3b)
+IP (tos 0x0, ttl 64, id 19914, offset 0, flags [none], proto UDP (17), length 280)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x07e9 -> 0x35ac!] isakmp 2.0 msgid 00000002 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=220 53cc6c0b41f14e4fc057c7f6a3524adde8521f26f67c058430a902db1a52ed16d322630d2eb515372dc12d97dc7c20552607e2ed193d9b33939e10aa2fc37b6199f0a629c6b58135f5b6f9e07906cd30dc3cae7d55fe08d95d3e660a623731c396a325adbff11c490f9fd102224391a65fb7bbe862945b64cf1fb833b9ce68c83df0b9d2ce7bd54f650864af9445e547cdfe5caa393344ae5274933b7efcf616821ea7daa9c5a6e8275ad6c688700cb7f4bcd6fb8025e93bb6dd5f581faebcbecb798c87617a4ec1b06ba290ac5fc1d6e4c2725c1f9f0e10b144fbbe)
+IP (tos 0x0, ttl 64, id 19915, offset 0, flags [none], proto UDP (17), length 248)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x06c9 -> 0xdeaf!] isakmp 2.0 msgid 00000003 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=188 9603e03f280964782717da15a502f0a9e9f17dbf4487c6923cf00b7040d539bc947c705790e4e99b834a7ae2a8d79f5620e11615e0a762889aab821e0d03132dfb8cc6b3718582411bcd98c242a8b10a66274dae1ce055fb30a4d3e64c969be6e08b626958f4446c6e4a0c8d7a24522959c6152e63a575c06930c2097539bfbdff08c70533428cf6b452e0b8b0259c2292925d2ed62e8956bc7e3a911a61509be1ac8f7b7cd4636176e524f4d0f17573f2aeddce2251fd6d5d9cd54d)
+IP (tos 0x0, ttl 64, id 19916, offset 0, flags [none], proto UDP (17), length 104)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x0639 -> 0xc72b!] isakmp 2.0 msgid 00000002 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=44 5bd2d26cb43b6cec30dec13fa387359797baf7b41e783422bc4dabf5d03ab2420d277d3b2f28d1f003da98d1)
+IP (tos 0x0, ttl 64, id 19917, offset 0, flags [none], proto UDP (17), length 104)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x0639 -> 0x4119!] isakmp 2.0 msgid 00000003 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=44 38f60ab69110967961ae04af4e47a770260d61e29d18fb13ce093a47970068dacb342f7999cc3d0d59f77a94)
+IP (tos 0x0, ttl 64, id 19918, offset 0, flags [none], proto UDP (17), length 312)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x0709 -> 0x236f!] isakmp 2.0 msgid 00000004 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=252 c7f2f1cc4997b30a61623222d4bfb535baa302199c4d8c1fdcfa745b0b29b5e7618ff0356848444d25010e5ad420760890ede066c838269b22d9e30d4fec1a012e731a210c243f803b661970d32e998e919f573c5742d2288949052c5a46a0cd7c4a1a295ede296c4fd9839b64dc4944e11a35f42a8ce18b447200fd03dbd58a71583b3a27c380148c801ce14452f7d756b1f55b10b84a58cfa9526001fff7157154645022e4456085517ceed98b79e20ed33297cf5ad80287e782728a8c6b87d2b422e7eeda1c72b33ebc51a5b76def9a59ffd1b4f97dec88c22a4f5448a71aeedf20c87dae5b44cd2e7a519d719a509f83f3b2faf6f5c607da609f)
+IP (tos 0x0, ttl 64, id 19919, offset 0, flags [none], proto UDP (17), length 280)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x07e9 -> 0xd8ba!] isakmp 2.0 msgid 00000005 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=220 dae6134a9cff1a4e3cc59a79e019a93f8469dd4e2faaaad1c3afba22ecd128fdb1e8954c753f8f62aeb6aac9732f414b065ec39569a670be6980c81eb3e44bc93ec63e9a754d0456c6703cd718371edeef674928180f9d14c39e52cfa4a517368e7db2fa0bfdb41cf56d97006233103f22650fdcd5ffab8418e40903e4749e126d06e9dc2a18cfd5bfda0013e3e9eb53e79bbe30eadf0f4ddcefbab0c08e870b29d39b2401c75b68fc46a066782857ca48d547e410ac15cabb6738875200b535cbd9ae1e1ce99839c9c25639070e5ed977809c50b6bb9550b50b49bb)
+IP (tos 0x0, ttl 64, id 19920, offset 0, flags [none], proto UDP (17), length 232)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x06b9 -> 0x7194!] isakmp 2.0 msgid 00000004 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=172 1fd8516b57b1ab1bdbcdba1930a5097decc023c5c534497ca53f178b9d4d11228746454371b0cc6ec067e14e1e5c5652840cfdae0ea84c7f0a6e799ff7fb131d15763feef45e80f24716cde47d23527f68e055a7c3adc7225489295e1bc3f1029b63822872865df55c6c275dead8a6f64bda8ae44f42c318fa71eb04eed7312dafd2dd8665fd5d3225f3aae6f7335b581c3a89c07af1009871dea9927f046432cd01b04234204d01583baf3a)
+IP (tos 0x0, ttl 64, id 19921, offset 0, flags [none], proto UDP (17), length 232)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x06b9 -> 0x6053!] isakmp 2.0 msgid 00000005 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=172 f6fc8113f34b92eb7d595a048f57d46593441ad9a61919e5919e7de4454fa35882937d3b74c83ab959fd053c6a12a51b04a0e92e01683782658bb9af2bbcc7a4bd5e1eef2dbcdc7715cac6eaecfbcc051a46f2263d1b8387bdad7e68c6e4ba1be9794e163e484768995a9f4a18edcbc6a44f0a74cb01c318e7848562e0866f388b8d04f14f1af87de7de6cee1f889d4330d82932a7127b7d1a934e641c32b76e33b37706d50286f8cbe335ba)
+IP (tos 0x0, ttl 64, id 19922, offset 0, flags [none], proto UDP (17), length 312)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x0709 -> 0xfb68!] isakmp 2.0 msgid 00000006 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=252 0aa2636a3b897ff3fa8093282ad1724ec9f326b64bf998e781d6edbb77a369a8444dc47a4dc095ebd3ac3b1dc337570bc42c93cd6dcb7289bc99a90874e66cc4ede7a13a58ce17c65b185e86def83d66f4c4ddc433e66baf1834e54296671357a5139b0b63ebf32e652df0938badea5a960ee1758e00faa643bed85f7adee2e2e75baeec9e0df88857a67ca5f2a2f4919d0b272313d42c791eb75feca145756a0ccae3640ee98c16689df511443228846d2c5b8830ea6d149c1abed11ad0a28ca33993036e91965d48a82a898145ada994af55978696480ab6cb697e13e67968a7748c3338786efb77250e5411b3a7eac84cd221324bd7b9109d9a69)
+IP (tos 0x0, ttl 64, id 19923, offset 0, flags [none], proto UDP (17), length 280)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x07e9 -> 0x9881!] isakmp 2.0 msgid 00000007 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=220 02c703f4bdd83246adc67e1ca07d7e7cfe21b6bde94637680a332813b8a4ca47341abd3a9c37263896c08252bfb1ea6c7ea44783b92ac52acb4fbfec53f03554281c6377650c09208f3d778b11e77b5fbd983be1e96699232392ef31a501fda73c6150fcc2e80bab1e0d49845bd5d511f7c9285ec08352687a2ac8d70d0dec3476491c40b97cb9da405606fc5e8d46bbe199e6d91ae993b7faa0583ec4296a80812fb7e0ae88d3bd54c4a30e5edb2778c960f3e0cb5b1369e999f84de4dc72b5d006805efb7e2d2ed4033e11ff9578012d22942e3799c9382506a021)
+IP (tos 0x0, ttl 64, id 19924, offset 0, flags [none], proto UDP (17), length 232)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x06b9 -> 0x3549!] isakmp 2.0 msgid 00000006 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=172 7e2e6623c66e161de9641ac7e1b6dfdcf3a5f45bbed123be88f3754d12514404afc054b3c7f789eb52a432a438359dde31152c11b8d209203d62779ca064823d70536c40f846d43d6694a2f12a3176f57007a3506c82fffaf3dbb713bbdbb5f540b7b39aee3c97145671504356095f7ab0c5a84347c0268bce259ca51b4a2dd75a7e3a7ee79f3bffc58d2fc0ac36686229f2309b5cd0c0dcc2af798664c14f5f166ab5e3c1f693092121aa44)
+IP (tos 0x0, ttl 64, id 19925, offset 0, flags [none], proto UDP (17), length 232)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x06b9 -> 0xe402!] isakmp 2.0 msgid 00000007 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=172 7b545033a2d35df2ab9f26c4bc444713910a32e60fb04cb10a9e76634787f9ddc138c6792faa074be2ebcb43f83f444249679018ec6dc7d4e2247dd8cb915778d90fa5597f1ecba8471db53e3b4da8f73d1eb60c23ca9fb5fa599dc526a961364471b49e5288fcef6a24d02a084d29c4a5c5d1fa305310dba01d09c9c36c86c0af297e05d3fc8559a11666a4363bacc354e96c941349b3f60dd397eb4c2bb09f381831167c0b33686c6bb5d8)
+IP (tos 0x0, ttl 64, id 19926, offset 0, flags [none], proto UDP (17), length 392)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x0759 -> 0x3076!] isakmp 2.0 msgid 00000008 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]:
+ (v2e: len=332 c4bf89ec6e7936ac98a432a525c2406de940b338c9149ce19cb1bf23a69dfd481df7b3ada1adbb70bf17074643edf97e63ade5ed07f74674f26c48d2d6a9044477ee9f203084c26e85405987ec8b9693deaea20ce78c2a451bf4e834d7bcc3c54c1322b5f28ba307f2ce31a00552b97b8fc103a29fee2e0040ccddfa10bf3ab3d1209e643c228dec575240c7bd750cf4d6d06c958f66bd8a79831df871f6fbd93e025b16bd03de35ffcdbabac65570d2367e624d9f8e8560da9bc3a2142b75008b7ceb8e839dbf425da74c4be15c9dc31735ef1ac6f65c2375042dcf9682df74259b8c4437d7ee8df19fea6ec1d5bd491409cc7276d70ee0ba9172b4177fbce7fa28171a236ca8e2e0c149e602c9c6a0a3ff5f054287f54b7c314b07cdf6d246241dd364c7419cc0647422d08f5511b13e7b5cb719616466e1c6966f5ccd4d2ca2b12dda7047c6f63af5dd47)
+IP (tos 0x0, ttl 64, id 19927, offset 0, flags [none], proto UDP (17), length 344)
+ 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 0x0729 -> 0xd64e!] isakmp 2.0 msgid 00000008 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]:
+ (v2e: len=284 2c1ac864ae2c8499b3c7af8c61a8c4dc9e1af23577b588d6bb3fdef3e483cc2f0158c07071d6dfaef73dccb6cdcf7a5758e41778daceb71cf6733e17168beff6ef2015d670c0b6574fc72e97d4282909966f394a9f9e0fced8e269bbf60e93f0f2080f48dcd4e02ff1129b94f68b268ddd9cff436f38e78fa7986d87e622d1f3da3b3c2795570ebc27d3c3d51f29ef0fff01ae89bd71d2e10ab8faee7d7bb4b5be8a9ee0ea9b5e347bbaf3ebdfaf19735d75e6faa020d6ea72826c2aa5cb2ee648de6b36cbb25087428dea44bd34504e05f2d4fef43c48e2a690510e9278ca8ff2f775792af061b5ccbcf77b3fee658851289969c55edc6d561718a0c761b09b0f67c96e61d00a7fa2929023b5adcfdd33436f63a478141d51b52333)
+IP (tos 0x0, ttl 64, id 19928, offset 0, flags [none], proto UDP (17), length 120)
+ 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 0x0649 -> 0x85b7!] isakmp 2.0 msgid 00000000 cookie 1d9be9451d4f97a8->64a2a4b5d0e17b6a: parent_sa inf2[I]:
+ (v2e: len=60 691b48829b6c5d6dd93fa8e33c38dd4c00f5434dc22b4251c0876f0bdb5dbba3dd06283907559a272f07ec7709b9d596a24cd8fe69b82a1f65dbf6f2)
--- /dev/null
+ikev2 I 0x0001020304050607 0xc02e7a3031a03188 sha1:0x4ea8e662b07cdd430f6944c6723e4b82d5722418 aes128:0x3f44bf47cafd8150591deb088199fcbf
+ikev2 R 0x0001020304050607 0xc02e7a3031a03188 sha1:0x515b0bd22e6d76b34fdb760aa7bfad80b109b75d aes128:0xbedb67ec7dc3d00cccac42e70cd63bde
--- /dev/null
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 536, bad cksum 0 (->f48e)!)
+ 192.1.2.45.500 > 192.1.2.23.500: [no cksum] isakmp 2.0 msgid 00000000 cookie 0001020304050607->0000000000000000: parent_sa ikev2_init[I]:
+ (sa[C]: len=240
+ (p: #1 protoid=isakmp transform=4 len=40
+ (t: #1 type=encr id=aes )
+ (t: #2 type=integ id=hmac-sha )
+ (t: #3 type=prf id=hmac-sha )
+ (t: #4 type=dh id=modp1536 ))
+ (p: #2 protoid=isakmp transform=4 len=40
+ (t: #1 type=encr id=aes )
+ (t: #2 type=integ id=hmac-sha )
+ (t: #3 type=prf id=hmac-md5 )
+ (t: #4 type=dh id=modp1536 ))
+ (p: #3 protoid=isakmp transform=4 len=40
+ (t: #1 type=encr id=3des )
+ (t: #2 type=integ id=hmac-sha )
+ (t: #3 type=prf id=hmac-sha )
+ (t: #4 type=dh id=modp1536 ))
+ (p: #4 protoid=isakmp transform=4 len=40
+ (t: #1 type=encr id=3des )
+ (t: #2 type=integ id=hmac-sha )
+ (t: #3 type=prf id=hmac-md5 )
+ (t: #4 type=dh id=modp1536 ))
+ (p: #5 protoid=isakmp transform=4 len=40
+ (t: #1 type=encr id=3des )
+ (t: #2 type=integ id=hmac-sha )
+ (t: #3 type=prf id=hmac-sha )
+ (t: #4 type=dh id=modp1024 ))
+ (p: #6 protoid=isakmp transform=4 len=40
+ (t: #1 type=encr id=3des )
+ (t: #2 type=integ id=hmac-sha )
+ (t: #3 type=prf id=hmac-md5 )
+ (t: #4 type=dh id=modp1024 )))
+ (v2ke: len=192 group=modp1536 ffbc6a92a6b9559b05fa96a7a43507b4c1e1c0861a5871d9ba73a163113788c0debb3979e7ff0c52b4ce6050eb05369ea4300d2bff3b1b299f3b802ccb13318c2ab9e3b5627cb4b35eb939982076b57c050d7b35c3c5c7cc8c0feab7b64a7d7b6b8f6b4dabf4ac406dd20126b90a98ac766efa37a7890c4394ff9a77615b58f52d651bbfa58d2a549af8b01aa4bca3d762426663b155d4ebda9f60a6a13573e6a888135cdc673dd483029903f3a90eca23e1ec1e270331b2d050f4f758f49927)
+ (nonce[C]: len=16 nonce=(b5ce8419095c6e2b6b62d3055305b3c4) )
+ (v2vid: len=12 vid=OErlA\nQukSR 4f45726c415c6e51756b5352)
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 312, bad cksum 0 (->f56e)!)
+ 192.1.2.45.500 > 192.1.2.23.500: [no cksum] isakmp 2.0 msgid 00000000 cookie 0001020304050607->c02e7a3031a03188: parent_sa ikev2_auth[I]:
+ (v2e[C]: len=252 000102030405060708090a0b0c0d0e0f4bcf2da20444caca5fb591c1ab4b9b4d4f22ac7cb49e6b08d2738884fb3efd8eebc607accc1f80f890e24df65e53d61e899f1d319d89c033524d036fd4ea7e0345def93356e2865e5481a6a20a7604083de04595e1071a2e98179eefb4e6ae4708e6875ae297b4dc5b2602d971e36f66cef12303946eea897d86bbb5903115281a266f4dcb627e146972ff2f7102931df82f24a2e40df594afc11e0a85eb1c56b9eddb7e2de52fa95cf51f4b4c9b5d53237ae39f64519413d201374a987fa8d1ce460fa2d67c417462203f2948c0b9ed8b734a69a015ff63bde767f44f83c3cfe5119d72d74e695b1032b957
+ (v2IDi: len=8 0200000077657374 fqdn:west)
+ (v2auth: len=196 method=rsasig authdata=(000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) ))
--- /dev/null
+IP6 :: > ff02::1:ff76:6c14: ICMP6, neighbor solicitation, who has fe80::20c:29ff:fe76:6c14, length 24
+IP6 version error: 0 != 6
+IP6 :: > ff02::1:ff76:6c14: ICMP6, neighbor solicitation, who has 1111:2222:3333:4444:20c:29ff:fe76:6c14, length 24
+IP6 version error: 0 != 6
--- /dev/null
+IP6 (hlim 4, next-header Routing (43) payload length: 32) 2200::244:212:3fff:feae:22f7 > 2200::240:2:0:0:4: srcrt (len=2, type=0, segleft=1, rsv=0x0, [0]2200::210:2:0:0:4) [icmp6 sum ok] ICMP6, echo request, seq 0
+IP6 (hlim 5, next-header Routing (43) payload length: 48) 2200::244:212:3fff:feae:22f7 > 2200::211:2:0:0:2: srcrt (len=4, type=0, segleft=2, rsv=0x0, [0]2200::210:2:0:0:4, [1]2200::240:2:0:0:4) [icmp6 sum ok] ICMP6, echo request, seq 0
+IP6 (hlim 4, next-header Routing (43) payload length: 32) 2200::244:212:3fff:feae:22f7 > 2200::240:2:0:0:4: srcrt (len=2, type=0, segleft=1, rsv=0x0, [0]2200::210:2:0:0:4) 5645 > 5642: [udp sum ok] UDP, length 0
+IP6 (hlim 5, next-header Routing (43) payload length: 48) 2200::244:212:3fff:feae:22f7 > 2200::211:2:0:0:2: srcrt (len=4, type=0, segleft=2, rsv=0x0, [0]2200::210:2:0:0:4, [1]2200::240:2:0:0:4) 5645 > 5642: [udp sum ok] UDP, length 0
--- /dev/null
+IP 127.0.0.1.500 > 127.0.0.1.500: isakmp:
--- /dev/null
+IP 129.170.249.126.500 > 129.170.249.87.500: isakmp: phase 1 ? base
--- /dev/null
+IP (tos 0x0, ttl 255, id 41068, offset 0, flags [none], proto UDP (17), length 312)
+ 127.0.0.1.501 > 127.0.0.1.500: isakmp 1.0 msgid 00000000: phase 1 I ident:
+ (id: idtype=FQDN protoid=0 port=0 len=248 \0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00)
--- /dev/null
+ARP, Request who-has 192.1.2.23 tell 192.1.2.254, length 28
+ARP, Reply 192.1.2.23 is-at 10:00:00:64:64:23, length 28
+IP 192.1.2.254.500 > 192.1.2.23.500: isakmp: phase 1 I ident
+IP 192.1.2.23.500 > 192.1.2.254.500: isakmp: phase 1 R ident
+IP 192.1.2.254.500 > 192.1.2.23.500: isakmp: phase 1 I ident
+IP 192.1.2.23.500 > 192.1.2.254.500: isakmp: phase 1 R ident
+IP 192.1.2.254.4500 > 192.1.2.23.4500: NONESP-encap: isakmp: phase 1 I ident[E]
+IP 192.1.2.23.4500 > 192.1.2.254.4500: NONESP-encap: isakmp: phase 1 R ident[E]
+IP 192.1.2.254.4500 > 192.1.2.23.4500: NONESP-encap: isakmp: phase 2/others I oakley-quick[E]
+IP 192.1.2.23.4500 > 192.1.2.254.4500: NONESP-encap: isakmp: phase 2/others R oakley-quick[E]
+IP 192.1.2.254.4500 > 192.1.2.23.4500: NONESP-encap: isakmp: phase 2/others I oakley-quick[E]
+IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x1), length 132
+ARP, Request who-has 192.1.2.254 tell 192.1.2.23, length 28
+ARP, Reply 192.1.2.254 is-at 10:00:00:de:ad:ba, length 28
+IP 192.1.2.23.4500 > 192.1.2.254.4500: NONESP-encap: isakmp: phase 2/others R oakley-quick[E]
+IP 192.1.2.254.4500 > 192.1.2.23.4500: NONESP-encap: isakmp: phase 2/others I oakley-quick[E]
+IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x2), length 132
+IP 192.1.2.254.4500 > 192.1.2.23.4500: isakmp-nat-keep-alive
+IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x3), length 132
+IP 192.1.2.23.4500 > 192.1.2.254.4500: NONESP-encap: isakmp: phase 2/others R oakley-quick[E]
+IP 192.1.2.254.4500 > 192.1.2.23.4500: NONESP-encap: isakmp: phase 2/others I oakley-quick[E]
+IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x4), length 132
+IP 192.1.2.254.4500 > 192.1.2.23.4500: isakmp-nat-keep-alive
+IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x5), length 132
+IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x6), length 132
+ARP, Request who-has 192.1.2.23 tell 192.1.2.254, length 28
+ARP, Reply 192.1.2.23 is-at 10:00:00:64:64:23, length 28
+IP 192.1.2.254.4500 > 192.1.2.23.4500: isakmp-nat-keep-alive
+IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x7), length 132
+IP 192.1.2.23.4500 > 192.1.2.254.4500: NONESP-encap: isakmp: phase 2/others R oakley-quick[E]
+IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x8), length 132
+ARP, Request who-has 192.1.2.254 tell 192.1.2.23, length 28
+ARP, Reply 192.1.2.254 is-at 10:00:00:de:ad:ba, length 28
+IP 192.1.2.254.4500 > 192.1.2.23.4500: isakmp-nat-keep-alive
+IP 192.1.2.23.4500 > 192.1.2.254.4500: NONESP-encap: isakmp: phase 2/others R inf[E]
--- /dev/null
+IP (tos 0xc0, ttl 255, id 101, offset 0, flags [none], proto UDP (17), length 176)
+ 10.0.0.1.500 > 10.0.0.2.500: isakmp 1.0 msgid 00000000: phase 1 I ident:
+ (sa: doi=ipsec situation=identity
+ (p: #1 protoid=isakmp transform=1
+ (t: #1 id=ike (type=enc value=aes)(type=keylen value=0080)(type=hash value=sha1)(type=group desc value=modp768)(type=auth value=preshared)(type=lifetype value=sec)(type=lifeduration len=4 value=00015180))))
+ (vid: len=16)
+ (vid: len=16)
+ (vid: len=16)
+IP (tos 0xc0, ttl 255, id 49, offset 0, flags [none], proto UDP (17), length 136)
+ 10.0.0.2.500 > 10.0.0.1.500: isakmp 1.0 msgid 00000000: phase 1 R ident:
+ (sa: doi=ipsec situation=identity
+ (p: #1 protoid=isakmp transform=1
+ (t: #1 id=ike (type=enc value=aes)(type=keylen value=0080)(type=hash value=sha1)(type=group desc value=modp768)(type=auth value=preshared)(type=lifetype value=sec)(type=lifeduration len=4 value=00015180))))
+ (vid: len=16)
+IP (tos 0xc0, ttl 255, id 102, offset 0, flags [none], proto UDP (17), length 300)
+ 10.0.0.1.500 > 10.0.0.2.500: isakmp 1.0 msgid 00000000: phase 1 I ident:
+ (ke: key len=96)
+ (nonce: n len=20)
+ (vid: len=16)
+ (vid: len=16)
+ (vid: len=16)
+ (vid: len=8)
+ (pay15)
+ (pay15)
+IP (tos 0xc0, ttl 255, id 50, offset 0, flags [none], proto UDP (17), length 300)
+ 10.0.0.2.500 > 10.0.0.1.500: isakmp 1.0 msgid 00000000: phase 1 R ident:
+ (ke: key len=96)
+ (nonce: n len=20)
+ (vid: len=16)
+ (vid: len=16)
+ (vid: len=16)
+ (vid: len=8)
+ (pay15)
+ (pay15)
+IP (tos 0xc0, ttl 255, id 103, offset 0, flags [none], proto UDP (17), length 136)
+ 10.0.0.1.500 > 10.0.0.2.500: isakmp 1.0 msgid 00000000: phase 1 I ident[E]: [encrypted id]
+IP (tos 0xc0, ttl 255, id 51, offset 0, flags [none], proto UDP (17), length 104)
+ 10.0.0.2.500 > 10.0.0.1.500: isakmp 1.0 msgid 00000000: phase 1 R ident[E]: [encrypted id]
+IP (tos 0xc0, ttl 255, id 104, offset 0, flags [none], proto UDP (17), length 248)
+ 10.0.0.1.500 > 10.0.0.2.500: isakmp 1.0 msgid 0f2b7862: phase 2/others I oakley-quick[E]: [encrypted hash]
+IP (tos 0xc0, ttl 255, id 52, offset 0, flags [none], proto UDP (17), length 248)
+ 10.0.0.2.500 > 10.0.0.1.500: isakmp 1.0 msgid 0f2b7862: phase 2/others R oakley-quick[E]: [encrypted hash]
+IP (tos 0xc0, ttl 255, id 105, offset 0, flags [none], proto UDP (17), length 88)
+ 10.0.0.1.500 > 10.0.0.2.500: isakmp 1.0 msgid 0f2b7862: phase 2/others I oakley-quick[E]: [encrypted hash]
--- /dev/null
+IS-IS, length 83
+ L1 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333.00, PDU length: 83
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 48
+ lsp-id: 2222.2222.2222.00-00, seq: 0x0000000e, lifetime: 1184s, chksum: 0x5910
+ lsp-id: 3333.3333.3333.00-00, seq: 0x00000010, lifetime: 1147s, chksum: 0x1749
+ lsp-id: 3333.3333.3333.02-00, seq: 0x00000004, lifetime: 634s, chksum: 0x7f9f
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0001
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 83
+ L1 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333.00, PDU length: 83
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 48
+ lsp-id: 2222.2222.2222.00-00, seq: 0x0000000e, lifetime: 1174s, chksum: 0x5910
+ lsp-id: 3333.3333.3333.00-00, seq: 0x00000010, lifetime: 1137s, chksum: 0x1749
+ lsp-id: 3333.3333.3333.02-00, seq: 0x00000004, lifetime: 624s, chksum: 0x7f9f
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 136
+ L1 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ lsp-id: 2222.2222.2222.00-00, seq: 0x0000000f, lifetime: 1199s
+ chksum: 0xb503 (correct), PDU length: 136, Flags: [ L1 IS ]
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Hostname TLV #137, length: 2
+ Hostname: R2
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 192.168.10.1
+ IPv4 Internal Reachability TLV #128, length: 24
+ IPv4 prefix: 10.0.10.0/30, Distribution: up, Metric: 10, Internal
+ IPv4 prefix: 192.168.10.0/24, Distribution: up, Metric: 10, Internal
+ IS Reachability TLV #2, length: 12
+ IsNotVirtual
+ IS Neighbor: 3333.3333.3333.02, Default Metric: 10, Internal
+ IPv4 External Reachability TLV #130, length: 48
+ IPv4 prefix: 172.16.0.0/30, Distribution: up, Metric: 0, External
+ IPv4 prefix: 172.16.1.0/24, Distribution: up, Metric: 0, External
+ IPv4 prefix: 172.16.2.0/24, Distribution: up, Metric: 0, External
+ IPv4 prefix: 172.16.3.0/24, Distribution: up, Metric: 0, External
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0001
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 83
+ L1 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333.00, PDU length: 83
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 48
+ lsp-id: 2222.2222.2222.00-00, seq: 0x0000000f, lifetime: 1194s, chksum: 0xb503
+ lsp-id: 3333.3333.3333.00-00, seq: 0x00000010, lifetime: 1130s, chksum: 0x1749
+ lsp-id: 3333.3333.3333.02-00, seq: 0x00000004, lifetime: 616s, chksum: 0x7f9f
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0001
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
--- /dev/null
+IS-IS, L1 CSNP, src-id 3333.3333.3333.00, length 83
+IS-IS, L1 Lan IIH, src-id 3333.3333.3333, lan-id 3333.3333.3333.02, prio 64, length 1497
+IS-IS, L1 Lan IIH, src-id 3333.3333.3333, lan-id 3333.3333.3333.02, prio 64, length 1497
+IS-IS, L1 Lan IIH, src-id 2222.2222.2222, lan-id 3333.3333.3333.02, prio 64, length 1497
+IS-IS, L1 Lan IIH, src-id 3333.3333.3333, lan-id 3333.3333.3333.02, prio 64, length 1497
+IS-IS, L1 CSNP, src-id 3333.3333.3333.00, length 83
+IS-IS, L1 Lan IIH, src-id 3333.3333.3333, lan-id 3333.3333.3333.02, prio 64, length 1497
+IS-IS, L1 Lan IIH, src-id 3333.3333.3333, lan-id 3333.3333.3333.02, prio 64, length 1497
+IS-IS, L1 LSP, lsp-id 2222.2222.2222.00-00, seq 0x0000000f, lifetime 1199s, length 136
+IS-IS, L1 Lan IIH, src-id 2222.2222.2222, lan-id 3333.3333.3333.02, prio 64, length 1497
+IS-IS, L1 Lan IIH, src-id 3333.3333.3333, lan-id 3333.3333.3333.02, prio 64, length 1497
+IS-IS, L1 CSNP, src-id 3333.3333.3333.00, length 83
+IS-IS, L1 Lan IIH, src-id 3333.3333.3333, lan-id 3333.3333.3333.02, prio 64, length 1497
+IS-IS, L1 Lan IIH, src-id 3333.3333.3333, lan-id 3333.3333.3333.02, prio 64, length 1497
+IS-IS, L1 Lan IIH, src-id 2222.2222.2222, lan-id 3333.3333.3333.02, prio 64, length 1497
--- /dev/null
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1 only]
+ lan-id: 2222.2222.2222.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 163
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1 only]
+ lan-id: 2222.2222.2222.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 163
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1 only]
+ lan-id: 2222.2222.2222.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 163
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1 only]
+ lan-id: 2222.2222.2222.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 163
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 30s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 163
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1 only]
+ lan-id: 2222.2222.2222.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0001
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 30s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0001
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 86
+ L1 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ lsp-id: 2222.2222.2222.00-00, seq: 0x00000009, lifetime: 1199s
+ chksum: 0x630b (correct), PDU length: 86, Flags: [ L1 IS ]
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Hostname TLV #137, length: 2
+ Hostname: R2
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 192.168.10.1
+ IPv4 Internal Reachability TLV #128, length: 24
+ IPv4 prefix: 10.0.10.0/30, Distribution: up, Metric: 10, Internal
+ IPv4 prefix: 192.168.10.0/24, Distribution: up, Metric: 10, Internal
+ IS Reachability TLV #2, length: 12
+ IsNotVirtual
+ IS Neighbor: 3333.3333.3333.02, Default Metric: 10, Internal
+IS-IS, length 74
+ L1 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ lsp-id: 3333.3333.3333.00-00, seq: 0x0000000e, lifetime: 1199s
+ chksum: 0x1b47 (correct), PDU length: 74, Flags: [ default ATT bit set, L2 IS ]
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Hostname TLV #137, length: 2
+ Hostname: R3
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ IPv4 Internal Reachability TLV #128, length: 12
+ IPv4 prefix: 10.0.10.0/30, Distribution: up, Metric: 10, Internal
+ IS Reachability TLV #2, length: 12
+ IsNotVirtual
+ IS Neighbor: 3333.3333.3333.02, Default Metric: 10, Internal
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 83
+ L1 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333.00, PDU length: 83
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 48
+ lsp-id: 2222.2222.2222.00-00, seq: 0x00000009, lifetime: 1192s, chksum: 0x630b
+ lsp-id: 3333.3333.3333.00-00, seq: 0x0000000e, lifetime: 1194s, chksum: 0x1b47
+ lsp-id: 3333.3333.3333.02-00, seq: 0x00000004, lifetime: 1039s, chksum: 0x7f9f
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0001
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 83
+ L1 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333.00, PDU length: 83
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 48
+ lsp-id: 2222.2222.2222.00-00, seq: 0x00000009, lifetime: 1184s, chksum: 0x630b
+ lsp-id: 3333.3333.3333.00-00, seq: 0x0000000e, lifetime: 1186s, chksum: 0x1b47
+ lsp-id: 3333.3333.3333.02-00, seq: 0x00000004, lifetime: 1032s, chksum: 0x7f9f
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0001
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L1 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 10s, Flags: [Level 1 only]
+ lan-id: 3333.3333.3333.02, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c201.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
--- /dev/null
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 30s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 163
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 30s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 163
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 30s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 163
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 30s, Flags: [Level 2 only]
+ lan-id: 3333.3333.3333.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 163
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 30s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 30s, Flags: [Level 2 only]
+ lan-id: 3333.3333.3333.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c203.29a9.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 100
+ L2 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ lsp-id: 4444.4444.4444.00-00, seq: 0x0000000a, lifetime: 1199s
+ chksum: 0xf252 (correct), PDU length: 100, Flags: [ L2 IS ]
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Hostname TLV #137, length: 2
+ Hostname: R4
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.20.1
+ IPv4 Internal Reachability TLV #128, length: 12
+ IPv4 prefix: 10.0.0.0/30, Distribution: up, Metric: 10, Internal
+ IS Reachability TLV #2, length: 12
+ IsNotVirtual
+ IS Neighbor: 4444.4444.4444.01, Default Metric: 10, Internal
+ IPv4 Internal Reachability TLV #128, length: 24
+ IPv4 prefix: 10.0.20.0/30, Distribution: up, Metric: 10, Internal
+ IPv4 prefix: 192.168.20.0/24, Distribution: up, Metric: 20, Internal
+IS-IS, length 52
+ L2 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ lsp-id: 4444.4444.4444.01-00, seq: 0x00000003, lifetime: 1199s
+ chksum: 0x7ef7 (correct), PDU length: 52, Flags: [ L2 IS ]
+ IS Reachability TLV #2, length: 23
+ IsNotVirtual
+ IS Neighbor: 4444.4444.4444.00, Default Metric: 0, Internal
+ IS Neighbor: 3333.3333.3333.00, Default Metric: 0, Internal
+IS-IS, length 100
+ L2 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ lsp-id: 3333.3333.3333.00-00, seq: 0x00000009, lifetime: 1199s
+ chksum: 0x24b1 (correct), PDU length: 100, Flags: [ L2 IS ]
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Hostname TLV #137, length: 2
+ Hostname: R3
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.10.1
+ IPv4 Internal Reachability TLV #128, length: 12
+ IPv4 prefix: 10.0.0.0/30, Distribution: up, Metric: 10, Internal
+ IS Reachability TLV #2, length: 12
+ IsNotVirtual
+ IS Neighbor: 4444.4444.4444.01, Default Metric: 10, Internal
+ IPv4 Internal Reachability TLV #128, length: 24
+ IPv4 prefix: 10.0.10.0/30, Distribution: up, Metric: 10, Internal
+ IPv4 prefix: 192.168.10.0/24, Distribution: up, Metric: 20, Internal
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 30s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c203.29a9.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 83
+ L2 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444.00, PDU length: 83
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 48
+ lsp-id: 3333.3333.3333.00-00, seq: 0x00000009, lifetime: 1192s, chksum: 0x24b1
+ lsp-id: 4444.4444.4444.00-00, seq: 0x0000000a, lifetime: 1194s, chksum: 0xf252
+ lsp-id: 4444.4444.4444.01-00, seq: 0x00000003, lifetime: 1194s, chksum: 0x7ef7
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 30s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c203.29a9.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 83
+ L2 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444.00, PDU length: 83
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 48
+ lsp-id: 3333.3333.3333.00-00, seq: 0x00000009, lifetime: 1183s, chksum: 0x24b1
+ lsp-id: 4444.4444.4444.00-00, seq: 0x0000000a, lifetime: 1185s, chksum: 0xf252
+ lsp-id: 4444.4444.4444.01-00, seq: 0x00000003, lifetime: 1185s, chksum: 0x7ef7
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 30s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c203.29a9.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 83
+ L2 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444.00, PDU length: 83
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 48
+ lsp-id: 3333.3333.3333.00-00, seq: 0x00000009, lifetime: 1174s, chksum: 0x24b1
+ lsp-id: 4444.4444.4444.00-00, seq: 0x0000000a, lifetime: 1176s, chksum: 0xf252
+ lsp-id: 4444.4444.4444.01-00, seq: 0x00000003, lifetime: 1176s, chksum: 0x7ef7
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 30s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c203.29a9.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 83
+ L2 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444.00, PDU length: 83
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 48
+ lsp-id: 3333.3333.3333.00-00, seq: 0x00000009, lifetime: 1166s, chksum: 0x24b1
+ lsp-id: 4444.4444.4444.00-00, seq: 0x0000000a, lifetime: 1168s, chksum: 0xf252
+ lsp-id: 4444.4444.4444.01-00, seq: 0x00000003, lifetime: 1168s, chksum: 0x7ef7
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 30s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c203.29a9.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 83
+ L2 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444.00, PDU length: 83
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 48
+ lsp-id: 3333.3333.3333.00-00, seq: 0x00000009, lifetime: 1157s, chksum: 0x24b1
+ lsp-id: 4444.4444.4444.00-00, seq: 0x0000000a, lifetime: 1159s, chksum: 0xf252
+ lsp-id: 4444.4444.4444.01-00, seq: 0x00000003, lifetime: 1159s, chksum: 0x7ef7
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 30s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c203.29a9.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 83
+ L2 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444.00, PDU length: 83
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 48
+ lsp-id: 3333.3333.3333.00-00, seq: 0x00000009, lifetime: 1147s, chksum: 0x24b1
+ lsp-id: 4444.4444.4444.00-00, seq: 0x0000000a, lifetime: 1149s, chksum: 0xf252
+ lsp-id: 4444.4444.4444.01-00, seq: 0x00000003, lifetime: 1149s, chksum: 0x7ef7
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 3333.3333.3333, holding time: 30s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.000a
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c203.29a9.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
+IS-IS, length 1497
+ L2 Lan IIH, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 4444.4444.4444, holding time: 10s, Flags: [Level 2 only]
+ lan-id: 4444.4444.4444.01, Priority: 64, PDU length: 1497
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0014
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ IS Neighbor(s) TLV #6, length: 6
+ SNPA: c202.2998.0000
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 155
--- /dev/null
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 1111.1111.1111, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Down (2)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 1111.1111.1111, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Down (2)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Down (2)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Down (2)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 1111.1111.1111, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Initializing (1)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Initializing (1)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 1111.1111.1111, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Up (0)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Up (0)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
+IS-IS, length 74
+ L1 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ lsp-id: 1111.1111.1111.00-00, seq: 0x00000007, lifetime: 1200s
+ chksum: 0x1da8 (correct), PDU length: 74, Flags: [ L2 IS ]
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Hostname TLV #137, length: 2
+ Hostname: R1
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ IPv4 Internal Reachability TLV #128, length: 12
+ IPv4 prefix: 10.0.0.0/30, Distribution: up, Metric: 10, Internal
+ IS Reachability TLV #2, length: 12
+ IsNotVirtual
+ IS Neighbor: 2222.2222.2222.00, Default Metric: 10, Internal
+IS-IS, length 74
+ L2 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ lsp-id: 1111.1111.1111.00-00, seq: 0x00000007, lifetime: 1200s
+ chksum: 0x378e (correct), PDU length: 74, Flags: [ L2 IS ]
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Hostname TLV #137, length: 2
+ Hostname: R1
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ IS Reachability TLV #2, length: 12
+ IsNotVirtual
+ IS Neighbor: 2222.2222.2222.00, Default Metric: 10, Internal
+ IPv4 Internal Reachability TLV #128, length: 12
+ IPv4 prefix: 10.0.0.0/30, Distribution: up, Metric: 10, Internal
+IS-IS, length 74
+ L1 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ lsp-id: 2222.2222.2222.00-00, seq: 0x00000005, lifetime: 1200s
+ chksum: 0x4382 (correct), PDU length: 74, Flags: [ L2 IS ]
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Hostname TLV #137, length: 2
+ Hostname: R2
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ IPv4 Internal Reachability TLV #128, length: 12
+ IPv4 prefix: 10.0.0.0/30, Distribution: up, Metric: 10, Internal
+ IS Reachability TLV #2, length: 12
+ IsNotVirtual
+ IS Neighbor: 1111.1111.1111.00, Default Metric: 10, Internal
+IS-IS, length 74
+ L2 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ lsp-id: 2222.2222.2222.00-00, seq: 0x00000006, lifetime: 1200s
+ chksum: 0xf4cf (correct), PDU length: 74, Flags: [ L2 IS ]
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Hostname TLV #137, length: 2
+ Hostname: R2
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ IS Reachability TLV #2, length: 12
+ IsNotVirtual
+ IS Neighbor: 1111.1111.1111.00, Default Metric: 10, Internal
+ IPv4 Internal Reachability TLV #128, length: 12
+ IPv4 prefix: 10.0.0.0/30, Distribution: up, Metric: 10, Internal
+IS-IS, length 67
+ L1 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222.00, PDU length: 67
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 32
+ lsp-id: 1111.1111.1111.00-00, seq: 0x00000007, lifetime: 1198s, chksum: 0x1da8
+ lsp-id: 2222.2222.2222.00-00, seq: 0x00000005, lifetime: 1199s, chksum: 0x4382
+IS-IS, length 67
+ L1 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 1111.1111.1111.00, PDU length: 67
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 32
+ lsp-id: 1111.1111.1111.00-00, seq: 0x00000007, lifetime: 1199s, chksum: 0x1da8
+ lsp-id: 2222.2222.2222.00-00, seq: 0x00000005, lifetime: 1198s, chksum: 0x4382
+IS-IS, length 67
+ L2 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 1111.1111.1111.00, PDU length: 67
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 32
+ lsp-id: 1111.1111.1111.00-00, seq: 0x00000007, lifetime: 1199s, chksum: 0x378e
+ lsp-id: 2222.2222.2222.00-00, seq: 0x00000006, lifetime: 1198s, chksum: 0xf4cf
+IS-IS, length 67
+ L2 CSNP, hlen: 33, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222.00, PDU length: 67
+ start lsp-id: 0000.0000.0000.00-00
+ end lsp-id: ffff.ffff.ffff.ff-ff
+ LSP entries TLV #9, length: 32
+ lsp-id: 1111.1111.1111.00-00, seq: 0x00000007, lifetime: 1198s, chksum: 0x378e
+ lsp-id: 2222.2222.2222.00-00, seq: 0x00000006, lifetime: 1199s, chksum: 0xf4cf
+IS-IS, length 35
+ L1 PSNP, hlen: 17, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 1111.1111.1111.00, PDU length: 35
+ LSP entries TLV #9, length: 16
+ lsp-id: 2222.2222.2222.00-00, seq: 0x00000005, lifetime: 1197s, chksum: 0x4382
+IS-IS, length 35
+ L2 PSNP, hlen: 17, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 1111.1111.1111.00, PDU length: 35
+ LSP entries TLV #9, length: 16
+ lsp-id: 2222.2222.2222.00-00, seq: 0x00000006, lifetime: 1198s, chksum: 0xf4cf
+IS-IS, length 35
+ L1 PSNP, hlen: 17, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222.00, PDU length: 35
+ LSP entries TLV #9, length: 16
+ lsp-id: 1111.1111.1111.00-00, seq: 0x00000007, lifetime: 1197s, chksum: 0x1da8
+IS-IS, length 35
+ L2 PSNP, hlen: 17, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222.00, PDU length: 35
+ LSP entries TLV #9, length: 16
+ lsp-id: 1111.1111.1111.00-00, seq: 0x00000007, lifetime: 1198s, chksum: 0x378e
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Up (0)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 1111.1111.1111, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Up (0)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Up (0)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 1111.1111.1111, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Up (0)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 2222.2222.2222, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Up (0)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.2
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
+IS-IS, length 1499
+ p2p IIH, hlen: 20, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 3 (0)
+ source-id: 1111.1111.1111, holding time: 30s, Flags: [Level 1, Level 2]
+ circuit-id: 0x00, PDU length: 1499
+ Restart Signaling TLV #211, length: 3
+ Flags [none], Remaining holding time 0s
+ Point-to-point Adjacency State TLV #240, length: 1
+ Adjacency State: Up (0)
+ Protocols supported TLV #129, length: 1
+ NLPID(s): IPv4 (0xcc)
+ Area address(es) TLV #1, length: 4
+ Area address (length: 3): 49.0001
+ IPv4 Interface address(es) TLV #132, length: 4
+ IPv4 interface address: 10.0.0.1
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 255
+ Padding TLV #8, length: 169
--- /dev/null
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto GRE (47), length 54)
+ 253.120.2.55 > 192.168.1.1: GREv0, Flags [none], length 34
+ IS-IS, length 30
+ L1 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (6), max-area: 7 (7)
+ lsp-id: ffff.ffff.ffff.ff-ff, seq: 0xffffffff, lifetime: 65535s
+ chksum: 0xffff (incorrect should be 0x0fe8), PDU length: 65535, Flags: [ L1 IS ]
+ IS Neighbor(s) (variable length) TLV #7, length: 0
+ 1 straggler bytes
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto GRE (47), length 54)
+ 234.176.145.73 > 192.168.1.1: GREv0, Flags [none], length 34
+ IS-IS, length 30
+ L1 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (6), max-area: 7 (7)
+ lsp-id: ffff.ffff.ffff.ff-ff, seq: 0xffffffff, lifetime: 65535s
+ chksum: 0xffff (incorrect should be 0x0fe8), PDU length: 65535, Flags: [ L1 IS ]
+ IS Neighbor(s) (variable length) TLV #7, length: 0
+ 1 straggler bytes
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto GRE (47), length 54)
+ 225.91.211.91 > 192.168.1.1: GREv0, Flags [none], length 34
+ IS-IS, length 30
+ L1 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (6), max-area: 7 (7)
+ lsp-id: ffff.ffff.ffff.ff-ff, seq: 0xffffffff, lifetime: 65535s
+ chksum: 0xffff (incorrect should be 0x0fe8), PDU length: 65535, Flags: [ L1 IS ]
+ IS Neighbor(s) (variable length) TLV #7, length: 0
+ 1 straggler bytes
+IP (tos 0x0, ttl 128, id 0, offset 0, flags [DF], proto GRE (47), length 54)
+ 160.196.17.46 > 192.168.1.1: GREv0, Flags [none], length 34
+ IS-IS, length 30
+ L1 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (6), max-area: 7 (7)
+ lsp-id: ffff.ffff.ffff.ff-ff, seq: 0xffffffff, lifetime: 65535s
+ chksum: 0xffff (incorrect should be 0x0fe8), PDU length: 65535, Flags: [ L1 IS ]
+ IS Neighbor(s) (variable length) TLV #7, length: 0
+ 1 straggler bytes
+IP (tos 0x0, ttl 128, id 0, offset 0, flags [DF], proto GRE (47), length 54)
+ 246.181.173.63 > 192.168.1.1: GREv0, Flags [none], length 34
+ IS-IS, length 30
+ L1 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (6), max-area: 7 (7)
+ lsp-id: ffff.ffff.ffff.ff-ff, seq: 0xffffffff, lifetime: 65535s
+ chksum: 0xffff (incorrect should be 0x0fe8), PDU length: 65535, Flags: [ L1 IS ]
+ IS Neighbor(s) (variable length) TLV #7, length: 0
+ 1 straggler bytes
--- /dev/null
+IP 10.28.6.42.2905 > 10.28.6.44.2905: sctp (1) [DATA] (B)(E) [TSN: 1822994892] [SID: 6] [SSEQ 42] [PPID M3UA]
+IP 10.28.6.44.2905 > 10.28.6.42.2905: sctp (1) [DATA] (B)(E) [TSN: 4307] [SID: 0] [SSEQ 643] [PPID M3UA]
+IP 10.28.6.44.2905 > 10.28.6.42.2905: sctp (1) [DATA] (B)(E) [TSN: 4308] [SID: 0] [SSEQ 644] [PPID M3UA]
+IP 10.28.6.44.2905 > 10.28.6.42.2905: sctp (1) [DATA] (B)(E) [TSN: 4309] [SID: 0] [SSEQ 645] [PPID M3UA]
+IP 10.28.6.42.2905 > 10.28.6.44.2905: sctp (1) [DATA] (B)(E) [TSN: 1822994893] [SID: 6] [SSEQ 43] [PPID M3UA]
+IP 10.28.6.44.2905 > 10.28.6.42.2905: sctp (1) [DATA] (B)(E) [TSN: 4310] [SID: 0] [SSEQ 646] [PPID M3UA]
--- /dev/null
+IP (tos 0x0, ttl 64, id 38618, offset 0, flags [none], proto SCTP (132), length 132)
+ 10.28.6.42.2905 > 10.28.6.44.2905: sctp
+ 1) [DATA] (B)(E) [TSN: 1822994892] [SID: 6] [SSEQ 42] [PPID M3UA]
+ Transfer Data Message
+ Unknown Parameter (0x0002): (length 73)
+IP (tos 0x0, ttl 255, id 50089, offset 0, flags [DF], proto SCTP (132), length 76)
+ 10.28.6.44.2905 > 10.28.6.42.2905: sctp
+ 1) [DATA] (B)(E) [TSN: 4307] [SID: 0] [SSEQ 643] [PPID M3UA]
+ Transfer Data Message
+ Unknown Parameter (0x0002): (length 18)
+IP (tos 0x0, ttl 255, id 50090, offset 0, flags [DF], proto SCTP (132), length 72)
+ 10.28.6.44.2905 > 10.28.6.42.2905: sctp
+ 1) [DATA] (B)(E) [TSN: 4308] [SID: 0] [SSEQ 644] [PPID M3UA]
+ Transfer Data Message
+ Unknown Parameter (0x0002): (length 15)
+IP (tos 0x0, ttl 255, id 50091, offset 0, flags [DF], proto SCTP (132), length 72)
+ 10.28.6.44.2905 > 10.28.6.42.2905: sctp
+ 1) [DATA] (B)(E) [TSN: 4309] [SID: 0] [SSEQ 645] [PPID M3UA]
+ Transfer Data Message
+ Unknown Parameter (0x0002): (length 13)
+IP (tos 0x0, ttl 64, id 38651, offset 0, flags [none], proto SCTP (132), length 76)
+ 10.28.6.42.2905 > 10.28.6.44.2905: sctp
+ 1) [DATA] (B)(E) [TSN: 1822994893] [SID: 6] [SSEQ 43] [PPID M3UA]
+ Transfer Data Message
+ Unknown Parameter (0x0002): (length 17)
+IP (tos 0x0, ttl 255, id 50109, offset 0, flags [DF], proto SCTP (132), length 72)
+ 10.28.6.44.2905 > 10.28.6.42.2905: sctp
+ 1) [DATA] (B)(E) [TSN: 4310] [SID: 0] [SSEQ 646] [PPID M3UA]
+ Transfer Data Message
+ Unknown Parameter (0x0002): (length 13)
--- /dev/null
+IP6, wrong link-layer encapsulation (tos 0x10, ttl 192, id 63177, offset 0, flags [DF], proto SCTP (132), length 168, options (security [bad length 110]), bad cksum a291 (->9204)!)
+ c084:a291:b8aa:42aa:3e38:9ac7:826e:b930.33943 > 8497:1a30:7cd4:d4d4:d4d4:d428:13:68.6704: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 1934917887] [SID: 256] [SSEQ 15360] [PPID 0x3c00]
+ ForCES Config
+ ForCES Version 14 len 88B flags 0x0a040604
+ SrcID 0xff000200(AllMulticast) DstID 0xb59cbe(FE) Correlator 0x30480805f4010800
+ Messy oper TLV header, type (0x600)
+ excess of -240 Bytes
+ [0x0000: e803 0016 ff00 0200 00b5 9cbe 3048 0805
+ [0x0010: f401 0800 0a04 0604 0010 003c 0000 3ce8
+ [0x0020: 0300 3c00 000e 0016 0604 0010 003c 0000
+ [0x0030: 0000 ff00 ffff a69c be30 4808 0600 0108
+ [0x0040: 0006 0400 0184 b59c be30 84b5 0010 0000
+ [0x0050: cc05 367e 0003 0000
+ ][|sctp]
+EXIT CODE 00000100
--- /dev/null
+CFMv0 unknown (204), MD Level 0, length 168
+ First TLV offset 52
+ 0x0000: a300 0000 0080 0000 0000 0000 0000 0000
+ 0x0010: 0000 00aa 6873 54d7 060b 003c 0000 003c
+ 0x0020: d4c3 b2a1 0200 1a00 000b 003c 0000 003c
+ 0x0030: d4c3 b2a1 0200 1a00 0000 0000 3620 0a00
+ 0x0040: b600 0000 b600 0000 40b5 9cbe 3048 0cc4
+ 0x0050: ad37 1005 ffff 05cc 0934 9300 0000 0080
+ 0x0060: 0000 0000 0000 3200 0000 0000 00aa 6873
+ Port status TLV (0x02), length 26, Status: Unknown (0)
+ Unknown TLV (0x37), length 4101
+ 0x0000: 3710 05ff ff05 cc09 3493 0000 0000 8000
+ 0x0010: 0000 0000 0032 0000 0000 0000 aa68 7354
+ 0x0020: d706 0b00 3c00 0000 3c00 0000 0080 0000
+ 0x0030: fffd 4d5f d9bd c709 30ac 8176 b36d cc11
+ 0x0040: 3abf 1291 f106 4ede 61f4 6297 afc4 39a4
+ 0x0050: 0db9 7a
+IP (tos 0x10, ttl 62, id 64806, offset 0, flags [DF], proto TCP (6), length 52)
+ 204.9.51.132.50079 > 204.9.54.80.22: Flags [.], cksum 0x8611 (incorrect -> 0xa678), ack 1819218606, win 4094, options [nop,nop,TS val 941371775 ecr 4294967242], length 0
+IP (tos 0x10, ttl 62, id 62920, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 4504 (->451a)!)
+ 204.9.51.132.50079 > 204.243.53.80.22: Flags [.], cksum 0x858b (incorrect -> 0x66a1), ack 2339312418, win 4092, options [nop,nop,TS val 941371913 ecr 1340592084], length 0
+IP (tos 0x0, ttl 64, id 63178, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 3e8c (->438c)!)
+ 204.9.64.80.55936 > 204.9.40.10.443: Flags [.], cksum 0x0594 (incorrect -> 0x7767), ack 3587398274, win 1040, options [nop,nop,TS val 647770294 ecr 2364779354], length 0
+IP (tos 0x0, ttl 64, id 36752, offset 0, flags [DF], proto TCP (6), length 399, bad cksum a46b (->a474)!)
+ 204.0.55.10.323 > 204.9.54.80.55936: Flags [P.], cksum 0xc9b6 (incorrect -> 0x8900), seq 3589495407:3589495754, ack 370428050, win 1040, options [nop,nop,TS val 2364757411 ecr 3084508609], length 347|trunc|trunc
+ [|RPKI-RTR]
+EXIT CODE 00000100
--- /dev/null
+IP (tos 0x10, ttl 64, id 63177, offset 0, flags [DF], proto TCP (6), length 168)
+ 204.9.54.80.22 > 204.9.51.132.50079: Flags [P.], cksum 0x0282 (incorrect -> 0x3217), seq 1819218606:1819218722, ack 1238485076, win 1039, options [nop,nop,TS val 1340592078 ecr 941371882], length 116
+IP6, wrong link-layer encapsulation (tos 0x10, ttl 62, id 64806, offset 0, flags [DF], proto TCP (6), length 52, options (unknown 195 [bad length 159]), bad cksum 3da6 (->45ca)!)
+ 27759 > 4782: tcp 24 [bad hdr length 0 - too short, < 20]
+IP (tos 0x10, ttl 62, id 62920, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 4504 (->451a)!)
+ 204.9.51.132.50079 > 204.243.53.80.22: Flags [.], cksum 0x858b (incorrect -> 0x85a1), ack 1819218722, win 4092, options [nop,nop,TS val 941371913 ecr 1340592084], length 0
+IP (tos 0x0, ttl 64, id 63178, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 3e8c (->438c)!)
+ 204.9.64.80.55936 > 204.9.40.10.443: Flags [.], cksum 0x0594 (incorrect -> 0x7767), ack 3587398274, win 1040, options [nop,nop,TS val 647770294 ecr 2364779354], length 0
+IP (tos 0x0, ttl 64, id 36752, offset 0, flags [DF], proto TCP (6), length 399, bad cksum a46b (->a474)!)
+ 204.0.55.10.323 > 204.9.54.80.55936: Flags [P.], cksum 0xc9b6 (incorrect -> 0x0cf1), seq 3589495407:3589495754, ack 370428050, win 1040, options [nop,nop,TS val 2381534627 ecr 3084508609], length 347|trunc|trunc|trunc
+IP (tos 0x10, ttl 62, id 64806, offset 0, flags [DF], proto TCP (6), length 52)
+ 204.9.51.132.50079 > 204.9.54.80.22: Flags [.], cksum 0x8611 (incorrect -> 0xa678), ack 0, win 4094, options [nop,nop,TS val 941371775 ecr 4294967242], length 0
+IP (tos 0x10, ttl 62, id 62920, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 4504 (->451a)!)
+ 204.9.51.132.50079 > 204.243.53.80.22: Flags [.], cksum 0x858b (incorrect -> 0x85a1), ack 1, win 4092, options [nop,nop,TS val 941371913 ecr 1340592084], length 0
+IP (tos 0x0, ttl 64, id 63178, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 3e8c (->438c)!)
+ 204.9.64.80.55936 > 204.9.40.10.443: Flags [.], cksum 0x0594 (incorrect -> 0x8d67), ack 1, win 1040, options [nop,nop,TS val 647770294 ecr 2364773722], length 0
+IP (tos 0x0, ttl 64, id 36752, offset 0, flags [DF], proto TCP (6), length 399, bad cksum a46b (->a474)!)
+ 204.0.55.10.323 > 204.9.54.80.55936: Flags [P.], cksum 0xc9b6 (incorrect -> 0xa6b3), seq 0:347, ack 1, win 1040, options [nop,nop,TS val 2364757411 ecr 3084508609], length 347|trunc|trunc|trunc
+ [|RPKI-RTR]
+EXIT CODE 00000100
--- /dev/null
+IP (tos 0x10, ttl 64, id 63177, offset 0, flags [none], proto unknown (240), length 168, bad cksum 418f (->80a5)!)
+ 204.9.54.80 > 204.9.51.132: ip-proto-240 148
+IP (tos 0x10, ttl 62, id 64806, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 3da6 (->35a6)!)
+ 212.9.51.132.50079 > 204.9.54.80.22: Flags [.], cksum 0x8611 (incorrect -> 0x4811), ack 1819218606, win 17918, options [nop,nop,TS val 941371903 ecr 1340592074], length 0
+84:b5:9c:be:30:48 Unknown SSAP 0x10 > 0c:c4:7a:08:e9:12 Unknown DSAP 0x44 Information, send seq 0, rcv seq 26, Flags [Command], length 52
+IP (tos 0x0, ttl 64, id 63178, offset 0, flags [DF], proto TCP (6), length 52)
+ 204.9.54.80.55936 > 204.9.55.10.443: Flags [.], cksum 0x0594 (incorrect -> 0x725a), ack 3589495407, win 1040, options [nop,nop,TS val 647770294 ecr 2364779354], length 0
+IP (tos 0x0, ttl 64, id 36752, offset 0, flags [DF], proto TCP (6), length 399, bad cksum a46b (->a474)!)
+ 204.0.55.10.323 > 204.9.54.80.55936: Flags [P.], cksum 0xc9b6 (incorrect -> 0xcd5f), seq 3589495407:3589495754, ack 370436242, win 1040, options [nop,nop,TS val 2364757411 ecr 3084508609], length 347|trunc|trunc|trunc
+ [|RPKI-RTR]
+IP (tos 0x10, ttl 62, id 64806, offset 0, flags [DF], proto TCP (6), length 52)
+ 204.9.51.132.50079 > 204.9.54.80.22: Flags [.], cksum 0x8611 (incorrect -> 0xa678), ack 1819218606, win 4094, options [nop,nop,TS val 941371775 ecr 4294967242], length 0
+IP (tos 0x10, ttl 62, id 62920, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 4504 (->451a)!)
+ 204.9.51.132.50079 > 204.243.53.80.22: Flags [.], cksum 0x858b (incorrect -> 0x85a1), ack 1819218722, win 4092, options [nop,nop,TS val 941371913 ecr 1340592084], length 0
+IP (tos 0x0, ttl 64, id 63178, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 3e8c (->438c)!)
+ 204.9.64.80.55936 > 204.9.40.10.443: Flags [.], cksum 0x0594 (incorrect -> 0x8d67), ack 3587398274, win 1040, options [nop,nop,TS val 647770294 ecr 2364773722], length 0
+IP (tos 0x0, ttl 64, id 36752, offset 0, flags [DF], proto TCP (6), length 399, bad cksum a46b (->a474)!)
+ 204.0.55.10.323 > 204.9.54.80.55936: Flags [P.], cksum 0xc9b6 (incorrect -> 0xfa70), seq 0:347, ack 4294959105, win 1040, options [nop,nop,TS val 2364757411 ecr 3084508609], length 347|trunc|trunc|trunc
+IP truncated-ip - 768 bytes missing! (tos 0x10, ttl 62, id 64806, offset 0, flags [DF], proto TCP (6), length 820, bad cksum 3da6 (->3aa6)!)
+ 204.9.51.132.50079 > 204.9.54.80.22: Flags [.], seq 0:768, ack 1, win 4094, options [nop,nop,TS val 941371775 ecr 4294967242], length 768
+IP (tos 0x6,ECT(0), ttl 62, id 62920, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 4504 (->4524)!)
+ 204.9.51.132.50079 > 204.243.53.80.22: Flags [.], cksum 0x858b (incorrect -> 0x85a1), ack 1, win 4092, options [nop,nop,TS val 941371913 ecr 1340592084], length 0
+IP (tos 0x0, ttl 64, id 63178, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 3e8c (->438c)!)
+ 204.9.64.80.55936 > 204.9.40.10.443: Flags [.], cksum 0x0594 (incorrect -> 0x8d67), ack 1, win 1040, options [nop,nop,TS val 647770294 ecr 2364773722], length 0
+IP (tos 0x0, ttl 64, id 36752, offset 0, flags [DF], proto TCP (6), length 399, bad cksum a46b (->a474)!)
+ 204.0.55.10.323 > 204.9.54.80.55936: Flags [P.], cksum 0xc9b6 (incorrect -> 0x3f28), seq 0:347, ack 4294959105, win 1040, options [nop,nop,TS val 2364757411 ecr 3084508609], length 347|trunc|trunc|trunc
+ [|RPKI-RTR]
+EXIT CODE 00000100
--- /dev/null
+CFMv0 unknown (204), MD Level 0, length 168
+ First TLV offset 52
+ 0x0000: a300 0000 0080 0000 0000 0000 0000 0000
+ 0x0010: 0000 00aa 6873 54d7 060b 003c 0000 003c
+ 0x0020: d4c3 b2a1 0200 1a00 000b 003c 0000 003c
+ 0x0030: d4c3 b2a1 0200 1a00 0000 0000 3620 0a00
+ 0x0040: b600 0000 b600 0000 40b5 9cbe 3048 0cc4
+ 0x0050: ad37 1005 ffff 05cc 0934 9300 0000 0080
+ 0x0060: 0000 0000 0000 3200 0000 0000 00aa 6873
+ Port status TLV (0x02), length 26, Status: Unknown (0)
+ Unknown TLV (0x37), length 4101
+ 0x0000: 3710 05ff ff05 cc09 3493 0000 0000 8000
+ 0x0010: 0000 0000 0032 0000 0000 0000 aa68 7354
+ 0x0020: d706 0b00 3c00 0000 3c00 0000 0080 0000
+ 0x0030: fffd 4d5f d9bd c709 30ac 8176 b36d cc11
+ 0x0040: 3abf 1291 f106 4ede 61f4 6297 afc4 39a4
+ 0x0050: 0db9 7a
+IP (tos 0x10, ttl 62, id 64806, offset 0, flags [DF], proto TCP (6), length 52)
+ 204.9.51.132.50079 > 204.9.54.80.22: Flags [.], cksum 0x8611 (incorrect -> 0xa678), ack 1819218606, win 4094, options [nop,nop,TS val 941371775 ecr 4294967242], length 0
+IP (tos 0x10, ttl 62, id 62920, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 4504 (->451a)!)
+ 204.9.51.132.50079 > 204.243.53.80.22: Flags [.], cksum 0x858b (incorrect -> 0x98c3), ack 1819279359, win 4092, options [nop,nop,TS val 941371913 ecr 1340592084], length 0
+IP (tos 0x0, ttl 64, id 63178, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 3e8c (->438c)!)
+ 204.9.64.80.55936 > 204.9.40.10.443: Flags [.], cksum 0x0594 (incorrect -> 0x7767), ack 3587398274, win 1040, options [nop,nop,TS val 647770294 ecr 2364779354], length 0
+IP (tos 0x0, ttl 64, id 36752, offset 0, flags [DF], proto TCP (6), length 399, bad cksum a46b (->a474)!)
+ 204.0.55.10.323 > 204.9.54.80.55936: Flags [P.], cksum 0xc9b6 (incorrect -> 0x183a), seq 3589495407:3589495754, ack 370428050, win 1040, options [nop,nop,TS val 2351322531 ecr 3084508609], length 347|trunc|trunc
+ [|RPKI-RTR]
+EXIT CODE 00000100
--- /dev/null
+FRF.16 Frag, seq 693, Flags [Begin], UI e8! IS-IS, length 301989913
+ L1 LSP, hlen: 27, v: 1, pdu-v: 1, sys-id-len: 6 (0), max-area: 131 (131)
+ lsp-id: 8383.8383.834f.00-60, seq: 0x06418fcc, lifetime: 33667s
+ chksum: 0x0900(unverified), PDU length: 33667, Flags: [ Overload bit set, expense ATT bit set, L1 IS ]
+ Multi-Topology Capability TLV #144, length: 137
+ O: 0, RES: 4, MTID(s): 3945
+ unknown subTLV #8, length: 233
+ unknown subTLV #18, length: 0
+ unknown subTLV #37, length: 144
+ unknown subTLV #137, length: 79
+ unknown subTLV #105, length: 8
+ unknown subTLV #0, length: 69
+ unknown subTLV #0, length: 0
+ unknown subTLV #52, length: 144
+ unknown subTLV #64, length: 64
+ SPB Instance subTLV #1, length: 64
+ CIST Root-ID: 06a516cc 09370acc, Path Cost: ffffff7f, Prio: 48090
+ RES: 1031, V: 1, SPSource-ID: 324444, No of Trees: 5
+ U:0, M:0, A:0, RES:22, ECT: 144a2d80, BVID: 256, SPVID: 1040
+ U:0, M:1, A:1, RES:14, ECT: 55000001, BVID: 16, SPVID: 2058
+ U:1, M:0, A:0, RES:12, ECT: f3ac2b26, BVID: 2499, SPVID: 185
+ U:1, M:0, A:1, RES:5, ECT: 68735440, BVID: 1216, SPVID: 3072
+ U:1, M:1, A:1, RES:23, ECT: 020000f7, BVID: 32, SPVID: 0
+ unknown subTLV #132, length: 181
+ unknown subTLV #156, length: 190
+ unknown subTLV #255, length: 255
+ unknown subTLV #255, length: 255
+ unknown subTLV #0, length: 64
+ unknown subTLV #6, length: 62
+ unknown subTLV #136, length: 204
+ unknown subTLV #9, length: 16
+ unknown subTLV #4, length: 16
+ unknown subTLV #5, length: 148
+ unknown subTLV #0, length: 0
+ SPB Instance subTLV #1, length: 1
+ CIST Root-ID: 080a26a6 318b8cf3, Path Cost: a5d38ec4, Prio: 31240
+ RES: 1864, V: 1, SPSource-ID: 133120, No of Trees: 45
+ U:0, M:0, A:0, RES:0, ECT: cc09370a, BVID: 3496, SPVID: 1
+ U:1, M:0, A:1, RES:27, ECT: 16274ce2, BVID: 3423, SPVID: 860
+ U:1, M:1, A:0, RES:10, ECT: 80100410, BVID: 89, SPVID: 1093
+ U:0, M:0, A:0, RES:16, ECT: 04106e55, BVID: 0, SPVID: 1
+ U:0, M:0, A:0, RES:1, ECT: 080a8cf3, BVID: 2754, SPVID: 2854
+ U:1, M:0, A:0, RES:28, ECT: 0e2d0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:27, ECT: 01001201, BVID: 2104, SPVID: 899
+ U:1, M:0, A:0, RES:3, ECT: 83838383, BVID: 2104, SPVID: 899
+ U:0, M:1, A:0, RES:15, ECT: 00600641, BVID: 2300, SPVID: 3081
+ U:0, M:0, A:0, RES:0, ECT: 2590894f, BVID: 1680, SPVID: 2281
+ U:0, M:0, A:0, RES:18, ECT: 0025e489, BVID: 1264, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3711
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0c0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e640e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e80ff, BVID: 3760, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e000003, BVID: 3720, SPVID: 14
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 560e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3675
+ U:1, M:0, A:0, RES:0, ECT: acaa4016, BVID: 380, SPVID: 494
+ U:1, M:1, A:0, RES:14, ECT: 1560b70f, BVID: 2993, SPVID: 1575
+ U:0, M:1, A:0, RES:12, ECT: e2d5f35c, BVID: 3240, SPVID: 16
+ U:0, M:0, A:0, RES:4, ECT: 10059445, BVID: 256, SPVID: 1040
+ U:0, M:1, A:1, RES:14, ECT: 55000001, BVID: 16, SPVID: 2058
+ U:1, M:0, A:0, RES:12, ECT: f3ac2b26, BVID: 2499, SPVID: 2745
+ U:1, M:0, A:1, RES:5, ECT: 68735440, BVID: 1216, SPVID: 3072
+ U:1, M:1, A:1, RES:23, ECT: 020000f7, BVID: 32, SPVID: 0
+ U:1, M:0, A:0, RES:4, ECT: b59cbe8c, BVID: 4095, SPVID: 4095
+ U:0, M:0, A:0, RES:0, ECT: 40ff3e88, BVID: 3264, SPVID: 2320
+ U:0, M:0, A:0, RES:4, ECT: 10059400, BVID: 0, SPVID: 257
+ U:0, M:0, A:0, RES:8, ECT: 0a269c31, BVID: 2232, SPVID: 3315
+ U:1, M:0, A:1, RES:12, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:0, ECT: 040e0e0e, BVID: 224, SPVID: 3598
+ U:1, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0b0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 224, SPVID: 3598
+ U:0, M:0, A:0, RES:14, ECT: 0e0e0e0e, BVID: 3, SPVID: 3616
+ unknown TLV #213, length: 243
+ 0x0000: 5cca 8010 0410 0594 4510 0410 6e55 0000
+ 0x0010: 0101 080a 8cf3 ac2b 269c 0e2d 0e0e 0e0e
+ 0x0020: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0030: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0040: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0050: 0e0e 0e0e 0e0e 0e0e 0e1b 0100 1201 8383
+ 0x0060: 8383 8383 8383 8383 834f 0060 0641 8fcc
+ 0x0070: 0900 2590 894f 6908 e912 0025 e489 4f0e
+ 0x0080: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0090: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x00a0: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x00b0: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x00c0: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x00d0: 7f0e 0e0e 0e0e 0e0e 0e0e 0e0e 0c0e 0e0e
+ 0x00e0: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x00f0: 0e0e 0e
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ unknown TLV #100, length: 14
+ 0x0000: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ unknown TLV #96, length: 183
+ 0x0000: 0fbb 1627 4ce2 d5f3 5cca 8010 0410 0594
+ 0x0010: 4510 0410 6e55 0000 0101 080a 8cf3 ac2b
+ 0x0020: 269c 3ab9 a568 7354 404c 0c00 f702 0000
+ 0x0030: f702 0000 84b5 9cbe 8cff ffff 0040 ff3e
+ 0x0040: 88cc 0910 0410 0594 0000 0101 080a 269c
+ 0x0050: 318b 8cf3 ac0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0060: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0070: 0e0e 0e0e 0004 0e0e 0e0e 0e0e 8e0e 0e0e
+ 0x0080: 0e0e 0e0e 0e0b 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0090: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x00a0: 0e00 3e20 0a00 b60d 0000 2000 0000 84b5
+ 0x00b0: aee0 3083 8383 1b
+ Area address(es) TLV #1, length: 0
+ unknown TLV #18, length: 1
+ 0x0000: 83
+ Inter-Domain Information Type TLV #131, length: 131
+ Inter-Domain Information Type: Unknown (0x83)
+ 0x0000: 8383 8383 8383 834f 0060 0641 8fcc 0900
+ 0x0010: 2590 894f 6908 e912 0025 9089 4f69 0800
+ 0x0020: 4500 0034 9040 4001 4006 a516 cc09 370a
+ 0x0030: ccff ffff 7fbb da80 d5f3 5c05 1614 4a2d
+ 0x0040: 8010 0410 6e55 0000 0101 080a 8cf3 ac2b
+ 0x0050: 269c 30b9 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0060: 0e08 0e0e 0e0e 0e01 0e0e 0e0e 0e0e 110e
+ 0x0070: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0080: 0e0e
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ unknown TLV #172, length: 198
+ 0x0000: 2478 f620 70ac 2561 8ae3 3458 2d7a 4ea0
+ 0x0010: d056 a568 7354 180e 0e0e 0e0e 0e0e 0e0e
+ 0x0020: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0030: 0e0d f20e 0e0e 0e0e 0e0e 0e0e 0e04 0e0e
+ 0x0040: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0050: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0060: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0070: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e49 0e0e
+ 0x0080: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0d
+ 0x0090: f20e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x00a0: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x00b0: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x00c0: 0e0e 0e0e 0e0e
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3612
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 5
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3676
+ unknown TLV #92, length: 92
+ 0x0000: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0010: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0020: 5c44 4444 4444 4444 4444 4444 4444 4444
+ 0x0030: 44b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x0040: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x0050: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ unknown TLV #183, length: 183
+ 0x0000: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x0010: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x0020: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x0030: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x0040: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x0050: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x0060: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x0070: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x0080: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x0090: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x00a0: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x00b0: b7b7 b7b7 b7b7 b7
+ unknown TLV #183, length: 183
+ 0x0000: b7b7 b7b7 b7b7 b7b7 b7c0 b7b7 b7b7 b7b7
+ 0x0010: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x0020: b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7 b7b7
+ 0x0030: b7b7 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0040: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0050: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0060: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0070: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0080: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0090: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x00a0: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x00b0: 5c5c 5c5c 5c5c 5c
+ unknown TLV #92, length: 92
+ 0x0000: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0010: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0020: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0030: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0040: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0050: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ unknown TLV #92, length: 92
+ 0x0000: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0010: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0020: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0030: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0040: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0050: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ unknown TLV #92, length: 92
+ 0x0000: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0010: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0020: 5c5c 715c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0030: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0040: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0050: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ unknown TLV #92, length: 92
+ 0x0000: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0010: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0020: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0030: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0040: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0050: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ unknown TLV #92, length: 92
+ 0x0000: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0010: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0020: 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c 5c5c
+ 0x0030: 5c5c 5c5c 5c5c 5c5c 5c10 0594 4510 0410
+ 0x0040: 6e55 0000 0101 080a 8cf3 ac2b 269c 3ab9
+ 0x0050: a568 7354 404c 0c00 f702 0000
+ unknown TLV #247, length: 2
+ 0x0000: 0000
+ IPv4 Interface address(es) TLV #132, length: 181
+ IPv4 interface address: 156.190.140.255
+ IPv4 interface address: 255.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.14.14
+ IPv4 interface address: 14.14.28.14
+ IPv4 interface address: 28.14.21.14
+ IPv4 interface address: 14.14.14.130
+ IPv4 interface address: 89.186.4.171
+ IPv4 interface address: 23.3.1.0
+ IPv4 interface address: 32.144.252.48
+ IPv4 interface address: 165.128.255.255
+ IPv4 interface address: 255.246.232.117
+ IPv4 interface address: 154.157.104.136
+ IPv4 interface address: 118.103.188.123
+ IPv4 interface address: 181.119.205.109
+ IPv4 interface address: 60.22.90.116
+ IPv4 interface address: 80.127.192.14
+ IPv4 interface address: 156.165.230.105
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 61197
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 13
+ LSP Buffersize: 244
+ unknown TLV #255, length: 0
+ unknown TLV #64, length: 6
+ 0x0000: 3e88 cc09 3650
+ unknown TLV #204, length: 9
+ 0x0000: 370a da80 01bb 0404 04
+ unknown TLV #11, length: 4
+ 0x0000: 2104 0404
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ unknown TLV #234, length: 4
+ 0x0000: 0404 0404
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ unknown TLV #0, length: 0
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 5
+ unknown TLV #13, length: 178
+ 0x0000: c4e4 f9cb 0ce2 cd2e 175a 0bf3 b492 01fa
+ 0x0010: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0020: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0030: 3a3a 3a3a 3a3a 3a3a 3a3a 3a3a 3a3a 3a3a
+ 0x0040: 3a3a 3a0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e28
+ 0x0050: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0060: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0070: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0080: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0090: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x00a0: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x00b0: 0e0e
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ Partition DIS TLV #4, length: 4
+ unknown TLV #0, length: 13
+ 0x0000: b2c4 e4f9 cb0c e2cd 2e17 5a0b f3
+ unknown TLV #180, length: 146
+ 0x0000: 01fa 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0010: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0020: 0e0e 0e28 0e0e 0e0e 0e0e fb0d 0e0e 0e0e
+ 0x0030: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0040: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0050: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0060: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0070: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0080: 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e 0e0e
+ 0x0090: 0e0e
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ IPv4 Internal Reachability TLV #128, length: 0
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ LSP Buffersize TLV #14, length: 14
+ LSP Buffersize: 3598
+ unknown TLV #58, length: 58
+ 0x0000: 3a3a 3a3a 3a3a 3a3a 3a3a 3a3a 3a3a 3a3a
+ 0x0010: 3a3a 3a
+ packet exceeded snapshot (39) bytes
+EXIT CODE 00000100
--- /dev/null
+IP (tos 0x10, ttl 64, id 63177, offset 0, flags [none], proto unknown (240), length 168, bad cksum 418f (->80a5)!)
+ 204.9.54.80 > 204.9.51.132: ip-proto-240 148
+IP (tos 0x10, ttl 62, id 64806, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 3da6 (->35a6)!)
+ 212.9.51.132.50079 > 204.9.54.80.22: Flags [.], cksum 0x8611 (incorrect -> 0x4811), ack 1819218606, win 17918, options [nop,nop,TS val 941371903 ecr 1340592074], length 0
+84:b5:9c:be:30:48 Unknown SSAP 0x10 > 0c:c4:7a:08:e9:12 Unknown DSAP 0x44 Information, send seq 0, rcv seq 26, Flags [Command], length 52
+IP (tos 0x0, ttl 64, id 63178, offset 0, flags [DF], proto TCP (6), length 52)
+ 204.9.54.80.55936 > 204.9.55.10.443: Flags [.], cksum 0x0594 (incorrect -> 0x725a), ack 3589495407, win 1040, options [nop,nop,TS val 647770294 ecr 2364779354], length 0
+IP (tos 0x0, ttl 64, id 36752, offset 0, flags [DF], proto TCP (6), length 399, bad cksum a46b (->a474)!)
+ 204.0.55.10.323 > 204.9.54.80.55936: Flags [P.], cksum 0xc9b6 (incorrect -> 0xcd5f), seq 3589495407:3589495754, ack 370436242, win 1040, options [nop,nop,TS val 2364757411 ecr 3084508609], length 347|trunc|trunc|trunc
+ [|RPKI-RTR]
+IP (tos 0x10, ttl 62, id 64806, offset 0, flags [DF], proto TCP (6), length 52)
+ 204.9.51.132.50079 > 204.9.54.80.22: Flags [.], cksum 0x8611 (incorrect -> 0xa678), ack 1819218606, win 4094, options [nop,nop,TS val 941371775 ecr 4294967242], length 0
+IP (tos 0x10, ttl 62, id 62920, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 4504 (->451a)!)
+ 204.9.51.132.50079 > 204.243.53.80.22: Flags [.], cksum 0x858b (incorrect -> 0x85a1), ack 1819218722, win 4092, options [nop,nop,TS val 941371913 ecr 1340592084], length 0
+IP (tos 0x0, ttl 64, id 63178, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 3e8c (->438c)!)
+ 204.9.64.80.55936 > 204.9.40.10.443: Flags [.], cksum 0x0594 (incorrect -> 0x8d67), ack 3587398274, win 1040, options [nop,nop,TS val 647770294 ecr 2364773722], length 0
+IP (tos 0x0, ttl 64, id 36752, offset 0, flags [DF], proto TCP (6), length 399, bad cksum a46b (->a474)!)
+ 204.0.55.10.323 > 204.9.54.80.55936: Flags [P.], cksum 0xc9b6 (incorrect -> 0xfa86), seq 0:347, ack 4294959105, win 1040, options [nop,nop,TS val 2364757411 ecr 3084508609], length 347|trunc|trunc|trunc
+IP truncated-ip - 768 bytes missing! (tos 0x10, ttl 62, id 64806, offset 0, flags [DF], proto TCP (6), length 820, bad cksum 3da6 (->3aa6)!)
+ 204.9.51.132.50079 > 204.9.54.80.22: Flags [.], seq 0:768, ack 1, win 4094, options [nop,nop,TS val 941371775 ecr 4294967242], length 768
+IP (tos 0x6,ECT(0), ttl 62, id 62920, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 4504 (->4524)!)
+ 204.9.51.132.50079 > 204.243.53.80.22: Flags [.], cksum 0x858b (incorrect -> 0x85a1), ack 1, win 4092, options [nop,nop,TS val 941371913 ecr 1340592084], length 0
+IP (tos 0x0, ttl 64, id 63178, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 3e8c (->438c)!)
+ 204.9.64.80.55936 > 204.9.40.10.443: Flags [.], cksum 0x0594 (incorrect -> 0x8d67), ack 1, win 1040, options [nop,nop,TS val 647770294 ecr 2364773722], length 0
+IP (tos 0x0, ttl 64, id 36752, offset 0, flags [DF], proto TCP (6), length 399, bad cksum a46b (->a474)!)
+ 204.0.55.10.323 > 204.9.54.80.55936: Flags [P.], cksum 0xc9b6 (incorrect -> 0x4ba9), seq 0:347, ack 4294959105, win 1040, options [nop,nop,TS val 2364757411 ecr 3084508609], length 347|trunc|trunc|trunc
+ [|RPKI-RTR]
+EXIT CODE 00000100
--- /dev/null
+CFMv0 unknown (204), MD Level 0, length 168
+ First TLV offset 52
+ 0x0000: a300 0000 0080 0000 0000 0000 0000 0000
+ 0x0010: 0000 00aa 6873 54d7 060b 003c 0000 003c
+ 0x0020: d4c3 b2a1 0200 1a00 000b 003c 0000 003c
+ 0x0030: d4c3 b2a1 0200 1a00 0000 0000 3620 0a00
+ 0x0040: b600 0000 b600 0000 40b5 9cbe 3048 0cc4
+ 0x0050: ad37 1005 ffff 05cc 0934 9300 0000 0080
+ 0x0060: fffa 0000 0000 3200 0000 0000 00aa 6873
+ Port status TLV (0x02), length 26, Status: Unknown (0)
+ Unknown TLV (0x37), length 4101
+ 0x0000: 3710 05ff ff05 cc09 3493 0000 0000 80ff
+ 0x0010: fa00 0000 0032 0000 0000 0000 aa68 7354
+ 0x0020: d706 0b00 3c00 0000 3c00 0000 0080 0000
+ 0x0030: fffd 4d5f d9bd c709 30ac 8176 b36d cc11
+ 0x0040: 3abf 1291 f106 4ede 61f4 6297 afc4 39a4
+ 0x0050: 0db9 7a
+IP (tos 0x10, ttl 62, id 64806, offset 0, flags [DF], proto TCP (6), length 52)
+ 204.9.51.132.50079 > 204.9.54.80.22: Flags [.], cksum 0x8611 (incorrect -> 0xa678), ack 1819218606, win 4094, options [nop,nop,TS val 941371775 ecr 4294967242], length 0
+IP (tos 0x10, ttl 62, id 62920, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 4504 (->451a)!)
+ 204.9.51.132.50079 > 204.243.53.80.22: Flags [.], cksum 0x858b (incorrect -> 0x85a1), ack 1819218722, win 4092, options [nop,nop,TS val 941371913 ecr 1340592084], length 0
+IP (tos 0x0, ttl 64, id 63178, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 3e8c (->438c)!)
+ 204.9.64.80.55936 > 204.9.40.10.443: Flags [.], cksum 0x0594 (incorrect -> 0x7767), ack 3587398274, win 1040, options [nop,nop,TS val 647770294 ecr 2364779354], length 0
+IP (tos 0x0, ttl 64, id 36752, offset 0, flags [DF], proto TCP (6), length 399, bad cksum a46b (->a474)!)
+ 204.0.55.10.323 > 204.9.54.80.55936: Flags [P.], cksum 0xc9b6 (incorrect -> 0xed9b), seq 3589495407:3589495754, ack 370428050, win 1040, options [nop,nop,TS val 2364757411 ecr 3084508609], length 347|trunc|trunc
+ [|RPKI-RTR]
+EXIT CODE 00000100
--- /dev/null
+00:13:c4:12:0f:0d > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Expired]
+ Partner Information TLV (0x02), length 20
+ System 00:0e:83:16:f5:00, System Priority 32768, Key 13, Port 25, Port Priority 32768
+ State Flags [Timeout, Aggregation, Collecting, Distributing]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:13:c4:12:0f:0d > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Expired]
+ Partner Information TLV (0x02), length 20
+ System 00:0e:83:16:f5:00, System Priority 32768, Key 13, Port 25, Port Priority 32768
+ State Flags [Timeout, Aggregation, Collecting, Distributing]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:13:c4:12:0f:0d > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Expired]
+ Partner Information TLV (0x02), length 20
+ System 00:0e:83:16:f5:00, System Priority 32768, Key 13, Port 25, Port Priority 32768
+ State Flags [Timeout, Aggregation, Collecting, Distributing]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:13:c4:12:0f:0d > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Synchronization, Default]
+ Partner Information TLV (0x02), length 20
+ System 00:00:00:00:00:00, System Priority 0, Key 0, Port 0, Port Priority 0
+ State Flags [none]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:13:c4:12:0f:0d > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Synchronization, Collecting, Distributing, Default]
+ Partner Information TLV (0x02), length 20
+ System 00:00:00:00:00:00, System Priority 0, Key 0, Port 0, Port Priority 0
+ State Flags [none]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:13:c4:12:0f:0d > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Synchronization, Collecting, Distributing, Default]
+ Partner Information TLV (0x02), length 20
+ System 00:00:00:00:00:00, System Priority 0, Key 0, Port 0, Port Priority 0
+ State Flags [none]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:13:c4:12:0f:0d > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Synchronization, Collecting, Distributing, Default]
+ Partner Information TLV (0x02), length 20
+ System 00:00:00:00:00:00, System Priority 0, Key 0, Port 0, Port Priority 0
+ State Flags [none]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:13:c4:12:0f:0d > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Synchronization, Collecting, Distributing, Default]
+ Partner Information TLV (0x02), length 20
+ System 00:00:00:00:00:00, System Priority 0, Key 0, Port 0, Port Priority 0
+ State Flags [none]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:0e:83:16:f5:10 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:0e:83:16:f5:00, System Priority 32768, Key 13, Port 25, Port Priority 32768
+ State Flags [Aggregation, Synchronization]
+ Partner Information TLV (0x02), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Collecting, Distributing, Default]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:13:c4:12:0f:0d > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Synchronization, Default]
+ Partner Information TLV (0x02), length 20
+ System 00:00:00:00:00:00, System Priority 0, Key 0, Port 0, Port Priority 0
+ State Flags [none]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:13:c4:12:0f:0d > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Default]
+ Partner Information TLV (0x02), length 20
+ System 00:00:00:00:00:00, System Priority 0, Key 0, Port 0, Port Priority 0
+ State Flags [none]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:0e:83:16:f5:10 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:0e:83:16:f5:00, System Priority 32768, Key 13, Port 25, Port Priority 32768
+ State Flags [Aggregation]
+ Partner Information TLV (0x02), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Collecting, Distributing, Default]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:0e:83:16:f5:10 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:0e:83:16:f5:00, System Priority 32768, Key 13, Port 25, Port Priority 32768
+ State Flags [Aggregation]
+ Partner Information TLV (0x02), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Collecting, Distributing, Default]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:0e:83:16:f5:10 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:0e:83:16:f5:00, System Priority 32768, Key 13, Port 25, Port Priority 32768
+ State Flags [Aggregation]
+ Partner Information TLV (0x02), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Default]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:0e:83:16:f5:10 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:0e:83:16:f5:00, System Priority 32768, Key 13, Port 25, Port Priority 32768
+ State Flags [Aggregation, Synchronization]
+ Partner Information TLV (0x02), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Default]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:13:c4:12:0f:0d > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Synchronization]
+ Partner Information TLV (0x02), length 20
+ System 00:0e:83:16:f5:00, System Priority 32768, Key 13, Port 25, Port Priority 32768
+ State Flags [Aggregation, Synchronization]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:13:c4:12:0f:0d > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Synchronization, Collecting, Distributing]
+ Partner Information TLV (0x02), length 20
+ System 00:0e:83:16:f5:00, System Priority 32768, Key 13, Port 25, Port Priority 32768
+ State Flags [Aggregation, Synchronization]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:0e:83:16:f5:10 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:0e:83:16:f5:00, System Priority 32768, Key 13, Port 25, Port Priority 32768
+ State Flags [Aggregation, Synchronization, Collecting, Distributing]
+ Partner Information TLV (0x02), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Synchronization]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:0e:83:16:f5:10 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:0e:83:16:f5:00, System Priority 32768, Key 13, Port 25, Port Priority 32768
+ State Flags [Aggregation, Synchronization, Collecting, Distributing]
+ Partner Information TLV (0x02), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Synchronization, Collecting, Distributing]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
+00:13:c4:12:0f:0d > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
+ Actor Information TLV (0x01), length 20
+ System 00:13:c4:12:0f:00, System Priority 32768, Key 13, Port 22, Port Priority 32768
+ State Flags [Activity, Aggregation, Synchronization, Collecting, Distributing]
+ Partner Information TLV (0x02), length 20
+ System 00:0e:83:16:f5:00, System Priority 32768, Key 13, Port 25, Port Priority 32768
+ State Flags [Aggregation, Synchronization, Collecting, Distributing]
+ Collector Information TLV (0x03), length 16
+ Max Delay 32768
+ Terminator TLV (0x00), length 0
--- /dev/null
+IP 45.116.197.72.45307 > 192.168.1.1.646:
+IP 90.6.30.91.34115 > 192.168.1.1.646:
+IP 146.203.190.45.13504 > 192.168.1.1.646:
+IP 67.199.76.127.18327 > 192.168.1.1.646:
+IP 13.213.243.81.57100 > 192.168.1.1.646:
--- /dev/null
+00:18:ba:98:68:8f > 01:00:0c:cc:cc:cc, 802.3, length 388: LLC, dsap SNAP (0xaa) Individual, ssap SNAP (0xaa) Command, ctrl 0x03: oui Cisco (0x00000c), pid CDP (0x2000): CDPv2, ttl: 180s, checksum: 0x0bea (unverified), length 366
+ Device-ID (0x01), value length: 2 bytes: 'S1'
+ Version String (0x05), value length: 190 bytes:
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(44)SE, RELEASE SOFTWARE (fc1)
+ Copyright (c) 1986-2008 by Cisco Systems, Inc.
+ Compiled Sat 05-Jan-08 00:15 by weiliu
+ Platform (0x06), value length: 19 bytes: 'cisco WS-C3560-24TS'
+ Address (0x02), value length: 13 bytes: IPv4 (1) 0.0.0.0
+ Port-ID (0x03), value length: 16 bytes: 'FastEthernet0/13'
+ Capability (0x04), value length: 4 bytes: (0x00000028): L2 Switch, IGMP snooping
+ Protocol-Hello option (0x08), value length: 32 bytes:
+ VTP Management Domain (0x09), value length: 0 bytes: ''
+ Native VLAN ID (0x0a), value length: 2 bytes: 1
+ Duplex (0x0b), value length: 1 byte: full
+ AVVID trust bitmap (0x12), value length: 1 byte: 0x00
+ AVVID untrusted ports CoS (0x13), value length: 1 byte: 0x00
+ Management Addresses (0x16), value length: 13 bytes: IPv4 (1) 0.0.0.0
+ unknown field type (0x1a), value length: 12 bytes:
+ 0x0000: 0000 0001 0000 0000 ffff ffff
+00:19:2f:a7:b2:8d > 01:00:0c:cc:cc:cc, 802.3, length 392: LLC, dsap SNAP (0xaa) Individual, ssap SNAP (0xaa) Command, ctrl 0x03: oui Cisco (0x00000c), pid CDP (0x2000): CDPv2, ttl: 180s, checksum: 0x971d (unverified), length 370
+ Device-ID (0x01), value length: 2 bytes: 'S2'
+ Version String (0x05), value length: 190 bytes:
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(44)SE, RELEASE SOFTWARE (fc1)
+ Copyright (c) 1986-2008 by Cisco Systems, Inc.
+ Compiled Sat 05-Jan-08 00:15 by weiliu
+ Platform (0x06), value length: 20 bytes: 'cisco WS-C3560G-24PS'
+ Address (0x02), value length: 13 bytes: IPv4 (1) 0.0.0.0
+ Port-ID (0x03), value length: 19 bytes: 'GigabitEthernet0/13'
+ Capability (0x04), value length: 4 bytes: (0x00000028): L2 Switch, IGMP snooping
+ Protocol-Hello option (0x08), value length: 32 bytes:
+ VTP Management Domain (0x09), value length: 0 bytes: ''
+ Native VLAN ID (0x0a), value length: 2 bytes: 1
+ Duplex (0x0b), value length: 1 byte: full
+ AVVID trust bitmap (0x12), value length: 1 byte: 0x00
+ AVVID untrusted ports CoS (0x13), value length: 1 byte: 0x00
+ Management Addresses (0x16), value length: 13 bytes: IPv4 (1) 0.0.0.0
+ unknown field type (0x1a), value length: 12 bytes:
+ 0x0000: 0000 0001 0000 0000 ffff ffff
+00:19:2f:a7:b2:8d > 01:80:c2:00:00:0e, ethertype LLDP (0x88cc), length 296: LLDP, length 282
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 00:19:2f:a7:b2:8d
+ Port ID TLV (2), length 13
+ Subtype Interface alias (1): Uplink to S1
+ Time to Live TLV (3), length 2: TTL 120s
+ System Name TLV (5), length 12: S2.cisco.com
+ System Description TLV (6), length 190
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(44)SE, RELEASE SOFTWARE (fc1)\0x0aCopyright (c) 1986-2008 by Cisco Systems, Inc.\0x0aCompiled Sat 05-Jan-08 00:15 by weiliu
+ Port Description TLV (4), length 19: GigabitEthernet0/13
+ System Capabilities TLV (7), length 4
+ System Capabilities [Bridge, Router] (0x0014)
+ Enabled Capabilities [Bridge] (0x0004)
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ Organization specific TLV (127), length 9: OUI IEEE 802.3 Private (0x00120f)
+ MAC/PHY configuration/status Subtype (1)
+ autonegotiation [supported, enabled] (0x03)
+ PMD autoneg capability [10BASE-T hdx, Sym PAUSE for fdx, Asym and Sym PAUSE for fdx, 1000BASE-{X LX SX CX} fdx, 1000BASE-T hdx] (0xc036)
+ MAU type 100BASETX fdx (0x0010)
+ End TLV (0), length 0
+00:18:ba:98:68:8f > 01:80:c2:00:00:0e, ethertype LLDP (0x88cc), length 287: LLDP, length 273
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 00:18:ba:98:68:8f
+ Port ID TLV (2), length 7
+ Subtype Local (7): Fa0/13
+ Time to Live TLV (3), length 2: TTL 120s
+ System Name TLV (5), length 12: S1.cisco.com
+ System Description TLV (6), length 190
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(44)SE, RELEASE SOFTWARE (fc1)\0x0aCopyright (c) 1986-2008 by Cisco Systems, Inc.\0x0aCompiled Sat 05-Jan-08 00:15 by weiliu
+ Port Description TLV (4), length 16: FastEthernet0/13
+ System Capabilities TLV (7), length 4
+ System Capabilities [Bridge, Router] (0x0014)
+ Enabled Capabilities [Bridge] (0x0004)
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ Organization specific TLV (127), length 9: OUI IEEE 802.3 Private (0x00120f)
+ MAC/PHY configuration/status Subtype (1)
+ autonegotiation [supported, enabled] (0x03)
+ PMD autoneg capability [Sym PAUSE for fdx, Asym and Sym PAUSE for fdx, 1000BASE-{X LX SX CX} fdx, 1000BASE-T hdx] (0x0036)
+ MAU type 100BASETX fdx (0x0010)
+ End TLV (0), length 0
+00:19:2f:a7:b2:8d > 01:80:c2:00:00:0e, ethertype LLDP (0x88cc), length 296: LLDP, length 282
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 00:19:2f:a7:b2:8d
+ Port ID TLV (2), length 13
+ Subtype Interface alias (1): Uplink to S1
+ Time to Live TLV (3), length 2: TTL 120s
+ System Name TLV (5), length 12: S2.cisco.com
+ System Description TLV (6), length 190
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(44)SE, RELEASE SOFTWARE (fc1)\0x0aCopyright (c) 1986-2008 by Cisco Systems, Inc.\0x0aCompiled Sat 05-Jan-08 00:15 by weiliu
+ Port Description TLV (4), length 19: GigabitEthernet0/13
+ System Capabilities TLV (7), length 4
+ System Capabilities [Bridge, Router] (0x0014)
+ Enabled Capabilities [Bridge] (0x0004)
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ Organization specific TLV (127), length 9: OUI IEEE 802.3 Private (0x00120f)
+ MAC/PHY configuration/status Subtype (1)
+ autonegotiation [supported, enabled] (0x03)
+ PMD autoneg capability [10BASE-T hdx, Sym PAUSE for fdx, Asym and Sym PAUSE for fdx, 1000BASE-{X LX SX CX} fdx, 1000BASE-T hdx] (0xc036)
+ MAU type 100BASETX fdx (0x0010)
+ End TLV (0), length 0
+00:18:ba:98:68:8f > 01:80:c2:00:00:0e, ethertype LLDP (0x88cc), length 287: LLDP, length 273
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 00:18:ba:98:68:8f
+ Port ID TLV (2), length 7
+ Subtype Local (7): Fa0/13
+ Time to Live TLV (3), length 2: TTL 120s
+ System Name TLV (5), length 12: S1.cisco.com
+ System Description TLV (6), length 190
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(44)SE, RELEASE SOFTWARE (fc1)\0x0aCopyright (c) 1986-2008 by Cisco Systems, Inc.\0x0aCompiled Sat 05-Jan-08 00:15 by weiliu
+ Port Description TLV (4), length 16: FastEthernet0/13
+ System Capabilities TLV (7), length 4
+ System Capabilities [Bridge, Router] (0x0014)
+ Enabled Capabilities [Bridge] (0x0004)
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ Organization specific TLV (127), length 9: OUI IEEE 802.3 Private (0x00120f)
+ MAC/PHY configuration/status Subtype (1)
+ autonegotiation [supported, enabled] (0x03)
+ PMD autoneg capability [Sym PAUSE for fdx, Asym and Sym PAUSE for fdx, 1000BASE-{X LX SX CX} fdx, 1000BASE-T hdx] (0x0036)
+ MAU type 100BASETX fdx (0x0010)
+ End TLV (0), length 0
+00:18:ba:98:68:8f > 01:00:0c:cc:cc:cc, 802.3, length 388: LLC, dsap SNAP (0xaa) Individual, ssap SNAP (0xaa) Command, ctrl 0x03: oui Cisco (0x00000c), pid CDP (0x2000): CDPv2, ttl: 180s, checksum: 0x0be9 (unverified), length 366
+ Device-ID (0x01), value length: 2 bytes: 'S1'
+ Version String (0x05), value length: 190 bytes:
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(44)SE, RELEASE SOFTWARE (fc1)
+ Copyright (c) 1986-2008 by Cisco Systems, Inc.
+ Compiled Sat 05-Jan-08 00:15 by weiliu
+ Platform (0x06), value length: 19 bytes: 'cisco WS-C3560-24TS'
+ Address (0x02), value length: 13 bytes: IPv4 (1) 0.0.0.0
+ Port-ID (0x03), value length: 16 bytes: 'FastEthernet0/13'
+ Capability (0x04), value length: 4 bytes: (0x00000028): L2 Switch, IGMP snooping
+ Protocol-Hello option (0x08), value length: 32 bytes:
+ VTP Management Domain (0x09), value length: 0 bytes: ''
+ Native VLAN ID (0x0a), value length: 2 bytes: 1
+ Duplex (0x0b), value length: 1 byte: full
+ AVVID trust bitmap (0x12), value length: 1 byte: 0x00
+ AVVID untrusted ports CoS (0x13), value length: 1 byte: 0x00
+ Management Addresses (0x16), value length: 13 bytes: IPv4 (1) 0.0.0.0
+ unknown field type (0x1a), value length: 12 bytes:
+ 0x0000: 0000 0001 0000 0000 ffff ffff
+00:19:2f:a7:b2:8d > 01:00:0c:cc:cc:cc, 802.3, length 392: LLC, dsap SNAP (0xaa) Individual, ssap SNAP (0xaa) Command, ctrl 0x03: oui Cisco (0x00000c), pid CDP (0x2000): CDPv2, ttl: 180s, checksum: 0x971c (unverified), length 370
+ Device-ID (0x01), value length: 2 bytes: 'S2'
+ Version String (0x05), value length: 190 bytes:
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(44)SE, RELEASE SOFTWARE (fc1)
+ Copyright (c) 1986-2008 by Cisco Systems, Inc.
+ Compiled Sat 05-Jan-08 00:15 by weiliu
+ Platform (0x06), value length: 20 bytes: 'cisco WS-C3560G-24PS'
+ Address (0x02), value length: 13 bytes: IPv4 (1) 0.0.0.0
+ Port-ID (0x03), value length: 19 bytes: 'GigabitEthernet0/13'
+ Capability (0x04), value length: 4 bytes: (0x00000028): L2 Switch, IGMP snooping
+ Protocol-Hello option (0x08), value length: 32 bytes:
+ VTP Management Domain (0x09), value length: 0 bytes: ''
+ Native VLAN ID (0x0a), value length: 2 bytes: 1
+ Duplex (0x0b), value length: 1 byte: full
+ AVVID trust bitmap (0x12), value length: 1 byte: 0x00
+ AVVID untrusted ports CoS (0x13), value length: 1 byte: 0x00
+ Management Addresses (0x16), value length: 13 bytes: IPv4 (1) 0.0.0.0
+ unknown field type (0x1a), value length: 12 bytes:
+ 0x0000: 0000 0001 0000 0000 ffff ffff
+00:19:2f:a7:b2:8d > 01:80:c2:00:00:0e, ethertype LLDP (0x88cc), length 296: LLDP, length 282
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 00:19:2f:a7:b2:8d
+ Port ID TLV (2), length 13
+ Subtype Interface alias (1): Uplink to S1
+ Time to Live TLV (3), length 2: TTL 120s
+ System Name TLV (5), length 12: S2.cisco.com
+ System Description TLV (6), length 190
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(44)SE, RELEASE SOFTWARE (fc1)\0x0aCopyright (c) 1986-2008 by Cisco Systems, Inc.\0x0aCompiled Sat 05-Jan-08 00:15 by weiliu
+ Port Description TLV (4), length 19: GigabitEthernet0/13
+ System Capabilities TLV (7), length 4
+ System Capabilities [Bridge, Router] (0x0014)
+ Enabled Capabilities [Bridge] (0x0004)
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ Organization specific TLV (127), length 9: OUI IEEE 802.3 Private (0x00120f)
+ MAC/PHY configuration/status Subtype (1)
+ autonegotiation [supported, enabled] (0x03)
+ PMD autoneg capability [10BASE-T hdx, Sym PAUSE for fdx, Asym and Sym PAUSE for fdx, 1000BASE-{X LX SX CX} fdx, 1000BASE-T hdx] (0xc036)
+ MAU type 100BASETX fdx (0x0010)
+ End TLV (0), length 0
+00:18:ba:98:68:8f > 01:80:c2:00:00:0e, ethertype LLDP (0x88cc), length 287: LLDP, length 273
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 00:18:ba:98:68:8f
+ Port ID TLV (2), length 7
+ Subtype Local (7): Fa0/13
+ Time to Live TLV (3), length 2: TTL 120s
+ System Name TLV (5), length 12: S1.cisco.com
+ System Description TLV (6), length 190
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(44)SE, RELEASE SOFTWARE (fc1)\0x0aCopyright (c) 1986-2008 by Cisco Systems, Inc.\0x0aCompiled Sat 05-Jan-08 00:15 by weiliu
+ Port Description TLV (4), length 16: FastEthernet0/13
+ System Capabilities TLV (7), length 4
+ System Capabilities [Bridge, Router] (0x0014)
+ Enabled Capabilities [Bridge] (0x0004)
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ Organization specific TLV (127), length 9: OUI IEEE 802.3 Private (0x00120f)
+ MAC/PHY configuration/status Subtype (1)
+ autonegotiation [supported, enabled] (0x03)
+ PMD autoneg capability [Sym PAUSE for fdx, Asym and Sym PAUSE for fdx, 1000BASE-{X LX SX CX} fdx, 1000BASE-T hdx] (0x0036)
+ MAU type 100BASETX fdx (0x0010)
+ End TLV (0), length 0
+00:19:2f:a7:b2:8d > 01:80:c2:00:00:0e, ethertype LLDP (0x88cc), length 296: LLDP, length 282
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 00:19:2f:a7:b2:8d
+ Port ID TLV (2), length 13
+ Subtype Interface alias (1): Uplink to S1
+ Time to Live TLV (3), length 2: TTL 120s
+ System Name TLV (5), length 12: S2.cisco.com
+ System Description TLV (6), length 190
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(44)SE, RELEASE SOFTWARE (fc1)\0x0aCopyright (c) 1986-2008 by Cisco Systems, Inc.\0x0aCompiled Sat 05-Jan-08 00:15 by weiliu
+ Port Description TLV (4), length 19: GigabitEthernet0/13
+ System Capabilities TLV (7), length 4
+ System Capabilities [Bridge, Router] (0x0014)
+ Enabled Capabilities [Bridge] (0x0004)
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ Organization specific TLV (127), length 9: OUI IEEE 802.3 Private (0x00120f)
+ MAC/PHY configuration/status Subtype (1)
+ autonegotiation [supported, enabled] (0x03)
+ PMD autoneg capability [10BASE-T hdx, Sym PAUSE for fdx, Asym and Sym PAUSE for fdx, 1000BASE-{X LX SX CX} fdx, 1000BASE-T hdx] (0xc036)
+ MAU type 100BASETX fdx (0x0010)
+ End TLV (0), length 0
+00:18:ba:98:68:8f > 01:80:c2:00:00:0e, ethertype LLDP (0x88cc), length 287: LLDP, length 273
+ Chassis ID TLV (1), length 7
+ Subtype MAC address (4): 00:18:ba:98:68:8f
+ Port ID TLV (2), length 7
+ Subtype Local (7): Fa0/13
+ Time to Live TLV (3), length 2: TTL 120s
+ System Name TLV (5), length 12: S1.cisco.com
+ System Description TLV (6), length 190
+ Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(44)SE, RELEASE SOFTWARE (fc1)\0x0aCopyright (c) 1986-2008 by Cisco Systems, Inc.\0x0aCompiled Sat 05-Jan-08 00:15 by weiliu
+ Port Description TLV (4), length 16: FastEthernet0/13
+ System Capabilities TLV (7), length 4
+ System Capabilities [Bridge, Router] (0x0014)
+ Enabled Capabilities [Bridge] (0x0004)
+ Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
+ Port VLAN Id Subtype (1)
+ port vlan id (PVID): 1
+ Organization specific TLV (127), length 9: OUI IEEE 802.3 Private (0x00120f)
+ MAC/PHY configuration/status Subtype (1)
+ autonegotiation [supported, enabled] (0x03)
+ PMD autoneg capability [Sym PAUSE for fdx, Asym and Sym PAUSE for fdx, 1000BASE-{X LX SX CX} fdx, 1000BASE-T hdx] (0x0036)
+ MAU type 100BASETX fdx (0x0010)
+ End TLV (0), length 0
--- /dev/null
+IP (tos 0x0, ttl 1, id 44530, offset 0, flags [none], proto UDP (17), length 84)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Begin Verify, Flags: [none], length: 56
+ Link ID Object (3), Class-Type: IPv4 Local (1) Flags: [non-negotiable], length: 8
+ IPv4 Link ID: 1.0.0.0 (0x01000000)
+ Message ID Object (5), Class-Type: 1 (1) Flags: [non-negotiable], length: 8
+ Message ID: 3 (0x00000003)
+ Link ID Object (3), Class-Type: IPv4 Remote (2) Flags: [non-negotiable], length: 8
+ IPv4 Link ID: 1.0.0.0 (0x01000000)
+ Verify Begin Object (8), Class-Type: 1 (1) Flags: [negotiable], length: 24
+ Flags: none
+ Verify Interval: 20
+ Data links: 30
+ Encoding type: Lambda (photonic)
+ Verify Transport Mechanism: 32768 (0x8000)
+ Transmission Rate: 0.001 Mbps
+ Wavelength: 8
+IP (tos 0x0, ttl 1, id 44531, offset 0, flags [none], proto UDP (17), length 56)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Hello, Flags: [none], length: 28
+ Control Channel ID Object (1), Class-Type: Local (1) Flags: [non-negotiable], length: 8
+ Control Channel ID: 1 (0x00000001)
+ Hello Object (7), Class-Type: 1 (1) Flags: [non-negotiable], length: 12
+ Tx Seq: 50, Rx Seq: 60
+IP (tos 0x0, ttl 1, id 44532, offset 0, flags [none], proto UDP (17), length 84)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Config NACK, Flags: [none], length: 56
+ Control Channel ID Object (1), Class-Type: Local (1) Flags: [non-negotiable], length: 8
+ Control Channel ID: 1 (0x00000001)
+ Node ID Object (2), Class-Type: Local (1) Flags: [non-negotiable], length: 8
+ Node ID: 10.0.50.1 (0x0a003201)
+ Control Channel ID Object (1), Class-Type: Remote (2) Flags: [non-negotiable], length: 8
+ Control Channel ID: 2 (0x00000002)
+ Message ID Object (5), Class-Type: 2 (2) Flags: [non-negotiable], length: 8
+ Message ID Ack: 3 (0x00000003)
+ Node ID Object (2), Class-Type: Remote (2) Flags: [non-negotiable], length: 8
+ Node ID: 10.0.50.2 (0x0a003202)
+ Configuration Object (6), Class-Type: 1 (1) Flags: [negotiable], length: 8
+ Hello Interval: 5
+ Hello Dead Interval: 15
+IP (tos 0x0, ttl 1, id 44533, offset 0, flags [none], proto UDP (17), length 76)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Config ACK, Flags: [none], length: 48
+ Control Channel ID Object (1), Class-Type: Local (1) Flags: [non-negotiable], length: 8
+ Control Channel ID: 1 (0x00000001)
+ Node ID Object (2), Class-Type: Local (1) Flags: [non-negotiable], length: 8
+ Node ID: 10.0.50.1 (0x0a003201)
+ Control Channel ID Object (1), Class-Type: Remote (2) Flags: [non-negotiable], length: 8
+ Control Channel ID: 2 (0x00000002)
+ Message ID Object (5), Class-Type: 2 (2) Flags: [non-negotiable], length: 8
+ Message ID Ack: 3 (0x00000003)
+ Node ID Object (2), Class-Type: Remote (2) Flags: [non-negotiable], length: 8
+ Node ID: 10.0.50.2 (0x0a003202)
+IP (tos 0x0, ttl 1, id 44534, offset 0, flags [none], proto UDP (17), length 68)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Config, Flags: [none], length: 40
+ Control Channel ID Object (1), Class-Type: Local (1) Flags: [non-negotiable], length: 8
+ Control Channel ID: 1 (0x00000001)
+ Message ID Object (5), Class-Type: 1 (1) Flags: [non-negotiable], length: 8
+ Message ID: 3 (0x00000003)
+ Node ID Object (2), Class-Type: Local (1) Flags: [non-negotiable], length: 8
+ Node ID: 10.0.50.1 (0x0a003201)
+ Configuration Object (6), Class-Type: 1 (1) Flags: [negotiable], length: 8
+ Hello Interval: 5
+ Hello Dead Interval: 15
+IP (tos 0x0, ttl 1, id 44535, offset 0, flags [none], proto UDP (17), length 44)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Link Summary ACK, Flags: [none], length: 16
+ Message ID Object (5), Class-Type: 2 (2) Flags: [non-negotiable], length: 8
+ Message ID Ack: 1 (0x00000001)
+IP (tos 0x0, ttl 1, id 44536, offset 0, flags [none], proto UDP (17), length 124)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Link Summary NACK, Flags: [none], length: 96
+ Message ID Object (5), Class-Type: 2 (2) Flags: [non-negotiable], length: 8
+ Message ID Ack: 1 (0x00000001)
+ Error Code Object (20), Class-Type: 2 (2) Flags: [non-negotiable], length: 8
+ Error Code: Unacceptable non-negotiable LINK-SUMMARY parameters, Renegotiate LINK-SUMMARY parameters, Invalid DATA-LINK Object, Unknown TE-LINK Object c-type, Unknown DATA-LINK Object c-type
+ Data Link Object (12), Class-Type: IPv4 (1) Flags: [non-negotiable], length: 36
+ Flags: [none]
+ Local Interface ID: 192.168.1.1 (0xc0a80101)
+ Remote Interface ID: 192.168.1.2 (0xc0a80102)
+ Subobject, Type: Interface Switching Type (1), Length: 12
+ Switching Type: Lambda-Switch Capable (150)
+ Encoding Type: Lambda (photonic) (8)
+ Min Reservable Bandwidth: 0.001 Mbps
+ Max Reservable Bandwidth: 0.001 Mbps
+ Subobject, Type: Wavelength (2), Length: 8
+ Wavelength: 6
+ Data Link Object (12), Class-Type: IPv4 (1) Flags: [non-negotiable], length: 36
+ Flags: [none]
+ Local Interface ID: 10.1.1.1 (0x0a010101)
+ Remote Interface ID: 10.1.1.2 (0x0a010102)
+ Subobject, Type: Interface Switching Type (1), Length: 12
+ Switching Type: Lambda-Switch Capable (150)
+ Encoding Type: ANSI/ETSI PDH (3)
+ Min Reservable Bandwidth: 9877.895 Mbps
+ Max Reservable Bandwidth: 10325.547 Mbps
+ Subobject, Type: Wavelength (2), Length: 8
+ Wavelength: 353
+IP (tos 0x0, ttl 1, id 44537, offset 0, flags [none], proto UDP (17), length 68)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Begin Verify ACK, Flags: [none], length: 40
+ Link ID Object (3), Class-Type: IPv4 Local (1) Flags: [non-negotiable], length: 8
+ IPv4 Link ID: 1.0.0.0 (0x01000000)
+ Message ID Object (5), Class-Type: 2 (2) Flags: [non-negotiable], length: 8
+ Message ID Ack: 1 (0x00000001)
+ Verify Begin ACK Object (9), Class-Type: 1 (1) Flags: [negotiable], length: 8
+ Verify Dead Interval: 50
+ Verify Transport Response: 100
+ Verify ID Object (10), Class-Type: 1 (1) Flags: [non-negotiable], length: 8
+ Verify ID: 5
+IP (tos 0x0, ttl 1, id 44538, offset 0, flags [none], proto UDP (17), length 60)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Begin Verify NACK, Flags: [none], length: 32
+ Link ID Object (3), Class-Type: IPv4 Local (1) Flags: [non-negotiable], length: 8
+ IPv4 Link ID: 10.0.0.0 (0x0a000000)
+ Message ID Object (5), Class-Type: 2 (2) Flags: [non-negotiable], length: 8
+ Message ID Ack: 3 (0x00000003)
+ Error Code Object (20), Class-Type: 1 (1) Flags: [non-negotiable], length: 8
+ Error Code: Link Verification Procedure Not supported, Unwilling to verify, Unsupported verification transport mechanism
+IP (tos 0x0, ttl 1, id 44539, offset 0, flags [none], proto UDP (17), length 52)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: End Verify, Flags: [none], length: 24
+ Message ID Object (5), Class-Type: 1 (1) Flags: [non-negotiable], length: 8
+ Message ID: 3 (0x00000003)
+ Verify ID Object (10), Class-Type: 1 (1) Flags: [non-negotiable], length: 8
+ Verify ID: 5
+IP (tos 0x0, ttl 1, id 44540, offset 0, flags [none], proto UDP (17), length 52)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: End Verify ACK, Flags: [none], length: 24
+ Message ID Object (5), Class-Type: 2 (2) Flags: [non-negotiable], length: 8
+ Message ID Ack: 3 (0x00000003)
+ Verify ID Object (10), Class-Type: 1 (1) Flags: [non-negotiable], length: 8
+ Verify ID: 5
+IP (tos 0x0, ttl 1, id 44541, offset 0, flags [none], proto UDP (17), length 52)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Test, Flags: [none], length: 24
+ Interface ID Object (4), Class-Type: IPv4 Local (1) Flags: [non-negotiable], length: 8
+ IPv4 Link ID: 1.0.0.0 (0x01000000)
+ Verify ID Object (10), Class-Type: 1 (1) Flags: [non-negotiable], length: 8
+ Verify ID: 5
+IP (tos 0x0, ttl 1, id 44542, offset 0, flags [none], proto UDP (17), length 52)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Test Status Failure, Flags: [none], length: 24
+ Message ID Object (5), Class-Type: 1 (1) Flags: [non-negotiable], length: 8
+ Message ID: 1 (0x00000001)
+ Verify ID Object (10), Class-Type: 1 (1) Flags: [non-negotiable], length: 8
+ Verify ID: 5
+IP (tos 0x0, ttl 1, id 44543, offset 0, flags [none], proto UDP (17), length 52)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Test Status ACK, Flags: [none], length: 24
+ Message ID Object (5), Class-Type: 2 (2) Flags: [non-negotiable], length: 8
+ Message ID Ack: 1 (0x00000001)
+ Verify ID Object (10), Class-Type: 1 (1) Flags: [non-negotiable], length: 8
+ Verify ID: 5
+IP (tos 0x0, ttl 1, id 44544, offset 0, flags [none], proto UDP (17), length 44)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Channel Status ACK, Flags: [none], length: 16
+ Message ID Object (5), Class-Type: 2 (2) Flags: [non-negotiable], length: 8
+ Message ID Ack: 3 (0x00000003)
+IP (tos 0x0, ttl 1, id 44545, offset 0, flags [none], proto UDP (17), length 64)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Channel Status Request, Flags: [none], length: 36
+ Link ID Object (3), Class-Type: IPv4 Local (1) Flags: [non-negotiable], length: 8
+ IPv4 Link ID: 1.0.0.0 (0x01000000)
+ Message ID Object (5), Class-Type: 1 (1) Flags: [non-negotiable], length: 8
+ Message ID: 3 (0x00000003)
+ Channel Status Request Object (14), Class-Type: IPv4 (1) Flags: [non-negotiable], length: 12
+ Interface ID: 2.0.0.0 (0x02000000)
+ Interface ID: 2.0.0.0 (0x02000000)
+IP (tos 0x0, ttl 1, id 44546, offset 0, flags [none], proto UDP (17), length 72)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Channel Status, Flags: [none], length: 44
+ Link ID Object (3), Class-Type: IPv4 Local (1) Flags: [non-negotiable], length: 8
+ IPv4 Link ID: 1.0.0.0 (0x01000000)
+ Message ID Object (5), Class-Type: 1 (1) Flags: [non-negotiable], length: 8
+ Message ID: 3 (0x00000003)
+ Channel Status Object (13), Class-Type: IPv4 (1) Flags: [non-negotiable], length: 20
+ Interface ID: 1.0.0.0 (0x01000000)
+ Active: Allocated (1)
+ Direction: Transmit (1)
+ Channel Status: Signal Fail (3)
+ Interface ID: 1.0.0.0 (0x01000000)
+ Active: Allocated (1)
+ Direction: Receive (0)
+ Channel Status: Signal Degraded (2)
+IP (tos 0x0, ttl 1, id 44547, offset 0, flags [none], proto UDP (17), length 64)
+ 10.0.12.1.49998 > 10.0.12.2.49998:
+ LMPv1, msg-type: Channel Status Response, Flags: [none], length: 36
+ Message ID Object (5), Class-Type: 2 (2) Flags: [non-negotiable], length: 8
+ Message ID Ack: 3 (0x00000003)
+ Channel Status Object (13), Class-Type: IPv4 (1) Flags: [non-negotiable], length: 20
+ Interface ID: 1.0.0.0 (0x01000000)
+ Active: Allocated (1)
+ Direction: Transmit (1)
+ Channel Status: Signal Degraded (2)
+ Interface ID: 1.0.0.0 (0x01000000)
+ Active: Allocated (1)
+ Direction: Transmit (1)
+ Channel Status: Signal Okay (1)
--- /dev/null
+#!/bin/sh
+
+# The "verbose" Link Management Protocol test involves a float calculation that
+# may produce a slightly different result depending on the architecture and the
+# compiler (see GitHub issue #333). The reference output was produced using a
+# GCC build and must reproduce correctly on any other GCC build regardless of
+# the architecture.
+
+# A Windows build may have no file named Makefile and also a version of grep
+# that won't return an error when the file does not exist. Work around.
+if [ ! -f ../Makefile ]
+then
+ printf ' %-30s: TEST SKIPPED (no Makefile)\n' 'lmp-v'
+elif grep '^CC = .*gcc' ../Makefile >/dev/null
+then
+ ./TESTonce lmp-v lmp.pcap lmp-v.out '-t -T lmp -v'
+else
+ printf ' %-30s: TEST SKIPPED (compiler is not GCC)\n' 'lmp-v'
+fi
--- /dev/null
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Begin Verify Message, length: 56
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Hello Message, length: 28
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Config NACK Message, length: 56
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Config ACK Message, length: 48
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Config Message, length: 40
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Link Summary ACK Message, length: 16
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Link Summary NACK Message, length: 96
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Begin Verify ACK Message, length: 40
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Begin Verify NACK Message, length: 32
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 End Verify Message, length: 24
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 End Verify ACK Message, length: 24
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Test Message, length: 24
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Test Status Failure Message, length: 24
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Test Status ACK Message, length: 24
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Channel Status ACK Message, length: 16
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Channel Status Request Message, length: 36
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Channel Status Message, length: 44
+IP 10.0.12.1.49998 > 10.0.12.2.49998: LMPv1 Channel Status Response Message, length: 36
--- /dev/null
+Loopback, skipCount 0, Forward Data, forwarding address aa:00:04:00:1d:04, data (44 octets)
+Loopback, skipCount 8, Reply, receipt number 1, data (40 octets)
+Loopback, skipCount 0, Forward Data, forwarding address aa:00:04:00:6a:04, data (60 octets)
+Loopback, skipCount 8, Forward Data, forwarding address aa:00:04:00:69:04, data (52 octets)
+Loopback, skipCount 16, Forward Data, forwarding address aa:00:04:00:1d:04, data (44 octets)
+Loopback, skipCount 24, Reply, receipt number 2, data (40 octets)
--- /dev/null
+IP (tos 0xc0, ttl 64, id 22725, offset 0, flags [DF], proto TCP (6), length 142)
+ 30.0.0.1.49038 > 30.0.0.2.179: Flags [P.], cksum 0xd6dc (correct), seq 1284816775:1284816865, ack 1288709908, win 29, options [nop,nop,TS val 184150022 ecr 184150021], length 90: BGP
+ Update Message (2), length: 90
+ Origin (1), length: 1, Flags [T]: Incomplete
+ AS Path (2), length: 4, Flags [T]: 1
+ Next Hop (3), length: 4, Flags [T]: 0.0.0.0
+ Multi-Protocol Reach NLRI (14), length: 46, Flags [O]:
+ AFI: IPv6 (2), SAFI: Unicast (1)
+ nexthop: dead:beef::1, fe80::1ff:fe01:0, nh-length: 32, no SNPA
+ 4:5::/64
--- /dev/null
+IP (tos 0xc0, ttl 1, id 15579, offset 0, flags [none], proto UDP (17), length 70)
+ 10.1.1.3.646 > 224.0.0.2.646:
+ LDP, Label-Space-ID: 10.1.0.2:0, pdu-length: 38
+ Hello Message (0x0100), length: 28, Message ID: 0x00011970, Flags: [ignore if unknown]
+ Common Hello Parameters TLV (0x0400), length: 4, Flags: [ignore and don't forward if unknown]
+ Hold Time: 15s, Flags: [Link Hello]
+ IPv4 Transport Address TLV (0x0401), length: 4, Flags: [ignore and don't forward if unknown]
+ IPv4 Transport Address: 10.1.0.2
+ Configuration Sequence Number TLV (0x0402), length: 4, Flags: [ignore and don't forward if unknown]
+ Sequence Number: 1
--- /dev/null
+ARP, Request who-has 10.2.1.2 tell 10.2.1.1, length 28
+ARP, Reply 10.2.1.2 is-at d6:06:3c:4a:35:7a, length 28
+IP 10.1.1.2.37479 > 10.2.1.2.2002: Flags [S], seq 1895673170, win 14600, options [mss 1460,sackOK,TS val 38230 ecr 0,nop,wscale 6,mptcp capable csum {0x9b59be3d695e66a7}], length 0
+IP 10.2.1.2.2002 > 10.1.1.2.37479: Flags [S.], seq 2868811558, ack 1895673171, win 14280, options [mss 1460,sackOK,TS val 4294943148 ecr 38230,nop,wscale 6,mptcp capable csum {0xd005b1ab34bad344}], length 0
+IP 10.1.1.2.37479 > 10.2.1.2.2002: Flags [.], ack 1, win 229, options [nop,nop,TS val 38230 ecr 4294943148,mptcp capable csum {0x9b59be3d695e66a7,0xd005b1ab34bad344}], length 0
+IP 10.1.1.2.37479 > 10.2.1.2.2002: Flags [P.], seq 1:2, ack 1, win 229, options [nop,nop,TS val 38230 ecr 4294943148,mptcp dss ack 3386645601 seq 2976985014 subseq 1 len 1 csum 0x9e91], length 1
+IP 10.2.1.2.2002 > 10.1.1.2.37479: Flags [.], ack 2, win 224, options [nop,nop,TS val 4294943148 ecr 38230,mptcp dss ack 2976985015], length 0
+IP 10.2.1.2.2002 > 10.1.1.2.37479: Flags [P.], seq 1:2, ack 2, win 224, options [nop,nop,TS val 4294943250 ecr 38230,mptcp dss ack 2976985015 seq 3386645601 subseq 1 len 1 csum 0x54ab], length 1
+IP 10.1.1.2.37479 > 10.2.1.2.2002: Flags [.], ack 2, win 229, options [nop,nop,TS val 38334 ecr 4294943250,mptcp dss ack 3386645602], length 0
+IP 10.1.1.2.37479 > 10.2.1.2.2002: Flags [.], ack 2, win 229, options [nop,nop,TS val 38734 ecr 4294943250,mptcp fast-close key 0xd005b1ab34bad344], length 0
+IP 10.2.1.2.2002 > 10.1.1.2.37479: Flags [R.], seq 2, ack 2, win 224, options [nop,nop,TS val 4294943650 ecr 38734,mptcp dss ack 2976985015], length 0
--- /dev/null
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [S], seq 2912457561, win 14600, options [mss 1460,sackOK,TS val 4294943152 ecr 0,nop,wscale 6,mptcp capable csum {0x9c9eabd1e46a33b2}], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [S.], seq 125971326, ack 2912457562, win 14280, options [mss 1460,sackOK,TS val 4294943467 ecr 4294943152,nop,wscale 5,mptcp capable csum {0x967d2770b6960552}], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1, win 229, options [nop,nop,TS val 4294943152 ecr 4294943467,mptcp capable csum {0x9c9eabd1e46a33b2,0x967d2770b6960552}], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1:42, ack 1, win 447, options [nop,nop,TS val 4294943474 ecr 4294943152,mptcp add-addr id 1 10.1.2.2,mptcp dss ack 3576348362 seq 3518592144 subseq 1 len 41 csum 0x82f], length 41
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 42, win 229, options [nop,nop,TS val 4294943168 ecr 4294943474,mptcp dss ack 3518592185], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 1:42, ack 42, win 229, options [nop,nop,TS val 4294943168 ecr 4294943474,mptcp dss ack 3518592185 seq 3576348362 subseq 1 len 41 csum 0x45c9], length 41
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [.], ack 42, win 447, options [nop,nop,TS val 4294943474 ecr 4294943168,mptcp dss ack 3576348403], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [S], seq 1863826096, win 14600, options [mss 1460,sackOK,TS val 4294943168 ecr 0,nop,wscale 6,mptcp join id 0 token 0xe47f0142 nonce 0x1b665a18], length 0
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [S.], seq 1704897135, ack 1863826097, win 14280, options [mss 1460,sackOK,TS val 4294943474 ecr 4294943168,nop,wscale 5,mptcp join id 1 hmac 0x5ab680c7884af03d nonce 0x33abe9d5], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 1, win 229, options [nop,nop,TS val 4294943168 ecr 4294943474,mptcp join hmac 0xcb7b87f5e5f0502f43b535fb70ef6607df2e6c7a], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 42:890, ack 42, win 229, options [nop,nop,TS val 4294943168 ecr 4294943474,mptcp dss ack 3518592185 seq 3576348403 subseq 42 len 848 csum 0x6d11], length 848
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [.], ack 1, win 447, options [nop,nop,TS val 4294943474 ecr 4294943168,mptcp dss ack 3576348403], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [.], ack 890, win 500, options [nop,nop,TS val 4294943474 ecr 4294943168,mptcp dss ack 3576349251], length 0
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 1:785, ack 1, win 500, options [nop,nop,TS val 4294943474 ecr 4294943168,mptcp dss ack 3576349251 seq 3518592185 subseq 1 len 784 csum 0x5187], length 784
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 785, win 253, options [nop,nop,TS val 4294943170 ecr 4294943474,mptcp dss ack 3518592969], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 1:25, ack 785, win 253, options [nop,nop,TS val 4294943170 ecr 4294943474,mptcp dss ack 3518592969 seq 3576349251 subseq 1 len 24 csum 0xec8a], length 24
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [.], ack 25, win 500, options [nop,nop,TS val 4294943474 ecr 4294943170,mptcp dss ack 3576349275], length 0
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 785:937, ack 25, win 500, options [nop,nop,TS val 4294943474 ecr 4294943170,mptcp dss ack 3576349275 seq 3518592969 subseq 785 len 152 csum 0x217c], length 152
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 25:169, ack 937, win 258, options [nop,nop,TS val 4294943170 ecr 4294943474,mptcp dss ack 3518593121 seq 3576349275 subseq 25 len 144 csum 0x7220], length 144
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 937:1657, ack 169, win 533, options [nop,nop,TS val 4294943474 ecr 4294943170,mptcp dss ack 3576349419 seq 3518593121 subseq 937 len 720 csum 0xfb83], length 720
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 890:906, ack 42, win 280, options [nop,nop,TS val 4294943172 ecr 4294943474,mptcp dss ack 3518593841 seq 3576349419 subseq 890 len 16 csum 0xc87], length 16
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [.], ack 906, win 533, options [nop,nop,TS val 4294943474 ecr 4294943172,mptcp dss ack 3576349435], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 906:954, ack 42, win 280, options [nop,nop,TS val 4294943172 ecr 4294943474,mptcp dss ack 3518593841 seq 3576349435 subseq 906 len 48 csum 0x36d0], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [.], ack 954, win 533, options [nop,nop,TS val 4294943474 ecr 4294943172,mptcp dss ack 3576349483], length 0
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 1657:1705, ack 169, win 533, options [nop,nop,TS val 4294943474 ecr 4294943170,mptcp dss ack 3576349483 seq 3518593841 subseq 1657 len 48 csum 0xb8f3], length 48
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 1705, win 280, options [nop,nop,TS val 4294943172 ecr 4294943474,mptcp dss ack 3518593889], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 954:1018, ack 42, win 280, options [nop,nop,TS val 4294943172 ecr 4294943474,mptcp dss ack 3518593889 seq 3576349483 subseq 954 len 64 csum 0x71f6], length 64
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [.], ack 1018, win 533, options [nop,nop,TS val 4294943474 ecr 4294943172,mptcp dss ack 3576349547], length 0
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 1705:1769, ack 169, win 533, options [nop,nop,TS val 4294943474 ecr 4294943172,mptcp dss ack 3576349547 seq 3518593889 subseq 1705 len 64 csum 0x67b9], length 64
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 1018:1386, ack 42, win 280, options [nop,nop,TS val 4294943175 ecr 4294943474,mptcp dss ack 3518593953 seq 3576349547 subseq 1018 len 368 csum 0x81d2], length 368
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [.], ack 1386, win 567, options [nop,nop,TS val 4294943474 ecr 4294943175,mptcp dss ack 3576349915], length 0
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 1769:2089, ack 169, win 567, options [nop,nop,TS val 4294943474 ecr 4294943172,mptcp dss ack 3576349915 seq 3518593953 subseq 1769 len 320 csum 0x5fc5], length 320
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 2089, win 290, options [nop,nop,TS val 4294943175 ecr 4294943474,mptcp dss ack 3518594273], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 1386:2026, ack 42, win 290, options [nop,nop,TS val 4294943175 ecr 4294943474,mptcp dss ack 3518594273 seq 3576349915 subseq 1386 len 640 csum 0x5af4], length 640
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [.], ack 2026, win 607, options [nop,nop,TS val 4294943485 ecr 4294943175,mptcp dss ack 3576350555], length 0
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 2089:2153, ack 169, win 607, options [nop,nop,TS val 4294943485 ecr 4294943175,mptcp dss ack 3576350555 seq 3518594273 subseq 2089 len 64 csum 0x548b], length 64
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 2153, win 290, options [nop,nop,TS val 4294943179 ecr 4294943485,mptcp dss ack 3518594337], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2026:2170, ack 42, win 290, options [nop,nop,TS val 4294943301 ecr 4294943485,mptcp dss ack 3518594337 seq 3576350555 subseq 2026 len 144 csum 0x62d7], length 144
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [.], ack 2170, win 640, options [nop,nop,TS val 4294943610 ecr 4294943301,mptcp dss ack 3576350699], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 42:74, ack 2170, win 640, options [nop,nop,TS val 4294943611 ecr 4294943301,mptcp dss ack 3576350699 seq 3518594337 subseq 42 len 32 csum 0x24cb], length 32
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2170:2298, ack 74, win 290, options [nop,nop,TS val 4294943304 ecr 4294943611,mptcp dss ack 3518594369 seq 3576350699 subseq 2170 len 128 csum 0x33ac], length 128
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 74:122, ack 2298, win 674, options [nop,nop,TS val 4294943611 ecr 4294943304,mptcp dss ack 3576350827 seq 3518594369 subseq 74 len 48 csum 0xf616], length 48
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 169:617, ack 2153, win 290, options [nop,nop,TS val 4294943306 ecr 4294943485,mptcp dss ack 3518594417 seq 3576350827 subseq 169 len 448 csum 0xe192], length 448
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 122:234, ack 2298, win 707, options [nop,nop,TS val 4294943611 ecr 4294943304,mptcp dss ack 3576351275 seq 3518594417 subseq 122 len 112 csum 0xeb29], length 112
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 234, win 290, options [nop,nop,TS val 4294943306 ecr 4294943611,mptcp dss ack 3518594529], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 234:346, ack 2298, win 707, options [nop,nop,TS val 4294943611 ecr 4294943306,mptcp dss ack 3576351275 seq 3518594529 subseq 234 len 112 csum 0x70c0], length 112
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 346:538, ack 2298, win 707, options [nop,nop,TS val 4294943611 ecr 4294943306,mptcp dss ack 3576351275 seq 3518594641 subseq 346 len 192 csum 0x91c], length 192
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 538, win 296, options [nop,nop,TS val 4294943309 ecr 4294943611,mptcp dss ack 3518594833], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 538:634, ack 2298, win 707, options [nop,nop,TS val 4294943611 ecr 4294943309,mptcp dss ack 3576351275 seq 3518594833 subseq 538 len 96 csum 0x5851], length 96
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 634:778, ack 2298, win 707, options [nop,nop,TS val 4294943611 ecr 4294943309,mptcp dss ack 3576351275 seq 3518594929 subseq 634 len 144 csum 0x405a], length 144
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 778, win 301, options [nop,nop,TS val 4294943309 ecr 4294943611,mptcp dss ack 3518595073], length 0
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [.], ack 617, win 707, options [nop,nop,TS val 4294943621 ecr 4294943306,mptcp dss ack 3576351275], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 778:858, ack 2298, win 707, options [nop,nop,TS val 4294943621 ecr 4294943309,mptcp dss ack 3576351275 seq 3518595073 subseq 778 len 80 csum 0x3c7b], length 80
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 858, win 301, options [nop,nop,TS val 4294943316 ecr 4294943621,mptcp dss ack 3518595153], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2298:2346, ack 858, win 301, options [nop,nop,TS val 4294943328 ecr 4294943621,mptcp dss ack 3518595153 seq 3576351275 subseq 2298 len 48 csum 0xe0ce], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 858:906, ack 2346, win 707, options [nop,nop,TS val 4294943629 ecr 4294943328,mptcp dss ack 3576351323 seq 3518595153 subseq 858 len 48 csum 0xbe20], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 906, win 301, options [nop,nop,TS val 4294943328 ecr 4294943629,mptcp dss ack 3518595201], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 906:1034, ack 2346, win 707, options [nop,nop,TS val 4294943645 ecr 4294943328,mptcp dss ack 3576351323 seq 3518595201 subseq 906 len 128 csum 0x3d9d], length 128
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1034, win 305, options [nop,nop,TS val 4294943339 ecr 4294943645,mptcp dss ack 3518595329], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2346:2394, ack 1034, win 305, options [nop,nop,TS val 4294943343 ecr 4294943645,mptcp dss ack 3518595329 seq 3576351323 subseq 2346 len 48 csum 0x8505], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1034:1114, ack 2394, win 707, options [nop,nop,TS val 4294943651 ecr 4294943343,mptcp dss ack 3576351371 seq 3518595329 subseq 1034 len 80 csum 0xb3da], length 80
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1114, win 305, options [nop,nop,TS val 4294943343 ecr 4294943651,mptcp dss ack 3518595409], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2394:2442, ack 1114, win 305, options [nop,nop,TS val 4294943355 ecr 4294943651,mptcp dss ack 3518595409 seq 3576351371 subseq 2394 len 48 csum 0xd46b], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1114:1194, ack 2442, win 707, options [nop,nop,TS val 4294943663 ecr 4294943355,mptcp dss ack 3576351419 seq 3518595409 subseq 1114 len 80 csum 0xfe3d], length 80
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1194, win 305, options [nop,nop,TS val 4294943355 ecr 4294943663,mptcp dss ack 3518595489], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2442:2490, ack 1194, win 305, options [nop,nop,TS val 4294943387 ecr 4294943663,mptcp dss ack 3518595489 seq 3576351419 subseq 2442 len 48 csum 0xd83], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1194:1242, ack 2490, win 707, options [nop,nop,TS val 4294943695 ecr 4294943387,mptcp dss ack 3576351467 seq 3518595489 subseq 1194 len 48 csum 0xad99], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1242, win 305, options [nop,nop,TS val 4294943387 ecr 4294943695,mptcp dss ack 3518595537], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2490:2538, ack 1242, win 305, options [nop,nop,TS val 4294943395 ecr 4294943695,mptcp dss ack 3518595537 seq 3576351467 subseq 2490 len 48 csum 0x3689], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1242:1290, ack 2538, win 707, options [nop,nop,TS val 4294943703 ecr 4294943395,mptcp dss ack 3576351515 seq 3518595537 subseq 1242 len 48 csum 0xf0cf], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1290, win 305, options [nop,nop,TS val 4294943395 ecr 4294943703,mptcp dss ack 3518595585], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2538:2586, ack 1290, win 305, options [nop,nop,TS val 4294943408 ecr 4294943703,mptcp dss ack 3518595585 seq 3576351515 subseq 2538 len 48 csum 0xed5f], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1290:1338, ack 2586, win 707, options [nop,nop,TS val 4294943717 ecr 4294943408,mptcp dss ack 3576351563 seq 3518595585 subseq 1290 len 48 csum 0xf2ec], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1338, win 305, options [nop,nop,TS val 4294943408 ecr 4294943717,mptcp dss ack 3518595633], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2586:2634, ack 1338, win 305, options [nop,nop,TS val 4294943417 ecr 4294943717,mptcp dss ack 3518595633 seq 3576351563 subseq 2586 len 48 csum 0x3678], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1338:1386, ack 2634, win 707, options [nop,nop,TS val 4294943726 ecr 4294943417,mptcp dss ack 3576351611 seq 3518595633 subseq 1338 len 48 csum 0xc9a1], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1386, win 305, options [nop,nop,TS val 4294943417 ecr 4294943726,mptcp dss ack 3518595681], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2634:2682, ack 1386, win 305, options [nop,nop,TS val 4294943424 ecr 4294943726,mptcp dss ack 3518595681 seq 3576351611 subseq 2634 len 48 csum 0x54c7], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1386:1434, ack 2682, win 707, options [nop,nop,TS val 4294943733 ecr 4294943424,mptcp dss ack 3576351659 seq 3518595681 subseq 1386 len 48 csum 0xf5e9], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1434, win 305, options [nop,nop,TS val 4294943424 ecr 4294943733,mptcp dss ack 3518595729], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2682:2730, ack 1434, win 305, options [nop,nop,TS val 4294943435 ecr 4294943733,mptcp dss ack 3518595729 seq 3576351659 subseq 2682 len 48 csum 0xc90a], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1434:1482, ack 2730, win 707, options [nop,nop,TS val 4294943743 ecr 4294943435,mptcp dss ack 3576351707 seq 3518595729 subseq 1434 len 48 csum 0x4e7d], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1482, win 305, options [nop,nop,TS val 4294943435 ecr 4294943743,mptcp dss ack 3518595777], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2730:2778, ack 1482, win 305, options [nop,nop,TS val 4294943440 ecr 4294943743,mptcp dss ack 3518595777 seq 3576351707 subseq 2730 len 48 csum 0x7b3d], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1482:1530, ack 2778, win 707, options [nop,nop,TS val 4294943749 ecr 4294943440,mptcp dss ack 3576351755 seq 3518595777 subseq 1482 len 48 csum 0x83e2], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1530, win 305, options [nop,nop,TS val 4294943440 ecr 4294943749,mptcp dss ack 3518595825], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2778:2826, ack 1530, win 305, options [nop,nop,TS val 4294943453 ecr 4294943749,mptcp dss ack 3518595825 seq 3576351755 subseq 2778 len 48 csum 0x6e36], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1530:1578, ack 2826, win 707, options [nop,nop,TS val 4294943762 ecr 4294943453,mptcp dss ack 3576351803 seq 3518595825 subseq 1530 len 48 csum 0xb348], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1578, win 305, options [nop,nop,TS val 4294943453 ecr 4294943762,mptcp dss ack 3518595873], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2826:2874, ack 1578, win 305, options [nop,nop,TS val 4294943458 ecr 4294943762,mptcp dss ack 3518595873 seq 3576351803 subseq 2826 len 48 csum 0x1991], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1578:1626, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943458,mptcp dss ack 3576351851 seq 3518595873 subseq 1578 len 48 csum 0xb4f], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1626, win 305, options [nop,nop,TS val 4294943458 ecr 4294943766,mptcp dss ack 3518595921], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1626:1722, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943458,mptcp dss ack 3576351851 seq 3518595921 subseq 1626 len 96 csum 0x9334], length 96
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1722:1834, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943458,mptcp dss ack 3576351851 seq 3518596017 subseq 1722 len 112 csum 0xdc3f], length 112
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1722, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518596017], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1834, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518596129], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1834:1946, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518596129 subseq 1834 len 112 csum 0x349e], length 112
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 1946, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518596241], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 1946:2042, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518596241 subseq 1946 len 96 csum 0xd5fe], length 96
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 2042, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518596337], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 2042:2154, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518596337 subseq 2042 len 112 csum 0x2c14], length 112
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 2154, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518596449], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 2154:2266, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518596449 subseq 2154 len 112 csum 0xe76e], length 112
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 2266, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518596561], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 2266:2346, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518596561 subseq 2266 len 80 csum 0x839a], length 80
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 2346:2442, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518596641 subseq 2346 len 96 csum 0xc1ee], length 96
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 2346, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518596641], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 2442, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518596737], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 2442:2506, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518596737 subseq 2442 len 64 csum 0xe67], length 64
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 2506:2554, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518596801 subseq 2506 len 48 csum 0x1474], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 2506, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518596801], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 2554, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518596849], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 2554:2650, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518596849 subseq 2554 len 96 csum 0x5dc1], length 96
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 2650, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518596945], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 2650:2762, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518596945 subseq 2650 len 112 csum 0xa20c], length 112
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 2762, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518597057], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 2762:2874, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518597057 subseq 2762 len 112 csum 0x643c], length 112
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 2874, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518597169], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 2874:2970, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518597169 subseq 2874 len 96 csum 0x5244], length 96
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 2970, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518597265], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 2970:3082, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518597265 subseq 2970 len 112 csum 0x295a], length 112
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 3082, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518597377], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 3082:3194, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518597377 subseq 3082 len 112 csum 0x510b], length 112
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 3194, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518597489], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 3194:3274, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518597489 subseq 3194 len 80 csum 0xc29a], length 80
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 3274, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518597569], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 3274:3370, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518597569 subseq 3274 len 96 csum 0x22a5], length 96
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 3370, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518597665], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 3370:3434, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518597665 subseq 3370 len 64 csum 0xe385], length 64
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 3434, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518597729], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 3434:3482, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518597729 subseq 3434 len 48 csum 0xd6b0], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 3482, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518597777], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 3482:3562, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518597777 subseq 3482 len 80 csum 0xec9d], length 80
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 3562, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518597857], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 3562:3658, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518597857 subseq 3562 len 96 csum 0x1eee], length 96
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 3658, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518597953], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 3658:3738, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518597953 subseq 3658 len 80 csum 0xbc5e], length 80
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 3738, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518598033], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 3738:3834, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518598033 subseq 3738 len 96 csum 0xe], length 96
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 3834, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518598129], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 3834:3930, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518598129 subseq 3834 len 96 csum 0xd42], length 96
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 3930, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518598225], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 3930:4042, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518598225 subseq 3930 len 112 csum 0xb006], length 112
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4042, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518598337], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4042:4122, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518598337 subseq 4042 len 80 csum 0x986f], length 80
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4122, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518598417], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4122:4218, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518598417 subseq 4122 len 96 csum 0x43ff], length 96
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4218, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518598513], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4218:4266, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518598513 subseq 4218 len 48 csum 0x8666], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4266, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518598561], length 0
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4266:4346, ack 2874, win 707, options [nop,nop,TS val 4294943766 ecr 4294943460,mptcp dss ack 3576351851 seq 3518598561 subseq 4266 len 80 csum 0x9239], length 80
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4346, win 305, options [nop,nop,TS val 4294943460 ecr 4294943766,mptcp dss ack 3518598641], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2874:2922, ack 4346, win 305, options [nop,nop,TS val 4294943484 ecr 4294943766,mptcp dss ack 3518598641 seq 3576351851 subseq 2874 len 48 csum 0xd397], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4346:4394, ack 2922, win 707, options [nop,nop,TS val 4294943793 ecr 4294943484,mptcp dss ack 3576351899 seq 3518598641 subseq 4346 len 48 csum 0xeeaa], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4394, win 305, options [nop,nop,TS val 4294943484 ecr 4294943793,mptcp dss ack 3518598689], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2922:2970, ack 4394, win 305, options [nop,nop,TS val 4294943496 ecr 4294943793,mptcp dss ack 3518598689 seq 3576351899 subseq 2922 len 48 csum 0x48a7], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4394:4442, ack 2970, win 707, options [nop,nop,TS val 4294943805 ecr 4294943496,mptcp dss ack 3576351947 seq 3518598689 subseq 4394 len 48 csum 0xc354], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4442, win 305, options [nop,nop,TS val 4294943496 ecr 4294943805,mptcp dss ack 3518598737], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 2970:3018, ack 4442, win 305, options [nop,nop,TS val 4294943513 ecr 4294943805,mptcp dss ack 3518598737 seq 3576351947 subseq 2970 len 48 csum 0xf6d], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4442:4490, ack 3018, win 707, options [nop,nop,TS val 4294943822 ecr 4294943513,mptcp dss ack 3576351995 seq 3518598737 subseq 4442 len 48 csum 0xe0e2], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4490, win 305, options [nop,nop,TS val 4294943513 ecr 4294943822,mptcp dss ack 3518598785], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3018:3066, ack 4490, win 305, options [nop,nop,TS val 4294943521 ecr 4294943822,mptcp dss ack 3518598785 seq 3576351995 subseq 3018 len 48 csum 0xf320], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4490:4538, ack 3066, win 707, options [nop,nop,TS val 4294943830 ecr 4294943521,mptcp dss ack 3576352043 seq 3518598785 subseq 4490 len 48 csum 0x9c04], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4538, win 305, options [nop,nop,TS val 4294943521 ecr 4294943830,mptcp dss ack 3518598833], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3066:3114, ack 4538, win 305, options [nop,nop,TS val 4294943525 ecr 4294943830,mptcp dss ack 3518598833 seq 3576352043 subseq 3066 len 48 csum 0x88f6], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4538:4586, ack 3114, win 707, options [nop,nop,TS val 4294943834 ecr 4294943525,mptcp dss ack 3576352091 seq 3518598833 subseq 4538 len 48 csum 0x8612], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4586, win 305, options [nop,nop,TS val 4294943525 ecr 4294943834,mptcp dss ack 3518598881], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3114:3162, ack 4586, win 305, options [nop,nop,TS val 4294943532 ecr 4294943834,mptcp dss ack 3518598881 seq 3576352091 subseq 3114 len 48 csum 0xa14c], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4586:4634, ack 3162, win 707, options [nop,nop,TS val 4294943841 ecr 4294943532,mptcp dss ack 3576352139 seq 3518598881 subseq 4586 len 48 csum 0x7979], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4634, win 305, options [nop,nop,TS val 4294943532 ecr 4294943841,mptcp dss ack 3518598929], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3162:3210, ack 4634, win 305, options [nop,nop,TS val 4294943543 ecr 4294943841,mptcp dss ack 3518598929 seq 3576352139 subseq 3162 len 48 csum 0x7c49], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4634:4682, ack 3210, win 707, options [nop,nop,TS val 4294943851 ecr 4294943543,mptcp dss ack 3576352187 seq 3518598929 subseq 4634 len 48 csum 0x7799], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4682, win 305, options [nop,nop,TS val 4294943543 ecr 4294943851,mptcp dss ack 3518598977], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3210:3258, ack 4682, win 305, options [nop,nop,TS val 4294943549 ecr 4294943851,mptcp dss ack 3518598977 seq 3576352187 subseq 3210 len 48 csum 0x7589], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4682:4730, ack 3258, win 707, options [nop,nop,TS val 4294943858 ecr 4294943549,mptcp dss ack 3576352235 seq 3518598977 subseq 4682 len 48 csum 0x9da3], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4730, win 305, options [nop,nop,TS val 4294943549 ecr 4294943858,mptcp dss ack 3518599025], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3258:3306, ack 4730, win 305, options [nop,nop,TS val 4294943560 ecr 4294943858,mptcp dss ack 3518599025 seq 3576352235 subseq 3258 len 48 csum 0x652], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4730:4778, ack 3306, win 707, options [nop,nop,TS val 4294943869 ecr 4294943560,mptcp dss ack 3576352283 seq 3518599025 subseq 4730 len 48 csum 0xf212], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4778, win 305, options [nop,nop,TS val 4294943560 ecr 4294943869,mptcp dss ack 3518599073], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3306:3354, ack 4778, win 305, options [nop,nop,TS val 4294943572 ecr 4294943869,mptcp dss ack 3518599073 seq 3576352283 subseq 3306 len 48 csum 0x757c], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4778:4826, ack 3354, win 707, options [nop,nop,TS val 4294943881 ecr 4294943572,mptcp dss ack 3576352331 seq 3518599073 subseq 4778 len 48 csum 0x5cf1], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4826, win 305, options [nop,nop,TS val 4294943572 ecr 4294943881,mptcp dss ack 3518599121], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3354:3402, ack 4826, win 305, options [nop,nop,TS val 4294943580 ecr 4294943881,mptcp dss ack 3518599121 seq 3576352331 subseq 3354 len 48 csum 0x363c], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4826:4874, ack 3402, win 707, options [nop,nop,TS val 4294943889 ecr 4294943580,mptcp dss ack 3576352379 seq 3518599121 subseq 4826 len 48 csum 0xdae4], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4874, win 305, options [nop,nop,TS val 4294943580 ecr 4294943889,mptcp dss ack 3518599169], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3402:3450, ack 4874, win 305, options [nop,nop,TS val 4294943589 ecr 4294943889,mptcp dss ack 3518599169 seq 3576352379 subseq 3402 len 48 csum 0x5ded], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4874:4922, ack 3450, win 707, options [nop,nop,TS val 4294943898 ecr 4294943589,mptcp dss ack 3576352427 seq 3518599169 subseq 4874 len 48 csum 0xb977], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4922, win 305, options [nop,nop,TS val 4294943589 ecr 4294943898,mptcp dss ack 3518599217], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3450:3498, ack 4922, win 305, options [nop,nop,TS val 4294943624 ecr 4294943898,mptcp dss ack 3518599217 seq 3576352427 subseq 3450 len 48 csum 0x8425], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4922:4970, ack 3498, win 707, options [nop,nop,TS val 4294943933 ecr 4294943624,mptcp dss ack 3576352475 seq 3518599217 subseq 4922 len 48 csum 0x1a42], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 4970, win 305, options [nop,nop,TS val 4294943624 ecr 4294943933,mptcp dss ack 3518599265], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3498:3546, ack 4970, win 305, options [nop,nop,TS val 4294943675 ecr 4294943933,mptcp dss ack 3518599265 seq 3576352475 subseq 3498 len 48 csum 0x37f5], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 4970:5018, ack 3546, win 707, options [nop,nop,TS val 4294943983 ecr 4294943675,mptcp dss ack 3576352523 seq 3518599265 subseq 4970 len 48 csum 0xb0f0], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 5018, win 305, options [nop,nop,TS val 4294943675 ecr 4294943983,mptcp dss ack 3518599313], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3546:3594, ack 5018, win 305, options [nop,nop,TS val 4294943688 ecr 4294943983,mptcp dss ack 3518599313 seq 3576352523 subseq 3546 len 48 csum 0xd912], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 5018:5066, ack 3594, win 707, options [nop,nop,TS val 4294943997 ecr 4294943688,mptcp dss ack 3576352571 seq 3518599313 subseq 5018 len 48 csum 0x5be5], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 5066, win 305, options [nop,nop,TS val 4294943688 ecr 4294943997,mptcp dss ack 3518599361], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3594:3642, ack 5066, win 305, options [nop,nop,TS val 4294943703 ecr 4294943997,mptcp dss ack 3518599361 seq 3576352571 subseq 3594 len 48 csum 0x539a], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 5066:5114, ack 3642, win 707, options [nop,nop,TS val 4294944011 ecr 4294943703,mptcp dss ack 3576352619 seq 3518599361 subseq 5066 len 48 csum 0x2d9e], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 5114, win 305, options [nop,nop,TS val 4294943703 ecr 4294944011,mptcp dss ack 3518599409], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3642:3690, ack 5114, win 305, options [nop,nop,TS val 4294943712 ecr 4294944011,mptcp dss ack 3518599409 seq 3576352619 subseq 3642 len 48 csum 0xbda6], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 5114:5162, ack 3690, win 707, options [nop,nop,TS val 4294944021 ecr 4294943712,mptcp dss ack 3576352667 seq 3518599409 subseq 5114 len 48 csum 0x1bc7], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 5162, win 305, options [nop,nop,TS val 4294943712 ecr 4294944021,mptcp dss ack 3518599457], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3690:3738, ack 5162, win 305, options [nop,nop,TS val 4294943725 ecr 4294944021,mptcp dss ack 3518599457 seq 3576352667 subseq 3690 len 48 csum 0xad71], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 5162:5210, ack 3738, win 707, options [nop,nop,TS val 4294944034 ecr 4294943725,mptcp dss ack 3576352715 seq 3518599457 subseq 5162 len 48 csum 0xf8f7], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 5210, win 305, options [nop,nop,TS val 4294943725 ecr 4294944034,mptcp dss ack 3518599505], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [P.], seq 3738:3786, ack 5210, win 305, options [nop,nop,TS val 4294943746 ecr 4294944034,mptcp dss ack 3518599505 seq 3576352715 subseq 3738 len 48 csum 0xd16], length 48
+IP 10.1.1.2.22 > 10.2.1.2.35961: Flags [P.], seq 5210:5258, ack 3786, win 707, options [nop,nop,TS val 4294944054 ecr 4294943746,mptcp dss ack 3576352763 seq 3518599505 subseq 5210 len 48 csum 0x8122], length 48
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [.], ack 5258, win 305, options [nop,nop,TS val 4294943746 ecr 4294944054,mptcp dss ack 3518599553], length 0
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [.], ack 617, win 707, options [nop,nop,TS val 4294944054 ecr 4294943306,mptcp rem-addr id 0,mptcp dss ack 3576352763], length 0
+IP 10.2.1.2.35961 > 10.1.1.2.22: Flags [R.], seq 3786, ack 5258, win 305, options [nop,nop,TS val 4294943749 ecr 4294944054,mptcp dss ack 3518599553], length 0
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 2153:2233, ack 617, win 707, options [nop,nop,TS val 4294944054 ecr 4294943306,mptcp dss ack 3576352763 seq 3518599553 subseq 2153 len 80 csum 0xe206], length 80
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 2233, win 305, options [nop,nop,TS val 4294943749 ecr 4294944054,mptcp dss ack 3518599633], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 617:665, ack 2233, win 305, options [nop,nop,TS val 4294943782 ecr 4294944054,mptcp dss ack 3518599633 seq 3576352763 subseq 617 len 48 csum 0xa135], length 48
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [.], ack 665, win 707, options [nop,nop,TS val 4294944090 ecr 4294943782,mptcp dss ack 3576352811], length 0
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 2233:2313, ack 665, win 707, options [nop,nop,TS val 4294944090 ecr 4294943782,mptcp dss ack 3576352811 seq 3518599633 subseq 2233 len 80 csum 0x917d], length 80
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 2313, win 305, options [nop,nop,TS val 4294943782 ecr 4294944090,mptcp dss ack 3518599713], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 665:713, ack 2313, win 305, options [nop,nop,TS val 4294943797 ecr 4294944090,mptcp dss ack 3518599713 seq 3576352811 subseq 665 len 48 csum 0x3789], length 48
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 2313:2393, ack 713, win 707, options [nop,nop,TS val 4294944106 ecr 4294943797,mptcp dss ack 3576352859 seq 3518599713 subseq 2313 len 80 csum 0x6cf1], length 80
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 2393, win 305, options [nop,nop,TS val 4294943797 ecr 4294944106,mptcp dss ack 3518599793], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 713:761, ack 2393, win 305, options [nop,nop,TS val 4294943811 ecr 4294944106,mptcp dss ack 3518599793 seq 3576352859 subseq 713 len 48 csum 0xc47b], length 48
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 2393:2473, ack 761, win 707, options [nop,nop,TS val 4294944119 ecr 4294943811,mptcp dss ack 3576352907 seq 3518599793 subseq 2393 len 80 csum 0x226], length 80
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 2473, win 305, options [nop,nop,TS val 4294943811 ecr 4294944119,mptcp dss ack 3518599873], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 761:809, ack 2473, win 305, options [nop,nop,TS val 4294943826 ecr 4294944119,mptcp dss ack 3518599873 seq 3576352907 subseq 761 len 48 csum 0x187f], length 48
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 2473:2553, ack 809, win 707, options [nop,nop,TS val 4294944134 ecr 4294943826,mptcp dss ack 3576352955 seq 3518599873 subseq 2473 len 80 csum 0xe4fe], length 80
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 2553, win 305, options [nop,nop,TS val 4294943826 ecr 4294944134,mptcp dss ack 3518599953], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 809:857, ack 2553, win 305, options [nop,nop,TS val 4294943840 ecr 4294944134,mptcp dss ack 3518599953 seq 3576352955 subseq 809 len 48 csum 0xf780], length 48
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 2553:2633, ack 857, win 707, options [nop,nop,TS val 4294944149 ecr 4294943840,mptcp dss ack 3576353003 seq 3518599953 subseq 2553 len 80 csum 0xb0e6], length 80
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 2633, win 305, options [nop,nop,TS val 4294943841 ecr 4294944149,mptcp dss ack 3518600033], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 857:905, ack 2633, win 305, options [nop,nop,TS val 4294943856 ecr 4294944149,mptcp dss ack 3518600033 seq 3576353003 subseq 857 len 48 csum 0x1272], length 48
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 2633:2713, ack 905, win 707, options [nop,nop,TS val 4294944164 ecr 4294943856,mptcp dss ack 3576353051 seq 3518600033 subseq 2633 len 80 csum 0x2521], length 80
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 2713, win 305, options [nop,nop,TS val 4294943856 ecr 4294944164,mptcp dss ack 3518600113], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 905:953, ack 2713, win 305, options [nop,nop,TS val 4294943871 ecr 4294944164,mptcp dss ack 3518600113 seq 3576353051 subseq 905 len 48 csum 0xeb71], length 48
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 2713:2793, ack 953, win 707, options [nop,nop,TS val 4294944179 ecr 4294943871,mptcp dss ack 3576353099 seq 3518600113 subseq 2713 len 80 csum 0xdd08], length 80
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 2793, win 305, options [nop,nop,TS val 4294943871 ecr 4294944179,mptcp dss ack 3518600193], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 953:1001, ack 2793, win 305, options [nop,nop,TS val 4294943887 ecr 4294944179,mptcp dss ack 3518600193 seq 3576353099 subseq 953 len 48 csum 0xf047], length 48
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 2793:2873, ack 1001, win 707, options [nop,nop,TS val 4294944195 ecr 4294943887,mptcp dss ack 3576353147 seq 3518600193 subseq 2793 len 80 csum 0x3967], length 80
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 2873, win 305, options [nop,nop,TS val 4294943887 ecr 4294944195,mptcp dss ack 3518600273], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 1001:1049, ack 2873, win 305, options [nop,nop,TS val 4294944018 ecr 4294944195,mptcp dss ack 3518600273 seq 3576353147 subseq 1001 len 48 csum 0xa43d], length 48
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 2873:2921, ack 1049, win 707, options [nop,nop,TS val 4294944326 ecr 4294944018,mptcp dss ack 3576353195 seq 3518600273 subseq 2873 len 48 csum 0x1c25], length 48
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 2921, win 305, options [nop,nop,TS val 4294944018 ecr 4294944326,mptcp dss ack 3518600321], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 1049:1097, ack 2921, win 305, options [nop,nop,TS val 4294944032 ecr 4294944326,mptcp dss ack 3518600321 seq 3576353195 subseq 1049 len 48 csum 0xebdc], length 48
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 2921:2969, ack 1097, win 707, options [nop,nop,TS val 4294944341 ecr 4294944032,mptcp dss ack 3576353243 seq 3518600321 subseq 2921 len 48 csum 0xf7df], length 48
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 2969, win 305, options [nop,nop,TS val 4294944032 ecr 4294944341,mptcp dss ack 3518600369], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 1097:1145, ack 2969, win 305, options [nop,nop,TS val 4294944037 ecr 4294944341,mptcp dss ack 3518600369 seq 3576353243 subseq 1097 len 48 csum 0xb656], length 48
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 2969:3017, ack 1145, win 707, options [nop,nop,TS val 4294944346 ecr 4294944037,mptcp dss ack 3576353291 seq 3518600369 subseq 2969 len 48 csum 0x73fb], length 48
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 3017, win 305, options [nop,nop,TS val 4294944037 ecr 4294944346,mptcp dss ack 3518600417], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 1145:1193, ack 3017, win 305, options [nop,nop,TS val 4294944056 ecr 4294944346,mptcp dss ack 3518600417 seq 3576353291 subseq 1145 len 48 csum 0x7813], length 48
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 3017:3065, ack 1193, win 707, options [nop,nop,TS val 4294944365 ecr 4294944056,mptcp dss ack 3576353339 seq 3518600417 subseq 3017 len 48 csum 0xa7ff], length 48
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 3065, win 305, options [nop,nop,TS val 4294944056 ecr 4294944365,mptcp dss ack 3518600465], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 1193:1241, ack 3065, win 305, options [nop,nop,TS val 4294944064 ecr 4294944365,mptcp dss ack 3518600465 seq 3576353339 subseq 1193 len 48 csum 0xd43c], length 48
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 3065:3241, ack 1241, win 707, options [nop,nop,TS val 4294944372 ecr 4294944064,mptcp dss ack 3576353387 seq 3518600465 subseq 3065 len 176 csum 0x49a0], length 176
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [P.], seq 3241:3305, ack 1241, win 707, options [nop,nop,TS val 4294944372 ecr 4294944064,mptcp dss ack 3576353387 seq 3518600641 subseq 3241 len 64 csum 0x2541], length 64
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 3241, win 310, options [nop,nop,TS val 4294944064 ecr 4294944372,mptcp dss ack 3518600641], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 3305, win 310, options [nop,nop,TS val 4294944064 ecr 4294944372,mptcp dss ack 3518600705], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 1241:1273, ack 3305, win 310, options [nop,nop,TS val 4294944064 ecr 4294944372,mptcp dss ack 3518600705 seq 3576353387 subseq 1241 len 32 csum 0xec34], length 32
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [P.], seq 1273:1337, ack 3305, win 310, options [nop,nop,TS val 4294944064 ecr 4294944372,mptcp dss ack 3518600705 seq 3576353419 subseq 1273 len 64 csum 0x3f93], length 64
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [.], ack 1337, win 707, options [nop,nop,TS val 4294944372 ecr 4294944064,mptcp dss ack 3576353483], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 3305, win 310, options [nop,nop,TS val 4294944064 ecr 4294944372,mptcp dss fin ack 3518600705 seq 3576353483 subseq 0 len 1 csum 0xa51], length 0
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [.], ack 1337, win 707, options [nop,nop,TS val 4294944372 ecr 4294944064,mptcp dss fin ack 3576353484 seq 3518600705 subseq 0 len 1 csum 0xbe46], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [F.], seq 1337, ack 3305, win 310, options [nop,nop,TS val 4294944066 ecr 4294944372,mptcp dss ack 3518600705], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 3305, win 310, options [nop,nop,TS val 4294944066 ecr 4294944372,mptcp dss ack 3518600706], length 0
+IP 10.1.2.2.22 > 10.2.1.2.41221: Flags [F.], seq 3305, ack 1338, win 707, options [nop,nop,TS val 4294944372 ecr 4294944066,mptcp dss ack 3576353484], length 0
+IP 10.2.1.2.41221 > 10.1.2.2.22: Flags [.], ack 3306, win 310, options [nop,nop,TS val 4294944066 ecr 4294944372,mptcp dss ack 3518600706], length 0
--- /dev/null
+MS NLB heartbeat, host priority: 2, cluster IP: 192.168.100.80, host IP: 192.168.100.82
+MS NLB heartbeat, host priority: 1, cluster IP: 192.168.100.80, host IP: 192.168.100.81
--- /dev/null
+[|MS NLB]
+[|MS NLB]
--- /dev/null
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 134
+ port-role Root, CIST root-id 0000.00:1f:27:b4:7d:80, CIST ext-pathcost 200000
+ CIST regional-root-id 8000.00:16:46:b5:8c:80, CIST port-id 8012,
+ message-age 1.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 96, MCID Name Brewery, rev 0,
+ digest 9357ebb7a8d74dd5fef4f2bab50531aa, CIST int-root-pathcost 200000,
+ CIST bridge-id 8000.00:1e:f7:05:a8:80, CIST remaining-hops 20
+ MSTI 1, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Designated
+ MSTI regional-root-id 6001.00:1e:f7:05:a8:80, pathcost 0
+ MSTI bridge-prio 6, port-prio 8, hops 20
+ MSTI 2, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Root
+ MSTI regional-root-id 8002.00:16:46:b5:8c:80, pathcost 200000
+ MSTI bridge-prio 8, port-prio 8, hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward, Agreement], length 134
+ port-role Designated, CIST root-id 0000.00:1f:27:b4:7d:80, CIST ext-pathcost 200000
+ CIST regional-root-id 8000.00:16:46:b5:8c:80, CIST port-id 800f,
+ message-age 1.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 96, MCID Name Brewery, rev 0,
+ digest 9357ebb7a8d74dd5fef4f2bab50531aa, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.00:16:46:b5:8c:80, CIST remaining-hops 20
+ MSTI 1, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Root
+ MSTI regional-root-id 6001.00:1e:f7:05:a8:80, pathcost 200000
+ MSTI bridge-prio 8, port-prio 8, hops 20
+ MSTI 2, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Designated
+ MSTI regional-root-id 8002.00:16:46:b5:8c:80, pathcost 0
+ MSTI bridge-prio 8, port-prio 8, hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 134
+ port-role Root, CIST root-id 0000.00:1f:27:b4:7d:80, CIST ext-pathcost 200000
+ CIST regional-root-id 8000.00:16:46:b5:8c:80, CIST port-id 8012,
+ message-age 1.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 96, MCID Name Brewery, rev 0,
+ digest 9357ebb7a8d74dd5fef4f2bab50531aa, CIST int-root-pathcost 200000,
+ CIST bridge-id 8000.00:1e:f7:05:a8:80, CIST remaining-hops 20
+ MSTI 1, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Designated
+ MSTI regional-root-id 6001.00:1e:f7:05:a8:80, pathcost 0
+ MSTI bridge-prio 6, port-prio 8, hops 20
+ MSTI 2, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Root
+ MSTI regional-root-id 8002.00:16:46:b5:8c:80, pathcost 200000
+ MSTI bridge-prio 8, port-prio 8, hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward, Agreement], length 134
+ port-role Designated, CIST root-id 0000.00:1f:27:b4:7d:80, CIST ext-pathcost 200000
+ CIST regional-root-id 8000.00:16:46:b5:8c:80, CIST port-id 800f,
+ message-age 1.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 96, MCID Name Brewery, rev 0,
+ digest 9357ebb7a8d74dd5fef4f2bab50531aa, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.00:16:46:b5:8c:80, CIST remaining-hops 20
+ MSTI 1, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Root
+ MSTI regional-root-id 6001.00:1e:f7:05:a8:80, pathcost 200000
+ MSTI bridge-prio 8, port-prio 8, hops 20
+ MSTI 2, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Designated
+ MSTI regional-root-id 8002.00:16:46:b5:8c:80, pathcost 0
+ MSTI bridge-prio 8, port-prio 8, hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 134
+ port-role Root, CIST root-id 0000.00:1f:27:b4:7d:80, CIST ext-pathcost 200000
+ CIST regional-root-id 8000.00:16:46:b5:8c:80, CIST port-id 8012,
+ message-age 1.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 96, MCID Name Brewery, rev 0,
+ digest 9357ebb7a8d74dd5fef4f2bab50531aa, CIST int-root-pathcost 200000,
+ CIST bridge-id 8000.00:1e:f7:05:a8:80, CIST remaining-hops 20
+ MSTI 1, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Designated
+ MSTI regional-root-id 6001.00:1e:f7:05:a8:80, pathcost 0
+ MSTI bridge-prio 6, port-prio 8, hops 20
+ MSTI 2, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Root
+ MSTI regional-root-id 8002.00:16:46:b5:8c:80, pathcost 200000
+ MSTI bridge-prio 8, port-prio 8, hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward, Agreement], length 134
+ port-role Designated, CIST root-id 0000.00:1f:27:b4:7d:80, CIST ext-pathcost 200000
+ CIST regional-root-id 8000.00:16:46:b5:8c:80, CIST port-id 800f,
+ message-age 1.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 96, MCID Name Brewery, rev 0,
+ digest 9357ebb7a8d74dd5fef4f2bab50531aa, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.00:16:46:b5:8c:80, CIST remaining-hops 20
+ MSTI 1, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Root
+ MSTI regional-root-id 6001.00:1e:f7:05:a8:80, pathcost 200000
+ MSTI bridge-prio 8, port-prio 8, hops 20
+ MSTI 2, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Designated
+ MSTI regional-root-id 8002.00:16:46:b5:8c:80, pathcost 0
+ MSTI bridge-prio 8, port-prio 8, hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 134
+ port-role Root, CIST root-id 0000.00:1f:27:b4:7d:80, CIST ext-pathcost 200000
+ CIST regional-root-id 8000.00:16:46:b5:8c:80, CIST port-id 8012,
+ message-age 1.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 96, MCID Name Brewery, rev 0,
+ digest 9357ebb7a8d74dd5fef4f2bab50531aa, CIST int-root-pathcost 200000,
+ CIST bridge-id 8000.00:1e:f7:05:a8:80, CIST remaining-hops 20
+ MSTI 1, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Designated
+ MSTI regional-root-id 6001.00:1e:f7:05:a8:80, pathcost 0
+ MSTI bridge-prio 6, port-prio 8, hops 20
+ MSTI 2, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Root
+ MSTI regional-root-id 8002.00:16:46:b5:8c:80, pathcost 200000
+ MSTI bridge-prio 8, port-prio 8, hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward, Agreement], length 134
+ port-role Designated, CIST root-id 0000.00:1f:27:b4:7d:80, CIST ext-pathcost 200000
+ CIST regional-root-id 8000.00:16:46:b5:8c:80, CIST port-id 800f,
+ message-age 1.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 96, MCID Name Brewery, rev 0,
+ digest 9357ebb7a8d74dd5fef4f2bab50531aa, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.00:16:46:b5:8c:80, CIST remaining-hops 20
+ MSTI 1, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Root
+ MSTI regional-root-id 6001.00:1e:f7:05:a8:80, pathcost 200000
+ MSTI bridge-prio 8, port-prio 8, hops 20
+ MSTI 2, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Designated
+ MSTI regional-root-id 8002.00:16:46:b5:8c:80, pathcost 0
+ MSTI bridge-prio 8, port-prio 8, hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward], length 134
+ port-role Root, CIST root-id 0000.00:1f:27:b4:7d:80, CIST ext-pathcost 200000
+ CIST regional-root-id 8000.00:16:46:b5:8c:80, CIST port-id 8012,
+ message-age 1.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 96, MCID Name Brewery, rev 0,
+ digest 9357ebb7a8d74dd5fef4f2bab50531aa, CIST int-root-pathcost 200000,
+ CIST bridge-id 8000.00:1e:f7:05:a8:80, CIST remaining-hops 20
+ MSTI 1, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Designated
+ MSTI regional-root-id 6001.00:1e:f7:05:a8:80, pathcost 0
+ MSTI bridge-prio 6, port-prio 8, hops 20
+ MSTI 2, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Root
+ MSTI regional-root-id 8002.00:16:46:b5:8c:80, pathcost 200000
+ MSTI bridge-prio 8, port-prio 8, hops 20
+STP 802.1s, Rapid STP, CIST Flags [Learn, Forward, Agreement], length 134
+ port-role Designated, CIST root-id 0000.00:1f:27:b4:7d:80, CIST ext-pathcost 200000
+ CIST regional-root-id 8000.00:16:46:b5:8c:80, CIST port-id 800f,
+ message-age 1.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 96, MCID Name Brewery, rev 0,
+ digest 9357ebb7a8d74dd5fef4f2bab50531aa, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.00:16:46:b5:8c:80, CIST remaining-hops 20
+ MSTI 1, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Root
+ MSTI regional-root-id 6001.00:1e:f7:05:a8:80, pathcost 200000
+ MSTI bridge-prio 8, port-prio 8, hops 20
+ MSTI 2, Flags [Learn, Forward, Agreement, Topology change ACK], port-role Designated
+ MSTI regional-root-id 8002.00:16:46:b5:8c:80, pathcost 0
+ MSTI bridge-prio 8, port-prio 8, hops 20
--- /dev/null
+IP 10.0.0.5 > 172.16.20.1: mtrace 7: 172.16.40.1 to 172.16.20.1 reply-to 172.16.40.1
+IP 10.0.0.6 > 10.0.0.5: mtrace 7: 172.16.40.1 to 172.16.20.1 reply-to 172.16.40.1
--- /dev/null
+version 0, resource ID 20, family IPv4 (2), length 180: 74.82.42.42.53 > 10.0.0.20.42585: 17265 1/0/0 A 93.184.216.119 (45)
+version 0, resource ID 20, family IPv4 (2), length 192: 74.82.42.42.53 > 10.0.0.20.45190: 52954 1/0/0 AAAA 2606:2800:220:6d:26bf:1447:1097:aa7 (57)
+version 0, resource ID 20, family IPv4 (2), length 184: 74.82.42.42.53 > 10.0.0.20.44031: 8279 1/0/0 A 93.184.216.119 (49)
+version 0, resource ID 20, family IPv4 (2), length 196: 74.82.42.42.53 > 10.0.0.20.48736: 2122 1/0/0 AAAA 2606:2800:220:6d:26bf:1447:1097:aa7 (61)
--- /dev/null
+#!/bin/sh
+
+# NFLOG support depends on both DLT_NFLOG and working <pcap/nflog.h>
+
+if grep '^#define HAVE_PCAP_NFLOG_H 1$' ../config.h >/dev/null
+then
+ ./TESTonce nflog-e nflog.pcap nflog-e.out '-t -e'
+else
+ printf ' %-30s: TEST SKIPPED (compiled w/o NFLOG)\n' 'nflog-e'
+fi
--- /dev/null
+IP (tos 0x0, ttl 64, id 53965, offset 0, flags [DF], proto TCP (6), length 104)
+ 10.0.0.80.6633 > 86.139.225.177.57145: Flags [P.], cksum 0xddb3 (correct), seq 3804035784:3804035836, ack 3936946676, win 136, options [nop,nop,TS val 256259488 ecr 12980962], length 52: OpenFlow
+ version 1.0, type VENDOR, length 24, xid 0x00000018, vendor 0x005c16c7 (Big Switch Networks)
+ subtype GET_IP_MASK_REQUEST, index 0
+ version 1.0, type VENDOR, length 20, xid 0x00000019, vendor 0x005c16c7 (Big Switch Networks)
+ subtype GET_MIRRORING_REQUEST, report_mirror_ports OFF
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x0000001a
+IP (tos 0x0, ttl 44, id 2943, offset 0, flags [DF], proto TCP (6), length 76)
+ 86.139.225.177.57145 > 10.0.0.80.6633: Flags [P.], cksum 0xf75f (correct), seq 1:25, ack 52, win 54, options [nop,nop,TS val 12980987 ecr 256259488], length 24: OpenFlow
+ version 1.0, type VENDOR, length 24, xid 0x00000018, vendor 0x005c16c7 (Big Switch Networks)
+ subtype GET_IP_MASK_REPLY, index 0, mask 255.255.255.255
+IP (tos 0x0, ttl 64, id 53966, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.80.6633 > 86.139.225.177.57145: Flags [.], cksum 0x42b3 (incorrect -> 0x0ee3), ack 25, win 136, options [nop,nop,TS val 256259628 ecr 12980987], length 0
+IP (tos 0x0, ttl 44, id 2944, offset 0, flags [DF], proto TCP (6), length 80)
+ 86.139.225.177.57145 > 10.0.0.80.6633: Flags [P.], cksum 0xf55e (correct), seq 25:53, ack 52, win 54, options [nop,nop,TS val 12981023 ecr 256259628], length 28: OpenFlow
+ version 1.0, type VENDOR, length 20, xid 0x00000019, vendor 0x005c16c7 (Big Switch Networks)
+ subtype GET_MIRRORING_REPLY, report_mirror_ports OFF
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x0000001a
--- /dev/null
+IP (tos 0x0, ttl 55, id 5483, offset 0, flags [DF], proto TCP (6), length 60)
+ 88.150.169.52.37044 > 109.74.202.168.6653: Flags [S], cksum 0x0576 (correct), seq 1216143989, win 14600, options [mss 1460,sackOK,TS val 50525982 ecr 0,nop,wscale 7], length 0
+IP (tos 0x0, ttl 64, id 26571, offset 0, flags [DF], proto TCP (6), length 40)
+ 109.74.202.168.6653 > 88.150.169.52.37044: Flags [R.], cksum 0xa06e (correct), seq 0, ack 1216143990, win 0, length 0
+IP (tos 0x0, ttl 55, id 49495, offset 0, flags [DF], proto TCP (6), length 60)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [S], cksum 0x4629 (correct), seq 774256709, win 14600, options [mss 1460,sackOK,TS val 50526482 ecr 0,nop,wscale 7], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [S.], cksum 0x39ec (incorrect -> 0x0c04), seq 3422281440, ack 774256710, win 28960, options [mss 1460,sackOK,TS val 590230513 ecr 50526482,nop,wscale 7], length 0
+IP (tos 0x0, ttl 55, id 49496, offset 0, flags [DF], proto TCP (6), length 52)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [.], cksum 0xab7c (correct), seq 1, ack 1, win 115, options [nop,nop,TS val 50526483 ecr 590230513], length 0
+IP (tos 0x0, ttl 64, id 60691, offset 0, flags [DF], proto TCP (6), length 60)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x39ec (incorrect -> 0xa9f0), seq 1:9, ack 1, win 227, options [nop,nop,TS val 590230516 ecr 50526483], length 8: OpenFlow
+ version 1.0, type HELLO, length 8, xid 0x00000001
+IP (tos 0x0, ttl 55, id 49497, offset 0, flags [DF], proto TCP (6), length 52)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [.], cksum 0xab6e (correct), seq 1, ack 9, win 115, options [nop,nop,TS val 50526486 ecr 590230516], length 0
+IP (tos 0x0, ttl 55, id 49498, offset 0, flags [DF], proto TCP (6), length 60)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0x7b45 (correct), seq 1:9, ack 9, win 115, options [nop,nop,TS val 50526732 ecr 590230516], length 8: OpenFlow
+ version 1.0, type HELLO, length 8, xid 0x00002e1b
+IP (tos 0x0, ttl 64, id 60692, offset 0, flags [DF], proto TCP (6), length 52)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [.], cksum 0x39e4 (incorrect -> 0xa8d7), seq 9, ack 9, win 227, options [nop,nop,TS val 590230813 ecr 50526732], length 0
+IP (tos 0x0, ttl 64, id 60693, offset 0, flags [DF], proto TCP (6), length 60)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x39ec (incorrect -> 0xa7b8), seq 9:17, ack 9, win 227, options [nop,nop,TS val 590230813 ecr 50526732], length 8: OpenFlow
+ version 1.0, type FEATURES_REQUEST, length 8, xid 0x00000002
+IP (tos 0x0, ttl 55, id 49499, offset 0, flags [DF], proto TCP (6), length 52)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [.], cksum 0xa93e (correct), seq 9, ack 17, win 115, options [nop,nop,TS val 50526733 ecr 590230813], length 0
+IP (tos 0x0, ttl 55, id 49500, offset 0, flags [DF], proto TCP (6), length 468)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0xff61 (correct), seq 9:425, ack 17, win 115, options [nop,nop,TS val 50526733 ecr 590230813], length 416: OpenFlow
+ version 1.0, type FEATURES_REPLY, length 416, xid 0x00000002
+ dpid 0x0000001c737d280f, n_buffers 0, n_tables 1
+ capabilities 0x000000c7 (FLOW_STATS, TABLE_STATS, PORT_STATS, QUEUE_STATS, ARP_MATCH_IP)
+ actions 0x00000905 (OUTPUT, SET_VLAN_PCP, SET_NW_TOS, ENQUEUE)
+ port_no 16, hw_addr 00:1c:73:7d:28:1f, name 'Ethernet16'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000c40 (10GB_FD, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 20, hw_addr 00:1c:73:7d:28:23, name 'Ethernet20'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000c40 (10GB_FD, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 18, hw_addr 00:1c:73:7d:28:21, name 'Ethernet18'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000c40 (10GB_FD, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 22, hw_addr 00:1c:73:7d:28:25, name 'Ethernet22'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000c40 (10GB_FD, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 17, hw_addr 00:1c:73:7d:28:20, name 'Ethernet17'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000cc0 (10GB_FD, COPPER, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 21, hw_addr 00:1c:73:7d:28:24, name 'Ethernet21'
+ config 0x80000001 (PORT_DOWN) (bogus)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000cc0 (10GB_FD, COPPER, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 19, hw_addr 00:1c:73:7d:28:22, name 'Ethernet19'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000c40 (10GB_FD, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 23, hw_addr 00:1c:73:7d:28:26, name 'Ethernet23'
+ config 0x80000001 (PORT_DOWN) (bogus)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000c40 (10GB_FD, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+IP (tos 0x0, ttl 64, id 60694, offset 0, flags [DF], proto TCP (6), length 136)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x3a38 (incorrect -> 0xa414), seq 17:101, ack 425, win 235, options [nop,nop,TS val 590230815 ecr 50526733], length 84: OpenFlow
+ version 1.0, type SET_CONFIG, length 12, xid 0x00000003
+ flags FRAG_NORMAL, miss_send_len 65535
+ version 1.0, type FLOW_MOD, length 72, xid 0x00000004
+ cookie 0x0000000000000000, command DELETE, out_port NONE, flags 0x0000
+IP (tos 0x0, ttl 64, id 60695, offset 0, flags [DF], proto TCP (6), length 60)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x39ec (incorrect -> 0xa5a0), seq 101:109, ack 425, win 235, options [nop,nop,TS val 590230816 ecr 50526733], length 8: OpenFlow
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000005
+IP (tos 0x0, ttl 55, id 49501, offset 0, flags [DF], proto TCP (6), length 140)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0x8297 (correct), seq 425:513, ack 109, win 115, options [nop,nop,TS val 50526735 ecr 590230815], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000ffd
+ match in_port 16
+ cookie 0x0000000000000001, priority 33000, reason DELETE, duration_sec 53, duration_nsec 990000000, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 60696, offset 0, flags [DF], proto TCP (6), length 52)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [.], cksum 0x39e4 (incorrect -> 0xa661), seq 109, ack 513, win 235, options [nop,nop,TS val 590230828 ecr 50526735], length 0
+IP (tos 0x0, ttl 55, id 49502, offset 0, flags [DF], proto TCP (6), length 236)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0x6fdb (correct), seq 513:697, ack 109, win 115, options [nop,nop,TS val 50526745 ecr 590230828], length 184: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000ffe
+ match in_port 18
+ cookie 0x0000000000000002, priority 31000, reason DELETE, duration_sec 53, duration_nsec 990000000, packet_count 0, byte_count 0
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000fff
+ match in_port 22
+ cookie 0x0000000000000003, priority 30000, reason DELETE, duration_sec 53, duration_nsec 990000000, packet_count 0, byte_count 0
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000005
+IP (tos 0x0, ttl 64, id 60697, offset 0, flags [DF], proto TCP (6), length 52)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [.], cksum 0x39e4 (incorrect -> 0xa596), seq 109, ack 697, win 243, options [nop,nop,TS val 590230829 ecr 50526745], length 0
+IP (tos 0x0, ttl 64, id 60698, offset 0, flags [DF], proto TCP (6), length 140)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x3a3c (incorrect -> 0x41fa), seq 109:197, ack 697, win 243, options [nop,nop,TS val 590230829 ecr 50526745], length 88: OpenFlow
+ version 1.0, type VENDOR, length 20, xid 0x00000006, vendor 0x005c16c7 (Big Switch Networks)
+ subtype SET_MIRRORING, report_mirror_ports ON
+ version 1.0, type VENDOR, length 20, xid 0x00000007, vendor 0x005c16c7 (Big Switch Networks)
+ subtype GET_MIRRORING_REQUEST, report_mirror_ports OFF
+ version 1.0, type VENDOR, length 20, xid 0x00000008, vendor 0x005c16c7 (Big Switch Networks)
+ subtype SET_MIRRORING, report_mirror_ports OFF
+ version 1.0, type VENDOR, length 20, xid 0x00000009, vendor 0x005c16c7 (Big Switch Networks)
+ subtype GET_MIRRORING_REQUEST, report_mirror_ports OFF
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x0000000a
+IP (tos 0x0, ttl 55, id 49503, offset 0, flags [DF], proto TCP (6), length 72)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0x8c59 (correct), seq 697:717, ack 197, win 115, options [nop,nop,TS val 50526747 ecr 590230829], length 20: OpenFlow
+ version 1.0, type VENDOR, length 20, xid 0x00000007, vendor 0x005c16c7 (Big Switch Networks)
+ subtype GET_MIRRORING_REPLY, report_mirror_ports ON
+IP (tos 0x0, ttl 64, id 60699, offset 0, flags [DF], proto TCP (6), length 52)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [.], cksum 0x39e4 (incorrect -> 0xa51a), seq 197, ack 717, win 243, options [nop,nop,TS val 590230843 ecr 50526747], length 0
+IP (tos 0x0, ttl 55, id 49504, offset 0, flags [DF], proto TCP (6), length 80)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0x8bfd (correct), seq 717:745, ack 197, win 115, options [nop,nop,TS val 50526758 ecr 590230843], length 28: OpenFlow
+ version 1.0, type VENDOR, length 20, xid 0x00000009, vendor 0x005c16c7 (Big Switch Networks)
+ subtype GET_MIRRORING_REPLY, report_mirror_ports OFF
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x0000000a
+IP (tos 0x0, ttl 64, id 60700, offset 0, flags [DF], proto TCP (6), length 52)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [.], cksum 0x39e4 (incorrect -> 0xa4f3), seq 197, ack 745, win 243, options [nop,nop,TS val 590230843 ecr 50526758], length 0
+IP (tos 0x0, ttl 64, id 60701, offset 0, flags [DF], proto TCP (6), length 80)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x3a00 (incorrect -> 0xa165), seq 197:225, ack 745, win 243, options [nop,nop,TS val 590230843 ecr 50526758], length 28: OpenFlow
+ version 1.0, type FEATURES_REQUEST, length 8, xid 0x0000000b
+ version 1.0, type STATS_REQUEST, length 12, xid 0x0000000c
+ type TABLE, flags 0x0000
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x0000000d
+IP (tos 0x0, ttl 55, id 49505, offset 0, flags [DF], proto TCP (6), length 468)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0xfb70 (correct), seq 745:1161, ack 225, win 115, options [nop,nop,TS val 50526759 ecr 590230843], length 416: OpenFlow
+ version 1.0, type FEATURES_REPLY, length 416, xid 0x0000000b
+ dpid 0x0000001c737d280f, n_buffers 0, n_tables 1
+ capabilities 0x000000c7 (FLOW_STATS, TABLE_STATS, PORT_STATS, QUEUE_STATS, ARP_MATCH_IP)
+ actions 0x00000905 (OUTPUT, SET_VLAN_PCP, SET_NW_TOS, ENQUEUE)
+ port_no 16, hw_addr 00:1c:73:7d:28:1f, name 'Ethernet16'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000c40 (10GB_FD, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 20, hw_addr 00:1c:73:7d:28:23, name 'Ethernet20'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000c40 (10GB_FD, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 18, hw_addr 00:1c:73:7d:28:21, name 'Ethernet18'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000c40 (10GB_FD, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 22, hw_addr 00:1c:73:7d:28:25, name 'Ethernet22'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000c40 (10GB_FD, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 17, hw_addr 00:1c:73:7d:28:20, name 'Ethernet17'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000cc0 (10GB_FD, COPPER, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 21, hw_addr 00:1c:73:7d:28:24, name 'Ethernet21'
+ config 0x80000001 (PORT_DOWN) (bogus)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000cc0 (10GB_FD, COPPER, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 19, hw_addr 00:1c:73:7d:28:22, name 'Ethernet19'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000c40 (10GB_FD, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 23, hw_addr 00:1c:73:7d:28:26, name 'Ethernet23'
+ config 0x80000001 (PORT_DOWN) (bogus)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000040 (10GB_FD)
+ advertised 0x00000000
+ supported 0x00000c40 (10GB_FD, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+IP (tos 0x0, ttl 64, id 60702, offset 0, flags [DF], proto TCP (6), length 52)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [.], cksum 0x39e4 (incorrect -> 0xa320), seq 225, ack 1161, win 252, options [nop,nop,TS val 590230856 ecr 50526759], length 0
+IP (tos 0x0, ttl 55, id 49506, offset 0, flags [DF], proto TCP (6), length 136)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0x4ea6 (correct), seq 1161:1245, ack 225, win 115, options [nop,nop,TS val 50526769 ecr 590230856], length 84: OpenFlow
+ version 1.0, type STATS_REPLY, length 76, xid 0x0000000c
+ type TABLE, flags 0x0000
+ table_id 0, name 'Table 0'
+ wildcards 0x003fffff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 1500, active_count 0, lookup_count 0, matched_count 0
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x0000000d
+IP (tos 0x0, ttl 64, id 60703, offset 0, flags [DF], proto TCP (6), length 52)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [.], cksum 0x39e4 (incorrect -> 0xa2c1), seq 225, ack 1245, win 252, options [nop,nop,TS val 590230857 ecr 50526769], length 0
+IP (tos 0x0, ttl 64, id 60704, offset 0, flags [DF], proto TCP (6), length 60)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x39ec (incorrect -> 0xa189), seq 225:233, ack 1245, win 252, options [nop,nop,TS val 590230857 ecr 50526769], length 8: OpenFlow
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x0000000e
+IP (tos 0x0, ttl 55, id 49507, offset 0, flags [DF], proto TCP (6), length 60)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0xa208 (correct), seq 1245:1253, ack 233, win 115, options [nop,nop,TS val 50526770 ecr 590230857], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x0000000e
+IP (tos 0x0, ttl 64, id 60705, offset 0, flags [DF], proto TCP (6), length 60)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x39ec (incorrect -> 0xa176), seq 233:241, ack 1253, win 252, options [nop,nop,TS val 590230858 ecr 50526770], length 8: OpenFlow
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x0000000f
+IP (tos 0x0, ttl 55, id 49508, offset 0, flags [DF], proto TCP (6), length 60)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0xa1f5 (correct), seq 1253:1261, ack 241, win 115, options [nop,nop,TS val 50526771 ecr 590230858], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x0000000f
+IP (tos 0x0, ttl 64, id 60706, offset 0, flags [DF], proto TCP (6), length 60)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x39ec (incorrect -> 0xa163), seq 241:249, ack 1261, win 252, options [nop,nop,TS val 590230859 ecr 50526771], length 8: OpenFlow
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000010
+IP (tos 0x0, ttl 55, id 49509, offset 0, flags [DF], proto TCP (6), length 60)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0xa1e3 (correct), seq 1261:1269, ack 249, win 115, options [nop,nop,TS val 50526771 ecr 590230859], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000010
+IP (tos 0x0, ttl 64, id 60707, offset 0, flags [DF], proto TCP (6), length 60)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x39ec (incorrect -> 0xa151), seq 249:257, ack 1269, win 252, options [nop,nop,TS val 590230860 ecr 50526771], length 8: OpenFlow
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000011
+IP (tos 0x0, ttl 55, id 49510, offset 0, flags [DF], proto TCP (6), length 60)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0xa1d0 (correct), seq 1269:1277, ack 257, win 115, options [nop,nop,TS val 50526772 ecr 590230860], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000011
+IP (tos 0x0, ttl 64, id 60708, offset 0, flags [DF], proto TCP (6), length 60)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x39ec (incorrect -> 0xa13e), seq 257:265, ack 1277, win 252, options [nop,nop,TS val 590230861 ecr 50526772], length 8: OpenFlow
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000012
+IP (tos 0x0, ttl 55, id 49511, offset 0, flags [DF], proto TCP (6), length 60)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0xa1bd (correct), seq 1277:1285, ack 265, win 115, options [nop,nop,TS val 50526773 ecr 590230861], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000012
+IP (tos 0x0, ttl 64, id 60709, offset 0, flags [DF], proto TCP (6), length 60)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x39ec (incorrect -> 0xa12b), seq 265:273, ack 1285, win 252, options [nop,nop,TS val 590230862 ecr 50526773], length 8: OpenFlow
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000013
+IP (tos 0x0, ttl 55, id 49512, offset 0, flags [DF], proto TCP (6), length 60)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0xa1aa (correct), seq 1285:1293, ack 273, win 115, options [nop,nop,TS val 50526774 ecr 590230862], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000013
+IP (tos 0x0, ttl 64, id 60710, offset 0, flags [DF], proto TCP (6), length 120)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x3a28 (incorrect -> 0x9a6c), seq 273:341, ack 1293, win 252, options [nop,nop,TS val 590230863 ecr 50526774], length 68: OpenFlow
+ version 1.0, type QUEUE_GET_CONFIG_REQUEST, length 12, xid 0x00000014
+ port_no 16
+ version 1.0, type QUEUE_GET_CONFIG_REQUEST, length 12, xid 0x00000015
+ port_no 20
+ version 1.0, type QUEUE_GET_CONFIG_REQUEST, length 12, xid 0x00000016
+ port_no 18
+ version 1.0, type QUEUE_GET_CONFIG_REQUEST, length 12, xid 0x00000017
+ port_no 22
+ version 1.0, type QUEUE_GET_CONFIG_REQUEST, length 12, xid 0x00000018
+ port_no 17
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000019
+IP (tos 0x0, ttl 55, id 49513, offset 0, flags [DF], proto TCP (6), length 68)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0xa139 (correct), seq 1293:1309, ack 341, win 115, options [nop,nop,TS val 50526775 ecr 590230863], length 16: OpenFlow
+ version 1.0, type QUEUE_GET_CONFIG_REPLY, length 16, xid 0x00000014
+ port_no 16
+IP (tos 0x0, ttl 64, id 60711, offset 0, flags [DF], proto TCP (6), length 52)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [.], cksum 0x39e4 (incorrect -> 0xa1f5), seq 341, ack 1309, win 252, options [nop,nop,TS val 590230875 ecr 50526775], length 0
+IP (tos 0x0, ttl 55, id 49514, offset 0, flags [DF], proto TCP (6), length 124)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0x9bb5 (correct), seq 1309:1381, ack 341, win 115, options [nop,nop,TS val 50526785 ecr 590230875], length 72: OpenFlow
+ version 1.0, type QUEUE_GET_CONFIG_REPLY, length 16, xid 0x00000015
+ port_no 20
+ version 1.0, type QUEUE_GET_CONFIG_REPLY, length 16, xid 0x00000016
+ port_no 18
+ version 1.0, type QUEUE_GET_CONFIG_REPLY, length 16, xid 0x00000017
+ port_no 22
+ version 1.0, type QUEUE_GET_CONFIG_REPLY, length 16, xid 0x00000018
+ port_no 17
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000019
+IP (tos 0x0, ttl 64, id 60712, offset 0, flags [DF], proto TCP (6), length 52)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [.], cksum 0x39e4 (incorrect -> 0xa1a3), seq 341, ack 1381, win 252, options [nop,nop,TS val 590230875 ecr 50526785], length 0
+IP (tos 0x0, ttl 64, id 60713, offset 0, flags [DF], proto TCP (6), length 562)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x3be2 (incorrect -> 0x4d80), seq 341:851, ack 1381, win 252, options [nop,nop,TS val 590230876 ecr 50526785], length 510: OpenFlow
+ version 1.0, type VENDOR, length 24, xid 0x0000001a, vendor 0x005c16c7 (Big Switch Networks)
+ subtype SET_IP_MASK, index 1, mask 255.0.14.0
+ version 1.0, type VENDOR, length 24, xid 0x0000001b, vendor 0x005c16c7 (Big Switch Networks)
+ subtype SET_IP_MASK, index 2, mask 255.0.28.0
+ version 1.0, type VENDOR, length 24, xid 0x0000001c, vendor 0x005c16c7 (Big Switch Networks)
+ subtype SET_IP_MASK, index 3, mask 255.0.56.0
+ version 1.0, type VENDOR, length 24, xid 0x0000001d, vendor 0x005c16c7 (Big Switch Networks)
+ subtype SET_IP_MASK, index 4, mask 255.0.112.0
+ version 1.0, type VENDOR, length 24, xid 0x0000001e, vendor 0x005c16c7 (Big Switch Networks)
+ subtype SET_IP_MASK, index 5, mask 255.0.224.0
+ version 1.0, type VENDOR, length 24, xid 0x0000001f, vendor 0x005c16c7 (Big Switch Networks)
+ subtype GET_IP_MASK_REQUEST, index 3
+ version 1.0, type VENDOR, length 30, xid 0x00000020, vendor 0x005c16c7 (Big Switch Networks)
+ subtype SHELL_COMMAND, service 0, data 'show clock'
+ version 1.0, type FLOW_MOD, length 104, xid 0x00000021
+ match in_port 16
+ cookie 0x0000000000000001, command ADD, priority 33000, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type VENDOR, len 24, vendor 0x005c16c7 (Big Switch Networks)
+ subtype MIRROR, dest_port 21, vlan_tag none, copy_stage INGRESS
+ action type OUTPUT, len 8, port 17
+ version 1.0, type FLOW_MOD, length 128, xid 0x00000022
+ match in_port 18
+ cookie 0x0000000000000002, command ADD, priority 31000, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type VENDOR, len 24, vendor 0x005c16c7 (Big Switch Networks)
+ subtype MIRROR, dest_port 21, vlan_tag 802.1Q (vlan 2, p 4), copy_stage INGRESS
+ action type OUTPUT, len 8, port 19
+ action type VENDOR, len 24, vendor 0x005c16c7 (Big Switch Networks)
+ subtype MIRROR, dest_port 23, vlan_tag 802.1Q (vlan 2748, p 5, DEI), copy_stage EGRESS
+ version 1.0, type FLOW_MOD, length 96, xid 0x00000023
+ match in_port 22
+ cookie 0x0000000000000003, command ADD, priority 30000, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type VENDOR, len 24, vendor 0x005c16c7 (Big Switch Networks)
+ subtype MIRROR, dest_port 21, vlan_tag 802.1Q (vlan 0, p 1), copy_stage INGRESS
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000024
+IP (tos 0x0, ttl 55, id 49515, offset 0, flags [DF], proto TCP (6), length 76)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0x4da3 (correct), seq 1381:1405, ack 851, win 123, options [nop,nop,TS val 50526786 ecr 590230876], length 24: OpenFlow
+ version 1.0, type VENDOR, length 24, xid 0x0000001f, vendor 0x005c16c7 (Big Switch Networks)
+ subtype GET_IP_MASK_REPLY, index 3, mask 255.0.56.0
+IP (tos 0x0, ttl 64, id 60714, offset 0, flags [DF], proto TCP (6), length 52)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [.], cksum 0x39e4 (incorrect -> 0x9f7f), seq 851, ack 1405, win 252, options [nop,nop,TS val 590230888 ecr 50526786], length 0
+IP (tos 0x0, ttl 55, id 49516, offset 0, flags [DF], proto TCP (6), length 80)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0x8632 (correct), seq 1405:1433, ack 851, win 123, options [nop,nop,TS val 50526795 ecr 590230888], length 28: OpenFlow
+ version 1.0, type VENDOR, length 20, xid 0x00000020, vendor 0x005c16c7 (Big Switch Networks)
+ subtype SHELL_STATUS, status 0xfffffffe
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000024
+IP (tos 0x0, ttl 64, id 60715, offset 0, flags [DF], proto TCP (6), length 52)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [.], cksum 0x39e4 (incorrect -> 0x9f59), seq 851, ack 1433, win 252, options [nop,nop,TS val 590230889 ecr 50526795], length 0
+IP (tos 0x0, ttl 64, id 60716, offset 0, flags [DF], proto TCP (6), length 60)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [P.], cksum 0x39ec (incorrect -> 0x9e0a), seq 851:859, ack 1433, win 252, options [nop,nop,TS val 590230889 ecr 50526795], length 8: OpenFlow
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000025
+IP (tos 0x0, ttl 55, id 49517, offset 0, flags [DF], proto TCP (6), length 60)
+ 88.150.169.52.4756 > 109.74.202.168.6653: Flags [P.], cksum 0x9e80 (correct), seq 1433:1441, ack 859, win 123, options [nop,nop,TS val 50526797 ecr 590230889], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000025
+IP (tos 0x0, ttl 64, id 60717, offset 0, flags [DF], proto TCP (6), length 52)
+ 109.74.202.168.6653 > 88.150.169.52.4756: Flags [.], cksum 0x39e4 (incorrect -> 0x9f3a), seq 859, ack 1441, win 252, options [nop,nop,TS val 590230902 ecr 50526797], length 0
--- /dev/null
+IP (tos 0x0, ttl 64, id 55495, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [S], cksum 0xa230 (correct), seq 3930397949, win 5840, options [sackOK,TS val 194888762 ecr 0,mss 1460,nop,wscale 5], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [S.], cksum 0x1474 (incorrect -> 0x4253), seq 491620419, ack 3930397950, win 14480, options [mss 1460,sackOK,TS val 220957518 ecr 194888762,nop,wscale 7], length 0
+IP (tos 0x0, ttl 64, id 55496, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [.], cksum 0xa8f8 (correct), seq 1, ack 1, win 183, options [nop,nop,TS val 194888762 ecr 220957518], length 0
+IP (tos 0x0, ttl 64, id 778, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [P.], cksum 0x1474 (incorrect -> 0xa818), seq 1:9, ack 1, win 114, options [nop,nop,TS val 220957530 ecr 194888762], length 8: OpenFlow
+ version 1.0, type HELLO, length 8, xid 0x00000001
+IP (tos 0x0, ttl 64, id 55497, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [.], cksum 0xa8e1 (correct), seq 1, ack 9, win 183, options [nop,nop,TS val 194888765 ecr 220957530], length 0
+IP (tos 0x0, ttl 64, id 55498, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0xa74f (correct), seq 1:9, ack 9, win 183, options [nop,nop,TS val 194888811 ecr 220957530], length 8: OpenFlow
+ version 1.0, type HELLO, length 8, xid 0x0000004c
+IP (tos 0x0, ttl 64, id 779, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0xa839), seq 9, ack 9, win 114, options [nop,nop,TS val 220957713 ecr 194888811], length 0
+IP (tos 0x0, ttl 64, id 780, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [P.], cksum 0x1474 (incorrect -> 0xa719), seq 9:17, ack 9, win 114, options [nop,nop,TS val 220957714 ecr 194888811], length 8: OpenFlow
+ version 1.0, type FEATURES_REQUEST, length 8, xid 0x00000002
+IP (tos 0x0, ttl 64, id 55499, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [.], cksum 0xa7eb (correct), seq 9, ack 17, win 183, options [nop,nop,TS val 194888811 ecr 220957714], length 0
+IP (tos 0x0, ttl 64, id 55500, offset 0, flags [DF], proto TCP (6), length 2628)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x1e7c (incorrect -> 0xae92), seq 9:2585, ack 17, win 183, options [nop,nop,TS val 194889013 ecr 220957714], length 2576: OpenFlow
+ version 1.0, type FEATURES_REPLY, length 2576, xid 0x00000002
+ dpid 0x0000089e0162d5f4, n_buffers 256, n_tables 1
+ capabilities 0x00000087 (FLOW_STATS, TABLE_STATS, PORT_STATS, ARP_MATCH_IP)
+ actions 0x0000003f (OUTPUT, SET_VLAN_VID, SET_VLAN_PCP, STRIP_VLAN, SET_DL_SRC, SET_DL_DST)
+ port_no 42, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/42'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 33, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/33'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 36, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/36'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 31, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/31'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 48, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/48'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 40, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/40'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 1, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/1'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 28, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/28'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 20, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/20'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 10, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/10'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 22, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/22'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 29, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/29'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 44, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/44'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 41, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/41'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 21, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/21'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 16, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/16'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 45, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/45'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 49, hw_addr 08:9e:01:62:d5:f4, name 'te-1/1/49'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x00000020 (1GB_FD)
+ supported 0x00000e60 (1GB_FD, 10GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 38, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/38'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 17, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/17'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 27, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/27'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 51, hw_addr 08:9e:01:62:d5:f4, name 'te-1/1/51'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x00000020 (1GB_FD)
+ supported 0x00000e60 (1GB_FD, 10GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 46, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/46'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 6, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/6'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 50, hw_addr 08:9e:01:62:d5:f4, name 'te-1/1/50'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x00000020 (1GB_FD)
+ supported 0x00000e60 (1GB_FD, 10GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 43, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/43'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 35, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/35'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 19, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/19'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 47, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/47'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 23, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/23'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 25, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/25'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 37, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/37'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 7, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/7'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 26, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/26'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 32, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/32'
+ config 0x00000020 (NO_FWD)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 4, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/4'
+ config 0x00000000
+ state 0x00000000
+ curr 0x00000020 (1GB_FD)
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ port_no 3, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/3'
+ config 0x00000000
+ state 0x00000000
+ curr 0x00000020 (1GB_FD)
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ port_no 18, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/18'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 39, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/39'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 8, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/8'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 2, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/2'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 14, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/14'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 5, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/5'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 30, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/30'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 11, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/11'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 15, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/15'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 52, hw_addr 08:9e:01:62:d5:f4, name 'te-1/1/52'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x00000020 (1GB_FD)
+ supported 0x00000e60 (1GB_FD, 10GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 34, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/34'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 13, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/13'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 12, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/12'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 24, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/24'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no 9, hw_addr 08:9e:01:62:d5:f4, name 'ge-1/1/9'
+ config 0x00000000
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000000
+ advertised 0x0000042f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, PAUSE)
+ supported 0x00000e2f (10MB_HD, 10MB_FD, 100MB_HD, 100MB_FD, 1GB_FD, AUTONEG, PAUSE, PAUSE_ASYM)
+ peer 0x00000000
+ port_no LOCAL, hw_addr 08:9e:01:62:d5:f4, name 'br0'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000082 (10MB_FD, COPPER)
+ advertised 0x00000000
+ supported 0x00000000
+ peer 0x00000000
+IP (tos 0x0, ttl 64, id 781, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x9a07), seq 17, ack 2585, win 154, options [nop,nop,TS val 220958521 ecr 194889013], length 0
+IP (tos 0x0, ttl 64, id 782, offset 0, flags [DF], proto TCP (6), length 136)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [P.], cksum 0x14c0 (incorrect -> 0x96f3), seq 17:101, ack 2585, win 154, options [nop,nop,TS val 220958525 ecr 194889013], length 84: OpenFlow
+ version 1.0, type SET_CONFIG, length 12, xid 0x00000003
+ flags FRAG_NORMAL, miss_send_len 65535
+ version 1.0, type FLOW_MOD, length 72, xid 0x00000004
+ cookie 0x0000000000000000, command DELETE, out_port NONE, flags 0x0000
+IP (tos 0x0, ttl 64, id 55502, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [.], cksum 0x9991 (correct), seq 2585, ack 101, win 183, options [nop,nop,TS val 194889014 ecr 220958525], length 0
+IP (tos 0x0, ttl 64, id 783, offset 0, flags [DF], proto TCP (6), length 1500)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x1a14 (incorrect -> 0xcf68), seq 101:1549, ack 2585, win 154, options [nop,nop,TS val 220958532 ecr 194889014], length 1448: OpenFlow
+ version 1.0, type GET_CONFIG_REQUEST, length 8, xid 0x00000005
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000006
+ match in_port 4
+ cookie 0x0000000000000001, command ADD, priority 54321, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000007
+ match in_port 4
+ cookie 0x0000000000000002, command ADD, priority 54320, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port LOCAL
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000008
+ match in_port 4
+ cookie 0x0000000000000003, command ADD, priority 54319, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port CONTROLLER, max_len 65535
+ version 1.0, type FLOW_MOD, length 88, xid 0x00000009
+ match in_port 4
+ cookie 0x0000000000000004, command ADD, priority 54318, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_VLAN_VID, len 8, vlan_vid 2
+ action type SET_TP_SRC, len 8, tp_port 23
+ version 1.0, type FLOW_MOD, length 80, xid 0x0000000a
+ match in_port 4
+ cookie 0x0000000000000005, command ADD, priority 54317, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_VLAN_PCP, len 8, vlan_pcp 5
+ version 1.0, type FLOW_MOD, length 80, xid 0x0000000b
+ match in_port 4
+ cookie 0x0000000000000006, command ADD, priority 54316, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type STRIP_VLAN, len 8
+ version 1.0, type FLOW_MOD, length 96, xid 0x0000000c
+ match in_port 4
+ cookie 0x0000000000000007, command ADD, priority 54315, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 11:22:33:44:55:66
+ action type SET_NW_SRC, len 8, nw_addr 192.168.72.143
+ version 1.0, type FLOW_MOD, length 96, xid 0x0000000d
+ match in_port 4
+ cookie 0x0000000000000008, command ADD, priority 54314, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_DST, len 16, dl_addr 77:88:99:aa:bb:cc
+ action type SET_NW_DST, len 8, nw_addr 192.168.98.55
+ version 1.0, type FLOW_MOD, length 88, xid 0x0000000e
+ match in_port 4
+ cookie 0x0000000000000009, command ADD, priority 54313, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_NW_TOS, len 8, nw_tos 0x2c
+ action type SET_TP_DST, len 8, tp_port 80
+ version 1.0, type FLOW_MOD, length 88, xid 0x0000000f
+ match in_port 4
+ cookie 0x000000000000000a, command ADD, priority 54312, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type ENQUEUE, len 16, port 1, queue_id 2
+ version 1.0, type FLOW_MOD, length 144, xid 0x00000010
+ match in_port 4
+ cookie 0x000000000000000b, command ADD, priority 54311, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type VENDOR, len 72, vendor 0x00001234 (unknown)
+ data (64 octets)
+ 0x0000: 4469 6420 796f 7520 6b6e 6f77 2076 656e Did.you.know.ven
+ 0x0010: 646f 7220 6163 7469 6f6e 2064 6174 6120 dor.action.data.
+ 0x0020: 6c65 6e67 7468 206d 7573 7420 6265 2061 length.must.be.a
+ 0x0030: 206d 756c 7469 706c 6520 6f66 2020 383f .multiple.of..8?
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000011
+ match in_port 1
+ match dl_src 00:00:00:00:00:01
+ cookie 0x000000000000000c, command ADD, priority 43210, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 5
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000012
+ match dl_vlan 100
+ match dl_vlan_pcp 4
+ match dl_type 0x8100
+ cookie 0x000000000000000d, command ADD, priority 43209, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 5
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000013
+ match dl_type 0x0800
+ match nw_src 10.11.12.0/24
+ match nw_dst 10.13.14.0/24
+ cookie 0x000000000000000e, command ADD, priority 43208, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 5
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000014
+ match dl_type 0x0800
+ match nw_proto 17
+ match tp_src 68
+ match tp_dst 67
+ cookie 0x000000000000000f, command ADD, priority 43207, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 5
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000015
+ match dl_type 0x0800
+ match nw_proto 1
+ match icmp_type 8
+ cookie 0x0000000000000010, command ADD, priority 43206, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 5
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000016
+ match dl_type 0x0800
+ match nw_proto 1 [|openflow]
+IP (tos 0x0, ttl 64, id 784, offset 0, flags [DF], proto TCP (6), length 740)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [P.], cksum 0x171c (incorrect -> 0xdfee), seq 1549:2237, ack 2585, win 154, options [nop,nop,TS val 220958532 ecr 194889014], length 688: OpenFlow
+ version unknown (0x00), type 0x00, length 0, xid 0x0003000d (corrupt)
+IP (tos 0x0, ttl 64, id 55503, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [.], cksum 0x9386 (correct), seq 2585, ack 1549, win 273, options [nop,nop,TS val 194889016 ecr 220958532], length 0
+IP (tos 0x0, ttl 64, id 55504, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [.], cksum 0x907b (correct), seq 2585, ack 2237, win 364, options [nop,nop,TS val 194889016 ecr 220958532], length 0
+IP (tos 0x0, ttl 64, id 55505, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0xba5c (correct), seq 2585:2673, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958532], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match dl_type 0x0800
+ match nw_proto 17
+ match tp_src 68
+ match tp_dst 67
+ cookie 0x000000000000000f, priority 43207, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 55506, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x3c6a (correct), seq 2673:2761, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958532], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match dl_vlan 100
+ match dl_vlan_pcp 4
+ match dl_type 0x8100
+ cookie 0x000000000000000d, priority 43209, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 785, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x8fbf), seq 2237, ack 2761, win 154, options [nop,nop,TS val 220958710 ecr 194889060], length 0
+IP (tos 0x0, ttl 64, id 55507, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0xc154 (correct), seq 2761:2849, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958532], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ cookie 0x0000000000000014, priority 43202, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 55508, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0xc04a (correct), seq 2849:2937, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958710], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ cookie 0x0000000000000015, priority 43201, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 55509, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0xa1f0 (correct), seq 2937:3025, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958710], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match dl_type 0x0800
+ match nw_src 10.11.12.0/24
+ match nw_dst 10.13.14.0/24
+ cookie 0x000000000000000e, priority 43208, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 786, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x8eb7), seq 2237, ack 3025, win 154, options [nop,nop,TS val 220958710 ecr 194889060], length 0
+IP (tos 0x0, ttl 64, id 55510, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0xbf9d (correct), seq 3025:3113, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958710], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match in_port 1
+ match dl_src 00:00:00:00:00:01
+ cookie 0x000000000000000c, priority 43210, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 55511, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x54e2 (correct), seq 3113:3201, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958710], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match dl_src aa:00:00:00:00:11
+ match dl_dst bb:00:00:00:00:22
+ cookie 0x0000000000000013, priority 43203, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 13, byte_count 1323
+IP (tos 0x0, ttl 64, id 55512, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x6bfc (correct), seq 3201:3289, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958710], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match in_port 4
+ cookie 0x0000000000000001, priority 54321, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 100, byte_count 10027
+IP (tos 0x0, ttl 64, id 787, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x8dae), seq 2237, ack 3289, win 154, options [nop,nop,TS val 220958711 ecr 194889060], length 0
+IP (tos 0x0, ttl 64, id 55513, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x9333 (correct), seq 3289:3377, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958710], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match in_port 4
+ cookie 0x0000000000000002, priority 54320, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 55514, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x92da (correct), seq 3377:3465, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958711], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match in_port 4
+ cookie 0x0000000000000003, priority 54319, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 55515, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x9282 (correct), seq 3465:3553, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958711], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match in_port 4
+ cookie 0x0000000000000004, priority 54318, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 788, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x8ca5), seq 2237, ack 3553, win 154, options [nop,nop,TS val 220958712 ecr 194889060], length 0
+IP (tos 0x0, ttl 64, id 55516, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x922a (correct), seq 3553:3641, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958711], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match in_port 4
+ cookie 0x0000000000000005, priority 54317, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 55517, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x91d1 (correct), seq 3641:3729, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958712], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match in_port 4
+ cookie 0x0000000000000006, priority 54316, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 789, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x8bf5), seq 2237, ack 3729, win 154, options [nop,nop,TS val 220958712 ecr 194889060], length 0
+IP (tos 0x0, ttl 64, id 55518, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x9179 (correct), seq 3729:3817, ack 2237, win 364, options [nop,nop,TS val 194889060 ecr 220958712], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match in_port 4
+ cookie 0x0000000000000007, priority 54315, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 55519, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x9120 (correct), seq 3817:3905, ack 2237, win 364, options [nop,nop,TS val 194889061 ecr 220958712], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match in_port 4
+ cookie 0x0000000000000008, priority 54314, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 55520, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x90c8 (correct), seq 3905:3993, ack 2237, win 364, options [nop,nop,TS val 194889061 ecr 220958712], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match in_port 4
+ cookie 0x0000000000000009, priority 54313, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 790, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x8aec), seq 2237, ack 3993, win 154, options [nop,nop,TS val 220958713 ecr 194889060], length 0
+IP (tos 0x0, ttl 64, id 55521, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x9070 (correct), seq 3993:4081, ack 2237, win 364, options [nop,nop,TS val 194889061 ecr 220958712], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000000
+ match in_port 4
+ cookie 0x000000000000000a, priority 54312, reason DELETE, duration_sec 122, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 55522, offset 0, flags [DF], proto TCP (6), length 64)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x8894 (correct), seq 4081:4093, ack 2237, win 364, options [nop,nop,TS val 194889061 ecr 220958713], length 12: OpenFlow
+ version 1.0, type GET_CONFIG_REPLY, length 12, xid 0x00000005
+ flags FRAG_NORMAL, miss_send_len 65535
+IP (tos 0x0, ttl 64, id 791, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x8a87), seq 2237, ack 4093, win 154, options [nop,nop,TS val 220958713 ecr 194889061], length 0
+IP (tos 0x0, ttl 64, id 55523, offset 0, flags [DF], proto TCP (6), length 128)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x90e5 (correct), seq 4093:4169, ack 2237, win 364, options [nop,nop,TS val 194889061 ecr 220958713], length 76: OpenFlow
+ version 1.0, type ERROR, length 76, xid 0x00000010
+ type BAD_ACTION, code BAD_VENDOR
+ data (64 octets)
+ 0x0000: 010e 0090 0000 0010 0038 20fe 0004 0000 .........8......
+ 0x0010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+ 0x0020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+ 0x0030: 0000 0000 0000 000b 0000 0000 0000 d427 ...............'
+IP (tos 0x0, ttl 64, id 55524, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x8821 (correct), seq 4169:4177, ack 2237, win 364, options [nop,nop,TS val 194889063 ecr 220958713], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x0000001b
+IP (tos 0x0, ttl 64, id 55525, offset 0, flags [DF], proto TCP (6), length 1120)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0xb778 (correct), seq 4177:5245, ack 2237, win 364, options [nop,nop,TS val 194889063 ecr 220958713], length 1068: OpenFlow
+ version 1.0, type STATS_REPLY, length 1068, xid 0x0000001c
+ type DESC, flags 0x0000
+ mfr_desc 'Nicira Networks, Inc.'
+ hw_desc 'Open vSwitch'
+ sw_desc '1.2.2'
+ serial_num 'None'
+ dp_desc 'None'
+IP (tos 0x0, ttl 64, id 792, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x85e9), seq 2237, ack 5245, win 176, options [nop,nop,TS val 220958721 ecr 194889061], length 0
+IP (tos 0x0, ttl 64, id 55526, offset 0, flags [DF], proto TCP (6), length 1752)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x1b10 (incorrect -> 0x7df4), seq 5245:6945, ack 2237, win 364, options [nop,nop,TS val 194889063 ecr 220958713], length 1700: OpenFlow
+ version 1.0, type STATS_REPLY, length 1700, xid 0x0000001d
+ type FLOW, flags 0x0000
+ length 96, table_id 0
+ match dl_type 0x0800
+ match nw_proto 17
+ match tp_src 68
+ match tp_dst 67
+ duration_sec 0, duration_nsec 0, priority 43207, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000f, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 5
+ length 96, table_id 0
+ match dl_vlan 100
+ match dl_vlan_pcp 4
+ match dl_type 0x8100
+ duration_sec 0, duration_nsec 0, priority 43209, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000d, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 5
+ length 96, table_id 0
+ duration_sec 0, duration_nsec 0, priority 43202, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000014, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 5
+ length 96, table_id 0
+ duration_sec 0, duration_nsec 0, priority 43201, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000015, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 5
+ length 96, table_id 0
+ match dl_type 0x0800
+ match nw_src 10.11.12.0/24
+ match nw_dst 10.13.14.0/24
+ duration_sec 0, duration_nsec 0, priority 43208, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000e, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 5
+ length 96, table_id 0
+ match in_port 1
+ match dl_src 00:00:00:00:00:01
+ duration_sec 0, duration_nsec 0, priority 43210, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000c, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 5
+ length 96, table_id 0
+ match dl_src aa:00:00:00:00:11
+ match dl_dst bb:00:00:00:00:22
+ duration_sec 0, duration_nsec 0, priority 43203, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000013, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 5
+ length 96, table_id 0
+ match in_port 4
+ duration_sec 0, duration_nsec 0, priority 54321, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000001, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 0
+ match in_port 4
+ duration_sec 0, duration_nsec 0, priority 54320, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000002, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port LOCAL
+ length 96, table_id 0
+ match in_port 4
+ duration_sec 0, duration_nsec 0, priority 54319, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000003, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port CONTROLLER, max_len 65535
+ length 104, table_id 0
+ match in_port 4
+ duration_sec 0, duration_nsec 0, priority 54318, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000004, packet_count 0, byte_count 0
+ action type SET_VLAN_VID, len 8, vlan_vid 2
+ action type SET_TP_SRC, len 8, tp_port 23
+ length 96, table_id 0
+ match in_port 4
+ duration_sec 0, duration_nsec 0, priority 54317, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000005, packet_count 0, byte_count 0
+ action type SET_VLAN_PCP, len 8, vlan_pcp 5
+ length 96, table_id 0
+ match in_port 4
+ duration_sec 0, duration_nsec 0, priority 54316, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000006, packet_count 0, byte_count 0
+ action type STRIP_VLAN, len 8
+ length 112, table_id 0
+ match in_port 4
+ duration_sec 0, duration_nsec 0, priority 54315, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000007, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 11:22:33:44:55:66
+ action type SET_NW_SRC, len 8, nw_addr 192.168.72.143
+ length 112, table_id 0
+ match in_port 4
+ duration_sec 0, duration_nsec 0, priority 54314, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000008, packet_count 0, byte_count 0
+ action type SET_DL_DST, len 16, dl_addr 77:88:99:aa:bb:cc
+ action type SET_NW_DST, len 8, nw_addr 192.168.98.55
+ length 104, table_id 0
+ match in_port 4
+ duration_sec 0, duration_nsec 0, priority 54313, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000009, packet_count 0, byte_count 0
+ action type SET_NW_TOS, len 8, nw_tos 0x2c
+ action type SET_TP_DST, len 8, tp_port 80
+ length 104, table_id 0
+ match in_port 4
+ duration_sec 0, duration_nsec 0, priority 54312, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000a, packet_count 0, byte_count 0
+ action type ENQUEUE, len 16, port 1, queue_id 2
+IP (tos 0x0, ttl 64, id 793, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x7f28), seq 2237, ack 6945, win 203, options [nop,nop,TS val 220958721 ecr 194889063], length 0
+IP (tos 0x0, ttl 64, id 55528, offset 0, flags [DF], proto TCP (6), length 88)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x7cfd (correct), seq 6945:6981, ack 2237, win 364, options [nop,nop,TS val 194889063 ecr 220958713], length 36: OpenFlow
+ version 1.0, type STATS_REPLY, length 36, xid 0x0000001e
+ type AGGREGATE, flags 0x0000
+ packet_count 0, byte_count 0, flow_count 17
+IP (tos 0x0, ttl 64, id 55529, offset 0, flags [DF], proto TCP (6), length 128)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0xeac4 (correct), seq 6981:7057, ack 2237, win 364, options [nop,nop,TS val 194889063 ecr 220958713], length 76: OpenFlow
+ version 1.0, type STATS_REPLY, length 76, xid 0x0000001f
+ type TABLE, flags 0x0000
+ table_id 0, name 'classifier'
+ wildcards 0x003fffff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 1000000, active_count 26, lookup_count 1158498983736653433, matched_count 1158498983736653433
+IP (tos 0x0, ttl 64, id 794, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x7eb8), seq 2237, ack 7057, win 203, options [nop,nop,TS val 220958721 ecr 194889063], length 0
+IP (tos 0x0, ttl 64, id 55530, offset 0, flags [DF], proto TCP (6), length 2948)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [.], cksum 0x1fbc (incorrect -> 0x5886), seq 7057:9953, ack 2237, win 364, options [nop,nop,TS val 194889063 ecr 220958721], length 2896: OpenFlow
+ version 1.0, type STATS_REPLY, length 5524, xid 0x00000020
+ type PORT, flags 0x0000
+ port_no 42, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 33, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 36, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 31, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 48, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 40, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 1, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 28, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 20, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 10, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 22, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 29, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 44, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 41, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 21, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 16, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 45, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 49, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 38, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 17, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 27, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 51, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 46, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 6, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 50, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 43, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 35, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0, rx_frame_err 0, rx_over_err 0, rx_crc_err 0, collisions 0
+ port_no 19, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 0, tx_errors 0 [|openflow]
+IP (tos 0x0, ttl 64, id 795, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x733a), seq 2237, ack 9953, win 248, options [nop,nop,TS val 220958722 ecr 194889063], length 0
+IP (tos 0x0, ttl 64, id 55532, offset 0, flags [DF], proto TCP (6), length 2680)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x1eb0 (incorrect -> 0x561b), seq 9953:12581, ack 2237, win 364, options [nop,nop,TS val 194889063 ecr 220958721], length 2628: OpenFlow
+ version unknown (0x00), type 0x00, length 0, xid 0x00000000 (corrupt)
+IP (tos 0x0, ttl 64, id 796, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x68cd), seq 2237, ack 12581, win 289, options [nop,nop,TS val 220958722 ecr 194889063], length 0
+IP (tos 0x0, ttl 64, id 55534, offset 0, flags [DF], proto TCP (6), length 64)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0x672c (correct), seq 12581:12593, ack 2237, win 364, options [nop,nop,TS val 194889063 ecr 220958721], length 12: OpenFlow
+ version 1.0, type STATS_REPLY, length 12, xid 0x00000021
+ type QUEUE, flags 0x0000
+IP (tos 0x0, ttl 64, id 55535, offset 0, flags [DF], proto TCP (6), length 128)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [P.], cksum 0xda41 (correct), seq 12593:12669, ack 2237, win 364, options [nop,nop,TS val 194889063 ecr 220958721], length 76: OpenFlow
+ version 1.0, type ERROR, length 76, xid 0x00000022
+ type BAD_REQUEST, code BAD_VENDOR
+ data (64 octets)
+ 0x0000: 0110 0090 0000 0022 ffff 0000 0000 1234 .......".......4
+ 0x0010: afaf afaf afaf afaf afaf afaf afaf afaf ................
+ 0x0020: afaf afaf afaf afaf afaf afaf afaf afaf ................
+ 0x0030: afaf afaf afaf afaf afaf afaf afaf afaf ................
+IP (tos 0x0, ttl 64, id 797, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x146c (incorrect -> 0x6875), seq 2237, ack 12669, win 289, options [nop,nop,TS val 220958722 ecr 194889063], length 0
+IP (tos 0x0, ttl 64, id 798, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [F.], cksum 0x146c (incorrect -> 0x5a63), seq 2237, ack 12669, win 289, options [nop,nop,TS val 220962323 ecr 194889063], length 0
+IP (tos 0x0, ttl 64, id 55536, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [.], cksum 0x568a (correct), seq 12669, ack 2238, win 364, options [nop,nop,TS val 194889973 ecr 220962323], length 0
+IP (tos 0x0, ttl 64, id 55537, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.50.35256 > 10.0.0.20.6633: Flags [F.], cksum 0x5664 (correct), seq 12669, ack 2238, win 364, options [nop,nop,TS val 194890010 ecr 220962323], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.50.35256: Flags [.], cksum 0x55f5 (correct), seq 2238, ack 12670, win 289, options [nop,nop,TS val 220962509 ecr 194890010], length 0
--- /dev/null
+IP (tos 0xa0, ttl 64, id 10670, offset 0, flags [DF], proto TCP (6), length 60)
+ 172.16.1.101.62224 > 172.16.1.51.6633: Flags [S], cksum 0x6dd0 (correct), seq 2446711727, win 2048, options [mss 1460,nop,wscale 0,nop,nop,TS val 0 ecr 0], length 0
+IP (tos 0xa0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
+ 172.16.1.51.6633 > 172.16.1.101.62224: Flags [R.], cksum 0xda97 (correct), seq 0, ack 2446711728, win 0, length 0
+IP (tos 0xa0, ttl 64, id 10673, offset 0, flags [DF], proto TCP (6), length 60)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [S], cksum 0xa14c (correct), seq 2619186670, win 2048, options [mss 1460,nop,wscale 0,nop,nop,TS val 0 ecr 0], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [S.], cksum 0x5ae7 (incorrect -> 0x3c7c), seq 3998019188, ack 2619186671, win 14480, options [mss 1460,nop,nop,TS val 2256457959 ecr 0,nop,wscale 7], length 0
+IP (tos 0xa0, ttl 64, id 10674, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [.], cksum 0x956f (correct), seq 1, ack 1, win 2920, options [nop,nop,TS val 0 ecr 2256457959], length 0
+IP (tos 0xa0, ttl 64, id 10675, offset 0, flags [DF], proto TCP (6), length 60)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0xb6f9 (correct), seq 1:9, ack 1, win 2920, options [nop,nop,TS val 0 ecr 2256457959], length 8: OpenFlow
+ version 1.0, type HELLO, length 8, xid 0x000cdd51
+IP (tos 0x0, ttl 64, id 16028, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [.], cksum 0x5adf (incorrect -> 0xa05b), seq 1, ack 9, win 114, options [nop,nop,TS val 2256457961 ecr 0], length 0
+IP (tos 0x0, ttl 64, id 16029, offset 0, flags [DF], proto TCP (6), length 60)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [P.], cksum 0x5ae7 (incorrect -> 0x9f29), seq 1:9, ack 9, win 114, options [nop,nop,TS val 2256457986 ecr 0], length 8: OpenFlow
+ version 1.0, type HELLO, length 8, xid 0x00000001
+IP (tos 0x0, ttl 64, id 16030, offset 0, flags [DF], proto TCP (6), length 60)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [P.], cksum 0x5ae7 (incorrect -> 0x9f13), seq 9:17, ack 9, win 114, options [nop,nop,TS val 2256457994 ecr 0], length 8: OpenFlow
+ version 1.0, type FEATURES_REQUEST, length 8, xid 0x00000002
+IP (tos 0xa0, ttl 64, id 10676, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [.], cksum 0x9544 (correct), seq 9, ack 17, win 2912, options [nop,nop,TS val 0 ecr 2256457986], length 0
+IP (tos 0xa0, ttl 64, id 10679, offset 0, flags [DF], proto TCP (6), length 468)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0xcacf (correct), seq 9:425, ack 17, win 2920, options [nop,nop,TS val 0 ecr 2256457986], length 416: OpenFlow
+ version 1.0, type FEATURES_REPLY, length 416, xid 0x00000002
+ dpid 0x000100255cab0c07, n_buffers 544, n_tables 11
+ capabilities 0x00000087 (FLOW_STATS, TABLE_STATS, PORT_STATS, ARP_MATCH_IP)
+ actions 0x00000fff (OUTPUT, SET_VLAN_VID, SET_VLAN_PCP, STRIP_VLAN, SET_DL_SRC, SET_DL_DST, SET_NW_SRC, SET_NW_DST, SET_NW_TOS, SET_TP_SRC, SET_TP_DST, ENQUEUE)
+ port_no 1, hw_addr 00:25:5c:ab:0c:87, name 'GBE0/1'
+ config 0x00000002 (NO_STP)
+ state 0x00000200 (STP_FORWARD, STP_BLOCK)
+ curr 0x000002a0 (1GB_FD, COPPER, AUTONEG)
+ advertised 0x00000000
+ supported 0x00000000
+ peer 0x00000000
+ port_no 2, hw_addr 00:25:5c:ab:0c:47, name 'GBE0/2'
+ config 0x00000002 (NO_STP)
+ state 0x00000200 (STP_FORWARD, STP_BLOCK)
+ curr 0x000002a0 (1GB_FD, COPPER, AUTONEG)
+ advertised 0x00000000
+ supported 0x00000000
+ peer 0x00000000
+ port_no 3, hw_addr 00:25:5c:ab:0c:c7, name 'GBE0/3'
+ config 0x00000002 (NO_STP)
+ state 0x00000200 (STP_FORWARD, STP_BLOCK)
+ curr 0x000002a0 (1GB_FD, COPPER, AUTONEG)
+ advertised 0x00000000
+ supported 0x00000000
+ peer 0x00000000
+ port_no 4, hw_addr 00:25:5c:ab:0c:27, name 'GBE0/4'
+ config 0x00000002 (NO_STP)
+ state 0x00000201 (LINK_DOWN, STP_FORWARD, STP_BLOCK)
+ curr 0x00000000
+ advertised 0x00000000
+ supported 0x00000000
+ peer 0x00000000
+ port_no 5, hw_addr 00:25:5c:ab:0c:a7, name 'GBE0/5'
+ config 0x00000002 (NO_STP)
+ state 0x00000201 (LINK_DOWN, STP_FORWARD, STP_BLOCK)
+ curr 0x00000000
+ advertised 0x00000000
+ supported 0x00000000
+ peer 0x00000000
+ port_no 6, hw_addr 00:25:5c:ab:0c:67, name 'GBE0/6'
+ config 0x00000002 (NO_STP)
+ state 0x00000201 (LINK_DOWN, STP_FORWARD, STP_BLOCK)
+ curr 0x00000000
+ advertised 0x00000000
+ supported 0x00000000
+ peer 0x00000000
+ port_no 7, hw_addr 00:25:5c:ab:0c:e7, name 'GBE0/7'
+ config 0x00000002 (NO_STP)
+ state 0x00000201 (LINK_DOWN, STP_FORWARD, STP_BLOCK)
+ curr 0x00000000
+ advertised 0x00000000
+ supported 0x00000000
+ peer 0x00000000
+ port_no 8, hw_addr 00:25:5c:ab:0c:17, name 'GBE0/8'
+ config 0x00000002 (NO_STP)
+ state 0x00000201 (LINK_DOWN, STP_FORWARD, STP_BLOCK)
+ curr 0x00000000
+ advertised 0x00000000
+ supported 0x00000000
+ peer 0x00000000
+IP (tos 0x0, ttl 64, id 16031, offset 0, flags [DF], proto TCP (6), length 136)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [P.], cksum 0x5b33 (incorrect -> 0x9b62), seq 17:101, ack 425, win 122, options [nop,nop,TS val 2256458010 ecr 0], length 84: OpenFlow
+ version 1.0, type SET_CONFIG, length 12, xid 0x00000003
+ flags FRAG_NORMAL, miss_send_len 65535
+ version 1.0, type FLOW_MOD, length 72, xid 0x00000004
+ cookie 0x0000000000000000, command DELETE, out_port NONE, flags 0x0000
+IP (tos 0x0, ttl 64, id 16032, offset 0, flags [DF], proto TCP (6), length 60)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [P.], cksum 0x5ae7 (incorrect -> 0x9ceb), seq 101:109, ack 425, win 122, options [nop,nop,TS val 2256458014 ecr 0], length 8: OpenFlow
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000005
+IP (tos 0xa0, ttl 64, id 10680, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [.], cksum 0x932f (correct), seq 425, ack 109, win 2912, options [nop,nop,TS val 1 ecr 2256458010], length 0
+IP (tos 0xa0, ttl 64, id 10681, offset 0, flags [DF], proto TCP (6), length 60)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0x91f7 (correct), seq 425:433, ack 109, win 2920, options [nop,nop,TS val 1 ecr 2256458010], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000005
+IP (tos 0x0, ttl 64, id 16033, offset 0, flags [DF], proto TCP (6), length 72)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [P.], cksum 0x5af3 (incorrect -> 0x9ba7), seq 109:129, ack 433, win 122, options [nop,nop,TS val 2256458017 ecr 1], length 20: OpenFlow
+ version 1.0, type STATS_REQUEST, length 12, xid 0x00000006
+ type DESC, flags 0x0000
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000007
+IP (tos 0xa0, ttl 64, id 10682, offset 0, flags [DF], proto TCP (6), length 1120)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0x7324 (correct), seq 433:1501, ack 129, win 2912, options [nop,nop,TS val 1 ecr 2256458017], length 1068: OpenFlow
+ version 1.0, type STATS_REPLY, length 1068, xid 0x00000006
+ type DESC, flags 0x0000
+ mfr_desc 'NEC Corporation'
+ hw_desc 'PF5240F-48T4XW-AX(L1L2)'
+ sw_desc 'OS-F3PA Ver. V4.0.1.0'
+ serial_num 'Y1252CFA0000S4068C8N004'
+ dp_desc 'PFS1'
+IP (tos 0x0, ttl 64, id 16034, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [.], cksum 0x5adf (incorrect -> 0x998b), seq 129, ack 1501, win 139, options [nop,nop,TS val 2256458059 ecr 1], length 0
+IP (tos 0xa0, ttl 64, id 10686, offset 0, flags [DF], proto TCP (6), length 60)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0x8da6 (correct), seq 1501:1509, ack 129, win 2920, options [nop,nop,TS val 1 ecr 2256458017], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000007
+IP (tos 0x0, ttl 64, id 16035, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [.], cksum 0x5adf (incorrect -> 0x9982), seq 129, ack 1509, win 139, options [nop,nop,TS val 2256458060 ecr 1], length 0
+IP (tos 0x0, ttl 64, id 16036, offset 0, flags [DF], proto TCP (6), length 84)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [P.], cksum 0x5aff (incorrect -> 0x95e2), seq 129:161, ack 1509, win 139, options [nop,nop,TS val 2256458060 ecr 1], length 32: OpenFlow
+ version 1.0, type QUEUE_GET_CONFIG_REQUEST, length 12, xid 0x00000008
+ port_no 1
+ version 1.0, type QUEUE_GET_CONFIG_REQUEST, length 12, xid 0x00000009
+ port_no 2
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x0000000a
+IP (tos 0xa0, ttl 64, id 10687, offset 0, flags [DF], proto TCP (6), length 196)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0x8b77 (correct), seq 1509:1653, ack 161, win 2900, options [nop,nop,TS val 1 ecr 2256458060], length 144: OpenFlow
+ version 1.0, type QUEUE_GET_CONFIG_REPLY, length 144, xid 0x00000008
+ port_no 1
+ queue_id 0, len 16
+ property NONE, len 8
+ queue_id 1, len 16
+ property NONE, len 8
+ queue_id 2, len 16
+ property NONE, len 8
+ queue_id 3, len 16
+ property NONE, len 8
+ queue_id 4, len 16
+ property NONE, len 8
+ queue_id 5, len 16
+ property NONE, len 8
+ queue_id 6, len 16
+ property NONE, len 8
+ queue_id 7, len 16
+ property NONE, len 8
+IP (tos 0x0, ttl 64, id 16037, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [.], cksum 0x5adf (incorrect -> 0x9899), seq 161, ack 1653, win 155, options [nop,nop,TS val 2256458101 ecr 1], length 0
+IP (tos 0xa0, ttl 64, id 10688, offset 0, flags [DF], proto TCP (6), length 204)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0x89a4 (correct), seq 1653:1805, ack 161, win 2920, options [nop,nop,TS val 1 ecr 2256458060], length 152: OpenFlow
+ version 1.0, type QUEUE_GET_CONFIG_REPLY, length 144, xid 0x00000009
+ port_no 2
+ queue_id 0, len 16
+ property NONE, len 8
+ queue_id 1, len 16
+ property NONE, len 8
+ queue_id 2, len 16
+ property NONE, len 8
+ queue_id 3, len 16
+ property NONE, len 8
+ queue_id 4, len 16
+ property NONE, len 8
+ queue_id 5, len 16
+ property NONE, len 8
+ queue_id 6, len 16
+ property NONE, len 8
+ queue_id 7, len 16
+ property NONE, len 8
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x0000000a
+IP (tos 0x0, ttl 64, id 16038, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [.], cksum 0x5adf (incorrect -> 0x97ef), seq 161, ack 1805, win 172, options [nop,nop,TS val 2256458102 ecr 1], length 0
+IP (tos 0x0, ttl 64, id 16039, offset 0, flags [DF], proto TCP (6), length 100)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [P.], cksum 0x5b0f (incorrect -> 0x9424), seq 161:209, ack 1805, win 172, options [nop,nop,TS val 2256458102 ecr 1], length 48: OpenFlow
+ version 1.0, type STATS_REQUEST, length 20, xid 0x0000000b
+ type QUEUE, flags 0x0000
+ port_no 1, queue_id ALL
+ version 1.0, type STATS_REQUEST, length 20, xid 0x0000000c
+ type QUEUE, flags 0x0000
+ port_no 2, queue_id ALL
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x0000000d
+IP (tos 0xa0, ttl 64, id 10689, offset 0, flags [DF], proto TCP (6), length 96)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0x8b9c (correct), seq 1805:1849, ack 209, win 2892, options [nop,nop,TS val 1 ecr 2256458102], length 44: OpenFlow
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000b
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 1, queue_id 0, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+IP (tos 0x0, ttl 64, id 16040, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [.], cksum 0x5adf (incorrect -> 0x9769), seq 209, ack 1849, win 172, options [nop,nop,TS val 2256458144 ecr 1], length 0
+IP (tos 0xa0, ttl 64, id 10690, offset 0, flags [DF], proto TCP (6), length 744)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0x72af (correct), seq 1849:2541, ack 209, win 2920, options [nop,nop,TS val 1 ecr 2256458102], length 692: OpenFlow
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000b
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 1, queue_id 1, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000b
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 1, queue_id 2, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000b
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 1, queue_id 3, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000b
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 1, queue_id 4, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000b
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 1, queue_id 5, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000b
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 1, queue_id 6, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000b
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 1, queue_id 7, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 12, xid 0x0000000b
+ type QUEUE, flags 0x0000
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000c
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 2, queue_id 0, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000c
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 2, queue_id 1, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000c
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 2, queue_id 2, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000c
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 2, queue_id 3, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000c
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 2, queue_id 4, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000c
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 2, queue_id 5, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000c
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 2, queue_id 6, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 44, xid 0x0000000c
+ type QUEUE, flags 0x0001 (MORE)
+ port_no 2, queue_id 7, tx_bytes 18446744073709551615, tx_packets 18446744073709551615, tx_errors 18446744073709551615
+ version 1.0, type STATS_REPLY, length 12, xid 0x0000000c
+ type QUEUE, flags 0x0000
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x0000000d
+IP (tos 0x0, ttl 64, id 16041, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [.], cksum 0x5adf (incorrect -> 0x94a3), seq 209, ack 2541, win 189, options [nop,nop,TS val 2256458145 ecr 1], length 0
+IP (tos 0x0, ttl 64, id 16042, offset 0, flags [DF], proto TCP (6), length 700)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [P.], cksum 0x5d67 (incorrect -> 0xa5e9), seq 209:857, ack 2541, win 189, options [nop,nop,TS val 2256458147 ecr 1], length 648: OpenFlow
+ version 1.0, type FLOW_MOD, length 80, xid 0x0000000e
+ match in_port 1
+ cookie 0x0000000000000001, command ADD, priority 24100, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 4
+ version 1.0, type FLOW_MOD, length 80, xid 0x0000000f
+ match in_port 2
+ cookie 0x0000000000000002, command ADD, priority 24200, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 4
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000010
+ match in_port 3
+ cookie 0x0000000000000003, command ADD, priority 24300, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 4
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000011
+ match in_port 5
+ cookie 0x0000000000000004, command ADD, priority 20500, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 8
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000012
+ match in_port 6
+ cookie 0x0000000000000005, command ADD, priority 20600, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 8
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000013
+ match in_port 7
+ cookie 0x0000000000000006, command ADD, priority 20700, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 8
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000014
+ match in_port 4
+ cookie 0x0000000000000007, command ADD, priority 25400, buffer_id NONE, flags 0x0005 (SEND_FLOW_REM, EMERG)
+ action type OUTPUT, len 8, port 8
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000015
+ match in_port 8
+ cookie 0x0000000000000008, command ADD, priority 25800, buffer_id NONE, flags 0x0005 (SEND_FLOW_REM, EMERG)
+ action type OUTPUT, len 8, port 4
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000016
+IP (tos 0xa0, ttl 64, id 10691, offset 0, flags [DF], proto TCP (6), length 60)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0x862d (correct), seq 2541:2549, ack 857, win 2920, options [nop,nop,TS val 1 ecr 2256458147], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000016
+IP (tos 0x0, ttl 64, id 16043, offset 0, flags [DF], proto TCP (6), length 116)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [P.], cksum 0x5b1f (incorrect -> 0x6ef4), seq 857:921, ack 2549, win 189, options [nop,nop,TS val 2256458158 ecr 1], length 64: OpenFlow
+ version 1.0, type STATS_REQUEST, length 56, xid 0x00000017
+ type FLOW, flags 0x0000
+ table_id ALL, out_port NONE
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000018
+IP (tos 0xa0, ttl 64, id 10692, offset 0, flags [DF], proto TCP (6), length 160)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0x0485 (correct), seq 2549:2657, ack 921, win 2912, options [nop,nop,TS val 1 ecr 2256458158], length 108: OpenFlow
+ version 1.0, type STATS_REPLY, length 108, xid 0x00000017
+ type FLOW, flags 0x0001 (MORE)
+ length 96, table_id 0
+ match in_port 3
+ duration_sec 0, duration_nsec 0, priority 24300, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000003, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 4
+IP (tos 0x0, ttl 64, id 16044, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [.], cksum 0x5adf (incorrect -> 0x9131), seq 921, ack 2657, win 189, options [nop,nop,TS val 2256458199 ecr 1], length 0
+IP (tos 0xa0, ttl 64, id 10693, offset 0, flags [DF], proto TCP (6), length 828)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0x1544 (correct), seq 2657:3433, ack 921, win 2920, options [nop,nop,TS val 1 ecr 2256458158], length 776: OpenFlow
+ version 1.0, type STATS_REPLY, length 108, xid 0x00000017
+ type FLOW, flags 0x0001 (MORE)
+ length 96, table_id 0
+ match in_port 2
+ duration_sec 0, duration_nsec 0, priority 24200, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000002, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 4
+ version 1.0, type STATS_REPLY, length 108, xid 0x00000017
+ type FLOW, flags 0x0001 (MORE)
+ length 96, table_id 0
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 24100, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000001, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 4
+ version 1.0, type STATS_REPLY, length 108, xid 0x00000017
+ type FLOW, flags 0x0001 (MORE)
+ length 96, table_id 1
+ match in_port 7
+ duration_sec 0, duration_nsec 0, priority 20700, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000006, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 8
+ version 1.0, type STATS_REPLY, length 108, xid 0x00000017
+ type FLOW, flags 0x0001 (MORE)
+ length 96, table_id 1
+ match in_port 6
+ duration_sec 0, duration_nsec 0, priority 20600, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000005, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 8
+ version 1.0, type STATS_REPLY, length 108, xid 0x00000017
+ type FLOW, flags 0x0001 (MORE)
+ length 96, table_id 1
+ match in_port 5
+ duration_sec 0, duration_nsec 0, priority 20500, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000004, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 8
+ version 1.0, type STATS_REPLY, length 108, xid 0x00000017
+ type FLOW, flags 0x0001 (MORE)
+ length 96, table_id EMERG
+ match in_port 8
+ duration_sec 0, duration_nsec 0, priority 25800, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000008, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 4
+ version 1.0, type STATS_REPLY, length 108, xid 0x00000017
+ type FLOW, flags 0x0001 (MORE)
+ length 96, table_id EMERG
+ match in_port 4
+ duration_sec 0, duration_nsec 0, priority 25400, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000007, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 8
+ version 1.0, type STATS_REPLY, length 12, xid 0x00000017
+ type FLOW, flags 0x0000
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000018
+IP (tos 0x0, ttl 64, id 16045, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [.], cksum 0x5adf (incorrect -> 0x8e18), seq 921, ack 3433, win 205, options [nop,nop,TS val 2256458200 ecr 1], length 0
+IP (tos 0x0, ttl 64, id 16046, offset 0, flags [DF], proto TCP (6), length 72)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [P.], cksum 0x5af3 (incorrect -> 0x8b90), seq 921:941, ack 3433, win 205, options [nop,nop,TS val 2256458200 ecr 1], length 20: OpenFlow
+ version 1.0, type STATS_REQUEST, length 12, xid 0x00000019
+ type TABLE, flags 0x0000
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x0000001a
+IP (tos 0xa0, ttl 64, id 10694, offset 0, flags [DF], proto TCP (6), length 128)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0xe84a (correct), seq 3433:3509, ack 941, win 2912, options [nop,nop,TS val 1 ecr 2256458200], length 76: OpenFlow
+ version 1.0, type STATS_REPLY, length 76, xid 0x00000019
+ type TABLE, flags 0x0001 (MORE)
+ table_id 0, name 'Normal 1 Flow Table'
+ wildcards 0x003820ff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 5632, active_count 3, lookup_count 18446744073709551615, matched_count 18446744073709551615
+IP (tos 0x0, ttl 64, id 16047, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [.], cksum 0x5adf (incorrect -> 0x8d8f), seq 941, ack 3509, win 205, options [nop,nop,TS val 2256458241 ecr 1], length 0
+IP (tos 0xa0, ttl 64, id 10695, offset 0, flags [DF], proto TCP (6), length 832)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [P.], cksum 0x198c (correct), seq 3509:4289, ack 941, win 2920, options [nop,nop,TS val 1 ecr 2256458200], length 780: OpenFlow
+ version 1.0, type STATS_REPLY, length 76, xid 0x00000019
+ type TABLE, flags 0x0001 (MORE)
+ table_id 1, name 'Expanded Flow Table'
+ wildcards 0x003820ff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 163840, active_count 3, lookup_count 18446744073709551615, matched_count 18446744073709551615
+ version 1.0, type STATS_REPLY, length 76, xid 0x00000019
+ type TABLE, flags 0x0001 (MORE)
+ table_id 20, name 'Normal 2 Flow Table'
+ wildcards 0x003820ff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 512, active_count 0, lookup_count 18446744073709551615, matched_count 18446744073709551615
+ version 1.0, type STATS_REPLY, length 76, xid 0x00000019
+ type TABLE, flags 0x0001 (MORE)
+ table_id 50, name 'Mpls 1 Flow Table'
+ wildcards 0x003820ef (IN_PORT, DL_VLAN, DL_SRC, DL_DST, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 512, active_count 0, lookup_count 18446744073709551615, matched_count 18446744073709551615
+ version 1.0, type STATS_REPLY, length 76, xid 0x00000019
+ type TABLE, flags 0x0001 (MORE)
+ table_id 51, name 'Mpls 2 Flow Table'
+ wildcards 0x003820ef (IN_PORT, DL_VLAN, DL_SRC, DL_DST, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 16384, active_count 0, lookup_count 18446744073709551615, matched_count 18446744073709551615
+ version 1.0, type STATS_REPLY, length 76, xid 0x00000019
+ type TABLE, flags 0x0001 (MORE)
+ table_id 99, name 'Software Flow Table'
+ wildcards 0x003820ff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 2048, active_count 0, lookup_count 18446744073709551615, matched_count 18446744073709551615
+ version 1.0, type STATS_REPLY, length 76, xid 0x00000019
+ type TABLE, flags 0x0001 (MORE)
+ table_id 100, name 'V-Normal 1 Flow Table'
+ wildcards 0x003820ff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 0, active_count 0, lookup_count 18446744073709551615, matched_count 18446744073709551615
+ version 1.0, type STATS_REPLY, length 76, xid 0x00000019
+ type TABLE, flags 0x0001 (MORE)
+ table_id 101, name 'V-Expanded Flow Table'
+ wildcards 0x003820ff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 0, active_count 0, lookup_count 18446744073709551615, matched_count 18446744073709551615
+ version 1.0, type STATS_REPLY, length 76, xid 0x00000019
+ type TABLE, flags 0x0001 (MORE)
+ table_id 120, name 'V-Normal 2 Flow Table'
+ wildcards 0x003820ff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 0, active_count 0, lookup_count 18446744073709551615, matched_count 18446744073709551615
+ version 1.0, type STATS_REPLY, length 76, xid 0x00000019
+ type TABLE, flags 0x0001 (MORE)
+ table_id 140, name 'Q-Normal 1 Flow Table'
+ wildcards 0x003820ff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 0, active_count 0, lookup_count 18446744073709551615, matched_count 18446744073709551615
+ version 1.0, type STATS_REPLY, length 76, xid 0x00000019
+ type TABLE, flags 0x0001 (MORE)
+ table_id EMERG, name 'Emergency Flow Cache'
+ wildcards 0x003820ff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 5632, active_count 2, lookup_count 18446744073709551615, matched_count 18446744073709551615
+ version 1.0, type STATS_REPLY, length 12, xid 0x00000019
+ type TABLE, flags 0x0000
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x0000001a
+IP (tos 0x0, ttl 64, id 16048, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [.], cksum 0x5adf (incorrect -> 0x8a72), seq 941, ack 4289, win 222, options [nop,nop,TS val 2256458241 ecr 1], length 0
+IP (tos 0x0, ttl 64, id 16049, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [F.], cksum 0x5adf (incorrect -> 0x895d), seq 941, ack 4289, win 222, options [nop,nop,TS val 2256458517 ecr 1], length 0
+IP (tos 0xa0, ttl 64, id 10696, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [.], cksum 0x7ed2 (correct), seq 4289, ack 942, win 2920, options [nop,nop,TS val 2 ecr 2256458517], length 0
+IP (tos 0xa0, ttl 64, id 10697, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.101.62221 > 172.16.1.51.6633: Flags [F.], cksum 0x7ed1 (correct), seq 4289, ack 942, win 2920, options [nop,nop,TS val 2 ecr 2256458517], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 172.16.1.51.6633 > 172.16.1.101.62221: Flags [.], cksum 0x8958 (correct), seq 942, ack 4290, win 222, options [nop,nop,TS val 2256458520 ecr 2], length 0
+IP (tos 0xa0, ttl 64, id 10710, offset 0, flags [DF], proto TCP (6), length 60)
+ 172.16.1.101.62216 > 172.16.1.51.6633: Flags [S], cksum 0xf0a4 (correct), seq 2928426028, win 2048, options [mss 1460,nop,wscale 0,nop,nop,TS val 0 ecr 0], length 0
+IP (tos 0xa0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
+ 172.16.1.51.6633 > 172.16.1.101.62216: Flags [R.], cksum 0x5d6c (correct), seq 0, ack 2928426029, win 0, length 0
--- /dev/null
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 64)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [S], cksum 0xa75a (correct), seq 469952923, win 32768, options [mss 1380,nop,wscale 5,sackOK,nop,nop,nop,nop,TS val 1 ecr 0], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [S.], cksum 0x1493 (incorrect -> 0xa59a), seq 1198728146, ack 469952924, win 14480, options [mss 1460,sackOK,TS val 47836340 ecr 1,nop,wscale 7], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [.], cksum 0x08ec (correct), seq 1, ack 1, win 1035, options [nop,nop,TS val 1 ecr 47836340], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x293c (correct), seq 1:9, ack 1, win 1035, options [nop,nop,TS val 1 ecr 47836340], length 8: OpenFlow
+ version 1.0, type HELLO, length 8, xid 0xf1c0ecd6
+IP (tos 0x0, ttl 64, id 53094, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0x0c7c), seq 1, ack 9, win 114, options [nop,nop,TS val 47836341 ecr 1], length 0
+IP (tos 0x0, ttl 64, id 53095, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x1493 (incorrect -> 0x0b5d), seq 1:9, ack 9, win 114, options [nop,nop,TS val 47836347 ecr 1], length 8: OpenFlow
+ version 1.0, type HELLO, length 8, xid 0x00000001
+IP (tos 0x0, ttl 64, id 53096, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x1493 (incorrect -> 0x0b4e), seq 9:17, ack 9, win 114, options [nop,nop,TS val 47836348 ecr 1], length 8: OpenFlow
+ version 1.0, type FEATURES_REQUEST, length 8, xid 0x00000002
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [.], cksum 0x08ce (correct), seq 9, ack 17, win 1034, options [nop,nop,TS val 1 ecr 47836347], length 0
+IP (tos 0x0, ttl 64, id 53469, offset 0, flags [DF], proto TCP (6), length 180)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x48dc (correct), seq 9:137, ack 17, win 1035, options [nop,nop,TS val 1 ecr 47836347], length 128: OpenFlow
+ version 1.0, type FEATURES_REPLY, length 128, xid 0x00000002
+ dpid 0x00010001e88ae0e2, n_buffers 0, n_tables 6
+ capabilities 0x00000007 (FLOW_STATS, TABLE_STATS, PORT_STATS)
+ actions 0x00000137 (OUTPUT, SET_VLAN_VID, SET_VLAN_PCP, SET_DL_SRC, SET_DL_DST, SET_NW_TOS)
+ port_no 1, hw_addr 00:01:e8:8a:e0:e4, name 'Te 0/0'
+ config 0x00000000
+ state 0x00000000
+ curr 0x00000340 (10GB_FD, FIBER, AUTONEG)
+ advertised 0x00000340 (10GB_FD, FIBER, AUTONEG)
+ supported 0x00000340 (10GB_FD, FIBER, AUTONEG)
+ peer 0x00000000
+ port_no 2, hw_addr 00:01:e8:8a:e0:e4, name 'Te 0/1'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000300 (FIBER, AUTONEG)
+ advertised 0x00000300 (FIBER, AUTONEG)
+ supported 0x00000300 (FIBER, AUTONEG)
+ peer 0x00000000
+IP (tos 0x0, ttl 64, id 53097, offset 0, flags [DF], proto TCP (6), length 136)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x14df (incorrect -> 0x08c9), seq 17:101, ack 137, win 122, options [nop,nop,TS val 47836352 ecr 1], length 84: OpenFlow
+ version 1.0, type SET_CONFIG, length 12, xid 0x00000003
+ flags FRAG_NORMAL, miss_send_len 65535
+ version 1.0, type FLOW_MOD, length 72, xid 0x00000004
+ cookie 0x0000000000000000, command DELETE, out_port NONE, flags 0x0000
+IP (tos 0x0, ttl 64, id 53098, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x1493 (incorrect -> 0x0a54), seq 101:109, ack 137, win 122, options [nop,nop,TS val 47836354 ecr 1], length 8: OpenFlow
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000005
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [.], cksum 0x07ed (correct), seq 137, ack 109, win 1034, options [nop,nop,TS val 1 ecr 47836352], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x06bc (correct), seq 137:145, ack 109, win 1035, options [nop,nop,TS val 1 ecr 47836352], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000005
+IP (tos 0x0, ttl 64, id 53099, offset 0, flags [DF], proto TCP (6), length 80)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x14a7 (incorrect -> 0x07f3), seq 109:137, ack 145, win 122, options [nop,nop,TS val 47836355 ecr 1], length 28: OpenFlow
+ version 1.0, type FEATURES_REQUEST, length 8, xid 0x00000006
+ version 1.0, type STATS_REQUEST, length 12, xid 0x00000007
+ type TABLE, flags 0x0000
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000008
+IP (tos 0x0, ttl 64, id 53475, offset 0, flags [DF], proto TCP (6), length 180)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x47d0 (correct), seq 145:273, ack 137, win 1035, options [nop,nop,TS val 1 ecr 47836355], length 128: OpenFlow
+ version 1.0, type FEATURES_REPLY, length 128, xid 0x00000006
+ dpid 0x00010001e88ae0e2, n_buffers 0, n_tables 6
+ capabilities 0x00000007 (FLOW_STATS, TABLE_STATS, PORT_STATS)
+ actions 0x00000137 (OUTPUT, SET_VLAN_VID, SET_VLAN_PCP, SET_DL_SRC, SET_DL_DST, SET_NW_TOS)
+ port_no 1, hw_addr 00:01:e8:8a:e0:e4, name 'Te 0/0'
+ config 0x00000000
+ state 0x00000000
+ curr 0x00000340 (10GB_FD, FIBER, AUTONEG)
+ advertised 0x00000340 (10GB_FD, FIBER, AUTONEG)
+ supported 0x00000340 (10GB_FD, FIBER, AUTONEG)
+ peer 0x00000000
+ port_no 2, hw_addr 00:01:e8:8a:e0:e4, name 'Te 0/1'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000300 (FIBER, AUTONEG)
+ advertised 0x00000300 (FIBER, AUTONEG)
+ supported 0x00000300 (FIBER, AUTONEG)
+ peer 0x00000000
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x0612 (correct), seq 273:281, ack 137, win 1035, options [nop,nop,TS val 1 ecr 47836355], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000008
+IP (tos 0x0, ttl 64, id 53476, offset 0, flags [DF], proto TCP (6), length 448)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x2be8 (correct), seq 281:677, ack 137, win 1035, options [nop,nop,TS val 1 ecr 47836355], length 396: OpenFlow
+ version 1.0, type STATS_REPLY, length 396, xid 0x00000007
+ type TABLE, flags 0x0000
+ table_id 0, name 'VLAN Table'
+ wildcards 0x003ffffd (IN_PORT, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 1024, active_count 0, lookup_count 0, matched_count 0
+ table_id 0, name 'MAC Table'
+ wildcards 0x003ffff5 (IN_PORT, DL_SRC, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 49152, active_count 0, lookup_count 0, matched_count 0
+ table_id 0, name 'Route Table'
+ wildcards 0x003fffff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 6144, active_count 0, lookup_count 0, matched_count 0
+ table_id 0, name 'ACL Table'
+ wildcards 0x003fffff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 498, active_count 0, lookup_count 127028, matched_count 0
+ table_id 0, name 'Learning Switch Table'
+ wildcards 0x003fffff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 24576, active_count 0, lookup_count 0, matched_count 0
+ table_id 0, name 'Egress Port Block Table'
+ wildcards 0x003fffff (IN_PORT, DL_VLAN, DL_SRC, DL_DST, DL_TYPE, NW_PROTO, TP_SRC, TP_DST, DL_VLAN_PCP, NW_TOS)
+ max_entries 256, active_count 0, lookup_count 0, matched_count 0
+IP (tos 0x0, ttl 64, id 53100, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0x088c), seq 137, ack 677, win 139, options [nop,nop,TS val 47836520 ecr 1], length 0
+IP (tos 0x0, ttl 64, id 53101, offset 0, flags [DF], proto TCP (6), length 4156)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x2493 (incorrect -> 0xa671), seq 137:4241, ack 677, win 139, options [nop,nop,TS val 47836527 ecr 1], length 4104: OpenFlow
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000009
+ match in_port 1
+ cookie 0x0000000000000001, command ADD, priority 35000, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port CONTROLLER, max_len 65535
+ version 1.0, type FLOW_MOD, length 80, xid 0x0000000a
+ match in_port 1
+ cookie 0x0000000000000002, command ADD, priority 34999, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_VLAN_VID, len 8, vlan_vid 2
+ version 1.0, type FLOW_MOD, length 80, xid 0x0000000b
+ match in_port 1
+ cookie 0x0000000000000003, command ADD, priority 34998, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_VLAN_PCP, len 8, vlan_pcp 5
+ version 1.0, type FLOW_MOD, length 88, xid 0x0000000c
+ match in_port 1
+ cookie 0x0000000000000004, command ADD, priority 34997, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_VLAN_VID, len 8, vlan_vid 2
+ action type SET_VLAN_PCP, len 8, vlan_pcp 5
+ version 1.0, type FLOW_MOD, length 88, xid 0x0000000d
+ match in_port 1
+ cookie 0x0000000000000005, command ADD, priority 34996, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 11:22:33:44:55:66
+ version 1.0, type FLOW_MOD, length 88, xid 0x0000000e
+ match in_port 1
+ cookie 0x0000000000000006, command ADD, priority 34995, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_DST, len 16, dl_addr 77:88:99:aa:bb:cc
+ version 1.0, type FLOW_MOD, length 104, xid 0x0000000f
+ match in_port 1
+ cookie 0x0000000000000007, command ADD, priority 34994, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 11:22:33:44:55:66
+ action type SET_DL_DST, len 16, dl_addr 77:88:99:aa:bb:cc
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000010
+ match in_port 1
+ match dl_src 00:00:00:00:00:01
+ cookie 0x0000000000000008, command ADD, priority 34000, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000011
+ match in_port 1
+ cookie 0x0000000000000009, command ADD, priority 33000, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_NW_TOS, len 8, nw_tos 0x28
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000012
+ match dl_vlan 100
+ match dl_vlan_pcp 4
+ match dl_type 0x0800
+ cookie 0x000000000000000a, command ADD, priority 32000, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000013
+ match dl_type 0x0800
+ match nw_src 10.11.12.0/24
+ match nw_dst 10.13.14.0/24
+ cookie 0x000000000000000b, command ADD, priority 31999, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000014
+ match dl_type 0x0800
+ match nw_proto 17
+ match tp_src 68
+ match tp_dst 67
+ cookie 0x000000000000000c, command ADD, priority 31998, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000015
+ match dl_type 0x0800
+ match nw_proto 1
+ match icmp_type 8
+ cookie 0x000000000000000d, command ADD, priority 31997, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000016
+ match dl_type 0x0800
+ match nw_proto 1
+ match icmp_type 3
+ match icmp_code 13
+ cookie 0x000000000000000e, command ADD, priority 31996, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000017
+ match dl_src aa:00:00:00:00:11
+ match dl_dst bb:00:00:00:00:22
+ cookie 0x000000000000000f, command ADD, priority 31995, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000018
+ match dl_type 0x0800
+ match nw_tos 0x24
+ cookie 0x0000000000000010, command ADD, priority 31994, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000019
+ match dl_type 0x0800
+ match nw_proto 6
+ match tp_src 80
+ match tp_dst 80
+ cookie 0x0000000000000011, command ADD, priority 31993, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 112, xid 0x0000001a
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.21.0.0/16
+ cookie 0x0000000000000012, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 112, xid 0x0000001b
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.22.0.0/16
+ cookie 0x0000000000000013, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 112, xid 0x0000001c
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.23.0.0/16
+ cookie 0x0000000000000014, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 112, xid 0x0000001d
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.24.0.0/16
+ cookie 0x0000000000000015, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 112, xid 0x0000001e
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.0.0/24
+ cookie 0x0000000000000016, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 112, xid 0x0000001f
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.1.0/24
+ cookie 0x0000000000000017, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 112, xid 0x00000020
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.2.0/24
+ cookie 0x0000000000000018, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 112, xid 0x00000021
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.3.0/24
+ cookie 0x0000000000000019, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 112, xid 0x00000022
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.4.0/24
+ cookie 0x000000000000001a, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 112, xid 0x00000023
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.5.0/24
+ cookie 0x000000000000001b, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 112, xid 0x00000024
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.6.0/24
+ cookie 0x000000000000001c, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 112, xid 0x00000025
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.7.0/24
+ cookie 0x000000000000001d, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 112, xid 0x00000026
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ cookie 0x000000000000001e, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000027
+ match dl_dst 00:11:22:33:00:32
+ match dl_vlan 50
+ cookie 0x000000000000001f, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000028
+ match dl_dst 00:11:22:33:00:33
+ match dl_vlan 51
+ cookie 0x0000000000000020, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000029
+ match dl_dst 00:11:22:33:00:34
+ match dl_vlan 52
+ cookie 0x0000000000000021, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x0000002a
+ match dl_dst 00:11:22:33:00:35
+ match dl_vlan 53
+ cookie 0x0000000000000022, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x0000002b
+ match dl_dst 00:11:22:33:00:36
+ match dl_vlan 54
+ cookie 0x0000000000000023, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x0000002c
+ match dl_dst 00:11:22:33:00:37
+ match dl_vlan 55
+ cookie 0x0000000000000024, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x0000002d
+ match dl_dst 00:11:22:33:00:38
+ match dl_vlan 56
+ cookie 0x0000000000000025, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x0000002e
+ match dl_dst 00:11:22:33:00:39
+ match dl_vlan 57
+ cookie 0x0000000000000026, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x0000002f
+ match dl_src 00:11:22:33:00:0a
+ match dl_dst 00:11:22:33:00:14
+ cookie 0x0000000000000027, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000030
+ match dl_src 00:11:22:33:00:0a
+ match dl_dst 00:11:22:33:00:15
+ cookie 0x0000000000000028, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000031
+ match dl_src 00:11:22:33:00:0a
+ match dl_dst 00:11:22:33:00:16
+ cookie 0x0000000000000029, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000032
+ match dl_src 00:11:22:33:00:0b
+ match dl_dst 00:11:22:33:00:14
+ cookie 0x000000000000002a, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000033
+ match dl_src 00:11:22:33:00:0b
+ match dl_dst 00:11:22:33:00:15
+ cookie 0x000000000000002b, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000034
+ match dl_src 00:11:22:33:00:0b
+ match dl_dst 00:11:22:33:00:16
+ cookie 0x000000000000002c, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000035
+ match dl_src 00:11:22:33:00:0c
+ match dl_dst 00:11:22:33:00:14
+ cookie 0x000000000000002d, command ADD, priority 65535, buffer_id NONE, flags 0x0001 (SEND_FLOW_REM)
+ action type OUTPUT, len 8, port 1
+ version 1.0, type FLOW_MOD, length 80, xid 0x00000036
+ match dl_src 00:11:22:33:00:0c
+ match dl_dst 00:11:22:33:00:15 [|openflow]
+IP (tos 0x0, ttl 64, id 53104, offset 0, flags [DF], proto TCP (6), length 180)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x150b (incorrect -> 0x8ec7), seq 4241:4369, ack 677, win 139, options [nop,nop,TS val 47836527 ecr 1], length 128: OpenFlow
+ version unknown (0x00), type 0x00, length 0, xid 0x00000000 (corrupt)
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [.], cksum 0xfaa7 (correct), seq 677, ack 2873, win 952, options [nop,nop,TS val 1 ecr 47836527], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [.], cksum 0xf4fe (correct), seq 677, ack 4369, win 905, options [nop,nop,TS val 1 ecr 47836527], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [.], cksum 0xf4a7 (correct), seq 677, ack 4369, win 992, options [nop,nop,TS val 1 ecr 47836527], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xf318 (correct), seq 677:685, ack 4369, win 1035, options [nop,nop,TS val 2 ecr 47836527], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000038
+IP (tos 0x0, ttl 64, id 53105, offset 0, flags [DF], proto TCP (6), length 228)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x153b (incorrect -> 0x165f), seq 4369:4545, ack 685, win 139, options [nop,nop,TS val 47836757 ecr 2], length 176: OpenFlow
+ version 1.0, type STATS_REQUEST, length 56, xid 0x00000039
+ type FLOW, flags 0x0000
+ table_id ALL, out_port NONE
+ version 1.0, type STATS_REQUEST, length 56, xid 0x0000003a
+ type FLOW, flags 0x0000
+ table_id 0, out_port NONE
+ version 1.0, type STATS_REQUEST, length 56, xid 0x0000003b
+ type FLOW, flags 0x0000
+ match dl_src 00:00:00:00:77:77
+ table_id 0, out_port CONTROLLER
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x0000003c
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [.], cksum 0xf2dd (correct), seq 685, ack 4545, win 1035, options [nop,nop,TS val 2 ecr 47836757], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 64)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xf170 (correct), seq 685:697, ack 4545, win 1035, options [nop,nop,TS val 2 ecr 47836757], length 12: OpenFlow
+ version 1.0, type STATS_REPLY, length 12, xid 0x0000003b
+ type FLOW, flags 0x0000
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xf16a (correct), seq 697:705, ack 4545, win 1035, options [nop,nop,TS val 2 ecr 47836757], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x0000003c
+IP (tos 0x0, ttl 64, id 53106, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xf556), seq 4545, ack 705, win 139, options [nop,nop,TS val 47837000 ecr 2], length 0
+IP (tos 0x0, ttl 64, id 53575, offset 0, flags [DF], proto TCP (6), length 1216)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x39b4 (correct), seq 705:1869, ack 4545, win 1035, options [nop,nop,TS val 2 ecr 47836757], length 1164: OpenFlow
+ version 1.0, type STATS_REPLY, length 1164, xid 0x00000039
+ type FLOW, flags 0x0001 (MORE)
+ length 128, table_id 30
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.21.0.0/16
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000012, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ length 128, table_id 30
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.22.0.0/16
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000013, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ length 128, table_id 30
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.23.0.0/16
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000014, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ length 128, table_id 30
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.24.0.0/16
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000015, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ length 128, table_id 30
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.0.0/24
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000016, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ length 128, table_id 30
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.1.0/24
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000017, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ length 128, table_id 30
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.2.0/24
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000018, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ length 128, table_id 30
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.3.0/24
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000019, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ length 128, table_id 30
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.4.0/24
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x000000000000001a, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+IP (tos 0x0, ttl 64, id 53576, offset 0, flags [DF], proto TCP (6), length 1176)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x6b64 (correct), seq 1869:2993, ack 4545, win 1035, options [nop,nop,TS val 2 ecr 47836757], length 1124: OpenFlow
+ version 1.0, type STATS_REPLY, length 1124, xid 0x00000039
+ type FLOW, flags 0x0001 (MORE)
+ length 128, table_id 30
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.5.0/24
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x000000000000001b, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ length 128, table_id 30
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.6.0/24
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x000000000000001c, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ length 128, table_id 30
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.7.0/24
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x000000000000001d, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ length 128, table_id 30
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x000000000000001e, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 00:01:e8:8a:e0:e4
+ action type SET_DL_DST, len 16, dl_addr 11:00:00:00:00:00
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 40
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 35000, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000001, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port CONTROLLER, max_len 65535
+ length 96, table_id 40
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 34999, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000002, packet_count 0, byte_count 0
+ action type SET_VLAN_VID, len 8, vlan_vid 2
+ length 96, table_id 40
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 34998, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000003, packet_count 0, byte_count 0
+ action type SET_VLAN_PCP, len 8, vlan_pcp 5
+ length 104, table_id 40
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 34997, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000004, packet_count 0, byte_count 0
+ action type SET_VLAN_VID, len 8, vlan_vid 2
+ action type SET_VLAN_PCP, len 8, vlan_pcp 5
+ length 104, table_id 40
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 34996, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000005, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 11:22:33:44:55:66
+ length 104, table_id 40
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 34995, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000006, packet_count 0, byte_count 0
+ action type SET_DL_DST, len 16, dl_addr 77:88:99:aa:bb:cc
+IP (tos 0x0, ttl 64, id 53107, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xec39), seq 4545, ack 2993, win 184, options [nop,nop,TS val 47837000 ecr 2], length 0
+IP (tos 0x0, ttl 64, id 53108, offset 0, flags [DF], proto TCP (6), length 148)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x14eb (incorrect -> 0xc5f7), seq 4545:4641, ack 2993, win 184, options [nop,nop,TS val 47837000 ecr 2], length 96: OpenFlow
+ version 1.0, type STATS_REQUEST, length 12, xid 0x0000003d
+ type DESC, flags 0x0000
+ version 1.0, type STATS_REQUEST, length 56, xid 0x0000003e
+ type AGGREGATE, flags 0x0000
+ table_id ALL, out_port NONE
+ version 1.0, type STATS_REQUEST, length 20, xid 0x0000003f
+ type PORT, flags 0x0000
+ port_no NONE
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000040
+IP (tos 0x0, ttl 64, id 53577, offset 0, flags [DF], proto TCP (6), length 1048)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x29df (correct), seq 2993:3989, ack 4545, win 1035, options [nop,nop,TS val 2 ecr 47836757], length 996: OpenFlow
+ version 1.0, type STATS_REPLY, length 996, xid 0x00000039
+ type FLOW, flags 0x0001 (MORE)
+ length 120, table_id 40
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 34994, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000007, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 11:22:33:44:55:66
+ action type SET_DL_DST, len 16, dl_addr 77:88:99:aa:bb:cc
+ length 96, table_id 40
+ match in_port 1
+ match dl_src 00:00:00:00:00:01
+ duration_sec 0, duration_nsec 0, priority 34000, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000008, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 40
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 33000, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000009, packet_count 0, byte_count 0
+ action type SET_NW_TOS, len 8, nw_tos 0x28
+ length 96, table_id 40
+ match dl_vlan 100
+ match dl_vlan_pcp 4
+ match dl_type 0x0800
+ duration_sec 0, duration_nsec 0, priority 32000, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000a, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 40
+ match dl_type 0x0800
+ match nw_src 10.11.12.0/24
+ match nw_dst 10.13.14.0/24
+ duration_sec 0, duration_nsec 0, priority 31999, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000b, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 40
+ match dl_type 0x0800
+ match nw_proto 17
+ match tp_src 68
+ match tp_dst 67
+ duration_sec 0, duration_nsec 0, priority 31998, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000c, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 40
+ match dl_type 0x0800
+ match nw_proto 1
+ match icmp_type 8
+ duration_sec 0, duration_nsec 0, priority 31997, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000d, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 40
+ match dl_type 0x0800
+ match nw_proto 1
+ match icmp_type 3
+ match icmp_code 13
+ duration_sec 0, duration_nsec 0, priority 31996, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000e, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 40
+ match dl_src aa:00:00:00:00:11
+ match dl_dst bb:00:00:00:00:22
+ duration_sec 0, duration_nsec 0, priority 31995, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000f, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 40
+ match dl_type 0x0800
+ match nw_tos 0x24
+ duration_sec 0, duration_nsec 0, priority 31994, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000010, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+IP (tos 0x0, ttl 64, id 53578, offset 0, flags [DF], proto TCP (6), length 1024)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x45c0 (correct), seq 3989:4961, ack 4545, win 1035, options [nop,nop,TS val 2 ecr 47836757], length 972: OpenFlow
+ version 1.0, type STATS_REPLY, length 972, xid 0x00000039
+ type FLOW, flags 0x0001 (MORE)
+ length 96, table_id 40
+ match dl_type 0x0800
+ match nw_proto 6
+ match tp_src 80
+ match tp_dst 80
+ duration_sec 0, duration_nsec 0, priority 31993, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000011, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 40
+ match dl_dst 00:11:22:33:00:32
+ match dl_vlan 50
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x000000000000001f, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_dst 00:11:22:33:00:33
+ match dl_vlan 51
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000020, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_dst 00:11:22:33:00:34
+ match dl_vlan 52
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000021, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_dst 00:11:22:33:00:35
+ match dl_vlan 53
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000022, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_dst 00:11:22:33:00:36
+ match dl_vlan 54
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000023, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_dst 00:11:22:33:00:37
+ match dl_vlan 55
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000024, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_dst 00:11:22:33:00:38
+ match dl_vlan 56
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000025, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_dst 00:11:22:33:00:39
+ match dl_vlan 57
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000026, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_src 00:11:22:33:00:0a
+ match dl_dst 00:11:22:33:00:14
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000027, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+IP (tos 0x0, ttl 64, id 53109, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xe405), seq 4641, ack 4961, win 220, options [nop,nop,TS val 47837000 ecr 2], length 0
+IP (tos 0x0, ttl 64, id 53579, offset 0, flags [DF], proto TCP (6), length 832)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x6f3d (correct), seq 4961:5741, ack 4545, win 1035, options [nop,nop,TS val 2 ecr 47836757], length 780: OpenFlow
+ version 1.0, type STATS_REPLY, length 780, xid 0x00000039
+ type FLOW, flags 0x0000
+ length 96, table_id 40
+ match dl_src 00:11:22:33:00:0a
+ match dl_dst 00:11:22:33:00:15
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000028, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_src 00:11:22:33:00:0a
+ match dl_dst 00:11:22:33:00:16
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000029, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_src 00:11:22:33:00:0b
+ match dl_dst 00:11:22:33:00:14
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x000000000000002a, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_src 00:11:22:33:00:0b
+ match dl_dst 00:11:22:33:00:15
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x000000000000002b, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_src 00:11:22:33:00:0b
+ match dl_dst 00:11:22:33:00:16
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x000000000000002c, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_src 00:11:22:33:00:0c
+ match dl_dst 00:11:22:33:00:14
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x000000000000002d, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_src 00:11:22:33:00:0c
+ match dl_dst 00:11:22:33:00:15
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x000000000000002e, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 40
+ match dl_src 00:11:22:33:00:0c
+ match dl_dst 00:11:22:33:00:16
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x000000000000002f, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+IP (tos 0x0, ttl 64, id 53580, offset 0, flags [DF], proto TCP (6), length 976)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x0dbb (correct), seq 5741:6665, ack 4545, win 1035, options [nop,nop,TS val 2 ecr 47836757], length 924: OpenFlow
+ version 1.0, type STATS_REPLY, length 924, xid 0x0000003a
+ type FLOW, flags 0x0001 (MORE)
+ length 96, table_id 0
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 35000, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000001, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port CONTROLLER, max_len 65535
+ length 96, table_id 0
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 34999, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000002, packet_count 0, byte_count 0
+ action type SET_VLAN_VID, len 8, vlan_vid 2
+ length 96, table_id 0
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 34998, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000003, packet_count 0, byte_count 0
+ action type SET_VLAN_PCP, len 8, vlan_pcp 5
+ length 104, table_id 0
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 34997, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000004, packet_count 0, byte_count 0
+ action type SET_VLAN_VID, len 8, vlan_vid 2
+ action type SET_VLAN_PCP, len 8, vlan_pcp 5
+ length 104, table_id 0
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 34996, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000005, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 11:22:33:44:55:66
+ length 104, table_id 0
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 34995, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000006, packet_count 0, byte_count 0
+ action type SET_DL_DST, len 16, dl_addr 77:88:99:aa:bb:cc
+ length 120, table_id 0
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 34994, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000007, packet_count 0, byte_count 0
+ action type SET_DL_SRC, len 16, dl_addr 11:22:33:44:55:66
+ action type SET_DL_DST, len 16, dl_addr 77:88:99:aa:bb:cc
+ length 96, table_id 0
+ match in_port 1
+ match dl_src 00:00:00:00:00:01
+ duration_sec 0, duration_nsec 0, priority 34000, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000008, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 0
+ match in_port 1
+ duration_sec 0, duration_nsec 0, priority 33000, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000009, packet_count 0, byte_count 0
+ action type SET_NW_TOS, len 8, nw_tos 0x28
+IP (tos 0x0, ttl 64, id 53110, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xdd38), seq 4641, ack 6665, win 257, options [nop,nop,TS val 47837000 ecr 2], length 0
+IP (tos 0x0, ttl 64, id 53581, offset 0, flags [DF], proto TCP (6), length 1500)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [.], cksum 0x2501 (correct), seq 6665:8113, ack 4545, win 1035, options [nop,nop,TS val 2 ecr 47837000], length 1448: OpenFlow
+ version 1.0, type STATS_REPLY, length 972, xid 0x0000003a
+ type FLOW, flags 0x0001 (MORE)
+ length 96, table_id 0
+ match dl_vlan 100
+ match dl_vlan_pcp 4
+ match dl_type 0x0800
+ duration_sec 0, duration_nsec 0, priority 32000, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000a, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 0
+ match dl_type 0x0800
+ match nw_src 10.11.12.0/24
+ match nw_dst 10.13.14.0/24
+ duration_sec 0, duration_nsec 0, priority 31999, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000b, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 0
+ match dl_type 0x0800
+ match nw_proto 17
+ match tp_src 68
+ match tp_dst 67
+ duration_sec 0, duration_nsec 0, priority 31998, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000c, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 0
+ match dl_type 0x0800
+ match nw_proto 1
+ match icmp_type 8
+ duration_sec 0, duration_nsec 0, priority 31997, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000d, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 0
+ match dl_type 0x0800
+ match nw_proto 1
+ match icmp_type 3
+ match icmp_code 13
+ duration_sec 0, duration_nsec 0, priority 31996, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000e, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 0
+ match dl_src aa:00:00:00:00:11
+ match dl_dst bb:00:00:00:00:22
+ duration_sec 0, duration_nsec 0, priority 31995, idle_timeout 0, hard_timeout 0, cookie 0x000000000000000f, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 0
+ match dl_type 0x0800
+ match nw_tos 0x24
+ duration_sec 0, duration_nsec 0, priority 31994, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000010, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 0
+ match dl_type 0x0800
+ match nw_proto 6
+ match tp_src 80
+ match tp_dst 80
+ duration_sec 0, duration_nsec 0, priority 31993, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000011, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 2
+ length 96, table_id 0
+ match dl_dst 00:11:22:33:00:32
+ match dl_vlan 50
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x000000000000001f, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 0
+ match dl_dst 00:11:22:33:00:33
+ match dl_vlan 51
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000020, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ version 1.0, type STATS_REPLY, length 972, xid 0x0000003a
+ type FLOW, flags 0x0001 (MORE)
+ length 96, table_id 0
+ match dl_dst 00:11:22:33:00:34
+ match dl_vlan 52
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000021, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 0
+ match dl_dst 00:11:22:33:00:35
+ match dl_vlan 53
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000022, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 0
+ match dl_dst 00:11:22:33:00:36
+ match dl_vlan 54
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000023, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 0
+ match dl_dst 00:11:22:33:00:37
+ match dl_vlan 55
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000024, packet_count 0, byte_count 0
+ action type OUTPUT, len 8, port 1
+ length 96, table_id 0
+ match dl_dst 00:11:22:33:00:38
+ match dl_vlan 56
+ duration_sec 0, duration_nsec 0, priority 65535, idle_timeout 0, hard_timeout 0, cookie 0x0000000000000025, packet_count 0 [|openflow]
+IP (tos 0x0, ttl 64, id 53582, offset 0, flags [DF], proto TCP (6), length 1040)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x395e (correct), seq 8113:9101, ack 4545, win 1035, options [nop,nop,TS val 2 ecr 47837000], length 988: OpenFlow
+ version unknown (0x00), type 0x00, length 0, xid 0x00000000 (corrupt)
+IP (tos 0x0, ttl 64, id 53111, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xd387), seq 4641, ack 9101, win 302, options [nop,nop,TS val 47837000 ecr 2], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [.], cksum 0xd0aa (correct), seq 9101, ack 4641, win 1035, options [nop,nop,TS val 2 ecr 47837000], length 0
+IP (tos 0x0, ttl 64, id 53602, offset 0, flags [DF], proto TCP (6), length 1120)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x141f (correct), seq 9101:10169, ack 4641, win 1035, options [nop,nop,TS val 3 ecr 47837000], length 1068: OpenFlow
+ version 1.0, type STATS_REPLY, length 1068, xid 0x0000003d
+ type DESC, flags 0x0000
+ mfr_desc 'Dell Force 10'
+ hw_desc 'OpenFlow switch HW ver. 1.0'
+ sw_desc 'OpenFlow switch SW ver. 1.0'
+ serial_num '02132012'
+ dp_desc 'Dell-Switch: 00:01:e8:8a:e0:e2; instance: 1'
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xcb12 (correct), seq 10169:10177, ack 4641, win 1035, options [nop,nop,TS val 3 ecr 47837000], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000040
+IP (tos 0x0, ttl 64, id 53603, offset 0, flags [DF], proto TCP (6), length 88)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xcaa5 (correct), seq 10177:10213, ack 4641, win 1035, options [nop,nop,TS val 3 ecr 47837000], length 36: OpenFlow
+ version 1.0, type STATS_REPLY, length 36, xid 0x0000003e
+ type AGGREGATE, flags 0x0000
+ packet_count 0, byte_count 0, flow_count 47
+IP (tos 0x0, ttl 64, id 53604, offset 0, flags [DF], proto TCP (6), length 189)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x03e7 (correct), seq 10213:10350, ack 4641, win 1035, options [nop,nop,TS val 3 ecr 47837000], length 137: OpenFlow
+ version 1.0, type PACKET_IN, length 137, xid 0x00000000
+ buffer_id NONE, total_len 119, in_port 1, reason ACTION
+ data (119 octets), frame decoding below
+STP 802.1s, Rapid STP, CIST Flags [Proposal, Learn, Forward, Agreement], length 102
+ port-role Designated, CIST root-id 8000.08:9e:01:62:d5:f4, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:9e:01:62:d5:f4, CIST port-id 8034,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name pica8, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:9e:01:62:d5:f4, CIST remaining-hops 20
+IP (tos 0x0, ttl 64, id 53605, offset 0, flags [DF], proto TCP (6), length 168)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x4a03 (correct), seq 10350:10466, ack 4641, win 1035, options [nop,nop,TS val 3 ecr 47837000], length 116: OpenFlow
+ version 1.0, type STATS_REPLY, length 116, xid 0x0000003f
+ type PORT, flags 0x0001 (MORE)
+ port_no 1, rx_packets 129437, tx_packets 8061, rx_bytes 16090662, tx_bytes 515904, rx_dropped 0, tx_dropped 0, rx_errors 18446744073709551615, tx_errors 18446744073709551615, rx_frame_err 18446744073709551615, rx_over_err 18446744073709551615, rx_crc_err 0, collisions 0
+IP (tos 0x0, ttl 64, id 53606, offset 0, flags [DF], proto TCP (6), length 168)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xc90e (correct), seq 10466:10582, ack 4641, win 1035, options [nop,nop,TS val 3 ecr 47837000], length 116: OpenFlow
+ version 1.0, type STATS_REPLY, length 116, xid 0x0000003f
+ type PORT, flags 0x0000
+ port_no 2, rx_packets 0, tx_packets 0, rx_bytes 0, tx_bytes 0, rx_dropped 0, tx_dropped 0, rx_errors 18446744073709551615, tx_errors 18446744073709551615, rx_frame_err 18446744073709551615, rx_over_err 18446744073709551615, rx_crc_err 0, collisions 0
+IP (tos 0x0, ttl 64, id 53112, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xcccd), seq 4641, ack 10582, win 331, options [nop,nop,TS val 47837211 ecr 3], length 0
+IP (tos 0x0, ttl 64, id 53113, offset 0, flags [DF], proto TCP (6), length 132)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x14db (incorrect -> 0xc93e), seq 4641:4721, ack 10582, win 331, options [nop,nop,TS val 47837212 ecr 3], length 80: OpenFlow
+ version 1.0, type FLOW_MOD, length 72, xid 0x00000041
+ cookie 0x0000000000000000, command DELETE, priority 65535, out_port NONE, flags 0x0001 (SEND_FLOW_REM)
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000042
+IP (tos 0x0, ttl 64, id 53707, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xc92c (correct), seq 10582:10670, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837212], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000001a
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.21.0.0/16
+ cookie 0x0000000000000012, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53708, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xc8d1 (correct), seq 10670:10758, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837212], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000001b
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.22.0.0/16
+ cookie 0x0000000000000013, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53709, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xc876 (correct), seq 10758:10846, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837212], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000001c
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.23.0.0/16
+ cookie 0x0000000000000014, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53710, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xc81b (correct), seq 10846:10934, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837212], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000001d
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.24.0.0/16
+ cookie 0x0000000000000015, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53711, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xc7c7 (correct), seq 10934:11022, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837212], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000001e
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.0.0/24
+ cookie 0x0000000000000016, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53712, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xc66d (correct), seq 11022:11110, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837212], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000001f
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.1.0/24
+ cookie 0x0000000000000017, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53713, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xc513 (correct), seq 11110:11198, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837212], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000020
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.2.0/24
+ cookie 0x0000000000000018, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53714, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xc3b9 (correct), seq 11198:11286, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837212], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000021
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.3.0/24
+ cookie 0x0000000000000019, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53114, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xc900), seq 4721, ack 11286, win 331, options [nop,nop,TS val 47837400 ecr 3], length 0
+IP (tos 0x0, ttl 64, id 53715, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xc25f (correct), seq 11286:11374, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837212], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000022
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.4.0/24
+ cookie 0x000000000000001a, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53716, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xc105 (correct), seq 11374:11462, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837212], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000023
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.5.0/24
+ cookie 0x000000000000001b, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53717, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xbfab (correct), seq 11462:11550, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837212], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000024
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.6.0/24
+ cookie 0x000000000000001c, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53718, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xbe51 (correct), seq 11550:11638, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837212], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000025
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ match nw_dst 10.20.7.0/24
+ cookie 0x000000000000001d, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53719, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xcf05 (correct), seq 11638:11726, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837212], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000026
+ match dl_dst 00:01:e8:8a:e0:e4
+ match dl_type 0x0800
+ cookie 0x000000000000001e, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53720, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x37c4 (correct), seq 11726:11814, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837400], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000009
+ match in_port 1
+ cookie 0x0000000000000001, priority 35000, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53721, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x376b (correct), seq 11814:11902, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837400], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000000a
+ match in_port 1
+ cookie 0x0000000000000002, priority 34999, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53115, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xc697), seq 4721, ack 11902, win 331, options [nop,nop,TS val 47837401 ecr 3], length 0
+IP (tos 0x0, ttl 64, id 53722, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x3712 (correct), seq 11902:11990, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837400], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000000b
+ match in_port 1
+ cookie 0x0000000000000003, priority 34998, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53723, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x36b9 (correct), seq 11990:12078, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837400], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000000c
+ match in_port 1
+ cookie 0x0000000000000004, priority 34997, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53724, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x3660 (correct), seq 12078:12166, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837400], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000000d
+ match in_port 1
+ cookie 0x0000000000000005, priority 34996, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53725, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x3607 (correct), seq 12166:12254, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837400], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000000e
+ match in_port 1
+ cookie 0x0000000000000006, priority 34995, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53726, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x35ae (correct), seq 12254:12342, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837400], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000000f
+ match in_port 1
+ cookie 0x0000000000000007, priority 34994, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53727, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x3938 (correct), seq 12342:12430, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000010
+ match in_port 1
+ match dl_src 00:00:00:00:00:01
+ cookie 0x0000000000000008, priority 34000, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53728, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x3cc3 (correct), seq 12430:12518, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000011
+ match in_port 1
+ cookie 0x0000000000000009, priority 33000, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53116, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xc42f), seq 4721, ack 12518, win 331, options [nop,nop,TS val 47837401 ecr 3], length 0
+IP (tos 0x0, ttl 64, id 53729, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x1317 (correct), seq 12518:12606, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000012
+ match dl_vlan 100
+ match dl_vlan_pcp 4
+ match dl_type 0x0800
+ cookie 0x000000000000000a, priority 32000, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53730, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x00fe (correct), seq 12606:12694, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000013
+ match dl_type 0x0800
+ match nw_src 10.11.12.0/24
+ match nw_dst 10.13.14.0/24
+ cookie 0x000000000000000b, priority 31999, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53731, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x16ff (correct), seq 12694:12782, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000014
+ match dl_type 0x0800
+ match nw_proto 17
+ match tp_src 68
+ match tp_dst 67
+ cookie 0x000000000000000c, priority 31998, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53732, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x16b5 (correct), seq 12782:12870, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000015
+ match dl_type 0x0800
+ match nw_proto 1
+ match icmp_type 8
+ cookie 0x000000000000000d, priority 31997, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53733, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x16d4 (correct), seq 12870:12958, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000016
+ match dl_type 0x0800
+ match nw_proto 1
+ match icmp_type 3
+ match icmp_code 13
+ cookie 0x000000000000000e, priority 31996, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53117, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xc37f), seq 4721, ack 12694, win 331, options [nop,nop,TS val 47837401 ecr 3], length 0
+IP (tos 0x0, ttl 64, id 53734, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xd96b (correct), seq 12958:13046, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000017
+ match dl_src aa:00:00:00:00:11
+ match dl_dst bb:00:00:00:00:22
+ cookie 0x000000000000000f, priority 31995, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53735, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xf172 (correct), seq 13046:13134, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000018
+ match dl_type 0x0800
+ match nw_tos 0x24
+ cookie 0x0000000000000010, priority 31994, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53736, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x1534 (correct), seq 13134:13222, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000019
+ match dl_type 0x0800
+ match nw_proto 6
+ match tp_src 80
+ match tp_dst 80
+ cookie 0x0000000000000011, priority 31993, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53118, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xc16f), seq 4721, ack 13222, win 331, options [nop,nop,TS val 47837401 ecr 3], length 0
+IP (tos 0x0, ttl 64, id 53737, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x97c9 (correct), seq 13222:13310, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000027
+ match dl_dst 00:11:22:33:00:32
+ match dl_vlan 50
+ cookie 0x000000000000001f, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53738, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x976d (correct), seq 13310:13398, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000028
+ match dl_dst 00:11:22:33:00:33
+ match dl_vlan 51
+ cookie 0x0000000000000020, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53739, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x9711 (correct), seq 13398:13486, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000029
+ match dl_dst 00:11:22:33:00:34
+ match dl_vlan 52
+ cookie 0x0000000000000021, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53740, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x96b5 (correct), seq 13486:13574, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000002a
+ match dl_dst 00:11:22:33:00:35
+ match dl_vlan 53
+ cookie 0x0000000000000022, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53741, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x9659 (correct), seq 13574:13662, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000002b
+ match dl_dst 00:11:22:33:00:36
+ match dl_vlan 54
+ cookie 0x0000000000000023, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53742, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x95fd (correct), seq 13662:13750, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000002c
+ match dl_dst 00:11:22:33:00:37
+ match dl_vlan 55
+ cookie 0x0000000000000024, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53743, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x95a1 (correct), seq 13750:13838, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000002d
+ match dl_dst 00:11:22:33:00:38
+ match dl_vlan 56
+ cookie 0x0000000000000025, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53119, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xbf07), seq 4721, ack 13838, win 331, options [nop,nop,TS val 47837401 ecr 3], length 0
+IP (tos 0x0, ttl 64, id 53744, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x9545 (correct), seq 13838:13926, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000002e
+ match dl_dst 00:11:22:33:00:39
+ match dl_vlan 57
+ cookie 0x0000000000000026, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53745, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x72fd (correct), seq 13926:14014, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x0000002f
+ match dl_src 00:11:22:33:00:0a
+ match dl_dst 00:11:22:33:00:14
+ cookie 0x0000000000000027, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53746, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x72a2 (correct), seq 14014:14102, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000030
+ match dl_src 00:11:22:33:00:0a
+ match dl_dst 00:11:22:33:00:15
+ cookie 0x0000000000000028, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53747, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x7247 (correct), seq 14102:14190, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000031
+ match dl_src 00:11:22:33:00:0a
+ match dl_dst 00:11:22:33:00:16
+ cookie 0x0000000000000029, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53748, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x71ee (correct), seq 14190:14278, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000032
+ match dl_src 00:11:22:33:00:0b
+ match dl_dst 00:11:22:33:00:14
+ cookie 0x000000000000002a, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53120, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xbd4e), seq 4721, ack 14278, win 331, options [nop,nop,TS val 47837402 ecr 3], length 0
+IP (tos 0x0, ttl 64, id 53749, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x7193 (correct), seq 14278:14366, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000033
+ match dl_src 00:11:22:33:00:0b
+ match dl_dst 00:11:22:33:00:15
+ cookie 0x000000000000002b, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53750, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x7138 (correct), seq 14366:14454, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000034
+ match dl_src 00:11:22:33:00:0b
+ match dl_dst 00:11:22:33:00:16
+ cookie 0x000000000000002c, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53751, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x70df (correct), seq 14454:14542, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000035
+ match dl_src 00:11:22:33:00:0c
+ match dl_dst 00:11:22:33:00:14
+ cookie 0x000000000000002d, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53752, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x7084 (correct), seq 14542:14630, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837401], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000036
+ match dl_src 00:11:22:33:00:0c
+ match dl_dst 00:11:22:33:00:15
+ cookie 0x000000000000002e, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 53753, offset 0, flags [DF], proto TCP (6), length 140)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0x7028 (correct), seq 14630:14718, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837402], length 88: OpenFlow
+ version 1.0, type FLOW_REMOVED, length 88, xid 0x00000037
+ match dl_src 00:11:22:33:00:0c
+ match dl_dst 00:11:22:33:00:16
+ cookie 0x000000000000002f, priority 65535, reason DELETE, duration_sec 0, duration_nsec 0, packet_count 0, byte_count 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xb769 (correct), seq 14718:14726, ack 4721, win 1035, options [nop,nop,TS val 3 ecr 47837402], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000042
+IP (tos 0x0, ttl 64, id 53121, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xbb8e), seq 4721, ack 14726, win 331, options [nop,nop,TS val 47837402 ecr 3], length 0
+IP (tos 0x0, ttl 64, id 53122, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x1493 (incorrect -> 0xba21), seq 4721:4729, ack 14726, win 331, options [nop,nop,TS val 47837402 ecr 3], length 8: OpenFlow
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000043
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xb758 (correct), seq 14726:14734, ack 4729, win 1035, options [nop,nop,TS val 3 ecr 47837402], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000043
+IP (tos 0x0, ttl 64, id 53123, offset 0, flags [DF], proto TCP (6), length 144)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x14e7 (incorrect -> 0x2671), seq 4729:4821, ack 14734, win 331, options [nop,nop,TS val 47837403 ecr 3], length 92: OpenFlow
+ version 1.0, type PACKET_OUT, length 84, xid 0x00000044
+ buffer_id 0xffffffff, in_port CONTROLLER
+ action type OUTPUT, len 8, port 1
+ data (60 octets), frame decoding below
+67:68:00:00:00:00 > 61:62:63:64:65:66 Null Information, send seq 0, rcv seq 0, Flags [Command], length 46
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000045
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xb6f1 (correct), seq 14734:14742, ack 4821, win 1035, options [nop,nop,TS val 3 ecr 47837403], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000045
+IP (tos 0x0, ttl 64, id 53124, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x1493 (incorrect -> 0xb9a7), seq 4821:4829, ack 14742, win 331, options [nop,nop,TS val 47837405 ecr 3], length 8: OpenFlow
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000046
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xb6de (correct), seq 14742:14750, ack 4829, win 1035, options [nop,nop,TS val 3 ecr 47837405], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000046
+IP (tos 0x0, ttl 64, id 53125, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x1493 (incorrect -> 0xb995), seq 4829:4837, ack 14750, win 331, options [nop,nop,TS val 47837406 ecr 3], length 8: OpenFlow
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000047
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xb6cc (correct), seq 14750:14758, ack 4837, win 1035, options [nop,nop,TS val 3 ecr 47837406], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000047
+IP (tos 0x0, ttl 64, id 53126, offset 0, flags [DF], proto TCP (6), length 72)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [P.], cksum 0x149f (incorrect -> 0xb819), seq 4837:4857, ack 14758, win 331, options [nop,nop,TS val 47837407 ecr 3], length 20: OpenFlow
+ version 1.0, type SET_CONFIG, length 12, xid 0x00000048
+ flags FRAG_NORMAL, miss_send_len 65535
+ version 1.0, type BARRIER_REQUEST, length 8, xid 0x00000049
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xb6ad (correct), seq 14758:14766, ack 4857, win 1035, options [nop,nop,TS val 3 ecr 47837407], length 8: OpenFlow
+ version 1.0, type BARRIER_REPLY, length 8, xid 0x00000049
+IP (tos 0x0, ttl 64, id 53127, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xbab1), seq 4857, ack 14766, win 331, options [nop,nop,TS val 47837447 ecr 3], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 64)
+ 10.0.0.81.55442 > 10.0.0.20.6633: Flags [S], cksum 0xb924 (correct), seq 553833795, win 32768, options [mss 1380,nop,wscale 5,sackOK,nop,nop,nop,nop,TS val 1 ecr 0], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.20.6633 > 10.0.0.81.55442: Flags [S.], cksum 0x1493 (incorrect -> 0x6111), seq 845973340, ack 553833796, win 14480, options [mss 1460,sackOK,TS val 47838340 ecr 1,nop,wscale 7], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.55442 > 10.0.0.20.6633: Flags [.], cksum 0xc462 (correct), seq 1, ack 1, win 1035, options [nop,nop,TS val 1 ecr 47838340], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.81.55442 > 10.0.0.20.6633: Flags [P.], cksum 0x3724 (correct), seq 1:9, ack 1, win 1035, options [nop,nop,TS val 1 ecr 47838340], length 8: OpenFlow
+ version 1.0, type HELLO, length 8, xid 0x95e1f644
+IP (tos 0x0, ttl 64, id 29656, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.55442: Flags [.], cksum 0x148b (incorrect -> 0xc7f2), seq 1, ack 9, win 114, options [nop,nop,TS val 47838341 ecr 1], length 0
+IP (tos 0x0, ttl 64, id 29657, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.20.6633 > 10.0.0.81.55442: Flags [P.], cksum 0x1493 (incorrect -> 0xc6d3), seq 1:9, ack 9, win 114, options [nop,nop,TS val 47838347 ecr 1], length 8: OpenFlow
+ version 1.0, type HELLO, length 8, xid 0x00000001
+IP (tos 0x0, ttl 64, id 29658, offset 0, flags [DF], proto TCP (6), length 60)
+ 10.0.0.20.6633 > 10.0.0.81.55442: Flags [P.], cksum 0x1493 (incorrect -> 0xc6c4), seq 9:17, ack 9, win 114, options [nop,nop,TS val 47838348 ecr 1], length 8: OpenFlow
+ version 1.0, type FEATURES_REQUEST, length 8, xid 0x00000002
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.55442 > 10.0.0.20.6633: Flags [.], cksum 0xc444 (correct), seq 9, ack 17, win 1034, options [nop,nop,TS val 1 ecr 47838347], length 0
+IP (tos 0x0, ttl 64, id 53761, offset 0, flags [DF], proto TCP (6), length 180)
+ 10.0.0.81.55442 > 10.0.0.20.6633: Flags [P.], cksum 0x1df1 (correct), seq 9:137, ack 17, win 1035, options [nop,nop,TS val 1 ecr 47838347], length 128: OpenFlow
+ version 1.0, type FEATURES_REPLY, length 128, xid 0x00000002
+ dpid 0x00050001e88ae0e2, n_buffers 0, n_tables 6
+ capabilities 0x00000007 (FLOW_STATS, TABLE_STATS, PORT_STATS)
+ actions 0x00000137 (OUTPUT, SET_VLAN_VID, SET_VLAN_PCP, SET_DL_SRC, SET_DL_DST, SET_NW_TOS)
+ port_no 13, hw_addr 00:01:e8:8a:e0:e4, name 'Te 0/12'
+ config 0x00000001 (PORT_DOWN)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000300 (FIBER, AUTONEG)
+ advertised 0x00000300 (FIBER, AUTONEG)
+ supported 0x00000300 (FIBER, AUTONEG)
+ peer 0x00000000
+ port_no 16, hw_addr 00:01:e8:8a:e0:e4, name 'Te 0/15'
+ config 0x00008001 (PORT_DOWN) (bogus)
+ state 0x00000001 (LINK_DOWN)
+ curr 0x00000300 (FIBER, AUTONEG)
+ advertised 0x00000300 (FIBER, AUTONEG)
+ supported 0x00000300 (FIBER, AUTONEG)
+ peer 0x00000000
+IP (tos 0x0, ttl 64, id 29659, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.55442: Flags [F.], cksum 0x148b (incorrect -> 0xc74d), seq 17, ack 137, win 122, options [nop,nop,TS val 47838353 ecr 1], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.55442 > 10.0.0.20.6633: Flags [.], cksum 0xc3bc (correct), seq 137, ack 18, win 1035, options [nop,nop,TS val 1 ecr 47838353], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.55442 > 10.0.0.20.6633: Flags [F.], cksum 0xc3bb (correct), seq 137, ack 18, win 1035, options [nop,nop,TS val 1 ecr 47838353], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.55442: Flags [.], cksum 0xc74c (correct), seq 18, ack 138, win 122, options [nop,nop,TS val 47838353 ecr 1], length 0
+IP (tos 0x0, ttl 64, id 53775, offset 0, flags [DF], proto TCP (6), length 189)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [P.], cksum 0xf083 (correct), seq 14766:14903, ack 4857, win 1035, options [nop,nop,TS val 6 ecr 47837447], length 137: OpenFlow
+ version 1.0, type PACKET_IN, length 137, xid 0x00000000
+ buffer_id NONE, total_len 119, in_port 1, reason NO_MATCH
+ data (119 octets), frame decoding below
+STP 802.1s, Rapid STP, CIST Flags [Proposal, Learn, Forward, Agreement], length 102
+ port-role Designated, CIST root-id 8000.08:9e:01:62:d5:f4, CIST ext-pathcost 0
+ CIST regional-root-id 8000.08:9e:01:62:d5:f4, CIST port-id 8034,
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ v3len 64, MCID Name pica8, rev 0,
+ digest ac36177f50283cd4b83821d8ab26de62, CIST int-root-pathcost 0,
+ CIST bridge-id 8000.08:9e:01:62:d5:f4, CIST remaining-hops 20
+IP (tos 0x0, ttl 64, id 53128, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0x148b (incorrect -> 0xb3e0), seq 4857, ack 14903, win 331, options [nop,nop,TS val 47839052 ecr 6], length 0
+IP (tos 0x0, ttl 64, id 53129, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [F.], cksum 0x148b (incorrect -> 0xac31), seq 4857, ack 14903, win 331, options [nop,nop,TS val 47841018 ecr 6], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [.], cksum 0xa96d (correct), seq 14903, ack 4858, win 1035, options [nop,nop,TS val 10 ecr 47841018], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.81.56068 > 10.0.0.20.6633: Flags [F.], cksum 0xa96c (correct), seq 14903, ack 4858, win 1035, options [nop,nop,TS val 10 ecr 47841018], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
+ 10.0.0.20.6633 > 10.0.0.81.56068: Flags [.], cksum 0xac2b (correct), seq 4858, ack 14904, win 331, options [nop,nop,TS val 47841019 ecr 10], length 0
--- /dev/null
+IP (tos 0xc0, ttl 1, id 4052, offset 0, flags [none], proto OSPF (89), length 172)
+ 40.35.1.2 > 224.0.0.5: OSPFv2, LS-Update, length 152
+ Router-ID 10.255.245.35, Backbone Area, Authentication Type: none (0), 1 LSA
+ LSA #1
+ Advertising Router 10.255.245.37, seq 0x80000002, age 9s, length 104
+ Area Local Opaque LSA (10), Opaque-Type Traffic Engineering LSA (1), Opaque-ID 8
+ Options: [External]
+ Link TLV (2), length: 100
+ Link Type subTLV (1), length: 1, Point-to-point (1)
+ Link ID subTLV (2), length: 4, 10.255.245.69 (0x0afff545)
+ Local Interface IP address subTLV (3), length: 4, 10.9.142.1
+ Remote Interface IP address subTLV (4), length: 4, 10.9.142.2
+ Traffic Engineering Metric subTLV (5), length: 4, Metric 63
+ Maximum Bandwidth subTLV (6), length: 4, 622.080 Mbps
+ Maximum Reservable Bandwidth subTLV (7), length: 4, 622.080 Mbps
+ Unreserved Bandwidth subTLV (8), length: 32
+ TE-Class 0: 622.080 Mbps
+ TE-Class 1: 622.080 Mbps
+ TE-Class 2: 622.080 Mbps
+ TE-Class 3: 622.080 Mbps
+ TE-Class 4: 622.080 Mbps
+ TE-Class 5: 622.080 Mbps
+ TE-Class 6: 622.080 Mbps
+ TE-Class 7: 622.080 Mbps
+ Administrative Group subTLV (9), length: 4, 0x00000000
+IP (tos 0xc0, ttl 1, id 4106, offset 0, flags [none], proto OSPF (89), length 172)
+ 40.35.1.2 > 224.0.0.5: OSPFv2, LS-Update, length 152
+ Router-ID 10.255.245.35, Backbone Area, Authentication Type: none (0), 1 LSA
+ LSA #1
+ Advertising Router 10.255.245.37, seq 0x80000002, age 9s, length 104
+ Area Local Opaque LSA (10), Opaque-Type Traffic Engineering LSA (1), Opaque-ID 9
+ Options: [External]
+ Link TLV (2), length: 100
+ Link Type subTLV (1), length: 1, Point-to-point (1)
+ Link ID subTLV (2), length: 4, 10.255.245.69 (0x0afff545)
+ Local Interface IP address subTLV (3), length: 4, 10.9.143.1
+ Remote Interface IP address subTLV (4), length: 4, 10.9.143.2
+ Traffic Engineering Metric subTLV (5), length: 4, Metric 63
+ Maximum Bandwidth subTLV (6), length: 4, 622.080 Mbps
+ Maximum Reservable Bandwidth subTLV (7), length: 4, 622.080 Mbps
+ Unreserved Bandwidth subTLV (8), length: 32
+ TE-Class 0: 622.080 Mbps
+ TE-Class 1: 622.080 Mbps
+ TE-Class 2: 622.080 Mbps
+ TE-Class 3: 622.080 Mbps
+ TE-Class 4: 622.080 Mbps
+ TE-Class 5: 622.080 Mbps
+ TE-Class 6: 622.080 Mbps
+ TE-Class 7: 622.080 Mbps
+ Administrative Group subTLV (9), length: 4, 0x00000000
+IP (tos 0xc0, ttl 1, id 4160, offset 0, flags [none], proto OSPF (89), length 212)
+ 40.35.1.2 > 224.0.0.5: OSPFv2, LS-Update, length 192
+ Router-ID 10.255.245.35, Backbone Area, Authentication Type: none (0), 1 LSA
+ LSA #1
+ Advertising Router 10.255.245.35, seq 0x80000003, age 3s, length 144
+ Area Local Opaque LSA (10), Opaque-Type Traffic Engineering LSA (1), Opaque-ID 3
+ Options: [External]
+ Link TLV (2), length: 140
+ Link Type subTLV (1), length: 1, Point-to-point (1)
+ Link ID subTLV (2), length: 4, 10.255.245.40 (0x0afff528)
+ Local Interface IP address subTLV (3), length: 4, 10.40.35.14
+ Remote Interface IP address subTLV (4), length: 4, 10.40.35.13
+ Traffic Engineering Metric subTLV (5), length: 4, Metric 1
+ Maximum Bandwidth subTLV (6), length: 4, 100.000 Mbps
+ Maximum Reservable Bandwidth subTLV (7), length: 4, 100.000 Mbps
+ Unreserved Bandwidth subTLV (8), length: 32
+ TE-Class 0: 0.000 Mbps
+ TE-Class 1: 0.000 Mbps
+ TE-Class 2: 0.000 Mbps
+ TE-Class 3: 0.000 Mbps
+ TE-Class 4: 0.000 Mbps
+ TE-Class 5: 0.000 Mbps
+ TE-Class 6: 0.000 Mbps
+ TE-Class 7: 0.000 Mbps
+ Interface Switching Capability subTLV (15), length: 44
+ Interface Switching Capability: Packet-Switch Capable-1
+ LSP Encoding: Ethernet V2/DIX
+ Max LSP Bandwidth:
+ priority level 0: 0.000 Mbps
+ priority level 1: 0.000 Mbps
+ priority level 2: 0.000 Mbps
+ priority level 3: 0.000 Mbps
+ priority level 4: 0.000 Mbps
+ priority level 5: 0.000 Mbps
+ priority level 6: 0.000 Mbps
+ priority level 7: 0.000 Mbps
--- /dev/null
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 60) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x13): OSPFv3, Hello, length 36
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Neighbor List:
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 60) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0xd): OSPFv3, Hello, length 36
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Neighbor List:
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x14): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0xe): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x15): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0xf): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x17): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 52) fe80::1 > fe80::2: AH(spi=0x00000100,sumlen=16,seq=0x16): OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x000012fd
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x10): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 52) fe80::1 > fe80::2: AH(spi=0x00000100,sumlen=16,seq=0x18): OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x000012fd
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x19): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 52) fe80::1 > fe80::2: AH(spi=0x00000100,sumlen=16,seq=0x1a): OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x000012fd
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 52) fe80::2 > fe80::1: AH(spi=0x00000100,sumlen=16,seq=0x11): OSPFv3, Database Description, length 28
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x00000b91
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 352) fe80::1 > fe80::2: AH(spi=0x00000100,sumlen=16,seq=0x1b): OSPFv3, Database Description, length 328
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [More], MTU 1500, DD-Sequence 0x00000b91
+ Advertising Router 1.1.1.1, seq 0x8000000b, age 14s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000008, age 69s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000003, age 74s, length 12
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1, seq 0x80000001, age 54s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1, seq 0x80000001, age 54s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 54s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.7
+ Advertising Router 1.1.1.1, seq 0x80000001, age 54s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.8
+ Advertising Router 2.2.2.2, seq 0x80000001, age 1019s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000001, age 873s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 2.2.2.2, seq 0x80000001, age 873s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2, seq 0x80000001, age 873s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 1.1.1.1, seq 0x80000002, age 49s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000002, age 1082s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1, seq 0x80000001, age 49s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000003, age 74s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.20.0
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x12): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 312) fe80::2 > fe80::1: AH(spi=0x00000100,sumlen=16,seq=0x13): OSPFv3, Database Description, length 288
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [More, Master], MTU 1500, DD-Sequence 0x00000b92
+ Advertising Router 1.1.1.1, seq 0x80000008, age 68s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x8000000a, age 39s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 1020s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x80000001, age 865s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 1.1.1.1, seq 0x80000001, age 865s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 1.1.1.1, seq 0x80000001, age 865s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 2.2.2.2, seq 0x80000001, age 40s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000001, age 40s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2, seq 0x80000001, age 40s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.7
+ Advertising Router 2.2.2.2, seq 0x80000001, age 40s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.8
+ Advertising Router 1.1.1.1, seq 0x80000002, age 1084s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000002, age 33s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000001, age 33s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 52) fe80::1 > fe80::2: AH(spi=0x00000100,sumlen=16,seq=0x1c): OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [none], MTU 1500, DD-Sequence 0x00000b92
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 196) fe80::2 > fe80::1: AH(spi=0x00000100,sumlen=16,seq=0x14): OSPFv3, LS-Request, length 172
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 1.1.1.1
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.8
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.7
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.20.0
+ Advertising Router 1.1.1.1
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 172) fe80::1 > fe80::2: AH(spi=0x00000100,sumlen=16,seq=0x1d): OSPFv3, LS-Request, length 148
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 2.2.2.2
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.8
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.7
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 2.2.2.2
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 52) fe80::2 > fe80::1: AH(spi=0x00000100,sumlen=16,seq=0x15): OSPFv3, Database Description, length 28
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [Master], MTU 1500, DD-Sequence 0x00000b93
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 532) fe80::1 > fe80::2: AH(spi=0x00000100,sumlen=16,seq=0x1e): OSPFv3, LS-Update, length 508
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x8000000b, age 15s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 2.2.2.2, seq 0x80000003, age 75s, length 12
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.5
+ Options [V6, External, Router, Demand Circuit]
+ Connected Routers:
+ 2.2.2.2
+ 1.1.1.1
+ Advertising Router 2.2.2.2, seq 0x80000001, age 874s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 74
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 874s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 84
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 874s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2, metric 74
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 1020s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1, metric 64
+ 2001:db8::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 55s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.8, metric 74
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 55s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.7, metric 84
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 55s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.6, metric 74
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 55s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5, metric 64
+ 2001:db8::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 50s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::1, Prefixes 1:
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000003, age 75s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.20.0
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.5
+ Prefixes 1:
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 50s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8:0:12::/64, metric 10
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 52) fe80::1 > fe80::2: AH(spi=0x00000100,sumlen=16,seq=0x1f): OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [none], MTU 1500, DD-Sequence 0x00000b93
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 456) fe80::2 > fe80::1: AH(spi=0x00000100,sumlen=16,seq=0x16): OSPFv3, LS-Update, length 432
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x8000000a, age 40s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 2.2.2.2, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.8, metric 74
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.7, metric 84
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.6, metric 74
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5, metric 64
+ 2001:db8::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 866s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 74
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 866s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 84
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 866s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2, metric 74
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 1021s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1, metric 64
+ 2001:db8::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000002, age 34s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::2, Prefixes 1:
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 34s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8:0:12::/64, metric 10
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 116) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x17): OSPFv3, LS-Update, length 92
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+ Advertising Router 2.2.2.2, seq 0x8000000b, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 2.2.2.2
+ Neighbor Interface-ID 0.0.0.5, Interface 0.0.0.5, metric 10
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 116) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x20): OSPFv3, LS-Update, length 92
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x8000000c, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 2.2.2.2
+ Neighbor Interface-ID 0.0.0.5, Interface 0.0.0.5, metric 10
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 300) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x18): OSPFv3, LS-Ack, length 276
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x8000000b, age 15s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000003, age 75s, length 12
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000001, age 874s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 2.2.2.2, seq 0x80000001, age 874s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2, seq 0x80000001, age 874s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 2.2.2.2, seq 0x80000001, age 1020s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x80000001, age 55s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.8
+ Advertising Router 1.1.1.1, seq 0x80000001, age 55s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.7
+ Advertising Router 1.1.1.1, seq 0x80000001, age 55s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 55s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1, seq 0x80000002, age 50s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000003, age 75s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.20.0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 50s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 260) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x21): OSPFv3, LS-Ack, length 236
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x8000000a, age 40s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.8
+ Advertising Router 2.2.2.2, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.7
+ Advertising Router 2.2.2.2, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1, seq 0x80000001, age 866s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 1.1.1.1, seq 0x80000001, age 866s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 1.1.1.1, seq 0x80000001, age 866s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 1.1.1.1, seq 0x80000001, age 1021s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000002, age 34s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000001, age 34s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x22): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 116) fe80::2 > fe80::1: AH(spi=0x00000100,sumlen=16,seq=0x19): OSPFv3, LS-Update, length 92
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+ Advertising Router 2.2.2.2, seq 0x8000000b, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 2.2.2.2
+ Neighbor Interface-ID 0.0.0.5, Interface 0.0.0.5, metric 10
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 264) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x1a): OSPFv3, LS-Update, length 240
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000004, age 1s, length 12
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.5
+ Options [V6, External, Router, Demand Circuit]
+ Connected Routers:
+ 2.2.2.2
+ 1.1.1.1
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 16777215
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 16777215
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2, metric 16777215
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1, metric 16777215
+ 2001:db8::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000004, age 1s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.20.0
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.5
+ Prefixes 1:
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 116) fe80::1 > fe80::2: AH(spi=0x00000100,sumlen=16,seq=0x23): OSPFv3, LS-Update, length 92
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x8000000c, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 2.2.2.2
+ Neighbor Interface-ID 0.0.0.5, Interface 0.0.0.5, metric 10
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 84) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x1b): OSPFv3, LS-Update, length 60
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x8000000c, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 2.2.2.2
+ Neighbor Interface-ID 0.0.0.5, Interface 0.0.0.5, metric 10
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 188) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x24): OSPFv3, LS-Update, length 164
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 16777215
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 16777215
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2, metric 16777215
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1, metric 16777215
+ 2001:db8::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 200) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x25): OSPFv3, LS-Ack, length 176
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x8000000b, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000004, age 1s, length 12
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000004, age 1s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.20.0
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 160) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x1c): OSPFv3, LS-Ack, length 136
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x8000000c, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x1d): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 84) fe80::2 > fe80::1: AH(spi=0x00000100,sumlen=16,seq=0x1e): OSPFv3, LS-Update, length 60
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x8000000c, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 2.2.2.2
+ Neighbor Interface-ID 0.0.0.5, Interface 0.0.0.5, metric 10
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 60) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x26): OSPFv3, LS-Ack, length 36
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x8000000c, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x27): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x1f): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x28): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x20): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x29): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x21): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x2a): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x22): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x2b): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x23): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x2c): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x24): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x2d): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x25): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x2e): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x26): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x2f): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x27): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x30): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x28): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x31): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::2 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x29): OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header AH (51) payload length: 64) fe80::1 > ff02::5: AH(spi=0x00000100,sumlen=16,seq=0x32): OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 2.2.2.2, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
--- /dev/null
+IP6 (class 0xc0, hlim 1, next-header OSPF (89) payload length: 88) fe80::20c:29ff:fe9e:c1b2 > ff02::5: OSPFv3, Hello, length 88
+ Router-ID 10.10.10.2, Backbone Area
+ Options [V6, External, Router, Authentication Trailer]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.2, Priority 1
+ Designated Router 10.10.10.1, Backup Designated Router 10.10.10.2
+ Neighbor List:
+ 10.10.10.1
+ Authentication Type HMAC, Length 48, SAID 1, CSN 0x00000000:52da4e0e
+ Authentication Data 0x0000: ca4d 7d58 69a5 da3c 2a69 0eda a732 9bee
+ Authentication Data 0x0010: 9d7f 448c 9f31 fbe4 a0e9 b39c 6da6 cca1
--- /dev/null
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::1 > ff02::5: OSPFv3, Hello, length 36
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Neighbor List:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::1 > ff02::5: OSPFv3, Hello, length 36
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Neighbor List:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::1 > ff02::5: OSPFv3, Hello, length 36
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Neighbor List:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::1 > ff02::5: OSPFv3, Hello, length 36
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Neighbor List:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::2 > ff02::5: OSPFv3, Hello, length 36
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Neighbor List:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::1 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 1.1.1.1
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::2 > fe80::1: OSPFv3, Database Description, length 28
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x00001d46
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::1 > fe80::2: OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x0000242c
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 168) fe80::1 > fe80::2: OSPFv3, Database Description, length 168
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [More], MTU 1500, DD-Sequence 0x00001d46
+ Advertising Router 1.1.1.1, seq 0x80000002, age 39s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 40s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 40s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x80000001, age 40s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 1.1.1.1, seq 0x80000001, age 40s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 1.1.1.1, seq 0x80000002, age 34s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1, seq 0x80000001, age 34s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 148) fe80::2 > fe80::1: OSPFv3, Database Description, length 148
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [More, Master], MTU 1500, DD-Sequence 0x00001d47
+ Advertising Router 2.2.2.2, seq 0x80000002, age 4s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 5s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 5s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000001, age 5s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 2.2.2.2, seq 0x80000001, age 5s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2, seq 0x80000001, age 4s, length 24
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::1 > fe80::2: OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [none], MTU 1500, DD-Sequence 0x00001d47
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 100) fe80::2 > fe80::1: OSPFv3, LS-Request, length 100
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 1.1.1.1
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 88) fe80::1 > fe80::2: OSPFv3, LS-Request, length 88
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 2.2.2.2
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::2 > fe80::1: OSPFv3, Database Description, length 28
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [Master], MTU 1500, DD-Sequence 0x00001d48
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 288) fe80::1 > fe80::2: OSPFv3, LS-Update, length 288
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x80000002, age 40s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 1.1.1.1, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 74
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2, metric 84
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1, metric 74
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0, metric 64
+ 2001:db8::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 35s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::1, Prefixes 1:
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 35s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8:0:12::/64, metric 10
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 232) fe80::2 > fe80::1: OSPFv3, LS-Update, length 232
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000002, age 5s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 2.2.2.2, seq 0x80000001, age 6s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 74
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 6s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2, metric 84
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 6s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1, metric 74
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 6s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0, metric 64
+ 2001:db8::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 5s, length 24
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::2, Prefixes 0:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::1 > fe80::2: OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router], DD Flags [none], MTU 1500, DD-Sequence 0x00001d48
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::2 > ff02::5: OSPFv3, LS-Update, length 60
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000003, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 1.1.1.1
+ Neighbor Interface-ID 0.0.0.5, Interface 0.0.0.5, metric 10
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 168) fe80::1 > ff02::5: OSPFv3, LS-Update, length 168
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x80000001, age 1s, length 12
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.5
+ Options [V6, External, Router, Demand Circuit]
+ Connected Routers:
+ 1.1.1.1
+ 2.2.2.2
+ Advertising Router 1.1.1.1, seq 0x80000001, age 1s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.20.0
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.5
+ Prefixes 1:
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+ Advertising Router 1.1.1.1, seq 0x80000003, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 1.1.1.1
+ Neighbor Interface-ID 0.0.0.5, Interface 0.0.0.5, metric 10
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 76) fe80::2 > ff02::5: OSPFv3, LS-Update, length 76
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000002, age 1s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::2, Prefixes 1:
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 136) fe80::1 > ff02::5: OSPFv3, LS-Ack, length 136
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000002, age 5s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 6s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2, seq 0x80000001, age 6s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 2.2.2.2, seq 0x80000001, age 6s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000001, age 6s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 5s, length 24
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 196) fe80::2 > ff02::5: OSPFv3, LS-Ack, length 196
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x80000002, age 40s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 1.1.1.1, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 1.1.1.1, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x80000001, age 41s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 35s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1, seq 0x80000001, age 35s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 1s, length 12
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1, seq 0x80000001, age 1s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.20.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::2 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 1.1.1.1, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::2 > fe80::1: OSPFv3, LS-Update, length 60
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000003, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 1.1.1.1
+ Neighbor Interface-ID 0.0.0.5, Interface 0.0.0.5, metric 10
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 92) fe80::1 > fe80::2: OSPFv3, LS-Update, length 92
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+ Advertising Router 1.1.1.1, seq 0x80000003, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 1.1.1.1
+ Neighbor Interface-ID 0.0.0.5, Interface 0.0.0.5, metric 10
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::1 > ff02::5: OSPFv3, LS-Update, length 60
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x80000004, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 1.1.1.1
+ Neighbor Interface-ID 0.0.0.5, Interface 0.0.0.5, metric 10
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 76) fe80::2 > fe80::1: OSPFv3, LS-Update, length 76
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000002, age 5s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::2, Prefixes 1:
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::1 > ff02::5: OSPFv3, LS-Ack, length 56
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000003, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000002, age 5s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.5
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::2 > ff02::5: OSPFv3, LS-Ack, length 56
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000003, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::1 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 1.1.1.1, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::1 > fe80::2: OSPFv3, LS-Update, length 60
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x80000004, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 1.1.1.1
+ Neighbor Interface-ID 0.0.0.5, Interface 0.0.0.5, metric 10
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::2 > ff02::5: OSPFv3, LS-Update, length 60
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000004, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 1.1.1.1
+ Neighbor Interface-ID 0.0.0.5, Interface 0.0.0.5, metric 10
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::2 > ff02::5: OSPFv3, LS-Ack, length 36
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Advertising Router 1.1.1.1, seq 0x80000004, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::1 > ff02::5: OSPFv3, LS-Ack, length 36
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Advertising Router 2.2.2.2, seq 0x80000004, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::2 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 1.1.1.1, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::1 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 1.1.1.1, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 2.2.2.2
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::2 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 1.1.1.1, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::1 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Area 0.0.0.1
+ Options [V6, External, Router]
+ Hello Timer 10s, Dead Timer 40s, Interface-ID 0.0.0.5, Priority 1
+ Designated Router 1.1.1.1, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 2.2.2.2
--- /dev/null
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::3 > ff02::5: OSPFv3, Hello, length 36
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Neighbor List:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::3 > ff02::5: OSPFv3, Hello, length 36
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Neighbor List:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::3 > ff02::5: OSPFv3, Hello, length 36
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Neighbor List:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::3 > ff02::5: OSPFv3, Hello, length 36
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Neighbor List:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::1 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Neighbor List:
+ 3.3.3.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::1 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Neighbor List:
+ 3.3.3.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::3 > fe80::1: OSPFv3, Database Description, length 28
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x00000bbd
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::1 > fe80::3: OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x000015b5
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 268) fe80::1 > fe80::3: OSPFv3, Database Description, length 268
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router], DD Flags [More], MTU 1500, DD-Sequence 0x00000bbd
+ Advertising Router 1.1.1.1, seq 0x80000012, age 29s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x8000000f, age 436s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x8000000a, age 445s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 476s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 30s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000001, age 810s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3, seq 0x80000001, age 605s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 605s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3, seq 0x80000001, age 595s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 1.1.1.1, seq 0x80000001, age 29s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 29s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 476s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 228) fe80::3 > fe80::1: OSPFv3, Database Description, length 228
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router], DD Flags [More, Master], MTU 1500, DD-Sequence 0x00000bbe
+ Advertising Router 1.1.1.1, seq 0x8000000f, age 435s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x8000000f, age 435s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x8000000d, age 32s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 811s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 2.2.2.2, seq 0x80000001, age 809s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3, seq 0x80000001, age 32s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 3.3.3.3, seq 0x80000001, age 32s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3, seq 0x80000001, age 32s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 3.3.3.3, seq 0x80000001, age 32s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000001, age 32s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 124) fe80::3 > fe80::1: OSPFv3, LS-Request, length 124
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 1.1.1.1
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+ Advertising Router 1.1.1.1
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::1 > fe80::3: OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router], DD Flags [none], MTU 1500, DD-Sequence 0x00000bbe
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 100) fe80::1 > fe80::3: OSPFv3, LS-Request, length 100
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 3.3.3.3
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::3 > fe80::1: OSPFv3, Database Description, length 28
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router], DD Flags [Master], MTU 1500, DD-Sequence 0x00000bbf
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 296) fe80::3 > fe80::1: OSPFv3, LS-Update, length 296
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x8000000d, age 33s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 3.3.3.3, seq 0x80000001, age 33s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5, metric 10
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 33s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 20
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 33s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 10
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 812s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 33s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 100, Link-local address fe80::3, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 33s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8::3/128, Options [Local address], metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 376) fe80::1 > fe80::3: OSPFv3, LS-Update, length 376
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000012, age 30s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 3.3.3.3, seq 0x80000002, age 477s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Connected Routers:
+ 3.3.3.3
+ 2.2.2.2
+ 1.1.1.1
+ Advertising Router 3.3.3.3, seq 0x80000001, age 596s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2, metric 20
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 606s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1, metric 10
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 606s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0, metric 10
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 31s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 30s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::1, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 477s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 30s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8::1/128, Options [Local address], metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::1 > fe80::3: OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router], DD Flags [none], MTU 1500, DD-Sequence 0x00000bbf
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::3 > fe80::1: OSPFv3, LS-Update, length 60
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x8000000e, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 1.1.1.1
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::1 > fe80::3: OSPFv3, LS-Update, length 60
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000013, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::2 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Neighbor List:
+ 3.3.3.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::2 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Neighbor List:
+ 3.3.3.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::3 > fe80::2: OSPFv3, Database Description, length 28
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x00000d54
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 196) fe80::3 > fe80::2: OSPFv3, LS-Ack, length 196
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000012, age 30s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 477s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000001, age 596s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3, seq 0x80000001, age 606s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3, seq 0x80000001, age 606s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 31s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1, seq 0x80000001, age 30s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000002, age 477s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 30s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::2 > fe80::3: OSPFv3, Database Description, length 28
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x00000b59
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 268) fe80::2 > fe80::3: OSPFv3, Database Description, length 268
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router], DD Flags [More], MTU 1500, DD-Sequence 0x00000d54
+ Advertising Router 1.1.1.1, seq 0x8000000f, age 439s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000012, age 29s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x8000000a, age 448s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 478s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 814s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 2.2.2.2, seq 0x80000001, age 30s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 3.3.3.3, seq 0x80000001, age 608s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 608s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3, seq 0x80000001, age 598s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 2.2.2.2, seq 0x80000001, age 29s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2, seq 0x80000001, age 29s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 478s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 156) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 156
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x8000000d, age 33s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 33s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 3.3.3.3, seq 0x80000001, age 33s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3, seq 0x80000001, age 33s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 1.1.1.1, seq 0x80000001, age 812s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3, seq 0x80000001, age 33s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000001, age 33s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 196) fe80::3 > fe80::1: OSPFv3, LS-Ack, length 196
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000012, age 30s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 477s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000001, age 596s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3, seq 0x80000001, age 606s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3, seq 0x80000001, age 606s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 31s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 1.1.1.1, seq 0x80000001, age 30s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000002, age 477s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 30s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 368) fe80::3 > fe80::2: OSPFv3, Database Description, length 368
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router], DD Flags [More, Master], MTU 1500, DD-Sequence 0x00000d55
+ Advertising Router 1.1.1.1, seq 0x80000012, age 32s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x8000000f, age 438s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x8000000e, age 2s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 479s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 814s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 1.1.1.1, seq 0x80000001, age 33s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000001, age 811s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3, seq 0x80000001, age 608s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 608s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3, seq 0x80000001, age 598s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3, seq 0x80000001, age 35s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 3.3.3.3, seq 0x80000001, age 35s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3, seq 0x80000001, age 35s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 3.3.3.3, seq 0x80000001, age 34s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 32s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 34s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 479s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::2 > fe80::3: OSPFv3, Database Description, length 28
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router], DD Flags [none], MTU 1500, DD-Sequence 0x00000d55
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 136) fe80::2 > fe80::3: OSPFv3, LS-Request, length 136
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 3.3.3.3
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 3.3.3.3
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 64) fe80::3 > fe80::2: OSPFv3, LS-Request, length 64
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::3 > fe80::2: OSPFv3, Database Description, length 28
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router], DD Flags [Master], MTU 1500, DD-Sequence 0x00000d56
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 424) fe80::3 > fe80::2: OSPFv3, LS-Update, length 424
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x8000000e, age 3s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 1.1.1.1
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+ Advertising Router 1.1.1.1, seq 0x80000012, age 33s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 3.3.3.3, seq 0x80000001, age 36s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5, metric 10
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 36s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 20
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 36s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 10
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 812s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 34s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 35s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 100, Link-local address fe80::3, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 35s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8::3/128, Options [Local address], metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 33s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8::1/128, Options [Local address], metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 188) fe80::2 > fe80::3: OSPFv3, LS-Update, length 188
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000012, age 30s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 2.2.2.2, seq 0x80000001, age 31s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 30s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::2, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 30s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8::2/128, Options [Local address], metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::2 > fe80::3: OSPFv3, Database Description, length 28
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router], DD Flags [none], MTU 1500, DD-Sequence 0x00000d56
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 188) fe80::3 > fe80::2: OSPFv3, LS-Update, length 188
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000001, age 31s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::2, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000012, age 31s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 2.2.2.2, seq 0x80000001, age 32s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 31s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8::2/128, Options [Local address], metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 188) fe80::3 > fe80::1: OSPFv3, LS-Update, length 188
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000001, age 31s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::2, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000012, age 31s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 2.2.2.2, seq 0x80000001, age 32s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 31s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8::2/128, Options [Local address], metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 96) fe80::2 > fe80::3: OSPFv3, LS-Ack, length 96
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000001, age 31s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2, seq 0x80000012, age 31s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 32s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000001, age 31s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::2 > fe80::3: OSPFv3, LS-Update, length 60
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000013, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 216) fe80::2 > fe80::3: OSPFv3, LS-Ack, length 216
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x8000000e, age 3s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000012, age 33s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 36s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 3.3.3.3, seq 0x80000001, age 36s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3, seq 0x80000001, age 36s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2, seq 0x80000001, age 812s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 1.1.1.1, seq 0x80000001, age 34s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 3.3.3.3, seq 0x80000001, age 35s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000001, age 35s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 33s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 96) fe80::3 > fe80::2: OSPFv3, LS-Ack, length 96
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000012, age 30s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 31s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000001, age 30s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2, seq 0x80000001, age 30s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 96) fe80::3 > fe80::1: OSPFv3, LS-Ack, length 96
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000012, age 30s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 31s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000001, age 30s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2, seq 0x80000001, age 30s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 96) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 96
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000001, age 31s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2, seq 0x80000012, age 31s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 32s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.5
+ Advertising Router 2.2.2.2, seq 0x80000001, age 31s, length 32
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::1 > fe80::3: OSPFv3, LS-Update, length 60
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000013, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::3 > fe80::2: OSPFv3, LS-Update, length 60
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000013, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::3 > fe80::1: OSPFv3, LS-Update, length 60
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000013, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::3 > fe80::1: OSPFv3, LS-Update, length 60
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x8000000e, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 1.1.1.1
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::1 > fe80::3: OSPFv3, LS-Update, length 56
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 16777215
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 300) fe80::3 > fe80::2: OSPFv3, LS-Update, length 300
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000003, age 3600s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Connected Routers:
+ 3.3.3.3
+ 2.2.2.2
+ 1.1.1.1
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2, metric 16777215
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1, metric 16777215
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0, metric 16777215
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000003, age 3600s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x8000000f, age 1s, length 36
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 2.2.2.2
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+ Neighbor Router-ID 1.1.1.1
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 16777215
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 300) fe80::3 > fe80::1: OSPFv3, LS-Update, length 300
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000003, age 3600s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Connected Routers:
+ 3.3.3.3
+ 2.2.2.2
+ 1.1.1.1
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2, metric 16777215
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1, metric 16777215
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0, metric 16777215
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000003, age 3600s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x8000000f, age 1s, length 36
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 2.2.2.2
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+ Neighbor Router-ID 1.1.1.1
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 16777215
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::3 > fe80::2: OSPFv3, LS-Ack, length 56
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000013, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::3 > fe80::1: OSPFv3, LS-Ack, length 56
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000013, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 176) fe80::2 > fe80::3: OSPFv3, LS-Ack, length 176
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000013, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000003, age 3600s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000003, age 3600s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+ Advertising Router 3.3.3.3, seq 0x8000000f, age 1s, length 36
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 136) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 136
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x8000000e, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000003, age 3600s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000003, age 3600s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::2 > fe80::3: OSPFv3, LS-Update, length 60
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000013, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::3 > fe80::2: OSPFv3, LS-Update, length 60
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000013, age 7s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::3 > fe80::1: OSPFv3, LS-Update, length 60
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000013, age 7s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::2 > fe80::3: OSPFv3, LS-Update, length 56
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 16777215
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::3 > fe80::2: OSPFv3, LS-Update, length 56
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 16777215
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::3 > fe80::1: OSPFv3, LS-Update, length 56
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 16777215
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::3 > fe80::2: OSPFv3, LS-Ack, length 56
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000013, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::3 > fe80::1: OSPFv3, LS-Ack, length 56
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000013, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 76) fe80::3 > fe80::1: OSPFv3, LS-Update, length 76
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x8000000f, age 5s, length 36
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Router-ID 2.2.2.2
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+ Neighbor Router-ID 1.1.1.1
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 56
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000013, age 7s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 36
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x8000000f, age 5s, length 36
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 44) fe80::3 > ff02::5: OSPFv3, Hello, length 44
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Neighbor List:
+ 2.2.2.2
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 44) fe80::3 > ff02::5: OSPFv3, Hello, length 44
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Neighbor List:
+ 2.2.2.2
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 44) fe80::3 > ff02::5: OSPFv3, Hello, length 44
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Neighbor List:
+ 2.2.2.2
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 44) fe80::3 > ff02::5: OSPFv3, Hello, length 44
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Neighbor List:
+ 2.2.2.2
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::1 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Neighbor List:
+ 3.3.3.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::1 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Neighbor List:
+ 3.3.3.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::2 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Neighbor List:
+ 3.3.3.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::2 > ff02::5: OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Neighbor List:
+ 3.3.3.3
--- /dev/null
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::3 > fe80::2: OSPFv3, Hello, length 36
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Designated Router 3.3.3.3
+ Neighbor List:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::3 > fe80::1: OSPFv3, Hello, length 36
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Designated Router 3.3.3.3
+ Neighbor List:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::1 > fe80::3: OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Designated Router 1.1.1.1
+ Neighbor List:
+ 3.3.3.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::3 > fe80::1: OSPFv3, Database Description, length 28
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x0000149b
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::1 > fe80::3: OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x00001b67
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 308) fe80::1 > fe80::3: OSPFv3, Database Description, length 308
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router], DD Flags [More], MTU 1500, DD-Sequence 0x0000149b
+ Advertising Router 1.1.1.1, seq 0x8000000d, age 209s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x8000000a, age 517s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000006, age 1127s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1157s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 330s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 2.2.2.2, seq 0x80000001, age 509s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1303s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1303s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1303s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 1.1.1.1, seq 0x80000001, age 329s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2, seq 0x80000001, age 1307s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1303s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 329s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1157s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 148) fe80::3 > fe80::1: OSPFv3, Database Description, length 148
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router], DD Flags [More, Master], MTU 1500, DD-Sequence 0x0000149c
+ Advertising Router 3.3.3.3, seq 0x80000002, age 14s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 124s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 124s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3, seq 0x80000001, age 114s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3, seq 0x80000001, age 134s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000001, age 134s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 160) fe80::3 > fe80::1: OSPFv3, LS-Request, length 160
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 2.2.2.2
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+ Advertising Router 1.1.1.1
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::1 > fe80::3: OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router], DD Flags [none], MTU 1500, DD-Sequence 0x0000149c
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 76) fe80::1 > fe80::3: OSPFv3, LS-Request, length 76
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::3 > fe80::1: OSPFv3, Database Description, length 28
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router], DD Flags [Master], MTU 1500, DD-Sequence 0x0000149d
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 228) fe80::3 > fe80::1: OSPFv3, LS-Update, length 228
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000001, age 115s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2, metric 20
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 125s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1, metric 10
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 125s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0, metric 10
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 135s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 100, Link-local address fe80::3, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 135s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8::/64, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 504) fe80::1 > fe80::3: OSPFv3, LS-Update, length 504
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000006, age 1128s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+ Advertising Router 2.2.2.2, seq 0x8000000a, age 518s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+ Advertising Router 1.1.1.1, seq 0x8000000d, age 210s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1158s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Connected Routers:
+ 3.3.3.3
+ 2.2.2.2
+ 1.1.1.1
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1304s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 10
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1304s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 20
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 510s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 331s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 1308s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::2, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 330s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::1, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1158s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 330s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8::/64, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::1 > fe80::3: OSPFv3, Database Description, length 28
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router], DD Flags [none], MTU 1500, DD-Sequence 0x0000149d
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 44) fe80::3 > fe80::1: OSPFv3, LS-Update, length 44
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000007, age 1s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 92) fe80::1 > fe80::3: OSPFv3, LS-Update, length 92
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+ Advertising Router 1.1.1.1, seq 0x8000000e, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 52) fe80::3 > fe80::1: OSPFv3, LS-Update, length 52
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::2 > fe80::3: OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Designated Router 2.2.2.2
+ Neighbor List:
+ 3.3.3.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::3 > fe80::2: OSPFv3, Database Description, length 28
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x0000027c
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::2 > fe80::3: OSPFv3, Database Description, length 28
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router], DD Flags [Init, More, Master], MTU 1500, DD-Sequence 0x00000cd9
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 308) fe80::2 > fe80::3: OSPFv3, Database Description, length 308
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router], DD Flags [More], MTU 1500, DD-Sequence 0x0000027c
+ Advertising Router 1.1.1.1, seq 0x8000000a, age 556s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x8000000d, age 209s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000006, age 1130s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1160s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 546s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2, seq 0x80000001, age 330s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1306s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1306s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1306s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 1.1.1.1, seq 0x80000001, age 1310s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2, seq 0x80000001, age 329s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1305s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2, seq 0x80000001, age 329s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1160s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 348) fe80::3 > fe80::2: OSPFv3, Database Description, length 348
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router], DD Flags [More, Master], MTU 1500, DD-Sequence 0x0000027d
+ Advertising Router 1.1.1.1, seq 0x8000000d, age 212s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x8000000a, age 520s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000007, age 2s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1160s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 333s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 2.2.2.2, seq 0x80000001, age 512s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 3.3.3.3, seq 0x80000001, age 127s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 127s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3, seq 0x80000001, age 117s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1306s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1306s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 1.1.1.1, seq 0x80000001, age 332s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2, seq 0x80000001, age 1310s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000001, age 136s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 332s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 1160s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 76) fe80::3 > fe80::2: OSPFv3, LS-Request, length 76
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::2 > fe80::3: OSPFv3, Database Description, length 28
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router], DD Flags [none], MTU 1500, DD-Sequence 0x0000027d
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 136) fe80::2 > fe80::3: OSPFv3, LS-Request, length 136
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 3.3.3.3
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 1.1.1.1
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 216) fe80::2 > fe80::3: OSPFv3, LS-Update, length 216
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x8000000d, age 210s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 2.2.2.2, seq 0x80000001, age 331s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 547s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 330s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::2, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 330s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8::/64, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::3 > fe80::2: OSPFv3, Database Description, length 28
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router], DD Flags [Master], MTU 1500, DD-Sequence 0x0000027e
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 404) fe80::3 > fe80::2: OSPFv3, LS-Update, length 404
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000007, age 3s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 1.1.1.1, seq 0x8000000d, age 213s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 3.3.3.3, seq 0x80000001, age 118s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2, metric 20
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 128s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1, metric 10
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 128s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0, metric 10
+ 2001:db8:0:3::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 513s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 334s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 137s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 100, Link-local address fe80::3, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 333s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::1, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 333s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8::/64, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 28) fe80::2 > fe80::3: OSPFv3, Database Description, length 28
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router], DD Flags [none], MTU 1500, DD-Sequence 0x0000027e
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 136) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 136
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000001, age 115s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3, seq 0x80000001, age 125s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3, seq 0x80000001, age 125s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 135s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000001, age 135s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000007, age 1s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 216) fe80::3 > fe80::2: OSPFv3, LS-Update, length 216
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000001, age 331s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::2, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x8000000d, age 211s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 2.2.2.2, seq 0x80000001, age 332s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 548s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 331s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8::/64, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 216) fe80::3 > fe80::1: OSPFv3, LS-Update, length 216
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000001, age 331s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Priority 1, Link-local address fe80::2, Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x8000000d, age 211s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Advertising Router 2.2.2.2, seq 0x80000001, age 332s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 1.1.1.1, seq 0x80000001, age 548s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 10
+ 2001:db8:0:12::/64, metric 0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 331s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 1:
+ 2001:db8::/64, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 116) fe80::2 > fe80::3: OSPFv3, LS-Ack, length 116
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000001, age 331s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2, seq 0x8000000d, age 211s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 332s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 1.1.1.1, seq 0x80000001, age 548s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2, seq 0x80000001, age 331s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 92) fe80::2 > fe80::3: OSPFv3, LS-Update, length 92
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+ Advertising Router 2.2.2.2, seq 0x8000000e, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 216) fe80::2 > fe80::3: OSPFv3, LS-Ack, length 216
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000007, age 3s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x8000000d, age 213s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000001, age 118s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.2
+ Advertising Router 3.3.3.3, seq 0x80000001, age 128s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.1
+ Advertising Router 3.3.3.3, seq 0x80000001, age 128s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 513s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 1.1.1.1, seq 0x80000001, age 334s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3, seq 0x80000001, age 137s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 333s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 1.1.1.1, seq 0x80000001, age 333s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 116) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 116
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000001, age 331s, length 36
+ Link LSA (8), Link Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 2.2.2.2, seq 0x8000000d, age 211s, length 4
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000001, age 332s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 1.1.1.1, seq 0x80000001, age 548s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2, seq 0x80000001, age 331s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 92) fe80::1 > fe80::3: OSPFv3, LS-Update, length 92
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+ Advertising Router 1.1.1.1, seq 0x8000000e, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 92) fe80::3 > fe80::2: OSPFv3, LS-Update, length 92
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+ Advertising Router 1.1.1.1, seq 0x8000000e, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 92) fe80::3 > fe80::1: OSPFv3, LS-Update, length 92
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+ Advertising Router 1.1.1.1, seq 0x8000000e, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 52) fe80::3 > fe80::1: OSPFv3, LS-Update, length 52
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 244) fe80::3 > fe80::2: OSPFv3, LS-Update, length 244
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000002, age 1s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Connected Routers:
+ 3.3.3.3
+ 2.2.2.2
+ 1.1.1.1
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 16777215
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 16777215
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 1s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000008, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+ Advertising Router 3.3.3.3, seq 0x80000003, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 244) fe80::3 > fe80::1: OSPFv3, LS-Update, length 244
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000002, age 1s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Options [V6, External, Router, Demand Circuit]
+ Connected Routers:
+ 3.3.3.3
+ 2.2.2.2
+ 1.1.1.1
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4, metric 16777215
+ 2001:db8:0:34::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 16777215
+ 2001:db8:0:4::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 1s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Prefixes 1:
+ 2001:db8::/64, metric 0
+ Advertising Router 3.3.3.3, seq 0x80000008, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+ Advertising Router 3.3.3.3, seq 0x80000003, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::2 > fe80::3: OSPFv3, LS-Ack, length 36
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000003, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::1 > fe80::3: OSPFv3, LS-Update, length 56
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 16777215
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::3 > fe80::2: OSPFv3, LS-Update, length 56
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 16777215
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::3 > fe80::1: OSPFv3, LS-Update, length 56
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 16777215
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 92) fe80::2 > fe80::3: OSPFv3, LS-Update, length 92
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+ Advertising Router 2.2.2.2, seq 0x8000000e, age 5s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 176) fe80::2 > fe80::3: OSPFv3, LS-Ack, length 176
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x8000000e, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 1s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 3.3.3.3, seq 0x80000002, age 1s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+ Advertising Router 3.3.3.3, seq 0x80000008, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 92) fe80::3 > fe80::2: OSPFv3, LS-Update, length 92
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+ Advertising Router 2.2.2.2, seq 0x8000000e, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 92) fe80::3 > fe80::1: OSPFv3, LS-Update, length 92
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+ Advertising Router 2.2.2.2, seq 0x8000000e, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 236) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 236
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x8000000e, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 3.3.3.3, seq 0x80000002, age 1s, length 16
+ Network LSA (2), Area Local Scope, LSA-ID 0.0.0.6
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.4
+ Advertising Router 3.3.3.3, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 3.3.3.3, seq 0x80000002, age 1s, length 24
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.24.0
+ Advertising Router 3.3.3.3, seq 0x80000008, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 1.1.1.1, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x8000000e, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::2 > fe80::3: OSPFv3, LS-Update, length 56
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 16777215
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::3 > fe80::2: OSPFv3, LS-Update, length 56
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 16777215
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 56) fe80::3 > fe80::1: OSPFv3, LS-Update, length 56
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3, metric 16777215
+ 2001:db8:0:12::/64, metric 0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 76) fe80::2 > fe80::3: OSPFv3, LS-Ack, length 76
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x8000000e, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 52) fe80::3 > fe80::1: OSPFv3, LS-Update, length 52
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000003, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Prefixes 0:
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 36
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000003, age 3600s, length 12
+ Intra-Area Prefix LSA (9), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 36
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x80000002, age 3600s, length 16
+ Inter-Area Prefix LSA (3), Area Local Scope, LSA-ID 0.0.0.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 44) fe80::3 > fe80::2: OSPFv3, Hello, length 44
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Designated Router 3.3.3.3
+ Neighbor List:
+ 2.2.2.2
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 44) fe80::3 > fe80::1: OSPFv3, Hello, length 44
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Designated Router 3.3.3.3
+ Neighbor List:
+ 2.2.2.2
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::1 > fe80::3: OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Designated Router 3.3.3.3, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 3.3.3.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::3 > fe80::2: OSPFv3, LS-Update, length 60
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000009, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::3 > fe80::1: OSPFv3, LS-Update, length 60
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000009, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::2 > fe80::3: OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Designated Router 3.3.3.3, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 3.3.3.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::2 > fe80::3: OSPFv3, LS-Ack, length 36
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000009, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 36
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x80000009, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::3 > fe80::2: OSPFv3, LS-Update, length 60
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x8000000a, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::3 > fe80::1: OSPFv3, LS-Update, length 60
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x8000000a, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 36
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x8000000a, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::2 > fe80::3: OSPFv3, LS-Ack, length 36
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 3.3.3.3, seq 0x8000000a, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 44) fe80::3 > fe80::2: OSPFv3, Hello, length 44
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Designated Router 3.3.3.3, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 2.2.2.2
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 44) fe80::3 > fe80::1: OSPFv3, Hello, length 44
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Designated Router 3.3.3.3, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 2.2.2.2
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::2 > fe80::3: OSPFv3, LS-Update, length 60
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x8000000f, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::1 > fe80::3: OSPFv3, LS-Update, length 60
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x8000000f, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::3 > fe80::2: OSPFv3, LS-Update, length 60
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x8000000f, age 2s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::3 > fe80::1: OSPFv3, LS-Update, length 60
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x8000000f, age 2s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::3 > fe80::2: OSPFv3, LS-Ack, length 36
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x8000000f, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::3 > fe80::1: OSPFv3, LS-Ack, length 36
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x8000000f, age 1s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::2 > fe80::3: OSPFv3, LS-Ack, length 36
+ Router-ID 2.2.2.2, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x8000000f, age 2s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 36
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 1.1.1.1, seq 0x8000000f, age 2s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 60) fe80::3 > fe80::1: OSPFv3, LS-Update, length 60
+ Router-ID 3.3.3.3, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x8000000f, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+ Options [V6, External, Router, Demand Circuit], RLA-Flags [ABR]
+ Neighbor Network-ID 3.3.3.3
+ Neighbor Interface-ID 0.0.0.6, Interface 0.0.0.6, metric 64
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 36) fe80::1 > fe80::3: OSPFv3, LS-Ack, length 36
+ Router-ID 1.1.1.1, Backbone Area
+ Advertising Router 2.2.2.2, seq 0x8000000f, age 6s, length 20
+ Router LSA (1), Area Local Scope, LSA-ID 0.0.0.0
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::1 > fe80::3: OSPFv3, Hello, length 40
+ Router-ID 1.1.1.1, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Designated Router 3.3.3.3, Backup Designated Router 1.1.1.1
+ Neighbor List:
+ 3.3.3.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 40) fe80::2 > fe80::3: OSPFv3, Hello, length 40
+ Router-ID 2.2.2.2, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 1
+ Designated Router 3.3.3.3, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 3.3.3.3
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 44) fe80::3 > fe80::2: OSPFv3, Hello, length 44
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Designated Router 3.3.3.3, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 2.2.2.2
+ 1.1.1.1
+IP6 (class 0xe0, hlim 1, next-header OSPF (89) payload length: 44) fe80::3 > fe80::1: OSPFv3, Hello, length 44
+ Router-ID 3.3.3.3, Backbone Area
+ Options [V6, External, Router]
+ Hello Timer 30s, Dead Timer 120s, Interface-ID 0.0.0.6, Priority 100
+ Designated Router 3.3.3.3, Backup Designated Router 2.2.2.2
+ Neighbor List:
+ 2.2.2.2
+ 1.1.1.1
--- /dev/null
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92190 trail 21618 lead 54950 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92191 trail 21618 lead 54950 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92192 trail 21618 lead 54950 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 1480)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 1436 0x3329041eba74 ODATA trail 21618 seq 54951 [1460]
+ frame offset 0x0000
+ frame flags+body (8-bit) length 116, flags 0x00 (-|-|-|-|-|-|-|-), first 115 byte(s) of body:
+ 0x0000: 5468 6973 2069 7320 6120 7368 6f72 7420 This.is.a.short.
+ 0x0010: 4153 4349 4920 6d65 7373 6167 6520 666f ASCII.message.fo
+ 0x0020: 6c6c 6f77 6564 2062 7920 6120 7368 6f72 llowed.by.a.shor
+ 0x0030: 7420 6269 6e61 7279 206d 6573 7361 6765 t.binary.message
+ 0x0040: 2c20 6120 6c6f 6e67 6572 2041 5343 4949 ,.a.longer.ASCII
+ 0x0050: 206d 6573 7361 6765 2061 6e64 2061 2073 .message.and.a.s
+ 0x0060: 686f 7274 2041 5343 4949 206d 6573 7361 hort.ASCII.messa
+ 0x0070: 6765 2e ge.
+
+ frame flags+body (8-bit) length 17, flags 0x00 (-|-|-|-|-|-|-|-), first 16 byte(s) of body:
+ 0x0000: 0001 0203 0405 0607 0809 0a0b 0c0d 0e0f ................
+
+ frame flags+body (64-bit) length 2790 (1290 captured), flags 0x00 (-|-|-|-|-|-|-|-), first 128 byte(s) of body:
+ 0x0000: 5468 6520 7175 6963 6b20 6272 6f77 6e20 The.quick.brown.
+ 0x0010: 666f 7820 6a75 6d70 7320 6f76 6572 2074 fox.jumps.over.t
+ 0x0020: 6865 206c 617a 7920 646f 672e 2054 6865 he.lazy.dog..The
+ 0x0030: 2071 7569 636b 2062 726f 776e 2066 6f78 .quick.brown.fox
+ 0x0040: 206a 756d 7073 206f 7665 7220 7468 6520 .jumps.over.the.
+ 0x0050: 6c61 7a79 2064 6f67 2e20 5468 6520 7175 lazy.dog..The.qu
+ 0x0060: 6963 6b20 6272 6f77 6e20 666f 7820 6a75 ick.brown.fox.ju
+ 0x0070: 6d70 7320 6f76 6572 2074 6865 206c 617a mps.over.the.laz
+ [|zmtp1]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 1480)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 1436 0x3329041eba74 ODATA trail 21619 seq 54952 [1460]
+ frame offset 0xffff
+ frame intermediate part, 1434 bytes, first 128 byte(s):
+ 0x0000: 7220 7468 6520 6c61 7a79 2064 6f67 2e20 r.the.lazy.dog..
+ 0x0010: 5468 6520 7175 6963 6b20 6272 6f77 6e20 The.quick.brown.
+ 0x0020: 666f 7820 6a75 6d70 7320 6f76 6572 2074 fox.jumps.over.t
+ 0x0030: 6865 206c 617a 7920 646f 672e 2054 6865 he.lazy.dog..The
+ 0x0040: 2071 7569 636b 2062 726f 776e 2066 6f78 .quick.brown.fox
+ 0x0050: 206a 756d 7073 206f 7665 7220 7468 6520 .jumps.over.the.
+ 0x0060: 6c61 7a79 2064 6f67 2e20 5468 6520 7175 lazy.dog..The.qu
+ 0x0070: 6963 6b20 6272 6f77 6e20 666f 7820 6a75 ick.brown.fox.ju
+
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 149)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 105 0x3329041eba74 ODATA trail 21620 seq 54953 [129]
+ frame offset 0x0042
+ frame intermediate part, 66 bytes, first 66 byte(s):
+ 0x0000: 7073 206f 7665 7220 7468 6520 6c61 7a79 ps.over.the.lazy
+ 0x0010: 2064 6f67 2e20 5468 6520 7175 6963 6b20 .dog..The.quick.
+ 0x0020: 6272 6f77 6e20 666f 7820 6a75 6d70 7320 brown.fox.jumps.
+ 0x0030: 6f76 6572 2074 6865 206c 617a 7920 646f over.the.lazy.do
+ 0x0040: 672e g.
+
+ frame flags+body (8-bit) length 36, flags 0x00 (-|-|-|-|-|-|-|-), first 35 byte(s) of body:
+ 0x0000: 5468 6973 2069 7320 7468 6520 7472 6169 This.is.the.trai
+ 0x0010: 6c69 6e67 2041 5343 4949 206d 6573 7361 ling.ASCII.messa
+ 0x0020: 6765 2e ge.
+
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92193 trail 21621 lead 54953 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 1, id 0, offset 0, flags [DF], proto PGM (113), length 36)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.5563 > 239.255.0.16.13320: PGM, length 0 0x3329041eba74 SPMR [16]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92194 trail 21621 lead 54953 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92195 trail 21621 lead 54953 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92196 trail 21621 lead 54953 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92197 trail 21621 lead 54953 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92198 trail 21621 lead 54953 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92199 trail 21621 lead 54953 nla 10.0.0.45 [36]
--- /dev/null
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92190 trail 21618 lead 54950 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92191 trail 21618 lead 54950 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92192 trail 21618 lead 54950 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 1480)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 1436 0x3329041eba74 ODATA trail 21618 seq 54951 [1460]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 1480)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 1436 0x3329041eba74 ODATA trail 21619 seq 54952 [1460]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 149)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 105 0x3329041eba74 ODATA trail 21620 seq 54953 [129]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92193 trail 21621 lead 54953 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 1, id 0, offset 0, flags [DF], proto PGM (113), length 36)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.5563 > 239.255.0.16.13320: PGM, length 0 0x3329041eba74 SPMR [16]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92194 trail 21621 lead 54953 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92195 trail 21621 lead 54953 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92196 trail 21621 lead 54953 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92197 trail 21621 lead 54953 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92198 trail 21621 lead 54953 nla 10.0.0.45 [36]
+IP (tos 0xb8, ttl 16, id 0, offset 0, flags [DF], proto PGM (113), length 56)
+ 10.0.0.45 > 239.255.0.16: 10.0.0.45.13320 > 239.255.0.16.5563: PGM, length 0 0x3329041eba74 SPM seq 92199 trail 21621 lead 54953 nla 10.0.0.45 [36]
--- /dev/null
+IP (tos 0xc0, ttl 1, id 477, offset 0, flags [none], proto PIM (103), length 66)
+ 10.0.0.5 > 224.0.0.13: PIMv2, length 46
+ Bootstrap, cksum 0xe410 (correct) tag=4b0 hashmlen=0 BSRprio=0 BSR=1.1.1.1 (group0: 224.0.0.0/4 RPcnt=2 FRPcnt=2 RP0=2.2.2.2,holdtime=2m30s,prio=0 RP1=3.3.3.3,holdtime=2m30s,prio=0)
+IP (tos 0xc0, ttl 255, id 433, offset 0, flags [none], proto PIM (103), length 42)
+ 10.0.0.6 > 1.1.1.1: PIMv2, length 22
+ Candidate RP Advertisement, cksum 0xee5e (correct) prefix-cnt=1 prio=0 holdtime=2m30s RP=3.3.3.3 Group0=224.0.0.0/4
+IP (tos 0xc0, ttl 1, id 520, offset 0, flags [none], proto PIM (103), length 66)
+ 10.0.0.5 > 224.0.0.13: PIMv2, length 46
+ Bootstrap, cksum 0xdf74 (correct) tag=94c hashmlen=0 BSRprio=0 BSR=1.1.1.1 (group0: 224.0.0.0/4 RPcnt=2 FRPcnt=2 RP0=2.2.2.2,holdtime=2m30s,prio=0 RP1=3.3.3.3,holdtime=2m30s,prio=0)
+IP (tos 0xc0, ttl 255, id 471, offset 0, flags [none], proto PIM (103), length 42)
+ 10.0.0.6 > 1.1.1.1: PIMv2, length 22
+ Candidate RP Advertisement, cksum 0xee5e (correct) prefix-cnt=1 prio=0 holdtime=2m30s RP=3.3.3.3 Group0=224.0.0.0/4
+IP (tos 0xc0, ttl 1, id 563, offset 0, flags [none], proto PIM (103), length 66)
+ 10.0.0.5 > 224.0.0.13: PIMv2, length 46
+ Bootstrap, cksum 0xd555 (correct) tag=136b hashmlen=0 BSRprio=0 BSR=1.1.1.1 (group0: 224.0.0.0/4 RPcnt=2 FRPcnt=2 RP0=2.2.2.2,holdtime=2m30s,prio=0 RP1=3.3.3.3,holdtime=2m30s,prio=0)
+IP (tos 0xc0, ttl 255, id 508, offset 0, flags [none], proto PIM (103), length 42)
+ 10.0.0.6 > 1.1.1.1: PIMv2, length 22
+ Candidate RP Advertisement, cksum 0xee5e (correct) prefix-cnt=1 prio=0 holdtime=2m30s RP=3.3.3.3 Group0=224.0.0.0/4
+IP (tos 0xc0, ttl 1, id 606, offset 0, flags [none], proto PIM (103), length 66)
+ 10.0.0.5 > 224.0.0.13: PIMv2, length 46
+ Bootstrap, cksum 0xe3ab (correct) tag=515 hashmlen=0 BSRprio=0 BSR=1.1.1.1 (group0: 224.0.0.0/4 RPcnt=2 FRPcnt=2 RP0=2.2.2.2,holdtime=2m30s,prio=0 RP1=3.3.3.3,holdtime=2m30s,prio=0)
+IP (tos 0xc0, ttl 255, id 547, offset 0, flags [none], proto PIM (103), length 42)
+ 10.0.0.6 > 1.1.1.1: PIMv2, length 22
+ Candidate RP Advertisement, cksum 0xee5e (correct) prefix-cnt=1 prio=0 holdtime=2m30s RP=3.3.3.3 Group0=224.0.0.0/4
--- /dev/null
+IP (tos 0xc0, ttl 1, id 121, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 115, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0x0, ttl 31, id 4621, offset 0, flags [none], proto UDP (17), length 1498)
+ 172.16.40.10.1064 > 239.123.123.123.5001: UDP, length 1470
+IP (tos 0xc0, ttl 1, id 122, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Join / Prune, cksum 0x8fd8 (correct), upstream-neighbor: 10.0.0.1
+ 1 group(s), holdtime: 3m30s
+ group #1: 239.123.123.123, joined sources: 0, pruned sources: 1
+ pruned source #1: 172.16.40.10
+IP (tos 0xc0, ttl 1, id 130, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 123, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 141, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 131, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 150, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 138, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 160, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 147, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 168, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 154, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 179, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 162, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 187, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 169, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0x0, ttl 31, id 4804, offset 0, flags [none], proto UDP (17), length 1498)
+ 172.16.40.10.1064 > 239.123.123.123.5001: UDP, length 1470
+IP (tos 0x0, ttl 31, id 4805, offset 0, flags [none], proto UDP (17), length 1498)
+ 172.16.40.10.1064 > 239.123.123.123.5001: UDP, length 1470
+IP (tos 0xc0, ttl 1, id 171, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Join / Prune, cksum 0x8fd8 (correct), upstream-neighbor: 10.0.0.1
+ 1 group(s), holdtime: 3m30s
+ group #1: 239.123.123.123, joined sources: 0, pruned sources: 1
+ pruned source #1: 172.16.40.10
+IP (tos 0xc0, ttl 1, id 198, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 178, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 206, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 185, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 217, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 194, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 225, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 201, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 236, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 209, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 245, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 216, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0x0, ttl 31, id 4988, offset 0, flags [none], proto UDP (17), length 1498)
+ 172.16.40.10.1064 > 239.123.123.123.5001: UDP, length 1470
+IP (tos 0x0, ttl 31, id 4989, offset 0, flags [none], proto UDP (17), length 1498)
+ 172.16.40.10.1064 > 239.123.123.123.5001: UDP, length 1470
+IP (tos 0xc0, ttl 1, id 218, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Join / Prune, cksum 0x8fd8 (correct), upstream-neighbor: 10.0.0.1
+ 1 group(s), holdtime: 3m30s
+ group #1: 239.123.123.123, joined sources: 0, pruned sources: 1
+ pruned source #1: 172.16.40.10
+IP (tos 0xc0, ttl 1, id 255, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb3eb (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76852f6
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 226, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x4fce (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd767b714
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
--- /dev/null
+IP (tos 0xc0, ttl 1, id 895, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xaa6e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0x3f0ef4cd
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 1093, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x6083 (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0x3ef93ece
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 912, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xaa6e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0x3f0ef4cd
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 1112, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x6083 (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0x3ef93ece
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 927, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.2 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xaa6e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0x3f0ef4cd
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 1129, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.1 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x6083 (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0x3ef93ece
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
--- /dev/null
+IP (tos 0x0, ttl 255, id 350, offset 0, flags [none], proto PIM (103), length 128)
+ 192.168.0.6 > 192.168.1.254: PIMv2, length 108
+ Register, cksum 0xdeff (correct), Flags [ none ]
+ IP (tos 0x0, ttl 254, id 15, offset 0, flags [none], proto ICMP (1), length 100)
+ 192.168.20.10 > 239.1.2.3: ICMP echo request, id 3, seq 0, length 80
+IP (tos 0xc0, ttl 255, id 642, offset 0, flags [none], proto PIM (103), length 38)
+ 192.168.1.254 > 192.168.0.6: PIMv2, length 18
+ Register Stop, cksum 0x1628 (correct) group=239.1.2.3 source=192.168.20.10
--- /dev/null
+IP (tos 0xc0, ttl 1, id 130, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 129, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 139, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Join / Prune, cksum 0x5ae5 (correct), upstream-neighbor: 10.0.0.13
+ 1 group(s), holdtime: 3m30s
+ group #1: 239.123.123.123, joined sources: 1, pruned sources: 0
+ joined source #1: 1.1.1.1(SWR)
+IP (tos 0xc0, ttl 1, id 150, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 146, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 169, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 163, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 175, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Join / Prune, cksum 0x5ae5 (correct), upstream-neighbor: 10.0.0.13
+ 1 group(s), holdtime: 3m30s
+ group #1: 239.123.123.123, joined sources: 1, pruned sources: 0
+ joined source #1: 1.1.1.1(SWR)
+IP (tos 0xc0, ttl 1, id 186, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 179, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 186, offset 0, flags [none], proto IGMP (2), length 44)
+ 1.1.1.1 > 224.0.0.2: igmp pimv1 RP-reachable group 239.123.123.123 RP 1.1.1.1 hold 4m30s
+IP (tos 0xc0, ttl 1, id 205, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 197, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 213, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Join / Prune, cksum 0x5ae5 (correct), upstream-neighbor: 10.0.0.13
+ 1 group(s), holdtime: 3m30s
+ group #1: 239.123.123.123, joined sources: 1, pruned sources: 0
+ joined source #1: 1.1.1.1(SWR)
+IP (tos 0xc0, ttl 1, id 224, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 214, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 230, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 243, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 250, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Join / Prune, cksum 0x5ae5 (correct), upstream-neighbor: 10.0.0.13
+ 1 group(s), holdtime: 3m30s
+ group #1: 239.123.123.123, joined sources: 1, pruned sources: 0
+ joined source #1: 1.1.1.1(SWR)
+IP (tos 0xc0, ttl 1, id 240, offset 0, flags [none], proto IGMP (2), length 44)
+ 1.1.1.1 > 224.0.0.2: igmp pimv1 RP-reachable group 239.123.123.123 RP 1.1.1.1 hold 4m30s
+IP (tos 0xc0, ttl 1, id 250, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 261, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 280, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 266, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 287, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Join / Prune, cksum 0x5ae5 (correct), upstream-neighbor: 10.0.0.13
+ 1 group(s), holdtime: 3m30s
+ group #1: 239.123.123.123, joined sources: 1, pruned sources: 0
+ joined source #1: 1.1.1.1(SWR)
+IP (tos 0xc0, ttl 1, id 300, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 285, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 292, offset 0, flags [none], proto IGMP (2), length 44)
+ 1.1.1.1 > 224.0.0.2: igmp pimv1 RP-reachable group 239.123.123.123 RP 1.1.1.1 hold 4m30s
+IP (tos 0xc0, ttl 1, id 316, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 301, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 326, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Join / Prune, cksum 0x5ae5 (correct), upstream-neighbor: 10.0.0.13
+ 1 group(s), holdtime: 3m30s
+ group #1: 239.123.123.123, joined sources: 1, pruned sources: 0
+ joined source #1: 1.1.1.1(SWR)
+IP (tos 0xc0, ttl 1, id 337, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 319, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 353, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 335, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 362, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Join / Prune, cksum 0x5ae5 (correct), upstream-neighbor: 10.0.0.13
+ 1 group(s), holdtime: 3m30s
+ group #1: 239.123.123.123, joined sources: 1, pruned sources: 0
+ joined source #1: 1.1.1.1(SWR)
+IP (tos 0xc0, ttl 1, id 346, offset 0, flags [none], proto IGMP (2), length 44)
+ 1.1.1.1 > 224.0.0.2: igmp pimv1 RP-reachable group 239.123.123.123 RP 1.1.1.1 hold 4m30s
+IP (tos 0xc0, ttl 1, id 374, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 354, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 390, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 372, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 399, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Join / Prune, cksum 0x5ae5 (correct), upstream-neighbor: 10.0.0.13
+ 1 group(s), holdtime: 3m30s
+ group #1: 239.123.123.123, joined sources: 1, pruned sources: 0
+ joined source #1: 1.1.1.1(SWR)
+IP (tos 0xc0, ttl 1, id 412, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 388, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 420, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Join / Prune, cksum 0x5ae5 (correct), upstream-neighbor: 10.0.0.13
+ 1 group(s), holdtime: 3m30s
+ group #1: 239.123.123.123, joined sources: 0, pruned sources: 1
+ pruned source #1: 1.1.1.1(SWR)
+IP (tos 0xc0, ttl 1, id 431, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.14 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0x41fe (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd76fc4dc
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
+IP (tos 0xc0, ttl 1, id 404, offset 0, flags [none], proto PIM (103), length 54)
+ 10.0.0.13 > 224.0.0.13: PIMv2, length 34
+ Hello, cksum 0xb52e (correct)
+ Hold Time Option (1), length 2, Value: 1m45s
+ Generation ID Option (20), length 4, Value: 0xd77051ab
+ DR Priority Option (19), length 4, Value: 1
+ State Refresh Capability Option (21), length 4, Value: v1
--- /dev/null
+PPPoE PADI [Service-Name] [PPP-Max-Payload 0x05DC] [Host-Uniq 0x16372C16]
--- /dev/null
+PPPoE [ses 0x17] LCP, Echo-Request (0x09), id 106, length 14
+PPPoE [ses 0x3b] LCP, Echo-Request (0x09), id 103, length 14
--- /dev/null
+PPPoE [ses 0x3b] LCP, Echo-Request (0x09), id 103, length 14
--- /dev/null
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [S], seq 928549246, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 0,nop,wscale 2], length 0
+E..<.h@.@.!R.........p.P7X.~.........!....@....
+M...........
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [S.], seq 930778609, ack 928549247, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 1306300950,nop,wscale 2], length 0
+E..<..@.@.<..........P.p7z..7X......n.....@....
+M...M.......
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 1, win 8192, options [nop,nop,TS val 1306300950 ecr 1306300950], length 0
+E..4.j@.@.!X.........p.P7X..7z.... .7......
+M...M...
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [P.], seq 1:203, ack 1, win 8192, options [nop,nop,TS val 1306300951 ecr 1306300950], length 202: HTTP: GET / HTTP/1.1
+E....l@.@. ..........p.P7X..7z.... ........
+M...M...GET / HTTP/1.1
+Host: localhost
+User-Agent: ELinks/0.10.4-7-debian (textmode; Linux 2.6.11-1-686-smp i686; 132x56-2)
+Accept: */*
+Accept-Encoding: gzip
+Accept-Language: en
+Connection: Keep-Alive
+
+
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [.], ack 203, win 8192, options [nop,nop,TS val 1306300952 ecr 1306300951], length 0
+E..4..@.@............P.p7z..7X.I.. .7......
+M...M...
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [P.], seq 1:5560, ack 203, win 8192, options [nop,nop,TS val 1306300953 ecr 1306300951], length 5559: HTTP: HTTP/1.1 200 OK
+E.....@.@..%.........P.p7z..7X.I.. ........
+M...M...HTTP/1.1 200 OK
+Date: Wed, 06 Jul 2005 03:57:35 GMT
+Server: Apache/1.3.33
+Last-Modified: Sun, 15 Aug 2004 00:43:41 GMT
+ETag: "6e80f0-148a-411eb1bd"
+Accept-Ranges: bytes
+Content-Length: 5258
+Keep-Alive: timeout=15, max=100
+Connection: Keep-Alive
+Content-Type: text/html; charset=iso-8859-1
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+ <META NAME="Description" CONTENT="The initial installation of Debian apache.">
+ <TITLE>Placeholder page</TITLE>
+</HEAD>
+<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EF" VLINK="#55188A" ALINK="#FF0000">
+
+<H1>Placeholder page</H1>
+<H2>If you are just browsing the web</h2>
+
+<P>The owner of this web site has not put up any web pages yet.
+Please come back later.</P>
+
+<P><SMALL><CITE>Move along, nothing to see here...</CITE> :-)</SMALL></P>
+
+<H2>If you are trying to locate the administrator of this machine</H2>
+
+<P>If you want to report something about this host's behavior, please
+contact the Internet Service Provider (ISP) involved directly.</P>
+
+<P>See the <A href="http://www.abuse.net/">Network Abuse
+Clearinghouse</A> for how to do this.</P>
+
+<H2>If you are the administrator of this machine</H2>
+
+<P>The initial installation of <A href="http://www.debian.org/">Debian's
+apache</A> web server package was successful.</P>
+
+<P><STRONG>You should replace this page with your own web pages as
+soon as possible.</STRONG></P>
+
+<P>Unless you changed its configuration, your new server is configured as follows:
+<UL>
+<LI>
+Configuration files can be found in <TT>/etc/apache</TT>.</LI>
+
+<LI>
+The <TT>DocumentRoot</TT>, which is the directory under which all your
+HTML files should exist, is set to <TT>/var/www</TT>.</LI>
+
+<LI>
+CGI scripts are looked for in <TT>/usr/lib/cgi-bin</TT>, which is where
+Debian packages will place their scripts.</LI>
+
+<LI>
+Log files are placed in <TT>/var/log/apache</TT>, and will be rotated
+weekly. The frequency of rotation can be easily changed by editing
+<TT>/etc/logrotate.d/apache</TT>.</LI>
+
+<LI>
+The default directory index is <TT>index.html</TT>, meaning that requests
+for a directory <TT>/foo/bar/</TT> will give the contents of the file <TT>/var/www/foo/bar/index.html</TT>
+if it exists (assuming that <TT>/var/www</TT> is your <TT>DocumentRoot</TT>).</LI>
+
+<LI>
+User directories are enabled, and user documents will be looked for
+in the <TT>public_html</TT> directory of the users' homes. These dirs
+should be under <TT>/home</TT>, and users will not be able to symlink
+to files they don't own.</LI>
+
+</UL>
+All the standard apache modules are available with this release and are
+now managed with debconf. Type <TT>dpkg-reconfigure apache</TT> to
+select which modules you want enabled. Many other modules are available
+through the Debian package system with the names <TT>libapache-mod-*</TT>.
+If you need to compile a module yourself, you will need to install the
+<TT>apache-dev</TT> package.
+
+<P>More documentation on Apache can be found on:
+<UL>
+<LI>
+The <A HREF="/doc/apache-doc/manual/">Apache documentation</A> stored on your server.</LI>
+
+<LI>
+The <A HREF="http://www.apache.org/">Apache Project</A> home site.</LI>
+
+<LI>
+The <A HREF="http://www.apache-ssl.org/">Apache-SSL</A> home site.</LI>
+
+<LI>
+The <A HREF="http://perl.apache.org/">mod perl</A> home site.</LI>
+
+<LI>
+The <A HREF="http://www.apacheweek.com/">ApacheWeek</A> newsletter.</LI>
+
+<LI>
+The <A HREF="http://www.debian.org/doc/">Debian Project
+Documentation</A> which contains HOWTOs, FAQs, and software updates.</LI>
+</UL>
+
+<P>You can also consult the list of <A HREF="http://www.boutell.com/faq/">World
+Wide Web Frequently Asked Questions</A> for information.
+
+<H2>Let other people know about this server</H2>
+
+<A HREF="http://netcraft.com/">Netcraft</A> provides an interesting free
+service for web site monitoring and statistic collection.
+You can let them know about your server using their
+<A HREF="http://uptime.netcraft.com/">interface</A>.
+Enabling the monitoring of your server will provide a better global overview
+of who is using what and where, and it would give Debian a better
+overview of the apache package usage.
+
+<H2>About this page</H2>
+
+<IMG ALIGN="right" ALT="" HEIGHT="247" WIDTH="278" SRC="icons/jhe061.png">
+
+<P>This is a placeholder page installed by the <A
+HREF="http://www.debian.org/">Debian</A>
+release of the apache Web server package.
+
+<P>This computer has installed the Debian GNU/Linux operating system,
+but it has <strong>nothing to do with the Debian
+Project</strong>. Please do <strong>not</strong> contact the Debian
+Project about it.</P>
+
+<P>If you find a bug in this apache package, or in Apache itself,
+please file a bug report on it. Instructions on doing this, and the
+list of <A HREF="http://bugs.debian.org/src:apache">known bugs</A> of this
+package, can be found in the
+<A HREF="http://www.debian.org/Bugs/Reporting">Debian Bug Tracking System</A>.
+
+<P>Thanks for using this package, and congratulations for your choice of
+a Debian system!</P>
+
+<DIV align="center">
+<a href="http://www.debian.org/">
+<IMG align="middle" height="30" width="25" src="icons/debian/openlogo-25.jpg" alt="Debian">
+</a>
+<a href="http://www.apache.org/">
+<IMG align="middle" height="32" width="259" src="icons/apache_pb.png" alt="Apache">
+</a>
+</DIV>
+
+<!--
+ This page was initially created by Johnie Ingram (http://netgod.net/)
+ It was later edited by Matthew Wilcox and Josip Rodin.
+ Last modified: Date: 2004/06/20 15:33:57 .
+ -->
+
+</BODY>
+</HTML>
+
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5560, win 12383, options [nop,nop,TS val 1306300953 ecr 1306300953], length 0
+E..4.n@.@.!T.........p.P7X.I7z....0_.......
+M...M...
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [F.], seq 203, ack 5560, win 12383, options [nop,nop,TS val 1306302241 ecr 1306300953], length 0
+E..4.p@.@.!R.........p.P7X.I7z....0_.......
+M..!M...
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [F.], seq 5560, ack 204, win 8192, options [nop,nop,TS val 1306302243 ecr 1306302241], length 0
+E..4..@.@............P.p7z..7X.J.. ..5.....
+M..#M..!
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5561, win 12383, options [nop,nop,TS val 1306302243 ecr 1306302243], length 0
+E..4.r@.@.!P.........p.P7X.J7z....0_.......
+M..#M..#
--- /dev/null
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [S], seq 928549246, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 0,nop,wscale 2], length 0
+..............E..<.h@.@.!R.........p.P7X.~.........!....@....
+M...........
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [S.], seq 930778609, ack 928549247, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 1306300950,nop,wscale 2], length 0
+..............E..<..@.@.<..........P.p7z..7X......n.....@....
+M...M.......
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 1, win 8192, options [nop,nop,TS val 1306300950 ecr 1306300950], length 0
+..............E..4.j@.@.!X.........p.P7X..7z.... .7......
+M...M...
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [P.], seq 1:203, ack 1, win 8192, options [nop,nop,TS val 1306300951 ecr 1306300950], length 202: HTTP: GET / HTTP/1.1
+..............E....l@.@. ..........p.P7X..7z.... ........
+M...M...GET / HTTP/1.1
+Host: localhost
+User-Agent: ELinks/0.10.4-7-debian (textmode; Linux 2.6.11-1-686-smp i686; 132x56-2)
+Accept: */*
+Accept-Encoding: gzip
+Accept-Language: en
+Connection: Keep-Alive
+
+
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [.], ack 203, win 8192, options [nop,nop,TS val 1306300952 ecr 1306300951], length 0
+..............E..4..@.@............P.p7z..7X.I.. .7......
+M...M...
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [P.], seq 1:5560, ack 203, win 8192, options [nop,nop,TS val 1306300953 ecr 1306300951], length 5559: HTTP: HTTP/1.1 200 OK
+..............E.....@.@..%.........P.p7z..7X.I.. ........
+M...M...HTTP/1.1 200 OK
+Date: Wed, 06 Jul 2005 03:57:35 GMT
+Server: Apache/1.3.33
+Last-Modified: Sun, 15 Aug 2004 00:43:41 GMT
+ETag: "6e80f0-148a-411eb1bd"
+Accept-Ranges: bytes
+Content-Length: 5258
+Keep-Alive: timeout=15, max=100
+Connection: Keep-Alive
+Content-Type: text/html; charset=iso-8859-1
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+ <META NAME="Description" CONTENT="The initial installation of Debian apache.">
+ <TITLE>Placeholder page</TITLE>
+</HEAD>
+<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EF" VLINK="#55188A" ALINK="#FF0000">
+
+<H1>Placeholder page</H1>
+<H2>If you are just browsing the web</h2>
+
+<P>The owner of this web site has not put up any web pages yet.
+Please come back later.</P>
+
+<P><SMALL><CITE>Move along, nothing to see here...</CITE> :-)</SMALL></P>
+
+<H2>If you are trying to locate the administrator of this machine</H2>
+
+<P>If you want to report something about this host's behavior, please
+contact the Internet Service Provider (ISP) involved directly.</P>
+
+<P>See the <A href="http://www.abuse.net/">Network Abuse
+Clearinghouse</A> for how to do this.</P>
+
+<H2>If you are the administrator of this machine</H2>
+
+<P>The initial installation of <A href="http://www.debian.org/">Debian's
+apache</A> web server package was successful.</P>
+
+<P><STRONG>You should replace this page with your own web pages as
+soon as possible.</STRONG></P>
+
+<P>Unless you changed its configuration, your new server is configured as follows:
+<UL>
+<LI>
+Configuration files can be found in <TT>/etc/apache</TT>.</LI>
+
+<LI>
+The <TT>DocumentRoot</TT>, which is the directory under which all your
+HTML files should exist, is set to <TT>/var/www</TT>.</LI>
+
+<LI>
+CGI scripts are looked for in <TT>/usr/lib/cgi-bin</TT>, which is where
+Debian packages will place their scripts.</LI>
+
+<LI>
+Log files are placed in <TT>/var/log/apache</TT>, and will be rotated
+weekly. The frequency of rotation can be easily changed by editing
+<TT>/etc/logrotate.d/apache</TT>.</LI>
+
+<LI>
+The default directory index is <TT>index.html</TT>, meaning that requests
+for a directory <TT>/foo/bar/</TT> will give the contents of the file <TT>/var/www/foo/bar/index.html</TT>
+if it exists (assuming that <TT>/var/www</TT> is your <TT>DocumentRoot</TT>).</LI>
+
+<LI>
+User directories are enabled, and user documents will be looked for
+in the <TT>public_html</TT> directory of the users' homes. These dirs
+should be under <TT>/home</TT>, and users will not be able to symlink
+to files they don't own.</LI>
+
+</UL>
+All the standard apache modules are available with this release and are
+now managed with debconf. Type <TT>dpkg-reconfigure apache</TT> to
+select which modules you want enabled. Many other modules are available
+through the Debian package system with the names <TT>libapache-mod-*</TT>.
+If you need to compile a module yourself, you will need to install the
+<TT>apache-dev</TT> package.
+
+<P>More documentation on Apache can be found on:
+<UL>
+<LI>
+The <A HREF="/doc/apache-doc/manual/">Apache documentation</A> stored on your server.</LI>
+
+<LI>
+The <A HREF="http://www.apache.org/">Apache Project</A> home site.</LI>
+
+<LI>
+The <A HREF="http://www.apache-ssl.org/">Apache-SSL</A> home site.</LI>
+
+<LI>
+The <A HREF="http://perl.apache.org/">mod perl</A> home site.</LI>
+
+<LI>
+The <A HREF="http://www.apacheweek.com/">ApacheWeek</A> newsletter.</LI>
+
+<LI>
+The <A HREF="http://www.debian.org/doc/">Debian Project
+Documentation</A> which contains HOWTOs, FAQs, and software updates.</LI>
+</UL>
+
+<P>You can also consult the list of <A HREF="http://www.boutell.com/faq/">World
+Wide Web Frequently Asked Questions</A> for information.
+
+<H2>Let other people know about this server</H2>
+
+<A HREF="http://netcraft.com/">Netcraft</A> provides an interesting free
+service for web site monitoring and statistic collection.
+You can let them know about your server using their
+<A HREF="http://uptime.netcraft.com/">interface</A>.
+Enabling the monitoring of your server will provide a better global overview
+of who is using what and where, and it would give Debian a better
+overview of the apache package usage.
+
+<H2>About this page</H2>
+
+<IMG ALIGN="right" ALT="" HEIGHT="247" WIDTH="278" SRC="icons/jhe061.png">
+
+<P>This is a placeholder page installed by the <A
+HREF="http://www.debian.org/">Debian</A>
+release of the apache Web server package.
+
+<P>This computer has installed the Debian GNU/Linux operating system,
+but it has <strong>nothing to do with the Debian
+Project</strong>. Please do <strong>not</strong> contact the Debian
+Project about it.</P>
+
+<P>If you find a bug in this apache package, or in Apache itself,
+please file a bug report on it. Instructions on doing this, and the
+list of <A HREF="http://bugs.debian.org/src:apache">known bugs</A> of this
+package, can be found in the
+<A HREF="http://www.debian.org/Bugs/Reporting">Debian Bug Tracking System</A>.
+
+<P>Thanks for using this package, and congratulations for your choice of
+a Debian system!</P>
+
+<DIV align="center">
+<a href="http://www.debian.org/">
+<IMG align="middle" height="30" width="25" src="icons/debian/openlogo-25.jpg" alt="Debian">
+</a>
+<a href="http://www.apache.org/">
+<IMG align="middle" height="32" width="259" src="icons/apache_pb.png" alt="Apache">
+</a>
+</DIV>
+
+<!--
+ This page was initially created by Johnie Ingram (http://netgod.net/)
+ It was later edited by Matthew Wilcox and Josip Rodin.
+ Last modified: Date: 2004/06/20 15:33:57 .
+ -->
+
+</BODY>
+</HTML>
+
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5560, win 12383, options [nop,nop,TS val 1306300953 ecr 1306300953], length 0
+..............E..4.n@.@.!T.........p.P7X.I7z....0_.......
+M...M...
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [F.], seq 203, ack 5560, win 12383, options [nop,nop,TS val 1306302241 ecr 1306300953], length 0
+..............E..4.p@.@.!R.........p.P7X.I7z....0_.......
+M..!M...
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [F.], seq 5560, ack 204, win 8192, options [nop,nop,TS val 1306302243 ecr 1306302241], length 0
+..............E..4..@.@............P.p7z..7X.J.. ..5.....
+M..#M..!
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5561, win 12383, options [nop,nop,TS val 1306302243 ecr 1306302243], length 0
+..............E..4.r@.@.!P.........p.P7X.J7z....0_.......
+M..#M..#
--- /dev/null
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [S], seq 928549246, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 0,nop,wscale 2], length 0
+ 0x0000: 4500 003c 1b68 4000 4006 2152 7f00 0001 E..<.h@.@.!R....
+ 0x0010: 7f00 0001 da70 0050 3758 897e 0000 0000 .....p.P7X.~....
+ 0x0020: a002 7fff 1421 0000 0204 400c 0402 080a .....!....@.....
+ 0x0030: 4ddc 9216 0000 0000 0103 0302 M...........
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [S.], seq 930778609, ack 928549247, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 1306300950,nop,wscale 2], length 0
+ 0x0000: 4500 003c 0000 4000 4006 3cba 7f00 0001 E..<..@.@.<.....
+ 0x0010: 7f00 0001 0050 da70 377a 8df1 3758 897f .....P.p7z..7X..
+ 0x0020: a012 7fff 6eb1 0000 0204 400c 0402 080a ....n.....@.....
+ 0x0030: 4ddc 9216 4ddc 9216 0103 0302 M...M.......
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 1, win 8192, options [nop,nop,TS val 1306300950 ecr 1306300950], length 0
+ 0x0000: 4500 0034 1b6a 4000 4006 2158 7f00 0001 E..4.j@.@.!X....
+ 0x0010: 7f00 0001 da70 0050 3758 897f 377a 8df2 .....p.P7X..7z..
+ 0x0020: 8010 2000 37d0 0000 0101 080a 4ddc 9216 ....7.......M...
+ 0x0030: 4ddc 9216 M...
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [P.], seq 1:203, ack 1, win 8192, options [nop,nop,TS val 1306300951 ecr 1306300950], length 202: HTTP: GET / HTTP/1.1
+ 0x0000: 4500 00fe 1b6c 4000 4006 208c 7f00 0001 E....l@.@.......
+ 0x0010: 7f00 0001 da70 0050 3758 897f 377a 8df2 .....p.P7X..7z..
+ 0x0020: 8018 2000 fef2 0000 0101 080a 4ddc 9217 ............M...
+ 0x0030: 4ddc 9216 4745 5420 2f20 4854 5450 2f31 M...GET./.HTTP/1
+ 0x0040: 2e31 0d0a 486f 7374 3a20 6c6f 6361 6c68 .1..Host:.localh
+ 0x0050: 6f73 740d 0a55 7365 722d 4167 656e 743a ost..User-Agent:
+ 0x0060: 2045 4c69 6e6b 732f 302e 3130 2e34 2d37 .ELinks/0.10.4-7
+ 0x0070: 2d64 6562 6961 6e20 2874 6578 746d 6f64 -debian.(textmod
+ 0x0080: 653b 204c 696e 7578 2032 2e36 2e31 312d e;.Linux.2.6.11-
+ 0x0090: 312d 3638 362d 736d 7020 6936 3836 3b20 1-686-smp.i686;.
+ 0x00a0: 3133 3278 3536 2d32 290d 0a41 6363 6570 132x56-2)..Accep
+ 0x00b0: 743a 202a 2f2a 0d0a 4163 6365 7074 2d45 t:.*/*..Accept-E
+ 0x00c0: 6e63 6f64 696e 673a 2067 7a69 700d 0a41 ncoding:.gzip..A
+ 0x00d0: 6363 6570 742d 4c61 6e67 7561 6765 3a20 ccept-Language:.
+ 0x00e0: 656e 0d0a 436f 6e6e 6563 7469 6f6e 3a20 en..Connection:.
+ 0x00f0: 4b65 6570 2d41 6c69 7665 0d0a 0d0a Keep-Alive....
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [.], ack 203, win 8192, options [nop,nop,TS val 1306300952 ecr 1306300951], length 0
+ 0x0000: 4500 0034 1fe4 4000 4006 1cde 7f00 0001 E..4..@.@.......
+ 0x0010: 7f00 0001 0050 da70 377a 8df2 3758 8a49 .....P.p7z..7X.I
+ 0x0020: 8010 2000 3703 0000 0101 080a 4ddc 9218 ....7.......M...
+ 0x0030: 4ddc 9217 M...
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [P.], seq 1:5560, ack 203, win 8192, options [nop,nop,TS val 1306300953 ecr 1306300951], length 5559: HTTP: HTTP/1.1 200 OK
+ 0x0000: 4500 15eb 1fe6 4000 4006 0725 7f00 0001 E.....@.@..%....
+ 0x0010: 7f00 0001 0050 da70 377a 8df2 3758 8a49 .....P.p7z..7X.I
+ 0x0020: 8018 2000 13e0 0000 0101 080a 4ddc 9219 ............M...
+ 0x0030: 4ddc 9217 4854 5450 2f31 2e31 2032 3030 M...HTTP/1.1.200
+ 0x0040: 204f 4b0d 0a44 6174 653a 2057 6564 2c20 .OK..Date:.Wed,.
+ 0x0050: 3036 204a 756c 2032 3030 3520 3033 3a35 06.Jul.2005.03:5
+ 0x0060: 373a 3335 2047 4d54 0d0a 5365 7276 6572 7:35.GMT..Server
+ 0x0070: 3a20 4170 6163 6865 2f31 2e33 2e33 330d :.Apache/1.3.33.
+ 0x0080: 0a4c 6173 742d 4d6f 6469 6669 6564 3a20 .Last-Modified:.
+ 0x0090: 5375 6e2c 2031 3520 4175 6720 3230 3034 Sun,.15.Aug.2004
+ 0x00a0: 2030 303a 3433 3a34 3120 474d 540d 0a45 .00:43:41.GMT..E
+ 0x00b0: 5461 673a 2022 3665 3830 6630 2d31 3438 Tag:."6e80f0-148
+ 0x00c0: 612d 3431 3165 6231 6264 220d 0a41 6363 a-411eb1bd"..Acc
+ 0x00d0: 6570 742d 5261 6e67 6573 3a20 6279 7465 ept-Ranges:.byte
+ 0x00e0: 730d 0a43 6f6e 7465 6e74 2d4c 656e 6774 s..Content-Lengt
+ 0x00f0: 683a 2035 3235 380d 0a4b 6565 702d 416c h:.5258..Keep-Al
+ 0x0100: 6976 653a 2074 696d 656f 7574 3d31 352c ive:.timeout=15,
+ 0x0110: 206d 6178 3d31 3030 0d0a 436f 6e6e 6563 .max=100..Connec
+ 0x0120: 7469 6f6e 3a20 4b65 6570 2d41 6c69 7665 tion:.Keep-Alive
+ 0x0130: 0d0a 436f 6e74 656e 742d 5479 7065 3a20 ..Content-Type:.
+ 0x0140: 7465 7874 2f68 746d 6c3b 2063 6861 7273 text/html;.chars
+ 0x0150: 6574 3d69 736f 2d38 3835 392d 310d 0a0d et=iso-8859-1...
+ 0x0160: 0a3c 2144 4f43 5459 5045 2048 544d 4c20 .<!DOCTYPE.HTML.
+ 0x0170: 5055 424c 4943 2022 2d2f 2f57 3343 2f2f PUBLIC."-//W3C//
+ 0x0180: 4454 4420 4854 4d4c 2034 2e30 3120 5472 DTD.HTML.4.01.Tr
+ 0x0190: 616e 7369 7469 6f6e 616c 2f2f 454e 223e ansitional//EN">
+ 0x01a0: 0a3c 4854 4d4c 3e0a 3c48 4541 443e 0a20 .<HTML>.<HEAD>..
+ 0x01b0: 2020 3c4d 4554 4120 4854 5450 2d45 5155 ..<META.HTTP-EQU
+ 0x01c0: 4956 3d22 436f 6e74 656e 742d 5479 7065 IV="Content-Type
+ 0x01d0: 2220 434f 4e54 454e 543d 2274 6578 742f ".CONTENT="text/
+ 0x01e0: 6874 6d6c 3b20 6368 6172 7365 743d 6973 html;.charset=is
+ 0x01f0: 6f2d 3838 3539 2d31 223e 0a20 2020 3c4d o-8859-1">....<M
+ 0x0200: 4554 4120 4e41 4d45 3d22 4465 7363 7269 ETA.NAME="Descri
+ 0x0210: 7074 696f 6e22 2043 4f4e 5445 4e54 3d22 ption".CONTENT="
+ 0x0220: 5468 6520 696e 6974 6961 6c20 696e 7374 The.initial.inst
+ 0x0230: 616c 6c61 7469 6f6e 206f 6620 4465 6269 allation.of.Debi
+ 0x0240: 616e 2061 7061 6368 652e 223e 0a20 2020 an.apache.">....
+ 0x0250: 3c54 4954 4c45 3e50 6c61 6365 686f 6c64 <TITLE>Placehold
+ 0x0260: 6572 2070 6167 653c 2f54 4954 4c45 3e0a er.page</TITLE>.
+ 0x0270: 3c2f 4845 4144 3e0a 3c42 4f44 5920 5445 </HEAD>.<BODY.TE
+ 0x0280: 5854 3d22 2330 3030 3030 3022 2042 4743 XT="#000000".BGC
+ 0x0290: 4f4c 4f52 3d22 2346 4646 4646 4622 204c OLOR="#FFFFFF".L
+ 0x02a0: 494e 4b3d 2223 3030 3030 4546 2220 564c INK="#0000EF".VL
+ 0x02b0: 494e 4b3d 2223 3535 3138 3841 2220 414c INK="#55188A".AL
+ 0x02c0: 494e 4b3d 2223 4646 3030 3030 223e 0a0a INK="#FF0000">..
+ 0x02d0: 3c48 313e 506c 6163 6568 6f6c 6465 7220 <H1>Placeholder.
+ 0x02e0: 7061 6765 3c2f 4831 3e0a 3c48 323e 4966 page</H1>.<H2>If
+ 0x02f0: 2079 6f75 2061 7265 206a 7573 7420 6272 .you.are.just.br
+ 0x0300: 6f77 7369 6e67 2074 6865 2077 6562 3c2f owsing.the.web</
+ 0x0310: 6832 3e0a 0a3c 503e 5468 6520 6f77 6e65 h2>..<P>The.owne
+ 0x0320: 7220 6f66 2074 6869 7320 7765 6220 7369 r.of.this.web.si
+ 0x0330: 7465 2068 6173 206e 6f74 2070 7574 2075 te.has.not.put.u
+ 0x0340: 7020 616e 7920 7765 6220 7061 6765 7320 p.any.web.pages.
+ 0x0350: 7965 742e 0a50 6c65 6173 6520 636f 6d65 yet..Please.come
+ 0x0360: 2062 6163 6b20 6c61 7465 722e 3c2f 503e .back.later.</P>
+ 0x0370: 0a0a 3c50 3e3c 534d 414c 4c3e 3c43 4954 ..<P><SMALL><CIT
+ 0x0380: 453e 4d6f 7665 2061 6c6f 6e67 2c20 6e6f E>Move.along,.no
+ 0x0390: 7468 696e 6720 746f 2073 6565 2068 6572 thing.to.see.her
+ 0x03a0: 652e 2e2e 3c2f 4349 5445 3e20 3a2d 293c e...</CITE>.:-)<
+ 0x03b0: 2f53 4d41 4c4c 3e3c 2f50 3e0a 0a3c 4832 /SMALL></P>..<H2
+ 0x03c0: 3e49 6620 796f 7520 6172 6520 7472 7969 >If.you.are.tryi
+ 0x03d0: 6e67 2074 6f20 6c6f 6361 7465 2074 6865 ng.to.locate.the
+ 0x03e0: 2061 646d 696e 6973 7472 6174 6f72 206f .administrator.o
+ 0x03f0: 6620 7468 6973 206d 6163 6869 6e65 3c2f f.this.machine</
+ 0x0400: 4832 3e0a 0a3c 503e 4966 2079 6f75 2077 H2>..<P>If.you.w
+ 0x0410: 616e 7420 746f 2072 6570 6f72 7420 736f ant.to.report.so
+ 0x0420: 6d65 7468 696e 6720 6162 6f75 7420 7468 mething.about.th
+ 0x0430: 6973 2068 6f73 7427 7320 6265 6861 7669 is.host's.behavi
+ 0x0440: 6f72 2c20 706c 6561 7365 0a63 6f6e 7461 or,.please.conta
+ 0x0450: 6374 2074 6865 2049 6e74 6572 6e65 7420 ct.the.Internet.
+ 0x0460: 5365 7276 6963 6520 5072 6f76 6964 6572 Service.Provider
+ 0x0470: 2028 4953 5029 2069 6e76 6f6c 7665 6420 .(ISP).involved.
+ 0x0480: 6469 7265 6374 6c79 2e3c 2f50 3e0a 0a3c directly.</P>..<
+ 0x0490: 503e 5365 6520 7468 6520 3c41 2068 7265 P>See.the.<A.hre
+ 0x04a0: 663d 2268 7474 703a 2f2f 7777 772e 6162 f="http://www.ab
+ 0x04b0: 7573 652e 6e65 742f 223e 4e65 7477 6f72 use.net/">Networ
+ 0x04c0: 6b20 4162 7573 650a 436c 6561 7269 6e67 k.Abuse.Clearing
+ 0x04d0: 686f 7573 653c 2f41 3e20 666f 7220 686f house</A>.for.ho
+ 0x04e0: 7720 746f 2064 6f20 7468 6973 2e3c 2f50 w.to.do.this.</P
+ 0x04f0: 3e0a 0a3c 4832 3e49 6620 796f 7520 6172 >..<H2>If.you.ar
+ 0x0500: 6520 7468 6520 6164 6d69 6e69 7374 7261 e.the.administra
+ 0x0510: 746f 7220 6f66 2074 6869 7320 6d61 6368 tor.of.this.mach
+ 0x0520: 696e 653c 2f48 323e 0a0a 3c50 3e54 6865 ine</H2>..<P>The
+ 0x0530: 2069 6e69 7469 616c 2069 6e73 7461 6c6c .initial.install
+ 0x0540: 6174 696f 6e20 6f66 203c 4120 6872 6566 ation.of.<A.href
+ 0x0550: 3d22 6874 7470 3a2f 2f77 7777 2e64 6562 ="http://www.deb
+ 0x0560: 6961 6e2e 6f72 672f 223e 4465 6269 616e ian.org/">Debian
+ 0x0570: 2773 0a61 7061 6368 653c 2f41 3e20 7765 's.apache</A>.we
+ 0x0580: 6220 7365 7276 6572 2070 6163 6b61 6765 b.server.package
+ 0x0590: 2077 6173 2073 7563 6365 7373 6675 6c2e .was.successful.
+ 0x05a0: 3c2f 503e 0a0a 3c50 3e3c 5354 524f 4e47 </P>..<P><STRONG
+ 0x05b0: 3e59 6f75 2073 686f 756c 6420 7265 706c >You.should.repl
+ 0x05c0: 6163 6520 7468 6973 2070 6167 6520 7769 ace.this.page.wi
+ 0x05d0: 7468 2079 6f75 7220 6f77 6e20 7765 6220 th.your.own.web.
+ 0x05e0: 7061 6765 7320 6173 0a73 6f6f 6e20 6173 pages.as.soon.as
+ 0x05f0: 2070 6f73 7369 626c 652e 3c2f 5354 524f .possible.</STRO
+ 0x0600: 4e47 3e3c 2f50 3e0a 0a3c 503e 556e 6c65 NG></P>..<P>Unle
+ 0x0610: 7373 2079 6f75 2063 6861 6e67 6564 2069 ss.you.changed.i
+ 0x0620: 7473 2063 6f6e 6669 6775 7261 7469 6f6e ts.configuration
+ 0x0630: 2c20 796f 7572 206e 6577 2073 6572 7665 ,.your.new.serve
+ 0x0640: 7220 6973 2063 6f6e 6669 6775 7265 6420 r.is.configured.
+ 0x0650: 6173 2066 6f6c 6c6f 7773 3a0a 3c55 4c3e as.follows:.<UL>
+ 0x0660: 0a3c 4c49 3e0a 436f 6e66 6967 7572 6174 .<LI>.Configurat
+ 0x0670: 696f 6e20 6669 6c65 7320 6361 6e20 6265 ion.files.can.be
+ 0x0680: 2066 6f75 6e64 2069 6e20 3c54 543e 2f65 .found.in.<TT>/e
+ 0x0690: 7463 2f61 7061 6368 653c 2f54 543e 2e3c tc/apache</TT>.<
+ 0x06a0: 2f4c 493e 0a0a 3c4c 493e 0a54 6865 203c /LI>..<LI>.The.<
+ 0x06b0: 5454 3e44 6f63 756d 656e 7452 6f6f 743c TT>DocumentRoot<
+ 0x06c0: 2f54 543e 2c20 7768 6963 6820 6973 2074 /TT>,.which.is.t
+ 0x06d0: 6865 2064 6972 6563 746f 7279 2075 6e64 he.directory.und
+ 0x06e0: 6572 2077 6869 6368 2061 6c6c 2079 6f75 er.which.all.you
+ 0x06f0: 720a 4854 4d4c 2066 696c 6573 2073 686f r.HTML.files.sho
+ 0x0700: 756c 6420 6578 6973 742c 2069 7320 7365 uld.exist,.is.se
+ 0x0710: 7420 746f 203c 5454 3e2f 7661 722f 7777 t.to.<TT>/var/ww
+ 0x0720: 773c 2f54 543e 2e3c 2f4c 493e 0a0a 3c4c w</TT>.</LI>..<L
+ 0x0730: 493e 0a43 4749 2073 6372 6970 7473 2061 I>.CGI.scripts.a
+ 0x0740: 7265 206c 6f6f 6b65 6420 666f 7220 696e re.looked.for.in
+ 0x0750: 203c 5454 3e2f 7573 722f 6c69 622f 6367 .<TT>/usr/lib/cg
+ 0x0760: 692d 6269 6e3c 2f54 543e 2c20 7768 6963 i-bin</TT>,.whic
+ 0x0770: 6820 6973 2077 6865 7265 0a44 6562 6961 h.is.where.Debia
+ 0x0780: 6e20 7061 636b 6167 6573 2077 696c 6c20 n.packages.will.
+ 0x0790: 706c 6163 6520 7468 6569 7220 7363 7269 place.their.scri
+ 0x07a0: 7074 732e 3c2f 4c49 3e0a 0a3c 4c49 3e0a pts.</LI>..<LI>.
+ 0x07b0: 4c6f 6720 6669 6c65 7320 6172 6520 706c Log.files.are.pl
+ 0x07c0: 6163 6564 2069 6e20 3c54 543e 2f76 6172 aced.in.<TT>/var
+ 0x07d0: 2f6c 6f67 2f61 7061 6368 653c 2f54 543e /log/apache</TT>
+ 0x07e0: 2c20 616e 6420 7769 6c6c 2062 6520 726f ,.and.will.be.ro
+ 0x07f0: 7461 7465 640a 7765 656b 6c79 2e20 2054 tated.weekly...T
+ 0x0800: 6865 2066 7265 7175 656e 6379 206f 6620 he.frequency.of.
+ 0x0810: 726f 7461 7469 6f6e 2063 616e 2062 6520 rotation.can.be.
+ 0x0820: 6561 7369 6c79 2063 6861 6e67 6564 2062 easily.changed.b
+ 0x0830: 7920 6564 6974 696e 670a 3c54 543e 2f65 y.editing.<TT>/e
+ 0x0840: 7463 2f6c 6f67 726f 7461 7465 2e64 2f61 tc/logrotate.d/a
+ 0x0850: 7061 6368 653c 2f54 543e 2e3c 2f4c 493e pache</TT>.</LI>
+ 0x0860: 0a0a 3c4c 493e 0a54 6865 2064 6566 6175 ..<LI>.The.defau
+ 0x0870: 6c74 2064 6972 6563 746f 7279 2069 6e64 lt.directory.ind
+ 0x0880: 6578 2069 7320 3c54 543e 696e 6465 782e ex.is.<TT>index.
+ 0x0890: 6874 6d6c 3c2f 5454 3e2c 206d 6561 6e69 html</TT>,.meani
+ 0x08a0: 6e67 2074 6861 7420 7265 7175 6573 7473 ng.that.requests
+ 0x08b0: 0a66 6f72 2061 2064 6972 6563 746f 7279 .for.a.directory
+ 0x08c0: 203c 5454 3e2f 666f 6f2f 6261 722f 3c2f .<TT>/foo/bar/</
+ 0x08d0: 5454 3e20 7769 6c6c 2067 6976 6520 7468 TT>.will.give.th
+ 0x08e0: 6520 636f 6e74 656e 7473 206f 6620 7468 e.contents.of.th
+ 0x08f0: 6520 6669 6c65 203c 5454 3e2f 7661 722f e.file.<TT>/var/
+ 0x0900: 7777 772f 666f 6f2f 6261 722f 696e 6465 www/foo/bar/inde
+ 0x0910: 782e 6874 6d6c 3c2f 5454 3e0a 6966 2069 x.html</TT>.if.i
+ 0x0920: 7420 6578 6973 7473 2028 6173 7375 6d69 t.exists.(assumi
+ 0x0930: 6e67 2074 6861 7420 3c54 543e 2f76 6172 ng.that.<TT>/var
+ 0x0940: 2f77 7777 3c2f 5454 3e20 6973 2079 6f75 /www</TT>.is.you
+ 0x0950: 7220 3c54 543e 446f 6375 6d65 6e74 526f r.<TT>DocumentRo
+ 0x0960: 6f74 3c2f 5454 3e29 2e3c 2f4c 493e 0a0a ot</TT>).</LI>..
+ 0x0970: 3c4c 493e 0a55 7365 7220 6469 7265 6374 <LI>.User.direct
+ 0x0980: 6f72 6965 7320 6172 6520 656e 6162 6c65 ories.are.enable
+ 0x0990: 642c 2061 6e64 2075 7365 7220 646f 6375 d,.and.user.docu
+ 0x09a0: 6d65 6e74 7320 7769 6c6c 2062 6520 6c6f ments.will.be.lo
+ 0x09b0: 6f6b 6564 2066 6f72 0a69 6e20 7468 6520 oked.for.in.the.
+ 0x09c0: 3c54 543e 7075 626c 6963 5f68 746d 6c3c <TT>public_html<
+ 0x09d0: 2f54 543e 2064 6972 6563 746f 7279 206f /TT>.directory.o
+ 0x09e0: 6620 7468 6520 7573 6572 7327 2068 6f6d f.the.users'.hom
+ 0x09f0: 6573 2e20 2054 6865 7365 2064 6972 730a es...These.dirs.
+ 0x0a00: 7368 6f75 6c64 2062 6520 756e 6465 7220 should.be.under.
+ 0x0a10: 3c54 543e 2f68 6f6d 653c 2f54 543e 2c20 <TT>/home</TT>,.
+ 0x0a20: 616e 6420 7573 6572 7320 7769 6c6c 206e and.users.will.n
+ 0x0a30: 6f74 2062 6520 6162 6c65 2074 6f20 7379 ot.be.able.to.sy
+ 0x0a40: 6d6c 696e 6b0a 746f 2066 696c 6573 2074 mlink.to.files.t
+ 0x0a50: 6865 7920 646f 6e27 7420 6f77 6e2e 3c2f hey.don't.own.</
+ 0x0a60: 4c49 3e0a 0a3c 2f55 4c3e 0a41 6c6c 2074 LI>..</UL>.All.t
+ 0x0a70: 6865 2073 7461 6e64 6172 6420 6170 6163 he.standard.apac
+ 0x0a80: 6865 206d 6f64 756c 6573 2061 7265 2061 he.modules.are.a
+ 0x0a90: 7661 696c 6162 6c65 2077 6974 6820 7468 vailable.with.th
+ 0x0aa0: 6973 2072 656c 6561 7365 2061 6e64 2061 is.release.and.a
+ 0x0ab0: 7265 0a6e 6f77 206d 616e 6167 6564 2077 re.now.managed.w
+ 0x0ac0: 6974 6820 6465 6263 6f6e 662e 2020 5479 ith.debconf...Ty
+ 0x0ad0: 7065 203c 5454 3e64 706b 672d 7265 636f pe.<TT>dpkg-reco
+ 0x0ae0: 6e66 6967 7572 6520 6170 6163 6865 3c2f nfigure.apache</
+ 0x0af0: 5454 3e20 746f 0a73 656c 6563 7420 7768 TT>.to.select.wh
+ 0x0b00: 6963 6820 6d6f 6475 6c65 7320 796f 7520 ich.modules.you.
+ 0x0b10: 7761 6e74 2065 6e61 626c 6564 2e20 204d want.enabled...M
+ 0x0b20: 616e 7920 6f74 6865 7220 6d6f 6475 6c65 any.other.module
+ 0x0b30: 7320 6172 6520 6176 6169 6c61 626c 650a s.are.available.
+ 0x0b40: 7468 726f 7567 6820 7468 6520 4465 6269 through.the.Debi
+ 0x0b50: 616e 2070 6163 6b61 6765 2073 7973 7465 an.package.syste
+ 0x0b60: 6d20 7769 7468 2074 6865 206e 616d 6573 m.with.the.names
+ 0x0b70: 203c 5454 3e6c 6962 6170 6163 6865 2d6d .<TT>libapache-m
+ 0x0b80: 6f64 2d2a 3c2f 5454 3e2e 0a49 6620 796f od-*</TT>..If.yo
+ 0x0b90: 7520 6e65 6564 2074 6f20 636f 6d70 696c u.need.to.compil
+ 0x0ba0: 6520 6120 6d6f 6475 6c65 2079 6f75 7273 e.a.module.yours
+ 0x0bb0: 656c 662c 2079 6f75 2077 696c 6c20 6e65 elf,.you.will.ne
+ 0x0bc0: 6564 2074 6f20 696e 7374 616c 6c20 7468 ed.to.install.th
+ 0x0bd0: 650a 3c54 543e 6170 6163 6865 2d64 6576 e.<TT>apache-dev
+ 0x0be0: 3c2f 5454 3e20 7061 636b 6167 652e 0a0a </TT>.package...
+ 0x0bf0: 3c50 3e4d 6f72 6520 646f 6375 6d65 6e74 <P>More.document
+ 0x0c00: 6174 696f 6e20 6f6e 2041 7061 6368 6520 ation.on.Apache.
+ 0x0c10: 6361 6e20 6265 2066 6f75 6e64 206f 6e3a can.be.found.on:
+ 0x0c20: 0a3c 554c 3e0a 3c4c 493e 0a54 6865 203c .<UL>.<LI>.The.<
+ 0x0c30: 4120 4852 4546 3d22 2f64 6f63 2f61 7061 A.HREF="/doc/apa
+ 0x0c40: 6368 652d 646f 632f 6d61 6e75 616c 2f22 che-doc/manual/"
+ 0x0c50: 3e41 7061 6368 6520 646f 6375 6d65 6e74 >Apache.document
+ 0x0c60: 6174 696f 6e3c 2f41 3e20 7374 6f72 6564 ation</A>.stored
+ 0x0c70: 206f 6e20 796f 7572 2073 6572 7665 722e .on.your.server.
+ 0x0c80: 3c2f 4c49 3e0a 0a3c 4c49 3e0a 5468 6520 </LI>..<LI>.The.
+ 0x0c90: 3c41 2048 5245 463d 2268 7474 703a 2f2f <A.HREF="http://
+ 0x0ca0: 7777 772e 6170 6163 6865 2e6f 7267 2f22 www.apache.org/"
+ 0x0cb0: 3e41 7061 6368 6520 5072 6f6a 6563 743c >Apache.Project<
+ 0x0cc0: 2f41 3e20 686f 6d65 2073 6974 652e 3c2f /A>.home.site.</
+ 0x0cd0: 4c49 3e0a 0a3c 4c49 3e0a 5468 6520 3c41 LI>..<LI>.The.<A
+ 0x0ce0: 2048 5245 463d 2268 7474 703a 2f2f 7777 .HREF="http://ww
+ 0x0cf0: 772e 6170 6163 6865 2d73 736c 2e6f 7267 w.apache-ssl.org
+ 0x0d00: 2f22 3e41 7061 6368 652d 5353 4c3c 2f41 /">Apache-SSL</A
+ 0x0d10: 3e20 686f 6d65 2073 6974 652e 3c2f 4c49 >.home.site.</LI
+ 0x0d20: 3e0a 0a3c 4c49 3e0a 5468 6520 3c41 2048 >..<LI>.The.<A.H
+ 0x0d30: 5245 463d 2268 7474 703a 2f2f 7065 726c REF="http://perl
+ 0x0d40: 2e61 7061 6368 652e 6f72 672f 223e 6d6f .apache.org/">mo
+ 0x0d50: 6420 7065 726c 3c2f 413e 2068 6f6d 6520 d.perl</A>.home.
+ 0x0d60: 7369 7465 2e3c 2f4c 493e 0a0a 3c4c 493e site.</LI>..<LI>
+ 0x0d70: 0a54 6865 203c 4120 4852 4546 3d22 6874 .The.<A.HREF="ht
+ 0x0d80: 7470 3a2f 2f77 7777 2e61 7061 6368 6577 tp://www.apachew
+ 0x0d90: 6565 6b2e 636f 6d2f 223e 4170 6163 6865 eek.com/">Apache
+ 0x0da0: 5765 656b 3c2f 413e 206e 6577 736c 6574 Week</A>.newslet
+ 0x0db0: 7465 722e 3c2f 4c49 3e0a 0a3c 4c49 3e0a ter.</LI>..<LI>.
+ 0x0dc0: 5468 6520 3c41 2048 5245 463d 2268 7474 The.<A.HREF="htt
+ 0x0dd0: 703a 2f2f 7777 772e 6465 6269 616e 2e6f p://www.debian.o
+ 0x0de0: 7267 2f64 6f63 2f22 3e44 6562 6961 6e20 rg/doc/">Debian.
+ 0x0df0: 5072 6f6a 6563 740a 446f 6375 6d65 6e74 Project.Document
+ 0x0e00: 6174 696f 6e3c 2f41 3e20 7768 6963 6820 ation</A>.which.
+ 0x0e10: 636f 6e74 6169 6e73 2048 4f57 544f 732c contains.HOWTOs,
+ 0x0e20: 2046 4151 732c 2061 6e64 2073 6f66 7477 .FAQs,.and.softw
+ 0x0e30: 6172 6520 7570 6461 7465 732e 3c2f 4c49 are.updates.</LI
+ 0x0e40: 3e0a 3c2f 554c 3e0a 0a3c 503e 596f 7520 >.</UL>..<P>You.
+ 0x0e50: 6361 6e20 616c 736f 2063 6f6e 7375 6c74 can.also.consult
+ 0x0e60: 2074 6865 206c 6973 7420 6f66 203c 4120 .the.list.of.<A.
+ 0x0e70: 4852 4546 3d22 6874 7470 3a2f 2f77 7777 HREF="http://www
+ 0x0e80: 2e62 6f75 7465 6c6c 2e63 6f6d 2f66 6171 .boutell.com/faq
+ 0x0e90: 2f22 3e57 6f72 6c64 0a57 6964 6520 5765 /">World.Wide.We
+ 0x0ea0: 6220 4672 6571 7565 6e74 6c79 2041 736b b.Frequently.Ask
+ 0x0eb0: 6564 2051 7565 7374 696f 6e73 3c2f 413e ed.Questions</A>
+ 0x0ec0: 2066 6f72 2069 6e66 6f72 6d61 7469 6f6e .for.information
+ 0x0ed0: 2e0a 0a3c 4832 3e4c 6574 206f 7468 6572 ...<H2>Let.other
+ 0x0ee0: 2070 656f 706c 6520 6b6e 6f77 2061 626f .people.know.abo
+ 0x0ef0: 7574 2074 6869 7320 7365 7276 6572 3c2f ut.this.server</
+ 0x0f00: 4832 3e0a 0a3c 4120 4852 4546 3d22 6874 H2>..<A.HREF="ht
+ 0x0f10: 7470 3a2f 2f6e 6574 6372 6166 742e 636f tp://netcraft.co
+ 0x0f20: 6d2f 223e 4e65 7463 7261 6674 3c2f 413e m/">Netcraft</A>
+ 0x0f30: 2070 726f 7669 6465 7320 616e 2069 6e74 .provides.an.int
+ 0x0f40: 6572 6573 7469 6e67 2066 7265 650a 7365 eresting.free.se
+ 0x0f50: 7276 6963 6520 666f 7220 7765 6220 7369 rvice.for.web.si
+ 0x0f60: 7465 206d 6f6e 6974 6f72 696e 6720 616e te.monitoring.an
+ 0x0f70: 6420 7374 6174 6973 7469 6320 636f 6c6c d.statistic.coll
+ 0x0f80: 6563 7469 6f6e 2e0a 596f 7520 6361 6e20 ection..You.can.
+ 0x0f90: 6c65 7420 7468 656d 206b 6e6f 7720 6162 let.them.know.ab
+ 0x0fa0: 6f75 7420 796f 7572 2073 6572 7665 7220 out.your.server.
+ 0x0fb0: 7573 696e 6720 7468 6569 720a 3c41 2048 using.their.<A.H
+ 0x0fc0: 5245 463d 2268 7474 703a 2f2f 7570 7469 REF="http://upti
+ 0x0fd0: 6d65 2e6e 6574 6372 6166 742e 636f 6d2f me.netcraft.com/
+ 0x0fe0: 223e 696e 7465 7266 6163 653c 2f41 3e2e ">interface</A>.
+ 0x0ff0: 0a45 6e61 626c 696e 6720 7468 6520 6d6f .Enabling.the.mo
+ 0x1000: 6e69 746f 7269 6e67 206f 6620 796f 7572 nitoring.of.your
+ 0x1010: 2073 6572 7665 7220 7769 6c6c 2070 726f .server.will.pro
+ 0x1020: 7669 6465 2061 2062 6574 7465 7220 676c vide.a.better.gl
+ 0x1030: 6f62 616c 206f 7665 7276 6965 770a 6f66 obal.overview.of
+ 0x1040: 2077 686f 2069 7320 7573 696e 6720 7768 .who.is.using.wh
+ 0x1050: 6174 2061 6e64 2077 6865 7265 2c20 616e at.and.where,.an
+ 0x1060: 6420 6974 2077 6f75 6c64 2067 6976 6520 d.it.would.give.
+ 0x1070: 4465 6269 616e 2061 2062 6574 7465 720a Debian.a.better.
+ 0x1080: 6f76 6572 7669 6577 206f 6620 7468 6520 overview.of.the.
+ 0x1090: 6170 6163 6865 2070 6163 6b61 6765 2075 apache.package.u
+ 0x10a0: 7361 6765 2e0a 0a3c 4832 3e41 626f 7574 sage...<H2>About
+ 0x10b0: 2074 6869 7320 7061 6765 3c2f 4832 3e0a .this.page</H2>.
+ 0x10c0: 0a3c 494d 4720 414c 4947 4e3d 2272 6967 .<IMG.ALIGN="rig
+ 0x10d0: 6874 2220 414c 543d 2222 2048 4549 4748 ht".ALT="".HEIGH
+ 0x10e0: 543d 2232 3437 2220 5749 4454 483d 2232 T="247".WIDTH="2
+ 0x10f0: 3738 2220 5352 433d 2269 636f 6e73 2f6a 78".SRC="icons/j
+ 0x1100: 6865 3036 312e 706e 6722 3e0a 0a3c 503e he061.png">..<P>
+ 0x1110: 5468 6973 2069 7320 6120 706c 6163 6568 This.is.a.placeh
+ 0x1120: 6f6c 6465 7220 7061 6765 2069 6e73 7461 older.page.insta
+ 0x1130: 6c6c 6564 2062 7920 7468 6520 3c41 0a48 lled.by.the.<A.H
+ 0x1140: 5245 463d 2268 7474 703a 2f2f 7777 772e REF="http://www.
+ 0x1150: 6465 6269 616e 2e6f 7267 2f22 3e44 6562 debian.org/">Deb
+ 0x1160: 6961 6e3c 2f41 3e0a 7265 6c65 6173 6520 ian</A>.release.
+ 0x1170: 6f66 2074 6865 2061 7061 6368 6520 5765 of.the.apache.We
+ 0x1180: 6220 7365 7276 6572 2070 6163 6b61 6765 b.server.package
+ 0x1190: 2e0a 0a3c 503e 5468 6973 2063 6f6d 7075 ...<P>This.compu
+ 0x11a0: 7465 7220 6861 7320 696e 7374 616c 6c65 ter.has.installe
+ 0x11b0: 6420 7468 6520 4465 6269 616e 2047 4e55 d.the.Debian.GNU
+ 0x11c0: 2f4c 696e 7578 206f 7065 7261 7469 6e67 /Linux.operating
+ 0x11d0: 2073 7973 7465 6d2c 0a62 7574 2069 7420 .system,.but.it.
+ 0x11e0: 6861 7320 3c73 7472 6f6e 673e 6e6f 7468 has.<strong>noth
+ 0x11f0: 696e 6720 746f 2064 6f20 7769 7468 2074 ing.to.do.with.t
+ 0x1200: 6865 2044 6562 6961 6e0a 5072 6f6a 6563 he.Debian.Projec
+ 0x1210: 743c 2f73 7472 6f6e 673e 2e20 506c 6561 t</strong>..Plea
+ 0x1220: 7365 2064 6f20 3c73 7472 6f6e 673e 6e6f se.do.<strong>no
+ 0x1230: 743c 2f73 7472 6f6e 673e 2063 6f6e 7461 t</strong>.conta
+ 0x1240: 6374 2074 6865 2044 6562 6961 6e0a 5072 ct.the.Debian.Pr
+ 0x1250: 6f6a 6563 7420 6162 6f75 7420 6974 2e3c oject.about.it.<
+ 0x1260: 2f50 3e0a 0a3c 503e 4966 2079 6f75 2066 /P>..<P>If.you.f
+ 0x1270: 696e 6420 6120 6275 6720 696e 2074 6869 ind.a.bug.in.thi
+ 0x1280: 7320 6170 6163 6865 2070 6163 6b61 6765 s.apache.package
+ 0x1290: 2c20 6f72 2069 6e20 4170 6163 6865 2069 ,.or.in.Apache.i
+ 0x12a0: 7473 656c 662c 0a70 6c65 6173 6520 6669 tself,.please.fi
+ 0x12b0: 6c65 2061 2062 7567 2072 6570 6f72 7420 le.a.bug.report.
+ 0x12c0: 6f6e 2069 742e 2020 496e 7374 7275 6374 on.it...Instruct
+ 0x12d0: 696f 6e73 206f 6e20 646f 696e 6720 7468 ions.on.doing.th
+ 0x12e0: 6973 2c20 616e 6420 7468 650a 6c69 7374 is,.and.the.list
+ 0x12f0: 206f 6620 3c41 2048 5245 463d 2268 7474 .of.<A.HREF="htt
+ 0x1300: 703a 2f2f 6275 6773 2e64 6562 6961 6e2e p://bugs.debian.
+ 0x1310: 6f72 672f 7372 633a 6170 6163 6865 223e org/src:apache">
+ 0x1320: 6b6e 6f77 6e20 6275 6773 3c2f 413e 206f known.bugs</A>.o
+ 0x1330: 6620 7468 6973 0a70 6163 6b61 6765 2c20 f.this.package,.
+ 0x1340: 6361 6e20 6265 2066 6f75 6e64 2069 6e20 can.be.found.in.
+ 0x1350: 7468 6520 0a3c 4120 4852 4546 3d22 6874 the..<A.HREF="ht
+ 0x1360: 7470 3a2f 2f77 7777 2e64 6562 6961 6e2e tp://www.debian.
+ 0x1370: 6f72 672f 4275 6773 2f52 6570 6f72 7469 org/Bugs/Reporti
+ 0x1380: 6e67 223e 4465 6269 616e 2042 7567 2054 ng">Debian.Bug.T
+ 0x1390: 7261 636b 696e 6720 5379 7374 656d 3c2f racking.System</
+ 0x13a0: 413e 2e0a 0a3c 503e 5468 616e 6b73 2066 A>...<P>Thanks.f
+ 0x13b0: 6f72 2075 7369 6e67 2074 6869 7320 7061 or.using.this.pa
+ 0x13c0: 636b 6167 652c 2061 6e64 2063 6f6e 6772 ckage,.and.congr
+ 0x13d0: 6174 756c 6174 696f 6e73 2066 6f72 2079 atulations.for.y
+ 0x13e0: 6f75 7220 6368 6f69 6365 206f 660a 6120 our.choice.of.a.
+ 0x13f0: 4465 6269 616e 2073 7973 7465 6d21 3c2f Debian.system!</
+ 0x1400: 503e 0a0a 3c44 4956 2061 6c69 676e 3d22 P>..<DIV.align="
+ 0x1410: 6365 6e74 6572 223e 0a3c 6120 6872 6566 center">.<a.href
+ 0x1420: 3d22 6874 7470 3a2f 2f77 7777 2e64 6562 ="http://www.deb
+ 0x1430: 6961 6e2e 6f72 672f 223e 0a3c 494d 4720 ian.org/">.<IMG.
+ 0x1440: 616c 6967 6e3d 226d 6964 646c 6522 2068 align="middle".h
+ 0x1450: 6569 6768 743d 2233 3022 2077 6964 7468 eight="30".width
+ 0x1460: 3d22 3235 2220 7372 633d 2269 636f 6e73 ="25".src="icons
+ 0x1470: 2f64 6562 6961 6e2f 6f70 656e 6c6f 676f /debian/openlogo
+ 0x1480: 2d32 352e 6a70 6722 2061 6c74 3d22 4465 -25.jpg".alt="De
+ 0x1490: 6269 616e 223e 0a3c 2f61 3e0a 3c61 2068 bian">.</a>.<a.h
+ 0x14a0: 7265 663d 2268 7474 703a 2f2f 7777 772e ref="http://www.
+ 0x14b0: 6170 6163 6865 2e6f 7267 2f22 3e0a 3c49 apache.org/">.<I
+ 0x14c0: 4d47 2061 6c69 676e 3d22 6d69 6464 6c65 MG.align="middle
+ 0x14d0: 2220 6865 6967 6874 3d22 3332 2220 7769 ".height="32".wi
+ 0x14e0: 6474 683d 2232 3539 2220 7372 633d 2269 dth="259".src="i
+ 0x14f0: 636f 6e73 2f61 7061 6368 655f 7062 2e70 cons/apache_pb.p
+ 0x1500: 6e67 2220 616c 743d 2241 7061 6368 6522 ng".alt="Apache"
+ 0x1510: 3e0a 3c2f 613e 0a3c 2f44 4956 3e0a 0a3c >.</a>.</DIV>..<
+ 0x1520: 212d 2d0a 2020 5468 6973 2070 6167 6520 !--...This.page.
+ 0x1530: 7761 7320 696e 6974 6961 6c6c 7920 6372 was.initially.cr
+ 0x1540: 6561 7465 6420 6279 204a 6f68 6e69 6520 eated.by.Johnie.
+ 0x1550: 496e 6772 616d 2028 6874 7470 3a2f 2f6e Ingram.(http://n
+ 0x1560: 6574 676f 642e 6e65 742f 290a 2020 4974 etgod.net/)...It
+ 0x1570: 2077 6173 206c 6174 6572 2065 6469 7465 .was.later.edite
+ 0x1580: 6420 6279 204d 6174 7468 6577 2057 696c d.by.Matthew.Wil
+ 0x1590: 636f 7820 616e 6420 4a6f 7369 7020 526f cox.and.Josip.Ro
+ 0x15a0: 6469 6e2e 0a20 204c 6173 7420 6d6f 6469 din....Last.modi
+ 0x15b0: 6669 6564 3a20 2444 6174 653a 2032 3030 fied:.$Date:.200
+ 0x15c0: 342f 3036 2f32 3020 3135 3a33 333a 3537 4/06/20.15:33:57
+ 0x15d0: 2024 2e0a 2020 2d2d 3e0a 0a3c 2f42 4f44 .$....-->..</BOD
+ 0x15e0: 593e 0a3c 2f48 544d 4c3e 0a Y>.</HTML>.
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5560, win 12383, options [nop,nop,TS val 1306300953 ecr 1306300953], length 0
+ 0x0000: 4500 0034 1b6e 4000 4006 2154 7f00 0001 E..4.n@.@.!T....
+ 0x0010: 7f00 0001 da70 0050 3758 8a49 377a a3a9 .....p.P7X.I7z..
+ 0x0020: 8010 305f 10ea 0000 0101 080a 4ddc 9219 ..0_........M...
+ 0x0030: 4ddc 9219 M...
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [F.], seq 203, ack 5560, win 12383, options [nop,nop,TS val 1306302241 ecr 1306300953], length 0
+ 0x0000: 4500 0034 1b70 4000 4006 2152 7f00 0001 E..4.p@.@.!R....
+ 0x0010: 7f00 0001 da70 0050 3758 8a49 377a a3a9 .....p.P7X.I7z..
+ 0x0020: 8011 305f 0be1 0000 0101 080a 4ddc 9721 ..0_........M..!
+ 0x0030: 4ddc 9219 M...
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [F.], seq 5560, ack 204, win 8192, options [nop,nop,TS val 1306302243 ecr 1306302241], length 0
+ 0x0000: 4500 0034 1fe8 4000 4006 1cda 7f00 0001 E..4..@.@.......
+ 0x0010: 7f00 0001 0050 da70 377a a3a9 3758 8a4a .....P.p7z..7X.J
+ 0x0020: 8011 2000 1735 0000 0101 080a 4ddc 9723 .....5......M..#
+ 0x0030: 4ddc 9721 M..!
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5561, win 12383, options [nop,nop,TS val 1306302243 ecr 1306302243], length 0
+ 0x0000: 4500 0034 1b72 4000 4006 2150 7f00 0001 E..4.r@.@.!P....
+ 0x0010: 7f00 0001 da70 0050 3758 8a4a 377a a3aa .....p.P7X.J7z..
+ 0x0020: 8010 305f 06d4 0000 0101 080a 4ddc 9723 ..0_........M..#
+ 0x0030: 4ddc 9723 M..#
--- /dev/null
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [S], seq 928549246, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 0,nop,wscale 2], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E.
+ 0x0010: 003c 1b68 4000 4006 2152 7f00 0001 7f00 .<.h@.@.!R......
+ 0x0020: 0001 da70 0050 3758 897e 0000 0000 a002 ...p.P7X.~......
+ 0x0030: 7fff 1421 0000 0204 400c 0402 080a 4ddc ...!....@.....M.
+ 0x0040: 9216 0000 0000 0103 0302 ..........
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [S.], seq 930778609, ack 928549247, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 1306300950,nop,wscale 2], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E.
+ 0x0010: 003c 0000 4000 4006 3cba 7f00 0001 7f00 .<..@.@.<.......
+ 0x0020: 0001 0050 da70 377a 8df1 3758 897f a012 ...P.p7z..7X....
+ 0x0030: 7fff 6eb1 0000 0204 400c 0402 080a 4ddc ..n.....@.....M.
+ 0x0040: 9216 4ddc 9216 0103 0302 ..M.......
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 1, win 8192, options [nop,nop,TS val 1306300950 ecr 1306300950], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E.
+ 0x0010: 0034 1b6a 4000 4006 2158 7f00 0001 7f00 .4.j@.@.!X......
+ 0x0020: 0001 da70 0050 3758 897f 377a 8df2 8010 ...p.P7X..7z....
+ 0x0030: 2000 37d0 0000 0101 080a 4ddc 9216 4ddc ..7.......M...M.
+ 0x0040: 9216 ..
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [P.], seq 1:203, ack 1, win 8192, options [nop,nop,TS val 1306300951 ecr 1306300950], length 202: HTTP: GET / HTTP/1.1
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E.
+ 0x0010: 00fe 1b6c 4000 4006 208c 7f00 0001 7f00 ...l@.@.........
+ 0x0020: 0001 da70 0050 3758 897f 377a 8df2 8018 ...p.P7X..7z....
+ 0x0030: 2000 fef2 0000 0101 080a 4ddc 9217 4ddc ..........M...M.
+ 0x0040: 9216 4745 5420 2f20 4854 5450 2f31 2e31 ..GET./.HTTP/1.1
+ 0x0050: 0d0a 486f 7374 3a20 6c6f 6361 6c68 6f73 ..Host:.localhos
+ 0x0060: 740d 0a55 7365 722d 4167 656e 743a 2045 t..User-Agent:.E
+ 0x0070: 4c69 6e6b 732f 302e 3130 2e34 2d37 2d64 Links/0.10.4-7-d
+ 0x0080: 6562 6961 6e20 2874 6578 746d 6f64 653b ebian.(textmode;
+ 0x0090: 204c 696e 7578 2032 2e36 2e31 312d 312d .Linux.2.6.11-1-
+ 0x00a0: 3638 362d 736d 7020 6936 3836 3b20 3133 686-smp.i686;.13
+ 0x00b0: 3278 3536 2d32 290d 0a41 6363 6570 743a 2x56-2)..Accept:
+ 0x00c0: 202a 2f2a 0d0a 4163 6365 7074 2d45 6e63 .*/*..Accept-Enc
+ 0x00d0: 6f64 696e 673a 2067 7a69 700d 0a41 6363 oding:.gzip..Acc
+ 0x00e0: 6570 742d 4c61 6e67 7561 6765 3a20 656e ept-Language:.en
+ 0x00f0: 0d0a 436f 6e6e 6563 7469 6f6e 3a20 4b65 ..Connection:.Ke
+ 0x0100: 6570 2d41 6c69 7665 0d0a 0d0a ep-Alive....
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [.], ack 203, win 8192, options [nop,nop,TS val 1306300952 ecr 1306300951], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E.
+ 0x0010: 0034 1fe4 4000 4006 1cde 7f00 0001 7f00 .4..@.@.........
+ 0x0020: 0001 0050 da70 377a 8df2 3758 8a49 8010 ...P.p7z..7X.I..
+ 0x0030: 2000 3703 0000 0101 080a 4ddc 9218 4ddc ..7.......M...M.
+ 0x0040: 9217 ..
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [P.], seq 1:5560, ack 203, win 8192, options [nop,nop,TS val 1306300953 ecr 1306300951], length 5559: HTTP: HTTP/1.1 200 OK
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E.
+ 0x0010: 15eb 1fe6 4000 4006 0725 7f00 0001 7f00 ....@.@..%......
+ 0x0020: 0001 0050 da70 377a 8df2 3758 8a49 8018 ...P.p7z..7X.I..
+ 0x0030: 2000 13e0 0000 0101 080a 4ddc 9219 4ddc ..........M...M.
+ 0x0040: 9217 4854 5450 2f31 2e31 2032 3030 204f ..HTTP/1.1.200.O
+ 0x0050: 4b0d 0a44 6174 653a 2057 6564 2c20 3036 K..Date:.Wed,.06
+ 0x0060: 204a 756c 2032 3030 3520 3033 3a35 373a .Jul.2005.03:57:
+ 0x0070: 3335 2047 4d54 0d0a 5365 7276 6572 3a20 35.GMT..Server:.
+ 0x0080: 4170 6163 6865 2f31 2e33 2e33 330d 0a4c Apache/1.3.33..L
+ 0x0090: 6173 742d 4d6f 6469 6669 6564 3a20 5375 ast-Modified:.Su
+ 0x00a0: 6e2c 2031 3520 4175 6720 3230 3034 2030 n,.15.Aug.2004.0
+ 0x00b0: 303a 3433 3a34 3120 474d 540d 0a45 5461 0:43:41.GMT..ETa
+ 0x00c0: 673a 2022 3665 3830 6630 2d31 3438 612d g:."6e80f0-148a-
+ 0x00d0: 3431 3165 6231 6264 220d 0a41 6363 6570 411eb1bd"..Accep
+ 0x00e0: 742d 5261 6e67 6573 3a20 6279 7465 730d t-Ranges:.bytes.
+ 0x00f0: 0a43 6f6e 7465 6e74 2d4c 656e 6774 683a .Content-Length:
+ 0x0100: 2035 3235 380d 0a4b 6565 702d 416c 6976 .5258..Keep-Aliv
+ 0x0110: 653a 2074 696d 656f 7574 3d31 352c 206d e:.timeout=15,.m
+ 0x0120: 6178 3d31 3030 0d0a 436f 6e6e 6563 7469 ax=100..Connecti
+ 0x0130: 6f6e 3a20 4b65 6570 2d41 6c69 7665 0d0a on:.Keep-Alive..
+ 0x0140: 436f 6e74 656e 742d 5479 7065 3a20 7465 Content-Type:.te
+ 0x0150: 7874 2f68 746d 6c3b 2063 6861 7273 6574 xt/html;.charset
+ 0x0160: 3d69 736f 2d38 3835 392d 310d 0a0d 0a3c =iso-8859-1....<
+ 0x0170: 2144 4f43 5459 5045 2048 544d 4c20 5055 !DOCTYPE.HTML.PU
+ 0x0180: 424c 4943 2022 2d2f 2f57 3343 2f2f 4454 BLIC."-//W3C//DT
+ 0x0190: 4420 4854 4d4c 2034 2e30 3120 5472 616e D.HTML.4.01.Tran
+ 0x01a0: 7369 7469 6f6e 616c 2f2f 454e 223e 0a3c sitional//EN">.<
+ 0x01b0: 4854 4d4c 3e0a 3c48 4541 443e 0a20 2020 HTML>.<HEAD>....
+ 0x01c0: 3c4d 4554 4120 4854 5450 2d45 5155 4956 <META.HTTP-EQUIV
+ 0x01d0: 3d22 436f 6e74 656e 742d 5479 7065 2220 ="Content-Type".
+ 0x01e0: 434f 4e54 454e 543d 2274 6578 742f 6874 CONTENT="text/ht
+ 0x01f0: 6d6c 3b20 6368 6172 7365 743d 6973 6f2d ml;.charset=iso-
+ 0x0200: 3838 3539 2d31 223e 0a20 2020 3c4d 4554 8859-1">....<MET
+ 0x0210: 4120 4e41 4d45 3d22 4465 7363 7269 7074 A.NAME="Descript
+ 0x0220: 696f 6e22 2043 4f4e 5445 4e54 3d22 5468 ion".CONTENT="Th
+ 0x0230: 6520 696e 6974 6961 6c20 696e 7374 616c e.initial.instal
+ 0x0240: 6c61 7469 6f6e 206f 6620 4465 6269 616e lation.of.Debian
+ 0x0250: 2061 7061 6368 652e 223e 0a20 2020 3c54 .apache.">....<T
+ 0x0260: 4954 4c45 3e50 6c61 6365 686f 6c64 6572 ITLE>Placeholder
+ 0x0270: 2070 6167 653c 2f54 4954 4c45 3e0a 3c2f .page</TITLE>.</
+ 0x0280: 4845 4144 3e0a 3c42 4f44 5920 5445 5854 HEAD>.<BODY.TEXT
+ 0x0290: 3d22 2330 3030 3030 3022 2042 4743 4f4c ="#000000".BGCOL
+ 0x02a0: 4f52 3d22 2346 4646 4646 4622 204c 494e OR="#FFFFFF".LIN
+ 0x02b0: 4b3d 2223 3030 3030 4546 2220 564c 494e K="#0000EF".VLIN
+ 0x02c0: 4b3d 2223 3535 3138 3841 2220 414c 494e K="#55188A".ALIN
+ 0x02d0: 4b3d 2223 4646 3030 3030 223e 0a0a 3c48 K="#FF0000">..<H
+ 0x02e0: 313e 506c 6163 6568 6f6c 6465 7220 7061 1>Placeholder.pa
+ 0x02f0: 6765 3c2f 4831 3e0a 3c48 323e 4966 2079 ge</H1>.<H2>If.y
+ 0x0300: 6f75 2061 7265 206a 7573 7420 6272 6f77 ou.are.just.brow
+ 0x0310: 7369 6e67 2074 6865 2077 6562 3c2f 6832 sing.the.web</h2
+ 0x0320: 3e0a 0a3c 503e 5468 6520 6f77 6e65 7220 >..<P>The.owner.
+ 0x0330: 6f66 2074 6869 7320 7765 6220 7369 7465 of.this.web.site
+ 0x0340: 2068 6173 206e 6f74 2070 7574 2075 7020 .has.not.put.up.
+ 0x0350: 616e 7920 7765 6220 7061 6765 7320 7965 any.web.pages.ye
+ 0x0360: 742e 0a50 6c65 6173 6520 636f 6d65 2062 t..Please.come.b
+ 0x0370: 6163 6b20 6c61 7465 722e 3c2f 503e 0a0a ack.later.</P>..
+ 0x0380: 3c50 3e3c 534d 414c 4c3e 3c43 4954 453e <P><SMALL><CITE>
+ 0x0390: 4d6f 7665 2061 6c6f 6e67 2c20 6e6f 7468 Move.along,.noth
+ 0x03a0: 696e 6720 746f 2073 6565 2068 6572 652e ing.to.see.here.
+ 0x03b0: 2e2e 3c2f 4349 5445 3e20 3a2d 293c 2f53 ..</CITE>.:-)</S
+ 0x03c0: 4d41 4c4c 3e3c 2f50 3e0a 0a3c 4832 3e49 MALL></P>..<H2>I
+ 0x03d0: 6620 796f 7520 6172 6520 7472 7969 6e67 f.you.are.trying
+ 0x03e0: 2074 6f20 6c6f 6361 7465 2074 6865 2061 .to.locate.the.a
+ 0x03f0: 646d 696e 6973 7472 6174 6f72 206f 6620 dministrator.of.
+ 0x0400: 7468 6973 206d 6163 6869 6e65 3c2f 4832 this.machine</H2
+ 0x0410: 3e0a 0a3c 503e 4966 2079 6f75 2077 616e >..<P>If.you.wan
+ 0x0420: 7420 746f 2072 6570 6f72 7420 736f 6d65 t.to.report.some
+ 0x0430: 7468 696e 6720 6162 6f75 7420 7468 6973 thing.about.this
+ 0x0440: 2068 6f73 7427 7320 6265 6861 7669 6f72 .host's.behavior
+ 0x0450: 2c20 706c 6561 7365 0a63 6f6e 7461 6374 ,.please.contact
+ 0x0460: 2074 6865 2049 6e74 6572 6e65 7420 5365 .the.Internet.Se
+ 0x0470: 7276 6963 6520 5072 6f76 6964 6572 2028 rvice.Provider.(
+ 0x0480: 4953 5029 2069 6e76 6f6c 7665 6420 6469 ISP).involved.di
+ 0x0490: 7265 6374 6c79 2e3c 2f50 3e0a 0a3c 503e rectly.</P>..<P>
+ 0x04a0: 5365 6520 7468 6520 3c41 2068 7265 663d See.the.<A.href=
+ 0x04b0: 2268 7474 703a 2f2f 7777 772e 6162 7573 "http://www.abus
+ 0x04c0: 652e 6e65 742f 223e 4e65 7477 6f72 6b20 e.net/">Network.
+ 0x04d0: 4162 7573 650a 436c 6561 7269 6e67 686f Abuse.Clearingho
+ 0x04e0: 7573 653c 2f41 3e20 666f 7220 686f 7720 use</A>.for.how.
+ 0x04f0: 746f 2064 6f20 7468 6973 2e3c 2f50 3e0a to.do.this.</P>.
+ 0x0500: 0a3c 4832 3e49 6620 796f 7520 6172 6520 .<H2>If.you.are.
+ 0x0510: 7468 6520 6164 6d69 6e69 7374 7261 746f the.administrato
+ 0x0520: 7220 6f66 2074 6869 7320 6d61 6368 696e r.of.this.machin
+ 0x0530: 653c 2f48 323e 0a0a 3c50 3e54 6865 2069 e</H2>..<P>The.i
+ 0x0540: 6e69 7469 616c 2069 6e73 7461 6c6c 6174 nitial.installat
+ 0x0550: 696f 6e20 6f66 203c 4120 6872 6566 3d22 ion.of.<A.href="
+ 0x0560: 6874 7470 3a2f 2f77 7777 2e64 6562 6961 http://www.debia
+ 0x0570: 6e2e 6f72 672f 223e 4465 6269 616e 2773 n.org/">Debian's
+ 0x0580: 0a61 7061 6368 653c 2f41 3e20 7765 6220 .apache</A>.web.
+ 0x0590: 7365 7276 6572 2070 6163 6b61 6765 2077 server.package.w
+ 0x05a0: 6173 2073 7563 6365 7373 6675 6c2e 3c2f as.successful.</
+ 0x05b0: 503e 0a0a 3c50 3e3c 5354 524f 4e47 3e59 P>..<P><STRONG>Y
+ 0x05c0: 6f75 2073 686f 756c 6420 7265 706c 6163 ou.should.replac
+ 0x05d0: 6520 7468 6973 2070 6167 6520 7769 7468 e.this.page.with
+ 0x05e0: 2079 6f75 7220 6f77 6e20 7765 6220 7061 .your.own.web.pa
+ 0x05f0: 6765 7320 6173 0a73 6f6f 6e20 6173 2070 ges.as.soon.as.p
+ 0x0600: 6f73 7369 626c 652e 3c2f 5354 524f 4e47 ossible.</STRONG
+ 0x0610: 3e3c 2f50 3e0a 0a3c 503e 556e 6c65 7373 ></P>..<P>Unless
+ 0x0620: 2079 6f75 2063 6861 6e67 6564 2069 7473 .you.changed.its
+ 0x0630: 2063 6f6e 6669 6775 7261 7469 6f6e 2c20 .configuration,.
+ 0x0640: 796f 7572 206e 6577 2073 6572 7665 7220 your.new.server.
+ 0x0650: 6973 2063 6f6e 6669 6775 7265 6420 6173 is.configured.as
+ 0x0660: 2066 6f6c 6c6f 7773 3a0a 3c55 4c3e 0a3c .follows:.<UL>.<
+ 0x0670: 4c49 3e0a 436f 6e66 6967 7572 6174 696f LI>.Configuratio
+ 0x0680: 6e20 6669 6c65 7320 6361 6e20 6265 2066 n.files.can.be.f
+ 0x0690: 6f75 6e64 2069 6e20 3c54 543e 2f65 7463 ound.in.<TT>/etc
+ 0x06a0: 2f61 7061 6368 653c 2f54 543e 2e3c 2f4c /apache</TT>.</L
+ 0x06b0: 493e 0a0a 3c4c 493e 0a54 6865 203c 5454 I>..<LI>.The.<TT
+ 0x06c0: 3e44 6f63 756d 656e 7452 6f6f 743c 2f54 >DocumentRoot</T
+ 0x06d0: 543e 2c20 7768 6963 6820 6973 2074 6865 T>,.which.is.the
+ 0x06e0: 2064 6972 6563 746f 7279 2075 6e64 6572 .directory.under
+ 0x06f0: 2077 6869 6368 2061 6c6c 2079 6f75 720a .which.all.your.
+ 0x0700: 4854 4d4c 2066 696c 6573 2073 686f 756c HTML.files.shoul
+ 0x0710: 6420 6578 6973 742c 2069 7320 7365 7420 d.exist,.is.set.
+ 0x0720: 746f 203c 5454 3e2f 7661 722f 7777 773c to.<TT>/var/www<
+ 0x0730: 2f54 543e 2e3c 2f4c 493e 0a0a 3c4c 493e /TT>.</LI>..<LI>
+ 0x0740: 0a43 4749 2073 6372 6970 7473 2061 7265 .CGI.scripts.are
+ 0x0750: 206c 6f6f 6b65 6420 666f 7220 696e 203c .looked.for.in.<
+ 0x0760: 5454 3e2f 7573 722f 6c69 622f 6367 692d TT>/usr/lib/cgi-
+ 0x0770: 6269 6e3c 2f54 543e 2c20 7768 6963 6820 bin</TT>,.which.
+ 0x0780: 6973 2077 6865 7265 0a44 6562 6961 6e20 is.where.Debian.
+ 0x0790: 7061 636b 6167 6573 2077 696c 6c20 706c packages.will.pl
+ 0x07a0: 6163 6520 7468 6569 7220 7363 7269 7074 ace.their.script
+ 0x07b0: 732e 3c2f 4c49 3e0a 0a3c 4c49 3e0a 4c6f s.</LI>..<LI>.Lo
+ 0x07c0: 6720 6669 6c65 7320 6172 6520 706c 6163 g.files.are.plac
+ 0x07d0: 6564 2069 6e20 3c54 543e 2f76 6172 2f6c ed.in.<TT>/var/l
+ 0x07e0: 6f67 2f61 7061 6368 653c 2f54 543e 2c20 og/apache</TT>,.
+ 0x07f0: 616e 6420 7769 6c6c 2062 6520 726f 7461 and.will.be.rota
+ 0x0800: 7465 640a 7765 656b 6c79 2e20 2054 6865 ted.weekly...The
+ 0x0810: 2066 7265 7175 656e 6379 206f 6620 726f .frequency.of.ro
+ 0x0820: 7461 7469 6f6e 2063 616e 2062 6520 6561 tation.can.be.ea
+ 0x0830: 7369 6c79 2063 6861 6e67 6564 2062 7920 sily.changed.by.
+ 0x0840: 6564 6974 696e 670a 3c54 543e 2f65 7463 editing.<TT>/etc
+ 0x0850: 2f6c 6f67 726f 7461 7465 2e64 2f61 7061 /logrotate.d/apa
+ 0x0860: 6368 653c 2f54 543e 2e3c 2f4c 493e 0a0a che</TT>.</LI>..
+ 0x0870: 3c4c 493e 0a54 6865 2064 6566 6175 6c74 <LI>.The.default
+ 0x0880: 2064 6972 6563 746f 7279 2069 6e64 6578 .directory.index
+ 0x0890: 2069 7320 3c54 543e 696e 6465 782e 6874 .is.<TT>index.ht
+ 0x08a0: 6d6c 3c2f 5454 3e2c 206d 6561 6e69 6e67 ml</TT>,.meaning
+ 0x08b0: 2074 6861 7420 7265 7175 6573 7473 0a66 .that.requests.f
+ 0x08c0: 6f72 2061 2064 6972 6563 746f 7279 203c or.a.directory.<
+ 0x08d0: 5454 3e2f 666f 6f2f 6261 722f 3c2f 5454 TT>/foo/bar/</TT
+ 0x08e0: 3e20 7769 6c6c 2067 6976 6520 7468 6520 >.will.give.the.
+ 0x08f0: 636f 6e74 656e 7473 206f 6620 7468 6520 contents.of.the.
+ 0x0900: 6669 6c65 203c 5454 3e2f 7661 722f 7777 file.<TT>/var/ww
+ 0x0910: 772f 666f 6f2f 6261 722f 696e 6465 782e w/foo/bar/index.
+ 0x0920: 6874 6d6c 3c2f 5454 3e0a 6966 2069 7420 html</TT>.if.it.
+ 0x0930: 6578 6973 7473 2028 6173 7375 6d69 6e67 exists.(assuming
+ 0x0940: 2074 6861 7420 3c54 543e 2f76 6172 2f77 .that.<TT>/var/w
+ 0x0950: 7777 3c2f 5454 3e20 6973 2079 6f75 7220 ww</TT>.is.your.
+ 0x0960: 3c54 543e 446f 6375 6d65 6e74 526f 6f74 <TT>DocumentRoot
+ 0x0970: 3c2f 5454 3e29 2e3c 2f4c 493e 0a0a 3c4c </TT>).</LI>..<L
+ 0x0980: 493e 0a55 7365 7220 6469 7265 6374 6f72 I>.User.director
+ 0x0990: 6965 7320 6172 6520 656e 6162 6c65 642c ies.are.enabled,
+ 0x09a0: 2061 6e64 2075 7365 7220 646f 6375 6d65 .and.user.docume
+ 0x09b0: 6e74 7320 7769 6c6c 2062 6520 6c6f 6f6b nts.will.be.look
+ 0x09c0: 6564 2066 6f72 0a69 6e20 7468 6520 3c54 ed.for.in.the.<T
+ 0x09d0: 543e 7075 626c 6963 5f68 746d 6c3c 2f54 T>public_html</T
+ 0x09e0: 543e 2064 6972 6563 746f 7279 206f 6620 T>.directory.of.
+ 0x09f0: 7468 6520 7573 6572 7327 2068 6f6d 6573 the.users'.homes
+ 0x0a00: 2e20 2054 6865 7365 2064 6972 730a 7368 ...These.dirs.sh
+ 0x0a10: 6f75 6c64 2062 6520 756e 6465 7220 3c54 ould.be.under.<T
+ 0x0a20: 543e 2f68 6f6d 653c 2f54 543e 2c20 616e T>/home</TT>,.an
+ 0x0a30: 6420 7573 6572 7320 7769 6c6c 206e 6f74 d.users.will.not
+ 0x0a40: 2062 6520 6162 6c65 2074 6f20 7379 6d6c .be.able.to.syml
+ 0x0a50: 696e 6b0a 746f 2066 696c 6573 2074 6865 ink.to.files.the
+ 0x0a60: 7920 646f 6e27 7420 6f77 6e2e 3c2f 4c49 y.don't.own.</LI
+ 0x0a70: 3e0a 0a3c 2f55 4c3e 0a41 6c6c 2074 6865 >..</UL>.All.the
+ 0x0a80: 2073 7461 6e64 6172 6420 6170 6163 6865 .standard.apache
+ 0x0a90: 206d 6f64 756c 6573 2061 7265 2061 7661 .modules.are.ava
+ 0x0aa0: 696c 6162 6c65 2077 6974 6820 7468 6973 ilable.with.this
+ 0x0ab0: 2072 656c 6561 7365 2061 6e64 2061 7265 .release.and.are
+ 0x0ac0: 0a6e 6f77 206d 616e 6167 6564 2077 6974 .now.managed.wit
+ 0x0ad0: 6820 6465 6263 6f6e 662e 2020 5479 7065 h.debconf...Type
+ 0x0ae0: 203c 5454 3e64 706b 672d 7265 636f 6e66 .<TT>dpkg-reconf
+ 0x0af0: 6967 7572 6520 6170 6163 6865 3c2f 5454 igure.apache</TT
+ 0x0b00: 3e20 746f 0a73 656c 6563 7420 7768 6963 >.to.select.whic
+ 0x0b10: 6820 6d6f 6475 6c65 7320 796f 7520 7761 h.modules.you.wa
+ 0x0b20: 6e74 2065 6e61 626c 6564 2e20 204d 616e nt.enabled...Man
+ 0x0b30: 7920 6f74 6865 7220 6d6f 6475 6c65 7320 y.other.modules.
+ 0x0b40: 6172 6520 6176 6169 6c61 626c 650a 7468 are.available.th
+ 0x0b50: 726f 7567 6820 7468 6520 4465 6269 616e rough.the.Debian
+ 0x0b60: 2070 6163 6b61 6765 2073 7973 7465 6d20 .package.system.
+ 0x0b70: 7769 7468 2074 6865 206e 616d 6573 203c with.the.names.<
+ 0x0b80: 5454 3e6c 6962 6170 6163 6865 2d6d 6f64 TT>libapache-mod
+ 0x0b90: 2d2a 3c2f 5454 3e2e 0a49 6620 796f 7520 -*</TT>..If.you.
+ 0x0ba0: 6e65 6564 2074 6f20 636f 6d70 696c 6520 need.to.compile.
+ 0x0bb0: 6120 6d6f 6475 6c65 2079 6f75 7273 656c a.module.yoursel
+ 0x0bc0: 662c 2079 6f75 2077 696c 6c20 6e65 6564 f,.you.will.need
+ 0x0bd0: 2074 6f20 696e 7374 616c 6c20 7468 650a .to.install.the.
+ 0x0be0: 3c54 543e 6170 6163 6865 2d64 6576 3c2f <TT>apache-dev</
+ 0x0bf0: 5454 3e20 7061 636b 6167 652e 0a0a 3c50 TT>.package...<P
+ 0x0c00: 3e4d 6f72 6520 646f 6375 6d65 6e74 6174 >More.documentat
+ 0x0c10: 696f 6e20 6f6e 2041 7061 6368 6520 6361 ion.on.Apache.ca
+ 0x0c20: 6e20 6265 2066 6f75 6e64 206f 6e3a 0a3c n.be.found.on:.<
+ 0x0c30: 554c 3e0a 3c4c 493e 0a54 6865 203c 4120 UL>.<LI>.The.<A.
+ 0x0c40: 4852 4546 3d22 2f64 6f63 2f61 7061 6368 HREF="/doc/apach
+ 0x0c50: 652d 646f 632f 6d61 6e75 616c 2f22 3e41 e-doc/manual/">A
+ 0x0c60: 7061 6368 6520 646f 6375 6d65 6e74 6174 pache.documentat
+ 0x0c70: 696f 6e3c 2f41 3e20 7374 6f72 6564 206f ion</A>.stored.o
+ 0x0c80: 6e20 796f 7572 2073 6572 7665 722e 3c2f n.your.server.</
+ 0x0c90: 4c49 3e0a 0a3c 4c49 3e0a 5468 6520 3c41 LI>..<LI>.The.<A
+ 0x0ca0: 2048 5245 463d 2268 7474 703a 2f2f 7777 .HREF="http://ww
+ 0x0cb0: 772e 6170 6163 6865 2e6f 7267 2f22 3e41 w.apache.org/">A
+ 0x0cc0: 7061 6368 6520 5072 6f6a 6563 743c 2f41 pache.Project</A
+ 0x0cd0: 3e20 686f 6d65 2073 6974 652e 3c2f 4c49 >.home.site.</LI
+ 0x0ce0: 3e0a 0a3c 4c49 3e0a 5468 6520 3c41 2048 >..<LI>.The.<A.H
+ 0x0cf0: 5245 463d 2268 7474 703a 2f2f 7777 772e REF="http://www.
+ 0x0d00: 6170 6163 6865 2d73 736c 2e6f 7267 2f22 apache-ssl.org/"
+ 0x0d10: 3e41 7061 6368 652d 5353 4c3c 2f41 3e20 >Apache-SSL</A>.
+ 0x0d20: 686f 6d65 2073 6974 652e 3c2f 4c49 3e0a home.site.</LI>.
+ 0x0d30: 0a3c 4c49 3e0a 5468 6520 3c41 2048 5245 .<LI>.The.<A.HRE
+ 0x0d40: 463d 2268 7474 703a 2f2f 7065 726c 2e61 F="http://perl.a
+ 0x0d50: 7061 6368 652e 6f72 672f 223e 6d6f 6420 pache.org/">mod.
+ 0x0d60: 7065 726c 3c2f 413e 2068 6f6d 6520 7369 perl</A>.home.si
+ 0x0d70: 7465 2e3c 2f4c 493e 0a0a 3c4c 493e 0a54 te.</LI>..<LI>.T
+ 0x0d80: 6865 203c 4120 4852 4546 3d22 6874 7470 he.<A.HREF="http
+ 0x0d90: 3a2f 2f77 7777 2e61 7061 6368 6577 6565 ://www.apachewee
+ 0x0da0: 6b2e 636f 6d2f 223e 4170 6163 6865 5765 k.com/">ApacheWe
+ 0x0db0: 656b 3c2f 413e 206e 6577 736c 6574 7465 ek</A>.newslette
+ 0x0dc0: 722e 3c2f 4c49 3e0a 0a3c 4c49 3e0a 5468 r.</LI>..<LI>.Th
+ 0x0dd0: 6520 3c41 2048 5245 463d 2268 7474 703a e.<A.HREF="http:
+ 0x0de0: 2f2f 7777 772e 6465 6269 616e 2e6f 7267 //www.debian.org
+ 0x0df0: 2f64 6f63 2f22 3e44 6562 6961 6e20 5072 /doc/">Debian.Pr
+ 0x0e00: 6f6a 6563 740a 446f 6375 6d65 6e74 6174 oject.Documentat
+ 0x0e10: 696f 6e3c 2f41 3e20 7768 6963 6820 636f ion</A>.which.co
+ 0x0e20: 6e74 6169 6e73 2048 4f57 544f 732c 2046 ntains.HOWTOs,.F
+ 0x0e30: 4151 732c 2061 6e64 2073 6f66 7477 6172 AQs,.and.softwar
+ 0x0e40: 6520 7570 6461 7465 732e 3c2f 4c49 3e0a e.updates.</LI>.
+ 0x0e50: 3c2f 554c 3e0a 0a3c 503e 596f 7520 6361 </UL>..<P>You.ca
+ 0x0e60: 6e20 616c 736f 2063 6f6e 7375 6c74 2074 n.also.consult.t
+ 0x0e70: 6865 206c 6973 7420 6f66 203c 4120 4852 he.list.of.<A.HR
+ 0x0e80: 4546 3d22 6874 7470 3a2f 2f77 7777 2e62 EF="http://www.b
+ 0x0e90: 6f75 7465 6c6c 2e63 6f6d 2f66 6171 2f22 outell.com/faq/"
+ 0x0ea0: 3e57 6f72 6c64 0a57 6964 6520 5765 6220 >World.Wide.Web.
+ 0x0eb0: 4672 6571 7565 6e74 6c79 2041 736b 6564 Frequently.Asked
+ 0x0ec0: 2051 7565 7374 696f 6e73 3c2f 413e 2066 .Questions</A>.f
+ 0x0ed0: 6f72 2069 6e66 6f72 6d61 7469 6f6e 2e0a or.information..
+ 0x0ee0: 0a3c 4832 3e4c 6574 206f 7468 6572 2070 .<H2>Let.other.p
+ 0x0ef0: 656f 706c 6520 6b6e 6f77 2061 626f 7574 eople.know.about
+ 0x0f00: 2074 6869 7320 7365 7276 6572 3c2f 4832 .this.server</H2
+ 0x0f10: 3e0a 0a3c 4120 4852 4546 3d22 6874 7470 >..<A.HREF="http
+ 0x0f20: 3a2f 2f6e 6574 6372 6166 742e 636f 6d2f ://netcraft.com/
+ 0x0f30: 223e 4e65 7463 7261 6674 3c2f 413e 2070 ">Netcraft</A>.p
+ 0x0f40: 726f 7669 6465 7320 616e 2069 6e74 6572 rovides.an.inter
+ 0x0f50: 6573 7469 6e67 2066 7265 650a 7365 7276 esting.free.serv
+ 0x0f60: 6963 6520 666f 7220 7765 6220 7369 7465 ice.for.web.site
+ 0x0f70: 206d 6f6e 6974 6f72 696e 6720 616e 6420 .monitoring.and.
+ 0x0f80: 7374 6174 6973 7469 6320 636f 6c6c 6563 statistic.collec
+ 0x0f90: 7469 6f6e 2e0a 596f 7520 6361 6e20 6c65 tion..You.can.le
+ 0x0fa0: 7420 7468 656d 206b 6e6f 7720 6162 6f75 t.them.know.abou
+ 0x0fb0: 7420 796f 7572 2073 6572 7665 7220 7573 t.your.server.us
+ 0x0fc0: 696e 6720 7468 6569 720a 3c41 2048 5245 ing.their.<A.HRE
+ 0x0fd0: 463d 2268 7474 703a 2f2f 7570 7469 6d65 F="http://uptime
+ 0x0fe0: 2e6e 6574 6372 6166 742e 636f 6d2f 223e .netcraft.com/">
+ 0x0ff0: 696e 7465 7266 6163 653c 2f41 3e2e 0a45 interface</A>..E
+ 0x1000: 6e61 626c 696e 6720 7468 6520 6d6f 6e69 nabling.the.moni
+ 0x1010: 746f 7269 6e67 206f 6620 796f 7572 2073 toring.of.your.s
+ 0x1020: 6572 7665 7220 7769 6c6c 2070 726f 7669 erver.will.provi
+ 0x1030: 6465 2061 2062 6574 7465 7220 676c 6f62 de.a.better.glob
+ 0x1040: 616c 206f 7665 7276 6965 770a 6f66 2077 al.overview.of.w
+ 0x1050: 686f 2069 7320 7573 696e 6720 7768 6174 ho.is.using.what
+ 0x1060: 2061 6e64 2077 6865 7265 2c20 616e 6420 .and.where,.and.
+ 0x1070: 6974 2077 6f75 6c64 2067 6976 6520 4465 it.would.give.De
+ 0x1080: 6269 616e 2061 2062 6574 7465 720a 6f76 bian.a.better.ov
+ 0x1090: 6572 7669 6577 206f 6620 7468 6520 6170 erview.of.the.ap
+ 0x10a0: 6163 6865 2070 6163 6b61 6765 2075 7361 ache.package.usa
+ 0x10b0: 6765 2e0a 0a3c 4832 3e41 626f 7574 2074 ge...<H2>About.t
+ 0x10c0: 6869 7320 7061 6765 3c2f 4832 3e0a 0a3c his.page</H2>..<
+ 0x10d0: 494d 4720 414c 4947 4e3d 2272 6967 6874 IMG.ALIGN="right
+ 0x10e0: 2220 414c 543d 2222 2048 4549 4748 543d ".ALT="".HEIGHT=
+ 0x10f0: 2232 3437 2220 5749 4454 483d 2232 3738 "247".WIDTH="278
+ 0x1100: 2220 5352 433d 2269 636f 6e73 2f6a 6865 ".SRC="icons/jhe
+ 0x1110: 3036 312e 706e 6722 3e0a 0a3c 503e 5468 061.png">..<P>Th
+ 0x1120: 6973 2069 7320 6120 706c 6163 6568 6f6c is.is.a.placehol
+ 0x1130: 6465 7220 7061 6765 2069 6e73 7461 6c6c der.page.install
+ 0x1140: 6564 2062 7920 7468 6520 3c41 0a48 5245 ed.by.the.<A.HRE
+ 0x1150: 463d 2268 7474 703a 2f2f 7777 772e 6465 F="http://www.de
+ 0x1160: 6269 616e 2e6f 7267 2f22 3e44 6562 6961 bian.org/">Debia
+ 0x1170: 6e3c 2f41 3e0a 7265 6c65 6173 6520 6f66 n</A>.release.of
+ 0x1180: 2074 6865 2061 7061 6368 6520 5765 6220 .the.apache.Web.
+ 0x1190: 7365 7276 6572 2070 6163 6b61 6765 2e0a server.package..
+ 0x11a0: 0a3c 503e 5468 6973 2063 6f6d 7075 7465 .<P>This.compute
+ 0x11b0: 7220 6861 7320 696e 7374 616c 6c65 6420 r.has.installed.
+ 0x11c0: 7468 6520 4465 6269 616e 2047 4e55 2f4c the.Debian.GNU/L
+ 0x11d0: 696e 7578 206f 7065 7261 7469 6e67 2073 inux.operating.s
+ 0x11e0: 7973 7465 6d2c 0a62 7574 2069 7420 6861 ystem,.but.it.ha
+ 0x11f0: 7320 3c73 7472 6f6e 673e 6e6f 7468 696e s.<strong>nothin
+ 0x1200: 6720 746f 2064 6f20 7769 7468 2074 6865 g.to.do.with.the
+ 0x1210: 2044 6562 6961 6e0a 5072 6f6a 6563 743c .Debian.Project<
+ 0x1220: 2f73 7472 6f6e 673e 2e20 506c 6561 7365 /strong>..Please
+ 0x1230: 2064 6f20 3c73 7472 6f6e 673e 6e6f 743c .do.<strong>not<
+ 0x1240: 2f73 7472 6f6e 673e 2063 6f6e 7461 6374 /strong>.contact
+ 0x1250: 2074 6865 2044 6562 6961 6e0a 5072 6f6a .the.Debian.Proj
+ 0x1260: 6563 7420 6162 6f75 7420 6974 2e3c 2f50 ect.about.it.</P
+ 0x1270: 3e0a 0a3c 503e 4966 2079 6f75 2066 696e >..<P>If.you.fin
+ 0x1280: 6420 6120 6275 6720 696e 2074 6869 7320 d.a.bug.in.this.
+ 0x1290: 6170 6163 6865 2070 6163 6b61 6765 2c20 apache.package,.
+ 0x12a0: 6f72 2069 6e20 4170 6163 6865 2069 7473 or.in.Apache.its
+ 0x12b0: 656c 662c 0a70 6c65 6173 6520 6669 6c65 elf,.please.file
+ 0x12c0: 2061 2062 7567 2072 6570 6f72 7420 6f6e .a.bug.report.on
+ 0x12d0: 2069 742e 2020 496e 7374 7275 6374 696f .it...Instructio
+ 0x12e0: 6e73 206f 6e20 646f 696e 6720 7468 6973 ns.on.doing.this
+ 0x12f0: 2c20 616e 6420 7468 650a 6c69 7374 206f ,.and.the.list.o
+ 0x1300: 6620 3c41 2048 5245 463d 2268 7474 703a f.<A.HREF="http:
+ 0x1310: 2f2f 6275 6773 2e64 6562 6961 6e2e 6f72 //bugs.debian.or
+ 0x1320: 672f 7372 633a 6170 6163 6865 223e 6b6e g/src:apache">kn
+ 0x1330: 6f77 6e20 6275 6773 3c2f 413e 206f 6620 own.bugs</A>.of.
+ 0x1340: 7468 6973 0a70 6163 6b61 6765 2c20 6361 this.package,.ca
+ 0x1350: 6e20 6265 2066 6f75 6e64 2069 6e20 7468 n.be.found.in.th
+ 0x1360: 6520 0a3c 4120 4852 4546 3d22 6874 7470 e..<A.HREF="http
+ 0x1370: 3a2f 2f77 7777 2e64 6562 6961 6e2e 6f72 ://www.debian.or
+ 0x1380: 672f 4275 6773 2f52 6570 6f72 7469 6e67 g/Bugs/Reporting
+ 0x1390: 223e 4465 6269 616e 2042 7567 2054 7261 ">Debian.Bug.Tra
+ 0x13a0: 636b 696e 6720 5379 7374 656d 3c2f 413e cking.System</A>
+ 0x13b0: 2e0a 0a3c 503e 5468 616e 6b73 2066 6f72 ...<P>Thanks.for
+ 0x13c0: 2075 7369 6e67 2074 6869 7320 7061 636b .using.this.pack
+ 0x13d0: 6167 652c 2061 6e64 2063 6f6e 6772 6174 age,.and.congrat
+ 0x13e0: 756c 6174 696f 6e73 2066 6f72 2079 6f75 ulations.for.you
+ 0x13f0: 7220 6368 6f69 6365 206f 660a 6120 4465 r.choice.of.a.De
+ 0x1400: 6269 616e 2073 7973 7465 6d21 3c2f 503e bian.system!</P>
+ 0x1410: 0a0a 3c44 4956 2061 6c69 676e 3d22 6365 ..<DIV.align="ce
+ 0x1420: 6e74 6572 223e 0a3c 6120 6872 6566 3d22 nter">.<a.href="
+ 0x1430: 6874 7470 3a2f 2f77 7777 2e64 6562 6961 http://www.debia
+ 0x1440: 6e2e 6f72 672f 223e 0a3c 494d 4720 616c n.org/">.<IMG.al
+ 0x1450: 6967 6e3d 226d 6964 646c 6522 2068 6569 ign="middle".hei
+ 0x1460: 6768 743d 2233 3022 2077 6964 7468 3d22 ght="30".width="
+ 0x1470: 3235 2220 7372 633d 2269 636f 6e73 2f64 25".src="icons/d
+ 0x1480: 6562 6961 6e2f 6f70 656e 6c6f 676f 2d32 ebian/openlogo-2
+ 0x1490: 352e 6a70 6722 2061 6c74 3d22 4465 6269 5.jpg".alt="Debi
+ 0x14a0: 616e 223e 0a3c 2f61 3e0a 3c61 2068 7265 an">.</a>.<a.hre
+ 0x14b0: 663d 2268 7474 703a 2f2f 7777 772e 6170 f="http://www.ap
+ 0x14c0: 6163 6865 2e6f 7267 2f22 3e0a 3c49 4d47 ache.org/">.<IMG
+ 0x14d0: 2061 6c69 676e 3d22 6d69 6464 6c65 2220 .align="middle".
+ 0x14e0: 6865 6967 6874 3d22 3332 2220 7769 6474 height="32".widt
+ 0x14f0: 683d 2232 3539 2220 7372 633d 2269 636f h="259".src="ico
+ 0x1500: 6e73 2f61 7061 6368 655f 7062 2e70 6e67 ns/apache_pb.png
+ 0x1510: 2220 616c 743d 2241 7061 6368 6522 3e0a ".alt="Apache">.
+ 0x1520: 3c2f 613e 0a3c 2f44 4956 3e0a 0a3c 212d </a>.</DIV>..<!-
+ 0x1530: 2d0a 2020 5468 6973 2070 6167 6520 7761 -...This.page.wa
+ 0x1540: 7320 696e 6974 6961 6c6c 7920 6372 6561 s.initially.crea
+ 0x1550: 7465 6420 6279 204a 6f68 6e69 6520 496e ted.by.Johnie.In
+ 0x1560: 6772 616d 2028 6874 7470 3a2f 2f6e 6574 gram.(http://net
+ 0x1570: 676f 642e 6e65 742f 290a 2020 4974 2077 god.net/)...It.w
+ 0x1580: 6173 206c 6174 6572 2065 6469 7465 6420 as.later.edited.
+ 0x1590: 6279 204d 6174 7468 6577 2057 696c 636f by.Matthew.Wilco
+ 0x15a0: 7820 616e 6420 4a6f 7369 7020 526f 6469 x.and.Josip.Rodi
+ 0x15b0: 6e2e 0a20 204c 6173 7420 6d6f 6469 6669 n....Last.modifi
+ 0x15c0: 6564 3a20 2444 6174 653a 2032 3030 342f ed:.$Date:.2004/
+ 0x15d0: 3036 2f32 3020 3135 3a33 333a 3537 2024 06/20.15:33:57.$
+ 0x15e0: 2e0a 2020 2d2d 3e0a 0a3c 2f42 4f44 593e ....-->..</BODY>
+ 0x15f0: 0a3c 2f48 544d 4c3e 0a .</HTML>.
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5560, win 12383, options [nop,nop,TS val 1306300953 ecr 1306300953], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E.
+ 0x0010: 0034 1b6e 4000 4006 2154 7f00 0001 7f00 .4.n@.@.!T......
+ 0x0020: 0001 da70 0050 3758 8a49 377a a3a9 8010 ...p.P7X.I7z....
+ 0x0030: 305f 10ea 0000 0101 080a 4ddc 9219 4ddc 0_........M...M.
+ 0x0040: 9219 ..
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [F.], seq 203, ack 5560, win 12383, options [nop,nop,TS val 1306302241 ecr 1306300953], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E.
+ 0x0010: 0034 1b70 4000 4006 2152 7f00 0001 7f00 .4.p@.@.!R......
+ 0x0020: 0001 da70 0050 3758 8a49 377a a3a9 8011 ...p.P7X.I7z....
+ 0x0030: 305f 0be1 0000 0101 080a 4ddc 9721 4ddc 0_........M..!M.
+ 0x0040: 9219 ..
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [F.], seq 5560, ack 204, win 8192, options [nop,nop,TS val 1306302243 ecr 1306302241], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E.
+ 0x0010: 0034 1fe8 4000 4006 1cda 7f00 0001 7f00 .4..@.@.........
+ 0x0020: 0001 0050 da70 377a a3a9 3758 8a4a 8011 ...P.p7z..7X.J..
+ 0x0030: 2000 1735 0000 0101 080a 4ddc 9723 4ddc ...5......M..#M.
+ 0x0040: 9721 .!
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5561, win 12383, options [nop,nop,TS val 1306302243 ecr 1306302243], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E.
+ 0x0010: 0034 1b72 4000 4006 2150 7f00 0001 7f00 .4.r@.@.!P......
+ 0x0020: 0001 da70 0050 3758 8a4a 377a a3aa 8010 ...p.P7X.J7z....
+ 0x0030: 305f 06d4 0000 0101 080a 4ddc 9723 4ddc 0_........M..#M.
+ 0x0040: 9723 .#
--- /dev/null
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [S], seq 928549246, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 0,nop,wscale 2], length 0
+ 0x0000: 4500 003c 1b68 4000 4006 2152 7f00 0001
+ 0x0010: 7f00 0001 da70 0050 3758 897e 0000 0000
+ 0x0020: a002 7fff 1421 0000 0204 400c 0402 080a
+ 0x0030: 4ddc 9216 0000 0000 0103 0302
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [S.], seq 930778609, ack 928549247, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 1306300950,nop,wscale 2], length 0
+ 0x0000: 4500 003c 0000 4000 4006 3cba 7f00 0001
+ 0x0010: 7f00 0001 0050 da70 377a 8df1 3758 897f
+ 0x0020: a012 7fff 6eb1 0000 0204 400c 0402 080a
+ 0x0030: 4ddc 9216 4ddc 9216 0103 0302
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 1, win 8192, options [nop,nop,TS val 1306300950 ecr 1306300950], length 0
+ 0x0000: 4500 0034 1b6a 4000 4006 2158 7f00 0001
+ 0x0010: 7f00 0001 da70 0050 3758 897f 377a 8df2
+ 0x0020: 8010 2000 37d0 0000 0101 080a 4ddc 9216
+ 0x0030: 4ddc 9216
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [P.], seq 1:203, ack 1, win 8192, options [nop,nop,TS val 1306300951 ecr 1306300950], length 202: HTTP: GET / HTTP/1.1
+ 0x0000: 4500 00fe 1b6c 4000 4006 208c 7f00 0001
+ 0x0010: 7f00 0001 da70 0050 3758 897f 377a 8df2
+ 0x0020: 8018 2000 fef2 0000 0101 080a 4ddc 9217
+ 0x0030: 4ddc 9216 4745 5420 2f20 4854 5450 2f31
+ 0x0040: 2e31 0d0a 486f 7374 3a20 6c6f 6361 6c68
+ 0x0050: 6f73 740d 0a55 7365 722d 4167 656e 743a
+ 0x0060: 2045 4c69 6e6b 732f 302e 3130 2e34 2d37
+ 0x0070: 2d64 6562 6961 6e20 2874 6578 746d 6f64
+ 0x0080: 653b 204c 696e 7578 2032 2e36 2e31 312d
+ 0x0090: 312d 3638 362d 736d 7020 6936 3836 3b20
+ 0x00a0: 3133 3278 3536 2d32 290d 0a41 6363 6570
+ 0x00b0: 743a 202a 2f2a 0d0a 4163 6365 7074 2d45
+ 0x00c0: 6e63 6f64 696e 673a 2067 7a69 700d 0a41
+ 0x00d0: 6363 6570 742d 4c61 6e67 7561 6765 3a20
+ 0x00e0: 656e 0d0a 436f 6e6e 6563 7469 6f6e 3a20
+ 0x00f0: 4b65 6570 2d41 6c69 7665 0d0a 0d0a
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [.], ack 203, win 8192, options [nop,nop,TS val 1306300952 ecr 1306300951], length 0
+ 0x0000: 4500 0034 1fe4 4000 4006 1cde 7f00 0001
+ 0x0010: 7f00 0001 0050 da70 377a 8df2 3758 8a49
+ 0x0020: 8010 2000 3703 0000 0101 080a 4ddc 9218
+ 0x0030: 4ddc 9217
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [P.], seq 1:5560, ack 203, win 8192, options [nop,nop,TS val 1306300953 ecr 1306300951], length 5559: HTTP: HTTP/1.1 200 OK
+ 0x0000: 4500 15eb 1fe6 4000 4006 0725 7f00 0001
+ 0x0010: 7f00 0001 0050 da70 377a 8df2 3758 8a49
+ 0x0020: 8018 2000 13e0 0000 0101 080a 4ddc 9219
+ 0x0030: 4ddc 9217 4854 5450 2f31 2e31 2032 3030
+ 0x0040: 204f 4b0d 0a44 6174 653a 2057 6564 2c20
+ 0x0050: 3036 204a 756c 2032 3030 3520 3033 3a35
+ 0x0060: 373a 3335 2047 4d54 0d0a 5365 7276 6572
+ 0x0070: 3a20 4170 6163 6865 2f31 2e33 2e33 330d
+ 0x0080: 0a4c 6173 742d 4d6f 6469 6669 6564 3a20
+ 0x0090: 5375 6e2c 2031 3520 4175 6720 3230 3034
+ 0x00a0: 2030 303a 3433 3a34 3120 474d 540d 0a45
+ 0x00b0: 5461 673a 2022 3665 3830 6630 2d31 3438
+ 0x00c0: 612d 3431 3165 6231 6264 220d 0a41 6363
+ 0x00d0: 6570 742d 5261 6e67 6573 3a20 6279 7465
+ 0x00e0: 730d 0a43 6f6e 7465 6e74 2d4c 656e 6774
+ 0x00f0: 683a 2035 3235 380d 0a4b 6565 702d 416c
+ 0x0100: 6976 653a 2074 696d 656f 7574 3d31 352c
+ 0x0110: 206d 6178 3d31 3030 0d0a 436f 6e6e 6563
+ 0x0120: 7469 6f6e 3a20 4b65 6570 2d41 6c69 7665
+ 0x0130: 0d0a 436f 6e74 656e 742d 5479 7065 3a20
+ 0x0140: 7465 7874 2f68 746d 6c3b 2063 6861 7273
+ 0x0150: 6574 3d69 736f 2d38 3835 392d 310d 0a0d
+ 0x0160: 0a3c 2144 4f43 5459 5045 2048 544d 4c20
+ 0x0170: 5055 424c 4943 2022 2d2f 2f57 3343 2f2f
+ 0x0180: 4454 4420 4854 4d4c 2034 2e30 3120 5472
+ 0x0190: 616e 7369 7469 6f6e 616c 2f2f 454e 223e
+ 0x01a0: 0a3c 4854 4d4c 3e0a 3c48 4541 443e 0a20
+ 0x01b0: 2020 3c4d 4554 4120 4854 5450 2d45 5155
+ 0x01c0: 4956 3d22 436f 6e74 656e 742d 5479 7065
+ 0x01d0: 2220 434f 4e54 454e 543d 2274 6578 742f
+ 0x01e0: 6874 6d6c 3b20 6368 6172 7365 743d 6973
+ 0x01f0: 6f2d 3838 3539 2d31 223e 0a20 2020 3c4d
+ 0x0200: 4554 4120 4e41 4d45 3d22 4465 7363 7269
+ 0x0210: 7074 696f 6e22 2043 4f4e 5445 4e54 3d22
+ 0x0220: 5468 6520 696e 6974 6961 6c20 696e 7374
+ 0x0230: 616c 6c61 7469 6f6e 206f 6620 4465 6269
+ 0x0240: 616e 2061 7061 6368 652e 223e 0a20 2020
+ 0x0250: 3c54 4954 4c45 3e50 6c61 6365 686f 6c64
+ 0x0260: 6572 2070 6167 653c 2f54 4954 4c45 3e0a
+ 0x0270: 3c2f 4845 4144 3e0a 3c42 4f44 5920 5445
+ 0x0280: 5854 3d22 2330 3030 3030 3022 2042 4743
+ 0x0290: 4f4c 4f52 3d22 2346 4646 4646 4622 204c
+ 0x02a0: 494e 4b3d 2223 3030 3030 4546 2220 564c
+ 0x02b0: 494e 4b3d 2223 3535 3138 3841 2220 414c
+ 0x02c0: 494e 4b3d 2223 4646 3030 3030 223e 0a0a
+ 0x02d0: 3c48 313e 506c 6163 6568 6f6c 6465 7220
+ 0x02e0: 7061 6765 3c2f 4831 3e0a 3c48 323e 4966
+ 0x02f0: 2079 6f75 2061 7265 206a 7573 7420 6272
+ 0x0300: 6f77 7369 6e67 2074 6865 2077 6562 3c2f
+ 0x0310: 6832 3e0a 0a3c 503e 5468 6520 6f77 6e65
+ 0x0320: 7220 6f66 2074 6869 7320 7765 6220 7369
+ 0x0330: 7465 2068 6173 206e 6f74 2070 7574 2075
+ 0x0340: 7020 616e 7920 7765 6220 7061 6765 7320
+ 0x0350: 7965 742e 0a50 6c65 6173 6520 636f 6d65
+ 0x0360: 2062 6163 6b20 6c61 7465 722e 3c2f 503e
+ 0x0370: 0a0a 3c50 3e3c 534d 414c 4c3e 3c43 4954
+ 0x0380: 453e 4d6f 7665 2061 6c6f 6e67 2c20 6e6f
+ 0x0390: 7468 696e 6720 746f 2073 6565 2068 6572
+ 0x03a0: 652e 2e2e 3c2f 4349 5445 3e20 3a2d 293c
+ 0x03b0: 2f53 4d41 4c4c 3e3c 2f50 3e0a 0a3c 4832
+ 0x03c0: 3e49 6620 796f 7520 6172 6520 7472 7969
+ 0x03d0: 6e67 2074 6f20 6c6f 6361 7465 2074 6865
+ 0x03e0: 2061 646d 696e 6973 7472 6174 6f72 206f
+ 0x03f0: 6620 7468 6973 206d 6163 6869 6e65 3c2f
+ 0x0400: 4832 3e0a 0a3c 503e 4966 2079 6f75 2077
+ 0x0410: 616e 7420 746f 2072 6570 6f72 7420 736f
+ 0x0420: 6d65 7468 696e 6720 6162 6f75 7420 7468
+ 0x0430: 6973 2068 6f73 7427 7320 6265 6861 7669
+ 0x0440: 6f72 2c20 706c 6561 7365 0a63 6f6e 7461
+ 0x0450: 6374 2074 6865 2049 6e74 6572 6e65 7420
+ 0x0460: 5365 7276 6963 6520 5072 6f76 6964 6572
+ 0x0470: 2028 4953 5029 2069 6e76 6f6c 7665 6420
+ 0x0480: 6469 7265 6374 6c79 2e3c 2f50 3e0a 0a3c
+ 0x0490: 503e 5365 6520 7468 6520 3c41 2068 7265
+ 0x04a0: 663d 2268 7474 703a 2f2f 7777 772e 6162
+ 0x04b0: 7573 652e 6e65 742f 223e 4e65 7477 6f72
+ 0x04c0: 6b20 4162 7573 650a 436c 6561 7269 6e67
+ 0x04d0: 686f 7573 653c 2f41 3e20 666f 7220 686f
+ 0x04e0: 7720 746f 2064 6f20 7468 6973 2e3c 2f50
+ 0x04f0: 3e0a 0a3c 4832 3e49 6620 796f 7520 6172
+ 0x0500: 6520 7468 6520 6164 6d69 6e69 7374 7261
+ 0x0510: 746f 7220 6f66 2074 6869 7320 6d61 6368
+ 0x0520: 696e 653c 2f48 323e 0a0a 3c50 3e54 6865
+ 0x0530: 2069 6e69 7469 616c 2069 6e73 7461 6c6c
+ 0x0540: 6174 696f 6e20 6f66 203c 4120 6872 6566
+ 0x0550: 3d22 6874 7470 3a2f 2f77 7777 2e64 6562
+ 0x0560: 6961 6e2e 6f72 672f 223e 4465 6269 616e
+ 0x0570: 2773 0a61 7061 6368 653c 2f41 3e20 7765
+ 0x0580: 6220 7365 7276 6572 2070 6163 6b61 6765
+ 0x0590: 2077 6173 2073 7563 6365 7373 6675 6c2e
+ 0x05a0: 3c2f 503e 0a0a 3c50 3e3c 5354 524f 4e47
+ 0x05b0: 3e59 6f75 2073 686f 756c 6420 7265 706c
+ 0x05c0: 6163 6520 7468 6973 2070 6167 6520 7769
+ 0x05d0: 7468 2079 6f75 7220 6f77 6e20 7765 6220
+ 0x05e0: 7061 6765 7320 6173 0a73 6f6f 6e20 6173
+ 0x05f0: 2070 6f73 7369 626c 652e 3c2f 5354 524f
+ 0x0600: 4e47 3e3c 2f50 3e0a 0a3c 503e 556e 6c65
+ 0x0610: 7373 2079 6f75 2063 6861 6e67 6564 2069
+ 0x0620: 7473 2063 6f6e 6669 6775 7261 7469 6f6e
+ 0x0630: 2c20 796f 7572 206e 6577 2073 6572 7665
+ 0x0640: 7220 6973 2063 6f6e 6669 6775 7265 6420
+ 0x0650: 6173 2066 6f6c 6c6f 7773 3a0a 3c55 4c3e
+ 0x0660: 0a3c 4c49 3e0a 436f 6e66 6967 7572 6174
+ 0x0670: 696f 6e20 6669 6c65 7320 6361 6e20 6265
+ 0x0680: 2066 6f75 6e64 2069 6e20 3c54 543e 2f65
+ 0x0690: 7463 2f61 7061 6368 653c 2f54 543e 2e3c
+ 0x06a0: 2f4c 493e 0a0a 3c4c 493e 0a54 6865 203c
+ 0x06b0: 5454 3e44 6f63 756d 656e 7452 6f6f 743c
+ 0x06c0: 2f54 543e 2c20 7768 6963 6820 6973 2074
+ 0x06d0: 6865 2064 6972 6563 746f 7279 2075 6e64
+ 0x06e0: 6572 2077 6869 6368 2061 6c6c 2079 6f75
+ 0x06f0: 720a 4854 4d4c 2066 696c 6573 2073 686f
+ 0x0700: 756c 6420 6578 6973 742c 2069 7320 7365
+ 0x0710: 7420 746f 203c 5454 3e2f 7661 722f 7777
+ 0x0720: 773c 2f54 543e 2e3c 2f4c 493e 0a0a 3c4c
+ 0x0730: 493e 0a43 4749 2073 6372 6970 7473 2061
+ 0x0740: 7265 206c 6f6f 6b65 6420 666f 7220 696e
+ 0x0750: 203c 5454 3e2f 7573 722f 6c69 622f 6367
+ 0x0760: 692d 6269 6e3c 2f54 543e 2c20 7768 6963
+ 0x0770: 6820 6973 2077 6865 7265 0a44 6562 6961
+ 0x0780: 6e20 7061 636b 6167 6573 2077 696c 6c20
+ 0x0790: 706c 6163 6520 7468 6569 7220 7363 7269
+ 0x07a0: 7074 732e 3c2f 4c49 3e0a 0a3c 4c49 3e0a
+ 0x07b0: 4c6f 6720 6669 6c65 7320 6172 6520 706c
+ 0x07c0: 6163 6564 2069 6e20 3c54 543e 2f76 6172
+ 0x07d0: 2f6c 6f67 2f61 7061 6368 653c 2f54 543e
+ 0x07e0: 2c20 616e 6420 7769 6c6c 2062 6520 726f
+ 0x07f0: 7461 7465 640a 7765 656b 6c79 2e20 2054
+ 0x0800: 6865 2066 7265 7175 656e 6379 206f 6620
+ 0x0810: 726f 7461 7469 6f6e 2063 616e 2062 6520
+ 0x0820: 6561 7369 6c79 2063 6861 6e67 6564 2062
+ 0x0830: 7920 6564 6974 696e 670a 3c54 543e 2f65
+ 0x0840: 7463 2f6c 6f67 726f 7461 7465 2e64 2f61
+ 0x0850: 7061 6368 653c 2f54 543e 2e3c 2f4c 493e
+ 0x0860: 0a0a 3c4c 493e 0a54 6865 2064 6566 6175
+ 0x0870: 6c74 2064 6972 6563 746f 7279 2069 6e64
+ 0x0880: 6578 2069 7320 3c54 543e 696e 6465 782e
+ 0x0890: 6874 6d6c 3c2f 5454 3e2c 206d 6561 6e69
+ 0x08a0: 6e67 2074 6861 7420 7265 7175 6573 7473
+ 0x08b0: 0a66 6f72 2061 2064 6972 6563 746f 7279
+ 0x08c0: 203c 5454 3e2f 666f 6f2f 6261 722f 3c2f
+ 0x08d0: 5454 3e20 7769 6c6c 2067 6976 6520 7468
+ 0x08e0: 6520 636f 6e74 656e 7473 206f 6620 7468
+ 0x08f0: 6520 6669 6c65 203c 5454 3e2f 7661 722f
+ 0x0900: 7777 772f 666f 6f2f 6261 722f 696e 6465
+ 0x0910: 782e 6874 6d6c 3c2f 5454 3e0a 6966 2069
+ 0x0920: 7420 6578 6973 7473 2028 6173 7375 6d69
+ 0x0930: 6e67 2074 6861 7420 3c54 543e 2f76 6172
+ 0x0940: 2f77 7777 3c2f 5454 3e20 6973 2079 6f75
+ 0x0950: 7220 3c54 543e 446f 6375 6d65 6e74 526f
+ 0x0960: 6f74 3c2f 5454 3e29 2e3c 2f4c 493e 0a0a
+ 0x0970: 3c4c 493e 0a55 7365 7220 6469 7265 6374
+ 0x0980: 6f72 6965 7320 6172 6520 656e 6162 6c65
+ 0x0990: 642c 2061 6e64 2075 7365 7220 646f 6375
+ 0x09a0: 6d65 6e74 7320 7769 6c6c 2062 6520 6c6f
+ 0x09b0: 6f6b 6564 2066 6f72 0a69 6e20 7468 6520
+ 0x09c0: 3c54 543e 7075 626c 6963 5f68 746d 6c3c
+ 0x09d0: 2f54 543e 2064 6972 6563 746f 7279 206f
+ 0x09e0: 6620 7468 6520 7573 6572 7327 2068 6f6d
+ 0x09f0: 6573 2e20 2054 6865 7365 2064 6972 730a
+ 0x0a00: 7368 6f75 6c64 2062 6520 756e 6465 7220
+ 0x0a10: 3c54 543e 2f68 6f6d 653c 2f54 543e 2c20
+ 0x0a20: 616e 6420 7573 6572 7320 7769 6c6c 206e
+ 0x0a30: 6f74 2062 6520 6162 6c65 2074 6f20 7379
+ 0x0a40: 6d6c 696e 6b0a 746f 2066 696c 6573 2074
+ 0x0a50: 6865 7920 646f 6e27 7420 6f77 6e2e 3c2f
+ 0x0a60: 4c49 3e0a 0a3c 2f55 4c3e 0a41 6c6c 2074
+ 0x0a70: 6865 2073 7461 6e64 6172 6420 6170 6163
+ 0x0a80: 6865 206d 6f64 756c 6573 2061 7265 2061
+ 0x0a90: 7661 696c 6162 6c65 2077 6974 6820 7468
+ 0x0aa0: 6973 2072 656c 6561 7365 2061 6e64 2061
+ 0x0ab0: 7265 0a6e 6f77 206d 616e 6167 6564 2077
+ 0x0ac0: 6974 6820 6465 6263 6f6e 662e 2020 5479
+ 0x0ad0: 7065 203c 5454 3e64 706b 672d 7265 636f
+ 0x0ae0: 6e66 6967 7572 6520 6170 6163 6865 3c2f
+ 0x0af0: 5454 3e20 746f 0a73 656c 6563 7420 7768
+ 0x0b00: 6963 6820 6d6f 6475 6c65 7320 796f 7520
+ 0x0b10: 7761 6e74 2065 6e61 626c 6564 2e20 204d
+ 0x0b20: 616e 7920 6f74 6865 7220 6d6f 6475 6c65
+ 0x0b30: 7320 6172 6520 6176 6169 6c61 626c 650a
+ 0x0b40: 7468 726f 7567 6820 7468 6520 4465 6269
+ 0x0b50: 616e 2070 6163 6b61 6765 2073 7973 7465
+ 0x0b60: 6d20 7769 7468 2074 6865 206e 616d 6573
+ 0x0b70: 203c 5454 3e6c 6962 6170 6163 6865 2d6d
+ 0x0b80: 6f64 2d2a 3c2f 5454 3e2e 0a49 6620 796f
+ 0x0b90: 7520 6e65 6564 2074 6f20 636f 6d70 696c
+ 0x0ba0: 6520 6120 6d6f 6475 6c65 2079 6f75 7273
+ 0x0bb0: 656c 662c 2079 6f75 2077 696c 6c20 6e65
+ 0x0bc0: 6564 2074 6f20 696e 7374 616c 6c20 7468
+ 0x0bd0: 650a 3c54 543e 6170 6163 6865 2d64 6576
+ 0x0be0: 3c2f 5454 3e20 7061 636b 6167 652e 0a0a
+ 0x0bf0: 3c50 3e4d 6f72 6520 646f 6375 6d65 6e74
+ 0x0c00: 6174 696f 6e20 6f6e 2041 7061 6368 6520
+ 0x0c10: 6361 6e20 6265 2066 6f75 6e64 206f 6e3a
+ 0x0c20: 0a3c 554c 3e0a 3c4c 493e 0a54 6865 203c
+ 0x0c30: 4120 4852 4546 3d22 2f64 6f63 2f61 7061
+ 0x0c40: 6368 652d 646f 632f 6d61 6e75 616c 2f22
+ 0x0c50: 3e41 7061 6368 6520 646f 6375 6d65 6e74
+ 0x0c60: 6174 696f 6e3c 2f41 3e20 7374 6f72 6564
+ 0x0c70: 206f 6e20 796f 7572 2073 6572 7665 722e
+ 0x0c80: 3c2f 4c49 3e0a 0a3c 4c49 3e0a 5468 6520
+ 0x0c90: 3c41 2048 5245 463d 2268 7474 703a 2f2f
+ 0x0ca0: 7777 772e 6170 6163 6865 2e6f 7267 2f22
+ 0x0cb0: 3e41 7061 6368 6520 5072 6f6a 6563 743c
+ 0x0cc0: 2f41 3e20 686f 6d65 2073 6974 652e 3c2f
+ 0x0cd0: 4c49 3e0a 0a3c 4c49 3e0a 5468 6520 3c41
+ 0x0ce0: 2048 5245 463d 2268 7474 703a 2f2f 7777
+ 0x0cf0: 772e 6170 6163 6865 2d73 736c 2e6f 7267
+ 0x0d00: 2f22 3e41 7061 6368 652d 5353 4c3c 2f41
+ 0x0d10: 3e20 686f 6d65 2073 6974 652e 3c2f 4c49
+ 0x0d20: 3e0a 0a3c 4c49 3e0a 5468 6520 3c41 2048
+ 0x0d30: 5245 463d 2268 7474 703a 2f2f 7065 726c
+ 0x0d40: 2e61 7061 6368 652e 6f72 672f 223e 6d6f
+ 0x0d50: 6420 7065 726c 3c2f 413e 2068 6f6d 6520
+ 0x0d60: 7369 7465 2e3c 2f4c 493e 0a0a 3c4c 493e
+ 0x0d70: 0a54 6865 203c 4120 4852 4546 3d22 6874
+ 0x0d80: 7470 3a2f 2f77 7777 2e61 7061 6368 6577
+ 0x0d90: 6565 6b2e 636f 6d2f 223e 4170 6163 6865
+ 0x0da0: 5765 656b 3c2f 413e 206e 6577 736c 6574
+ 0x0db0: 7465 722e 3c2f 4c49 3e0a 0a3c 4c49 3e0a
+ 0x0dc0: 5468 6520 3c41 2048 5245 463d 2268 7474
+ 0x0dd0: 703a 2f2f 7777 772e 6465 6269 616e 2e6f
+ 0x0de0: 7267 2f64 6f63 2f22 3e44 6562 6961 6e20
+ 0x0df0: 5072 6f6a 6563 740a 446f 6375 6d65 6e74
+ 0x0e00: 6174 696f 6e3c 2f41 3e20 7768 6963 6820
+ 0x0e10: 636f 6e74 6169 6e73 2048 4f57 544f 732c
+ 0x0e20: 2046 4151 732c 2061 6e64 2073 6f66 7477
+ 0x0e30: 6172 6520 7570 6461 7465 732e 3c2f 4c49
+ 0x0e40: 3e0a 3c2f 554c 3e0a 0a3c 503e 596f 7520
+ 0x0e50: 6361 6e20 616c 736f 2063 6f6e 7375 6c74
+ 0x0e60: 2074 6865 206c 6973 7420 6f66 203c 4120
+ 0x0e70: 4852 4546 3d22 6874 7470 3a2f 2f77 7777
+ 0x0e80: 2e62 6f75 7465 6c6c 2e63 6f6d 2f66 6171
+ 0x0e90: 2f22 3e57 6f72 6c64 0a57 6964 6520 5765
+ 0x0ea0: 6220 4672 6571 7565 6e74 6c79 2041 736b
+ 0x0eb0: 6564 2051 7565 7374 696f 6e73 3c2f 413e
+ 0x0ec0: 2066 6f72 2069 6e66 6f72 6d61 7469 6f6e
+ 0x0ed0: 2e0a 0a3c 4832 3e4c 6574 206f 7468 6572
+ 0x0ee0: 2070 656f 706c 6520 6b6e 6f77 2061 626f
+ 0x0ef0: 7574 2074 6869 7320 7365 7276 6572 3c2f
+ 0x0f00: 4832 3e0a 0a3c 4120 4852 4546 3d22 6874
+ 0x0f10: 7470 3a2f 2f6e 6574 6372 6166 742e 636f
+ 0x0f20: 6d2f 223e 4e65 7463 7261 6674 3c2f 413e
+ 0x0f30: 2070 726f 7669 6465 7320 616e 2069 6e74
+ 0x0f40: 6572 6573 7469 6e67 2066 7265 650a 7365
+ 0x0f50: 7276 6963 6520 666f 7220 7765 6220 7369
+ 0x0f60: 7465 206d 6f6e 6974 6f72 696e 6720 616e
+ 0x0f70: 6420 7374 6174 6973 7469 6320 636f 6c6c
+ 0x0f80: 6563 7469 6f6e 2e0a 596f 7520 6361 6e20
+ 0x0f90: 6c65 7420 7468 656d 206b 6e6f 7720 6162
+ 0x0fa0: 6f75 7420 796f 7572 2073 6572 7665 7220
+ 0x0fb0: 7573 696e 6720 7468 6569 720a 3c41 2048
+ 0x0fc0: 5245 463d 2268 7474 703a 2f2f 7570 7469
+ 0x0fd0: 6d65 2e6e 6574 6372 6166 742e 636f 6d2f
+ 0x0fe0: 223e 696e 7465 7266 6163 653c 2f41 3e2e
+ 0x0ff0: 0a45 6e61 626c 696e 6720 7468 6520 6d6f
+ 0x1000: 6e69 746f 7269 6e67 206f 6620 796f 7572
+ 0x1010: 2073 6572 7665 7220 7769 6c6c 2070 726f
+ 0x1020: 7669 6465 2061 2062 6574 7465 7220 676c
+ 0x1030: 6f62 616c 206f 7665 7276 6965 770a 6f66
+ 0x1040: 2077 686f 2069 7320 7573 696e 6720 7768
+ 0x1050: 6174 2061 6e64 2077 6865 7265 2c20 616e
+ 0x1060: 6420 6974 2077 6f75 6c64 2067 6976 6520
+ 0x1070: 4465 6269 616e 2061 2062 6574 7465 720a
+ 0x1080: 6f76 6572 7669 6577 206f 6620 7468 6520
+ 0x1090: 6170 6163 6865 2070 6163 6b61 6765 2075
+ 0x10a0: 7361 6765 2e0a 0a3c 4832 3e41 626f 7574
+ 0x10b0: 2074 6869 7320 7061 6765 3c2f 4832 3e0a
+ 0x10c0: 0a3c 494d 4720 414c 4947 4e3d 2272 6967
+ 0x10d0: 6874 2220 414c 543d 2222 2048 4549 4748
+ 0x10e0: 543d 2232 3437 2220 5749 4454 483d 2232
+ 0x10f0: 3738 2220 5352 433d 2269 636f 6e73 2f6a
+ 0x1100: 6865 3036 312e 706e 6722 3e0a 0a3c 503e
+ 0x1110: 5468 6973 2069 7320 6120 706c 6163 6568
+ 0x1120: 6f6c 6465 7220 7061 6765 2069 6e73 7461
+ 0x1130: 6c6c 6564 2062 7920 7468 6520 3c41 0a48
+ 0x1140: 5245 463d 2268 7474 703a 2f2f 7777 772e
+ 0x1150: 6465 6269 616e 2e6f 7267 2f22 3e44 6562
+ 0x1160: 6961 6e3c 2f41 3e0a 7265 6c65 6173 6520
+ 0x1170: 6f66 2074 6865 2061 7061 6368 6520 5765
+ 0x1180: 6220 7365 7276 6572 2070 6163 6b61 6765
+ 0x1190: 2e0a 0a3c 503e 5468 6973 2063 6f6d 7075
+ 0x11a0: 7465 7220 6861 7320 696e 7374 616c 6c65
+ 0x11b0: 6420 7468 6520 4465 6269 616e 2047 4e55
+ 0x11c0: 2f4c 696e 7578 206f 7065 7261 7469 6e67
+ 0x11d0: 2073 7973 7465 6d2c 0a62 7574 2069 7420
+ 0x11e0: 6861 7320 3c73 7472 6f6e 673e 6e6f 7468
+ 0x11f0: 696e 6720 746f 2064 6f20 7769 7468 2074
+ 0x1200: 6865 2044 6562 6961 6e0a 5072 6f6a 6563
+ 0x1210: 743c 2f73 7472 6f6e 673e 2e20 506c 6561
+ 0x1220: 7365 2064 6f20 3c73 7472 6f6e 673e 6e6f
+ 0x1230: 743c 2f73 7472 6f6e 673e 2063 6f6e 7461
+ 0x1240: 6374 2074 6865 2044 6562 6961 6e0a 5072
+ 0x1250: 6f6a 6563 7420 6162 6f75 7420 6974 2e3c
+ 0x1260: 2f50 3e0a 0a3c 503e 4966 2079 6f75 2066
+ 0x1270: 696e 6420 6120 6275 6720 696e 2074 6869
+ 0x1280: 7320 6170 6163 6865 2070 6163 6b61 6765
+ 0x1290: 2c20 6f72 2069 6e20 4170 6163 6865 2069
+ 0x12a0: 7473 656c 662c 0a70 6c65 6173 6520 6669
+ 0x12b0: 6c65 2061 2062 7567 2072 6570 6f72 7420
+ 0x12c0: 6f6e 2069 742e 2020 496e 7374 7275 6374
+ 0x12d0: 696f 6e73 206f 6e20 646f 696e 6720 7468
+ 0x12e0: 6973 2c20 616e 6420 7468 650a 6c69 7374
+ 0x12f0: 206f 6620 3c41 2048 5245 463d 2268 7474
+ 0x1300: 703a 2f2f 6275 6773 2e64 6562 6961 6e2e
+ 0x1310: 6f72 672f 7372 633a 6170 6163 6865 223e
+ 0x1320: 6b6e 6f77 6e20 6275 6773 3c2f 413e 206f
+ 0x1330: 6620 7468 6973 0a70 6163 6b61 6765 2c20
+ 0x1340: 6361 6e20 6265 2066 6f75 6e64 2069 6e20
+ 0x1350: 7468 6520 0a3c 4120 4852 4546 3d22 6874
+ 0x1360: 7470 3a2f 2f77 7777 2e64 6562 6961 6e2e
+ 0x1370: 6f72 672f 4275 6773 2f52 6570 6f72 7469
+ 0x1380: 6e67 223e 4465 6269 616e 2042 7567 2054
+ 0x1390: 7261 636b 696e 6720 5379 7374 656d 3c2f
+ 0x13a0: 413e 2e0a 0a3c 503e 5468 616e 6b73 2066
+ 0x13b0: 6f72 2075 7369 6e67 2074 6869 7320 7061
+ 0x13c0: 636b 6167 652c 2061 6e64 2063 6f6e 6772
+ 0x13d0: 6174 756c 6174 696f 6e73 2066 6f72 2079
+ 0x13e0: 6f75 7220 6368 6f69 6365 206f 660a 6120
+ 0x13f0: 4465 6269 616e 2073 7973 7465 6d21 3c2f
+ 0x1400: 503e 0a0a 3c44 4956 2061 6c69 676e 3d22
+ 0x1410: 6365 6e74 6572 223e 0a3c 6120 6872 6566
+ 0x1420: 3d22 6874 7470 3a2f 2f77 7777 2e64 6562
+ 0x1430: 6961 6e2e 6f72 672f 223e 0a3c 494d 4720
+ 0x1440: 616c 6967 6e3d 226d 6964 646c 6522 2068
+ 0x1450: 6569 6768 743d 2233 3022 2077 6964 7468
+ 0x1460: 3d22 3235 2220 7372 633d 2269 636f 6e73
+ 0x1470: 2f64 6562 6961 6e2f 6f70 656e 6c6f 676f
+ 0x1480: 2d32 352e 6a70 6722 2061 6c74 3d22 4465
+ 0x1490: 6269 616e 223e 0a3c 2f61 3e0a 3c61 2068
+ 0x14a0: 7265 663d 2268 7474 703a 2f2f 7777 772e
+ 0x14b0: 6170 6163 6865 2e6f 7267 2f22 3e0a 3c49
+ 0x14c0: 4d47 2061 6c69 676e 3d22 6d69 6464 6c65
+ 0x14d0: 2220 6865 6967 6874 3d22 3332 2220 7769
+ 0x14e0: 6474 683d 2232 3539 2220 7372 633d 2269
+ 0x14f0: 636f 6e73 2f61 7061 6368 655f 7062 2e70
+ 0x1500: 6e67 2220 616c 743d 2241 7061 6368 6522
+ 0x1510: 3e0a 3c2f 613e 0a3c 2f44 4956 3e0a 0a3c
+ 0x1520: 212d 2d0a 2020 5468 6973 2070 6167 6520
+ 0x1530: 7761 7320 696e 6974 6961 6c6c 7920 6372
+ 0x1540: 6561 7465 6420 6279 204a 6f68 6e69 6520
+ 0x1550: 496e 6772 616d 2028 6874 7470 3a2f 2f6e
+ 0x1560: 6574 676f 642e 6e65 742f 290a 2020 4974
+ 0x1570: 2077 6173 206c 6174 6572 2065 6469 7465
+ 0x1580: 6420 6279 204d 6174 7468 6577 2057 696c
+ 0x1590: 636f 7820 616e 6420 4a6f 7369 7020 526f
+ 0x15a0: 6469 6e2e 0a20 204c 6173 7420 6d6f 6469
+ 0x15b0: 6669 6564 3a20 2444 6174 653a 2032 3030
+ 0x15c0: 342f 3036 2f32 3020 3135 3a33 333a 3537
+ 0x15d0: 2024 2e0a 2020 2d2d 3e0a 0a3c 2f42 4f44
+ 0x15e0: 593e 0a3c 2f48 544d 4c3e 0a
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5560, win 12383, options [nop,nop,TS val 1306300953 ecr 1306300953], length 0
+ 0x0000: 4500 0034 1b6e 4000 4006 2154 7f00 0001
+ 0x0010: 7f00 0001 da70 0050 3758 8a49 377a a3a9
+ 0x0020: 8010 305f 10ea 0000 0101 080a 4ddc 9219
+ 0x0030: 4ddc 9219
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [F.], seq 203, ack 5560, win 12383, options [nop,nop,TS val 1306302241 ecr 1306300953], length 0
+ 0x0000: 4500 0034 1b70 4000 4006 2152 7f00 0001
+ 0x0010: 7f00 0001 da70 0050 3758 8a49 377a a3a9
+ 0x0020: 8011 305f 0be1 0000 0101 080a 4ddc 9721
+ 0x0030: 4ddc 9219
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [F.], seq 5560, ack 204, win 8192, options [nop,nop,TS val 1306302243 ecr 1306302241], length 0
+ 0x0000: 4500 0034 1fe8 4000 4006 1cda 7f00 0001
+ 0x0010: 7f00 0001 0050 da70 377a a3a9 3758 8a4a
+ 0x0020: 8011 2000 1735 0000 0101 080a 4ddc 9723
+ 0x0030: 4ddc 9721
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5561, win 12383, options [nop,nop,TS val 1306302243 ecr 1306302243], length 0
+ 0x0000: 4500 0034 1b72 4000 4006 2150 7f00 0001
+ 0x0010: 7f00 0001 da70 0050 3758 8a4a 377a a3aa
+ 0x0020: 8010 305f 06d4 0000 0101 080a 4ddc 9723
+ 0x0030: 4ddc 9723
--- /dev/null
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [S], seq 928549246, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 0,nop,wscale 2], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500
+ 0x0010: 003c 1b68 4000 4006 2152 7f00 0001 7f00
+ 0x0020: 0001 da70 0050 3758 897e 0000 0000 a002
+ 0x0030: 7fff 1421 0000 0204 400c 0402 080a 4ddc
+ 0x0040: 9216 0000 0000 0103 0302
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [S.], seq 930778609, ack 928549247, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 1306300950,nop,wscale 2], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500
+ 0x0010: 003c 0000 4000 4006 3cba 7f00 0001 7f00
+ 0x0020: 0001 0050 da70 377a 8df1 3758 897f a012
+ 0x0030: 7fff 6eb1 0000 0204 400c 0402 080a 4ddc
+ 0x0040: 9216 4ddc 9216 0103 0302
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 1, win 8192, options [nop,nop,TS val 1306300950 ecr 1306300950], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500
+ 0x0010: 0034 1b6a 4000 4006 2158 7f00 0001 7f00
+ 0x0020: 0001 da70 0050 3758 897f 377a 8df2 8010
+ 0x0030: 2000 37d0 0000 0101 080a 4ddc 9216 4ddc
+ 0x0040: 9216
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [P.], seq 1:203, ack 1, win 8192, options [nop,nop,TS val 1306300951 ecr 1306300950], length 202: HTTP: GET / HTTP/1.1
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500
+ 0x0010: 00fe 1b6c 4000 4006 208c 7f00 0001 7f00
+ 0x0020: 0001 da70 0050 3758 897f 377a 8df2 8018
+ 0x0030: 2000 fef2 0000 0101 080a 4ddc 9217 4ddc
+ 0x0040: 9216 4745 5420 2f20 4854 5450 2f31 2e31
+ 0x0050: 0d0a 486f 7374 3a20 6c6f 6361 6c68 6f73
+ 0x0060: 740d 0a55 7365 722d 4167 656e 743a 2045
+ 0x0070: 4c69 6e6b 732f 302e 3130 2e34 2d37 2d64
+ 0x0080: 6562 6961 6e20 2874 6578 746d 6f64 653b
+ 0x0090: 204c 696e 7578 2032 2e36 2e31 312d 312d
+ 0x00a0: 3638 362d 736d 7020 6936 3836 3b20 3133
+ 0x00b0: 3278 3536 2d32 290d 0a41 6363 6570 743a
+ 0x00c0: 202a 2f2a 0d0a 4163 6365 7074 2d45 6e63
+ 0x00d0: 6f64 696e 673a 2067 7a69 700d 0a41 6363
+ 0x00e0: 6570 742d 4c61 6e67 7561 6765 3a20 656e
+ 0x00f0: 0d0a 436f 6e6e 6563 7469 6f6e 3a20 4b65
+ 0x0100: 6570 2d41 6c69 7665 0d0a 0d0a
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [.], ack 203, win 8192, options [nop,nop,TS val 1306300952 ecr 1306300951], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500
+ 0x0010: 0034 1fe4 4000 4006 1cde 7f00 0001 7f00
+ 0x0020: 0001 0050 da70 377a 8df2 3758 8a49 8010
+ 0x0030: 2000 3703 0000 0101 080a 4ddc 9218 4ddc
+ 0x0040: 9217
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [P.], seq 1:5560, ack 203, win 8192, options [nop,nop,TS val 1306300953 ecr 1306300951], length 5559: HTTP: HTTP/1.1 200 OK
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500
+ 0x0010: 15eb 1fe6 4000 4006 0725 7f00 0001 7f00
+ 0x0020: 0001 0050 da70 377a 8df2 3758 8a49 8018
+ 0x0030: 2000 13e0 0000 0101 080a 4ddc 9219 4ddc
+ 0x0040: 9217 4854 5450 2f31 2e31 2032 3030 204f
+ 0x0050: 4b0d 0a44 6174 653a 2057 6564 2c20 3036
+ 0x0060: 204a 756c 2032 3030 3520 3033 3a35 373a
+ 0x0070: 3335 2047 4d54 0d0a 5365 7276 6572 3a20
+ 0x0080: 4170 6163 6865 2f31 2e33 2e33 330d 0a4c
+ 0x0090: 6173 742d 4d6f 6469 6669 6564 3a20 5375
+ 0x00a0: 6e2c 2031 3520 4175 6720 3230 3034 2030
+ 0x00b0: 303a 3433 3a34 3120 474d 540d 0a45 5461
+ 0x00c0: 673a 2022 3665 3830 6630 2d31 3438 612d
+ 0x00d0: 3431 3165 6231 6264 220d 0a41 6363 6570
+ 0x00e0: 742d 5261 6e67 6573 3a20 6279 7465 730d
+ 0x00f0: 0a43 6f6e 7465 6e74 2d4c 656e 6774 683a
+ 0x0100: 2035 3235 380d 0a4b 6565 702d 416c 6976
+ 0x0110: 653a 2074 696d 656f 7574 3d31 352c 206d
+ 0x0120: 6178 3d31 3030 0d0a 436f 6e6e 6563 7469
+ 0x0130: 6f6e 3a20 4b65 6570 2d41 6c69 7665 0d0a
+ 0x0140: 436f 6e74 656e 742d 5479 7065 3a20 7465
+ 0x0150: 7874 2f68 746d 6c3b 2063 6861 7273 6574
+ 0x0160: 3d69 736f 2d38 3835 392d 310d 0a0d 0a3c
+ 0x0170: 2144 4f43 5459 5045 2048 544d 4c20 5055
+ 0x0180: 424c 4943 2022 2d2f 2f57 3343 2f2f 4454
+ 0x0190: 4420 4854 4d4c 2034 2e30 3120 5472 616e
+ 0x01a0: 7369 7469 6f6e 616c 2f2f 454e 223e 0a3c
+ 0x01b0: 4854 4d4c 3e0a 3c48 4541 443e 0a20 2020
+ 0x01c0: 3c4d 4554 4120 4854 5450 2d45 5155 4956
+ 0x01d0: 3d22 436f 6e74 656e 742d 5479 7065 2220
+ 0x01e0: 434f 4e54 454e 543d 2274 6578 742f 6874
+ 0x01f0: 6d6c 3b20 6368 6172 7365 743d 6973 6f2d
+ 0x0200: 3838 3539 2d31 223e 0a20 2020 3c4d 4554
+ 0x0210: 4120 4e41 4d45 3d22 4465 7363 7269 7074
+ 0x0220: 696f 6e22 2043 4f4e 5445 4e54 3d22 5468
+ 0x0230: 6520 696e 6974 6961 6c20 696e 7374 616c
+ 0x0240: 6c61 7469 6f6e 206f 6620 4465 6269 616e
+ 0x0250: 2061 7061 6368 652e 223e 0a20 2020 3c54
+ 0x0260: 4954 4c45 3e50 6c61 6365 686f 6c64 6572
+ 0x0270: 2070 6167 653c 2f54 4954 4c45 3e0a 3c2f
+ 0x0280: 4845 4144 3e0a 3c42 4f44 5920 5445 5854
+ 0x0290: 3d22 2330 3030 3030 3022 2042 4743 4f4c
+ 0x02a0: 4f52 3d22 2346 4646 4646 4622 204c 494e
+ 0x02b0: 4b3d 2223 3030 3030 4546 2220 564c 494e
+ 0x02c0: 4b3d 2223 3535 3138 3841 2220 414c 494e
+ 0x02d0: 4b3d 2223 4646 3030 3030 223e 0a0a 3c48
+ 0x02e0: 313e 506c 6163 6568 6f6c 6465 7220 7061
+ 0x02f0: 6765 3c2f 4831 3e0a 3c48 323e 4966 2079
+ 0x0300: 6f75 2061 7265 206a 7573 7420 6272 6f77
+ 0x0310: 7369 6e67 2074 6865 2077 6562 3c2f 6832
+ 0x0320: 3e0a 0a3c 503e 5468 6520 6f77 6e65 7220
+ 0x0330: 6f66 2074 6869 7320 7765 6220 7369 7465
+ 0x0340: 2068 6173 206e 6f74 2070 7574 2075 7020
+ 0x0350: 616e 7920 7765 6220 7061 6765 7320 7965
+ 0x0360: 742e 0a50 6c65 6173 6520 636f 6d65 2062
+ 0x0370: 6163 6b20 6c61 7465 722e 3c2f 503e 0a0a
+ 0x0380: 3c50 3e3c 534d 414c 4c3e 3c43 4954 453e
+ 0x0390: 4d6f 7665 2061 6c6f 6e67 2c20 6e6f 7468
+ 0x03a0: 696e 6720 746f 2073 6565 2068 6572 652e
+ 0x03b0: 2e2e 3c2f 4349 5445 3e20 3a2d 293c 2f53
+ 0x03c0: 4d41 4c4c 3e3c 2f50 3e0a 0a3c 4832 3e49
+ 0x03d0: 6620 796f 7520 6172 6520 7472 7969 6e67
+ 0x03e0: 2074 6f20 6c6f 6361 7465 2074 6865 2061
+ 0x03f0: 646d 696e 6973 7472 6174 6f72 206f 6620
+ 0x0400: 7468 6973 206d 6163 6869 6e65 3c2f 4832
+ 0x0410: 3e0a 0a3c 503e 4966 2079 6f75 2077 616e
+ 0x0420: 7420 746f 2072 6570 6f72 7420 736f 6d65
+ 0x0430: 7468 696e 6720 6162 6f75 7420 7468 6973
+ 0x0440: 2068 6f73 7427 7320 6265 6861 7669 6f72
+ 0x0450: 2c20 706c 6561 7365 0a63 6f6e 7461 6374
+ 0x0460: 2074 6865 2049 6e74 6572 6e65 7420 5365
+ 0x0470: 7276 6963 6520 5072 6f76 6964 6572 2028
+ 0x0480: 4953 5029 2069 6e76 6f6c 7665 6420 6469
+ 0x0490: 7265 6374 6c79 2e3c 2f50 3e0a 0a3c 503e
+ 0x04a0: 5365 6520 7468 6520 3c41 2068 7265 663d
+ 0x04b0: 2268 7474 703a 2f2f 7777 772e 6162 7573
+ 0x04c0: 652e 6e65 742f 223e 4e65 7477 6f72 6b20
+ 0x04d0: 4162 7573 650a 436c 6561 7269 6e67 686f
+ 0x04e0: 7573 653c 2f41 3e20 666f 7220 686f 7720
+ 0x04f0: 746f 2064 6f20 7468 6973 2e3c 2f50 3e0a
+ 0x0500: 0a3c 4832 3e49 6620 796f 7520 6172 6520
+ 0x0510: 7468 6520 6164 6d69 6e69 7374 7261 746f
+ 0x0520: 7220 6f66 2074 6869 7320 6d61 6368 696e
+ 0x0530: 653c 2f48 323e 0a0a 3c50 3e54 6865 2069
+ 0x0540: 6e69 7469 616c 2069 6e73 7461 6c6c 6174
+ 0x0550: 696f 6e20 6f66 203c 4120 6872 6566 3d22
+ 0x0560: 6874 7470 3a2f 2f77 7777 2e64 6562 6961
+ 0x0570: 6e2e 6f72 672f 223e 4465 6269 616e 2773
+ 0x0580: 0a61 7061 6368 653c 2f41 3e20 7765 6220
+ 0x0590: 7365 7276 6572 2070 6163 6b61 6765 2077
+ 0x05a0: 6173 2073 7563 6365 7373 6675 6c2e 3c2f
+ 0x05b0: 503e 0a0a 3c50 3e3c 5354 524f 4e47 3e59
+ 0x05c0: 6f75 2073 686f 756c 6420 7265 706c 6163
+ 0x05d0: 6520 7468 6973 2070 6167 6520 7769 7468
+ 0x05e0: 2079 6f75 7220 6f77 6e20 7765 6220 7061
+ 0x05f0: 6765 7320 6173 0a73 6f6f 6e20 6173 2070
+ 0x0600: 6f73 7369 626c 652e 3c2f 5354 524f 4e47
+ 0x0610: 3e3c 2f50 3e0a 0a3c 503e 556e 6c65 7373
+ 0x0620: 2079 6f75 2063 6861 6e67 6564 2069 7473
+ 0x0630: 2063 6f6e 6669 6775 7261 7469 6f6e 2c20
+ 0x0640: 796f 7572 206e 6577 2073 6572 7665 7220
+ 0x0650: 6973 2063 6f6e 6669 6775 7265 6420 6173
+ 0x0660: 2066 6f6c 6c6f 7773 3a0a 3c55 4c3e 0a3c
+ 0x0670: 4c49 3e0a 436f 6e66 6967 7572 6174 696f
+ 0x0680: 6e20 6669 6c65 7320 6361 6e20 6265 2066
+ 0x0690: 6f75 6e64 2069 6e20 3c54 543e 2f65 7463
+ 0x06a0: 2f61 7061 6368 653c 2f54 543e 2e3c 2f4c
+ 0x06b0: 493e 0a0a 3c4c 493e 0a54 6865 203c 5454
+ 0x06c0: 3e44 6f63 756d 656e 7452 6f6f 743c 2f54
+ 0x06d0: 543e 2c20 7768 6963 6820 6973 2074 6865
+ 0x06e0: 2064 6972 6563 746f 7279 2075 6e64 6572
+ 0x06f0: 2077 6869 6368 2061 6c6c 2079 6f75 720a
+ 0x0700: 4854 4d4c 2066 696c 6573 2073 686f 756c
+ 0x0710: 6420 6578 6973 742c 2069 7320 7365 7420
+ 0x0720: 746f 203c 5454 3e2f 7661 722f 7777 773c
+ 0x0730: 2f54 543e 2e3c 2f4c 493e 0a0a 3c4c 493e
+ 0x0740: 0a43 4749 2073 6372 6970 7473 2061 7265
+ 0x0750: 206c 6f6f 6b65 6420 666f 7220 696e 203c
+ 0x0760: 5454 3e2f 7573 722f 6c69 622f 6367 692d
+ 0x0770: 6269 6e3c 2f54 543e 2c20 7768 6963 6820
+ 0x0780: 6973 2077 6865 7265 0a44 6562 6961 6e20
+ 0x0790: 7061 636b 6167 6573 2077 696c 6c20 706c
+ 0x07a0: 6163 6520 7468 6569 7220 7363 7269 7074
+ 0x07b0: 732e 3c2f 4c49 3e0a 0a3c 4c49 3e0a 4c6f
+ 0x07c0: 6720 6669 6c65 7320 6172 6520 706c 6163
+ 0x07d0: 6564 2069 6e20 3c54 543e 2f76 6172 2f6c
+ 0x07e0: 6f67 2f61 7061 6368 653c 2f54 543e 2c20
+ 0x07f0: 616e 6420 7769 6c6c 2062 6520 726f 7461
+ 0x0800: 7465 640a 7765 656b 6c79 2e20 2054 6865
+ 0x0810: 2066 7265 7175 656e 6379 206f 6620 726f
+ 0x0820: 7461 7469 6f6e 2063 616e 2062 6520 6561
+ 0x0830: 7369 6c79 2063 6861 6e67 6564 2062 7920
+ 0x0840: 6564 6974 696e 670a 3c54 543e 2f65 7463
+ 0x0850: 2f6c 6f67 726f 7461 7465 2e64 2f61 7061
+ 0x0860: 6368 653c 2f54 543e 2e3c 2f4c 493e 0a0a
+ 0x0870: 3c4c 493e 0a54 6865 2064 6566 6175 6c74
+ 0x0880: 2064 6972 6563 746f 7279 2069 6e64 6578
+ 0x0890: 2069 7320 3c54 543e 696e 6465 782e 6874
+ 0x08a0: 6d6c 3c2f 5454 3e2c 206d 6561 6e69 6e67
+ 0x08b0: 2074 6861 7420 7265 7175 6573 7473 0a66
+ 0x08c0: 6f72 2061 2064 6972 6563 746f 7279 203c
+ 0x08d0: 5454 3e2f 666f 6f2f 6261 722f 3c2f 5454
+ 0x08e0: 3e20 7769 6c6c 2067 6976 6520 7468 6520
+ 0x08f0: 636f 6e74 656e 7473 206f 6620 7468 6520
+ 0x0900: 6669 6c65 203c 5454 3e2f 7661 722f 7777
+ 0x0910: 772f 666f 6f2f 6261 722f 696e 6465 782e
+ 0x0920: 6874 6d6c 3c2f 5454 3e0a 6966 2069 7420
+ 0x0930: 6578 6973 7473 2028 6173 7375 6d69 6e67
+ 0x0940: 2074 6861 7420 3c54 543e 2f76 6172 2f77
+ 0x0950: 7777 3c2f 5454 3e20 6973 2079 6f75 7220
+ 0x0960: 3c54 543e 446f 6375 6d65 6e74 526f 6f74
+ 0x0970: 3c2f 5454 3e29 2e3c 2f4c 493e 0a0a 3c4c
+ 0x0980: 493e 0a55 7365 7220 6469 7265 6374 6f72
+ 0x0990: 6965 7320 6172 6520 656e 6162 6c65 642c
+ 0x09a0: 2061 6e64 2075 7365 7220 646f 6375 6d65
+ 0x09b0: 6e74 7320 7769 6c6c 2062 6520 6c6f 6f6b
+ 0x09c0: 6564 2066 6f72 0a69 6e20 7468 6520 3c54
+ 0x09d0: 543e 7075 626c 6963 5f68 746d 6c3c 2f54
+ 0x09e0: 543e 2064 6972 6563 746f 7279 206f 6620
+ 0x09f0: 7468 6520 7573 6572 7327 2068 6f6d 6573
+ 0x0a00: 2e20 2054 6865 7365 2064 6972 730a 7368
+ 0x0a10: 6f75 6c64 2062 6520 756e 6465 7220 3c54
+ 0x0a20: 543e 2f68 6f6d 653c 2f54 543e 2c20 616e
+ 0x0a30: 6420 7573 6572 7320 7769 6c6c 206e 6f74
+ 0x0a40: 2062 6520 6162 6c65 2074 6f20 7379 6d6c
+ 0x0a50: 696e 6b0a 746f 2066 696c 6573 2074 6865
+ 0x0a60: 7920 646f 6e27 7420 6f77 6e2e 3c2f 4c49
+ 0x0a70: 3e0a 0a3c 2f55 4c3e 0a41 6c6c 2074 6865
+ 0x0a80: 2073 7461 6e64 6172 6420 6170 6163 6865
+ 0x0a90: 206d 6f64 756c 6573 2061 7265 2061 7661
+ 0x0aa0: 696c 6162 6c65 2077 6974 6820 7468 6973
+ 0x0ab0: 2072 656c 6561 7365 2061 6e64 2061 7265
+ 0x0ac0: 0a6e 6f77 206d 616e 6167 6564 2077 6974
+ 0x0ad0: 6820 6465 6263 6f6e 662e 2020 5479 7065
+ 0x0ae0: 203c 5454 3e64 706b 672d 7265 636f 6e66
+ 0x0af0: 6967 7572 6520 6170 6163 6865 3c2f 5454
+ 0x0b00: 3e20 746f 0a73 656c 6563 7420 7768 6963
+ 0x0b10: 6820 6d6f 6475 6c65 7320 796f 7520 7761
+ 0x0b20: 6e74 2065 6e61 626c 6564 2e20 204d 616e
+ 0x0b30: 7920 6f74 6865 7220 6d6f 6475 6c65 7320
+ 0x0b40: 6172 6520 6176 6169 6c61 626c 650a 7468
+ 0x0b50: 726f 7567 6820 7468 6520 4465 6269 616e
+ 0x0b60: 2070 6163 6b61 6765 2073 7973 7465 6d20
+ 0x0b70: 7769 7468 2074 6865 206e 616d 6573 203c
+ 0x0b80: 5454 3e6c 6962 6170 6163 6865 2d6d 6f64
+ 0x0b90: 2d2a 3c2f 5454 3e2e 0a49 6620 796f 7520
+ 0x0ba0: 6e65 6564 2074 6f20 636f 6d70 696c 6520
+ 0x0bb0: 6120 6d6f 6475 6c65 2079 6f75 7273 656c
+ 0x0bc0: 662c 2079 6f75 2077 696c 6c20 6e65 6564
+ 0x0bd0: 2074 6f20 696e 7374 616c 6c20 7468 650a
+ 0x0be0: 3c54 543e 6170 6163 6865 2d64 6576 3c2f
+ 0x0bf0: 5454 3e20 7061 636b 6167 652e 0a0a 3c50
+ 0x0c00: 3e4d 6f72 6520 646f 6375 6d65 6e74 6174
+ 0x0c10: 696f 6e20 6f6e 2041 7061 6368 6520 6361
+ 0x0c20: 6e20 6265 2066 6f75 6e64 206f 6e3a 0a3c
+ 0x0c30: 554c 3e0a 3c4c 493e 0a54 6865 203c 4120
+ 0x0c40: 4852 4546 3d22 2f64 6f63 2f61 7061 6368
+ 0x0c50: 652d 646f 632f 6d61 6e75 616c 2f22 3e41
+ 0x0c60: 7061 6368 6520 646f 6375 6d65 6e74 6174
+ 0x0c70: 696f 6e3c 2f41 3e20 7374 6f72 6564 206f
+ 0x0c80: 6e20 796f 7572 2073 6572 7665 722e 3c2f
+ 0x0c90: 4c49 3e0a 0a3c 4c49 3e0a 5468 6520 3c41
+ 0x0ca0: 2048 5245 463d 2268 7474 703a 2f2f 7777
+ 0x0cb0: 772e 6170 6163 6865 2e6f 7267 2f22 3e41
+ 0x0cc0: 7061 6368 6520 5072 6f6a 6563 743c 2f41
+ 0x0cd0: 3e20 686f 6d65 2073 6974 652e 3c2f 4c49
+ 0x0ce0: 3e0a 0a3c 4c49 3e0a 5468 6520 3c41 2048
+ 0x0cf0: 5245 463d 2268 7474 703a 2f2f 7777 772e
+ 0x0d00: 6170 6163 6865 2d73 736c 2e6f 7267 2f22
+ 0x0d10: 3e41 7061 6368 652d 5353 4c3c 2f41 3e20
+ 0x0d20: 686f 6d65 2073 6974 652e 3c2f 4c49 3e0a
+ 0x0d30: 0a3c 4c49 3e0a 5468 6520 3c41 2048 5245
+ 0x0d40: 463d 2268 7474 703a 2f2f 7065 726c 2e61
+ 0x0d50: 7061 6368 652e 6f72 672f 223e 6d6f 6420
+ 0x0d60: 7065 726c 3c2f 413e 2068 6f6d 6520 7369
+ 0x0d70: 7465 2e3c 2f4c 493e 0a0a 3c4c 493e 0a54
+ 0x0d80: 6865 203c 4120 4852 4546 3d22 6874 7470
+ 0x0d90: 3a2f 2f77 7777 2e61 7061 6368 6577 6565
+ 0x0da0: 6b2e 636f 6d2f 223e 4170 6163 6865 5765
+ 0x0db0: 656b 3c2f 413e 206e 6577 736c 6574 7465
+ 0x0dc0: 722e 3c2f 4c49 3e0a 0a3c 4c49 3e0a 5468
+ 0x0dd0: 6520 3c41 2048 5245 463d 2268 7474 703a
+ 0x0de0: 2f2f 7777 772e 6465 6269 616e 2e6f 7267
+ 0x0df0: 2f64 6f63 2f22 3e44 6562 6961 6e20 5072
+ 0x0e00: 6f6a 6563 740a 446f 6375 6d65 6e74 6174
+ 0x0e10: 696f 6e3c 2f41 3e20 7768 6963 6820 636f
+ 0x0e20: 6e74 6169 6e73 2048 4f57 544f 732c 2046
+ 0x0e30: 4151 732c 2061 6e64 2073 6f66 7477 6172
+ 0x0e40: 6520 7570 6461 7465 732e 3c2f 4c49 3e0a
+ 0x0e50: 3c2f 554c 3e0a 0a3c 503e 596f 7520 6361
+ 0x0e60: 6e20 616c 736f 2063 6f6e 7375 6c74 2074
+ 0x0e70: 6865 206c 6973 7420 6f66 203c 4120 4852
+ 0x0e80: 4546 3d22 6874 7470 3a2f 2f77 7777 2e62
+ 0x0e90: 6f75 7465 6c6c 2e63 6f6d 2f66 6171 2f22
+ 0x0ea0: 3e57 6f72 6c64 0a57 6964 6520 5765 6220
+ 0x0eb0: 4672 6571 7565 6e74 6c79 2041 736b 6564
+ 0x0ec0: 2051 7565 7374 696f 6e73 3c2f 413e 2066
+ 0x0ed0: 6f72 2069 6e66 6f72 6d61 7469 6f6e 2e0a
+ 0x0ee0: 0a3c 4832 3e4c 6574 206f 7468 6572 2070
+ 0x0ef0: 656f 706c 6520 6b6e 6f77 2061 626f 7574
+ 0x0f00: 2074 6869 7320 7365 7276 6572 3c2f 4832
+ 0x0f10: 3e0a 0a3c 4120 4852 4546 3d22 6874 7470
+ 0x0f20: 3a2f 2f6e 6574 6372 6166 742e 636f 6d2f
+ 0x0f30: 223e 4e65 7463 7261 6674 3c2f 413e 2070
+ 0x0f40: 726f 7669 6465 7320 616e 2069 6e74 6572
+ 0x0f50: 6573 7469 6e67 2066 7265 650a 7365 7276
+ 0x0f60: 6963 6520 666f 7220 7765 6220 7369 7465
+ 0x0f70: 206d 6f6e 6974 6f72 696e 6720 616e 6420
+ 0x0f80: 7374 6174 6973 7469 6320 636f 6c6c 6563
+ 0x0f90: 7469 6f6e 2e0a 596f 7520 6361 6e20 6c65
+ 0x0fa0: 7420 7468 656d 206b 6e6f 7720 6162 6f75
+ 0x0fb0: 7420 796f 7572 2073 6572 7665 7220 7573
+ 0x0fc0: 696e 6720 7468 6569 720a 3c41 2048 5245
+ 0x0fd0: 463d 2268 7474 703a 2f2f 7570 7469 6d65
+ 0x0fe0: 2e6e 6574 6372 6166 742e 636f 6d2f 223e
+ 0x0ff0: 696e 7465 7266 6163 653c 2f41 3e2e 0a45
+ 0x1000: 6e61 626c 696e 6720 7468 6520 6d6f 6e69
+ 0x1010: 746f 7269 6e67 206f 6620 796f 7572 2073
+ 0x1020: 6572 7665 7220 7769 6c6c 2070 726f 7669
+ 0x1030: 6465 2061 2062 6574 7465 7220 676c 6f62
+ 0x1040: 616c 206f 7665 7276 6965 770a 6f66 2077
+ 0x1050: 686f 2069 7320 7573 696e 6720 7768 6174
+ 0x1060: 2061 6e64 2077 6865 7265 2c20 616e 6420
+ 0x1070: 6974 2077 6f75 6c64 2067 6976 6520 4465
+ 0x1080: 6269 616e 2061 2062 6574 7465 720a 6f76
+ 0x1090: 6572 7669 6577 206f 6620 7468 6520 6170
+ 0x10a0: 6163 6865 2070 6163 6b61 6765 2075 7361
+ 0x10b0: 6765 2e0a 0a3c 4832 3e41 626f 7574 2074
+ 0x10c0: 6869 7320 7061 6765 3c2f 4832 3e0a 0a3c
+ 0x10d0: 494d 4720 414c 4947 4e3d 2272 6967 6874
+ 0x10e0: 2220 414c 543d 2222 2048 4549 4748 543d
+ 0x10f0: 2232 3437 2220 5749 4454 483d 2232 3738
+ 0x1100: 2220 5352 433d 2269 636f 6e73 2f6a 6865
+ 0x1110: 3036 312e 706e 6722 3e0a 0a3c 503e 5468
+ 0x1120: 6973 2069 7320 6120 706c 6163 6568 6f6c
+ 0x1130: 6465 7220 7061 6765 2069 6e73 7461 6c6c
+ 0x1140: 6564 2062 7920 7468 6520 3c41 0a48 5245
+ 0x1150: 463d 2268 7474 703a 2f2f 7777 772e 6465
+ 0x1160: 6269 616e 2e6f 7267 2f22 3e44 6562 6961
+ 0x1170: 6e3c 2f41 3e0a 7265 6c65 6173 6520 6f66
+ 0x1180: 2074 6865 2061 7061 6368 6520 5765 6220
+ 0x1190: 7365 7276 6572 2070 6163 6b61 6765 2e0a
+ 0x11a0: 0a3c 503e 5468 6973 2063 6f6d 7075 7465
+ 0x11b0: 7220 6861 7320 696e 7374 616c 6c65 6420
+ 0x11c0: 7468 6520 4465 6269 616e 2047 4e55 2f4c
+ 0x11d0: 696e 7578 206f 7065 7261 7469 6e67 2073
+ 0x11e0: 7973 7465 6d2c 0a62 7574 2069 7420 6861
+ 0x11f0: 7320 3c73 7472 6f6e 673e 6e6f 7468 696e
+ 0x1200: 6720 746f 2064 6f20 7769 7468 2074 6865
+ 0x1210: 2044 6562 6961 6e0a 5072 6f6a 6563 743c
+ 0x1220: 2f73 7472 6f6e 673e 2e20 506c 6561 7365
+ 0x1230: 2064 6f20 3c73 7472 6f6e 673e 6e6f 743c
+ 0x1240: 2f73 7472 6f6e 673e 2063 6f6e 7461 6374
+ 0x1250: 2074 6865 2044 6562 6961 6e0a 5072 6f6a
+ 0x1260: 6563 7420 6162 6f75 7420 6974 2e3c 2f50
+ 0x1270: 3e0a 0a3c 503e 4966 2079 6f75 2066 696e
+ 0x1280: 6420 6120 6275 6720 696e 2074 6869 7320
+ 0x1290: 6170 6163 6865 2070 6163 6b61 6765 2c20
+ 0x12a0: 6f72 2069 6e20 4170 6163 6865 2069 7473
+ 0x12b0: 656c 662c 0a70 6c65 6173 6520 6669 6c65
+ 0x12c0: 2061 2062 7567 2072 6570 6f72 7420 6f6e
+ 0x12d0: 2069 742e 2020 496e 7374 7275 6374 696f
+ 0x12e0: 6e73 206f 6e20 646f 696e 6720 7468 6973
+ 0x12f0: 2c20 616e 6420 7468 650a 6c69 7374 206f
+ 0x1300: 6620 3c41 2048 5245 463d 2268 7474 703a
+ 0x1310: 2f2f 6275 6773 2e64 6562 6961 6e2e 6f72
+ 0x1320: 672f 7372 633a 6170 6163 6865 223e 6b6e
+ 0x1330: 6f77 6e20 6275 6773 3c2f 413e 206f 6620
+ 0x1340: 7468 6973 0a70 6163 6b61 6765 2c20 6361
+ 0x1350: 6e20 6265 2066 6f75 6e64 2069 6e20 7468
+ 0x1360: 6520 0a3c 4120 4852 4546 3d22 6874 7470
+ 0x1370: 3a2f 2f77 7777 2e64 6562 6961 6e2e 6f72
+ 0x1380: 672f 4275 6773 2f52 6570 6f72 7469 6e67
+ 0x1390: 223e 4465 6269 616e 2042 7567 2054 7261
+ 0x13a0: 636b 696e 6720 5379 7374 656d 3c2f 413e
+ 0x13b0: 2e0a 0a3c 503e 5468 616e 6b73 2066 6f72
+ 0x13c0: 2075 7369 6e67 2074 6869 7320 7061 636b
+ 0x13d0: 6167 652c 2061 6e64 2063 6f6e 6772 6174
+ 0x13e0: 756c 6174 696f 6e73 2066 6f72 2079 6f75
+ 0x13f0: 7220 6368 6f69 6365 206f 660a 6120 4465
+ 0x1400: 6269 616e 2073 7973 7465 6d21 3c2f 503e
+ 0x1410: 0a0a 3c44 4956 2061 6c69 676e 3d22 6365
+ 0x1420: 6e74 6572 223e 0a3c 6120 6872 6566 3d22
+ 0x1430: 6874 7470 3a2f 2f77 7777 2e64 6562 6961
+ 0x1440: 6e2e 6f72 672f 223e 0a3c 494d 4720 616c
+ 0x1450: 6967 6e3d 226d 6964 646c 6522 2068 6569
+ 0x1460: 6768 743d 2233 3022 2077 6964 7468 3d22
+ 0x1470: 3235 2220 7372 633d 2269 636f 6e73 2f64
+ 0x1480: 6562 6961 6e2f 6f70 656e 6c6f 676f 2d32
+ 0x1490: 352e 6a70 6722 2061 6c74 3d22 4465 6269
+ 0x14a0: 616e 223e 0a3c 2f61 3e0a 3c61 2068 7265
+ 0x14b0: 663d 2268 7474 703a 2f2f 7777 772e 6170
+ 0x14c0: 6163 6865 2e6f 7267 2f22 3e0a 3c49 4d47
+ 0x14d0: 2061 6c69 676e 3d22 6d69 6464 6c65 2220
+ 0x14e0: 6865 6967 6874 3d22 3332 2220 7769 6474
+ 0x14f0: 683d 2232 3539 2220 7372 633d 2269 636f
+ 0x1500: 6e73 2f61 7061 6368 655f 7062 2e70 6e67
+ 0x1510: 2220 616c 743d 2241 7061 6368 6522 3e0a
+ 0x1520: 3c2f 613e 0a3c 2f44 4956 3e0a 0a3c 212d
+ 0x1530: 2d0a 2020 5468 6973 2070 6167 6520 7761
+ 0x1540: 7320 696e 6974 6961 6c6c 7920 6372 6561
+ 0x1550: 7465 6420 6279 204a 6f68 6e69 6520 496e
+ 0x1560: 6772 616d 2028 6874 7470 3a2f 2f6e 6574
+ 0x1570: 676f 642e 6e65 742f 290a 2020 4974 2077
+ 0x1580: 6173 206c 6174 6572 2065 6469 7465 6420
+ 0x1590: 6279 204d 6174 7468 6577 2057 696c 636f
+ 0x15a0: 7820 616e 6420 4a6f 7369 7020 526f 6469
+ 0x15b0: 6e2e 0a20 204c 6173 7420 6d6f 6469 6669
+ 0x15c0: 6564 3a20 2444 6174 653a 2032 3030 342f
+ 0x15d0: 3036 2f32 3020 3135 3a33 333a 3537 2024
+ 0x15e0: 2e0a 2020 2d2d 3e0a 0a3c 2f42 4f44 593e
+ 0x15f0: 0a3c 2f48 544d 4c3e 0a
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5560, win 12383, options [nop,nop,TS val 1306300953 ecr 1306300953], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500
+ 0x0010: 0034 1b6e 4000 4006 2154 7f00 0001 7f00
+ 0x0020: 0001 da70 0050 3758 8a49 377a a3a9 8010
+ 0x0030: 305f 10ea 0000 0101 080a 4ddc 9219 4ddc
+ 0x0040: 9219
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [F.], seq 203, ack 5560, win 12383, options [nop,nop,TS val 1306302241 ecr 1306300953], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500
+ 0x0010: 0034 1b70 4000 4006 2152 7f00 0001 7f00
+ 0x0020: 0001 da70 0050 3758 8a49 377a a3a9 8011
+ 0x0030: 305f 0be1 0000 0101 080a 4ddc 9721 4ddc
+ 0x0040: 9219
+IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [F.], seq 5560, ack 204, win 8192, options [nop,nop,TS val 1306302243 ecr 1306302241], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500
+ 0x0010: 0034 1fe8 4000 4006 1cda 7f00 0001 7f00
+ 0x0020: 0001 0050 da70 377a a3a9 3758 8a4a 8011
+ 0x0030: 2000 1735 0000 0101 080a 4ddc 9723 4ddc
+ 0x0040: 9721
+IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5561, win 12383, options [nop,nop,TS val 1306302243 ecr 1306302243], length 0
+ 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500
+ 0x0010: 0034 1b72 4000 4006 2150 7f00 0001 7f00
+ 0x0020: 0001 da70 0050 3758 8a4a 377a a3aa 8010
+ 0x0030: 305f 06d4 0000 0101 080a 4ddc 9723 4ddc
+ 0x0040: 9723
--- /dev/null
+IP (tos 0x0, ttl 64, id 20820, offset 0, flags [none], proto UDP (17), length 108)
+ 127.0.0.1.53334 > 127.0.0.1.1812: RADIUS, length: 80
+ Access-Request (1), id: 0x46, Authenticator: f44757bc498c3393763a27d0b2393702
+ User-Name Attribute (1), length: 12, Value: bob-tagged
+ User-Password Attribute (2), length: 18, Value:
+ NAS-IP-Address Attribute (4), length: 6, Value: 127.0.0.1
+ NAS-Port Attribute (5), length: 6, Value: 1
+ Message-Authenticator Attribute (80), length: 18, Value: .....b..7-\7f...b.
+IP (tos 0x0, ttl 64, id 20821, offset 0, flags [none], proto UDP (17), length 81)
+ 127.0.0.1.1812 > 127.0.0.1.53334: RADIUS, length: 53
+ Access-Accept (2), id: 0x46, Authenticator: 766a0314eaf4b95f1ec271ae19cb3bdc
+ Egress-VLANID Attribute (56), length: 6, Value: Tagged (0x31) 123
+ Ingress-Filters Attribute (57), length: 6, Value: Enabled
+ Egress-VLAN-Name Attribute (58), length: 11, Value: Tagged (0x31) vlanname
+ User-Priority-Table Attribute (59), length: 10, Value:
+IP (tos 0x0, ttl 64, id 21127, offset 0, flags [none], proto UDP (17), length 110)
+ 127.0.0.1.46281 > 127.0.0.1.1812: RADIUS, length: 82
+ Access-Request (1), id: 0xb5, Authenticator: 11851d8b1b483f54a864b703ea21f4dc
+ User-Name Attribute (1), length: 14, Value: bob-untagged
+ User-Password Attribute (2), length: 18, Value:
+ NAS-IP-Address Attribute (4), length: 6, Value: 127.0.0.1
+ NAS-Port Attribute (5), length: 6, Value: 1
+ Message-Authenticator Attribute (80), length: 18, Value: ..o..}f..d.;..R[
+IP (tos 0x0, ttl 64, id 21128, offset 0, flags [none], proto UDP (17), length 71)
+ 127.0.0.1.1812 > 127.0.0.1.46281: RADIUS, length: 43
+ Access-Accept (2), id: 0xb5, Authenticator: e223a663823b20ccc18bcf90c3ecbe27
+ Egress-VLANID Attribute (56), length: 6, Value: Untagged (0x32) 123
+ Ingress-Filters Attribute (57), length: 6, Value: Disabled
+ Egress-VLAN-Name Attribute (58), length: 11, Value: Untagged (0x32) vlanname
+IP (tos 0x0, ttl 64, id 21190, offset 0, flags [none], proto UDP (17), length 109)
+ 127.0.0.1.39300 > 127.0.0.1.1812: RADIUS, length: 81
+ Access-Request (1), id: 0x5a, Authenticator: 8dd685f50f837e8ad29e9cc095261172
+ User-Name Attribute (1), length: 13, Value: bob-invalid
+ User-Password Attribute (2), length: 18, Value:
+ NAS-IP-Address Attribute (4), length: 6, Value: 127.0.0.1
+ NAS-Port Attribute (5), length: 6, Value: 1
+ Message-Authenticator Attribute (80), length: 18, Value: ....(..^A.f.....
+IP (tos 0x0, ttl 64, id 21191, offset 0, flags [none], proto UDP (17), length 71)
+ 127.0.0.1.1812 > 127.0.0.1.39300: RADIUS, length: 43
+ Access-Accept (2), id: 0x5a, Authenticator: fbaa7d05d009953514d00697da4d1dfc
+ Egress-VLANID Attribute (56), length: 6, Value: Unknown tag (0x33) 123
+ Ingress-Filters Attribute (57), length: 6, Value: #3
+ Egress-VLAN-Name Attribute (58), length: 11, Value: Unknown tag (0x33) vlanname
--- /dev/null
+IP (tos 0x0, ttl 4, id 29161, offset 0, flags [none], proto UDP (17), length 66)
+ 10.0.0.10.12345 > 10.0.0.1.3799: RADIUS, length: 38
+ Disconnect-Request (40), id: 0x01, Authenticator: e1792d2b4ab349f1a4c0fcc733d091c1
+ Message-Authenticator Attribute (80), length: 18, Value: XQ=f(G..sJ0.....
+IP (tos 0x0, ttl 4, id 18682, offset 0, flags [none], proto UDP (17), length 66)
+ 10.0.0.1.3799 > 10.0.0.10.12345: RADIUS, length: 38
+ Disconnect-ACK (41), id: 0x02, Authenticator: 3bc9c343f689990756b96c583a56890a
+ Message-Authenticator Attribute (80), length: 18, Value: .O........iC,'}.
+IP (tos 0x0, ttl 4, id 22542, offset 0, flags [none], proto UDP (17), length 66)
+ 10.0.0.1.3799 > 10.0.0.10.12345: RADIUS, length: 38
+ Disconnect-NAK (42), id: 0x03, Authenticator: d867c308c9c43112b3a669a0e8c0ab8c
+ Message-Authenticator Attribute (80), length: 18, Value: ...p.I...(."....
+IP (tos 0x0, ttl 4, id 16413, offset 0, flags [none], proto UDP (17), length 66)
+ 10.0.0.10.12345 > 10.0.0.1.3799: RADIUS, length: 38
+ CoA-Request (43), id: 0x04, Authenticator: 5f18309be67cd6150fe4c3a0b93536c9
+ Message-Authenticator Attribute (80), length: 18, Value: '..6|.F..._...[.
+IP (tos 0x0, ttl 4, id 170, offset 0, flags [none], proto UDP (17), length 66)
+ 10.0.0.1.3799 > 10.0.0.10.12345: RADIUS, length: 38
+ CoA-ACK (44), id: 0x05, Authenticator: 55ab6cb78aa161d692753fa9130c5019
+ Message-Authenticator Attribute (80), length: 18, Value: .........+.x...s
+IP (tos 0x0, ttl 4, id 29645, offset 0, flags [none], proto UDP (17), length 66)
+ 10.0.0.1.3799 > 10.0.0.10.12345: RADIUS, length: 38
+ CoA-NAK (45), id: 0x06, Authenticator: 40f21bdee27a87a5d757a30bfed62f28
+ Message-Authenticator Attribute (80), length: 18, Value: .%y.....x...&j..
--- /dev/null
+IP (tos 0x0, ttl 255, id 70, offset 0, flags [none], proto UDP (17), length 167)
+ 10.0.0.1.1645 > 10.0.0.100.1812: RADIUS, length: 139
+ Access-Request (1), id: 0x05, Authenticator: ecfe3d2fe4473ec6299095ee46aedf77
+ NAS-IP-Address Attribute (4), length: 6, Value: 10.0.0.1
+ NAS-Port Attribute (5), length: 6, Value: 50012
+ NAS-Port-Type Attribute (61), length: 6, Value: Ethernet
+ User-Name Attribute (1), length: 14, Value: John.McGuirk
+ Called-Station-Id Attribute (30), length: 19, Value: 00-19-06-EA-B8-8C
+ Calling-Station-Id Attribute (31), length: 19, Value: 00-14-22-E9-54-5E
+ Service-Type Attribute (6), length: 6, Value: Framed
+ Framed-MTU Attribute (12), length: 6, Value: 1500
+ EAP-Message Attribute (79), length: 19, Value: .
+ Message-Authenticator Attribute (80), length: 18, Value: (....$..p.Q1o.x.
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 137)
+ 10.0.0.100.1812 > 10.0.0.1.1645: RADIUS, length: 109
+ Access-Challenge (11), id: 0x05, Authenticator: f050649184625d36f14c9075b7a48b83
+ Framed-IP-Address Attribute (8), length: 6, Value: NAS Select
+ Framed-MTU Attribute (12), length: 6, Value: 576
+ Service-Type Attribute (6), length: 6, Value: Framed
+ Reply-Message Attribute (18), length: 11, Value: Hello, %u
+ EAP-Message Attribute (79), length: 24, Value: ..
+ Message-Authenticator Attribute (80), length: 18, Value: ...<.(.X.13..t4.
+ State Attribute (24), length: 18, Value: ..../.0$.s..1..w
+IP (tos 0x0, ttl 255, id 71, offset 0, flags [none], proto UDP (17), length 202)
+ 10.0.0.1.1645 > 10.0.0.100.1812: RADIUS, length: 174
+ Access-Request (1), id: 0x06, Authenticator: 6a6f38e6dae830304d2333e5d5364643
+ NAS-IP-Address Attribute (4), length: 6, Value: 10.0.0.1
+ NAS-Port Attribute (5), length: 6, Value: 50012
+ NAS-Port-Type Attribute (61), length: 6, Value: Ethernet
+ User-Name Attribute (1), length: 14, Value: John.McGuirk
+ Called-Station-Id Attribute (30), length: 19, Value: 00-19-06-EA-B8-8C
+ Calling-Station-Id Attribute (31), length: 19, Value: 00-14-22-E9-54-5E
+ Service-Type Attribute (6), length: 6, Value: Framed
+ Framed-MTU Attribute (12), length: 6, Value: 1500
+ State Attribute (24), length: 18, Value: ..../.0$.s..1..w
+ EAP-Message Attribute (79), length: 36, Value: ..
+ Message-Authenticator Attribute (80), length: 18, Value: '&.q1.....Ojb..8
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 125)
+ 10.0.0.100.1812 > 10.0.0.1.1645: RADIUS, length: 97
+ Access-Accept (2), id: 0x06, Authenticator: fbba6a784c7decb314caf0f27944a37b
+ Framed-IP-Address Attribute (8), length: 6, Value: NAS Select
+ Framed-MTU Attribute (12), length: 6, Value: 576
+ Service-Type Attribute (6), length: 6, Value: Framed
+ Reply-Message Attribute (18), length: 21, Value: Hello, John.McGuirk
+ EAP-Message Attribute (79), length: 6, Value: ..
+ Message-Authenticator Attribute (80), length: 18, Value: ...b...2.^..NLc`
+ User-Name Attribute (1), length: 14, Value: John.McGuirk
--- /dev/null
+IP (tos 0xc0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 52)
+ 10.0.0.20.520 > 10.0.0.255.520:
+ RIPv1, Request, length: 24, routes: 1
+ AFI 0, 0.0.0.0, metric: 16
+IP (tos 0xc0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 52)
+ 10.0.0.20.520 > 10.0.0.255.520:
+ RIPv1, Response, length: 24, routes: 1
+ 10.70.178.0, metric: 1
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 52)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Request, length: 24, routes: 1 or less
+ AFI 0, 0.0.0.0/0 , tag 0x0000, metric: 16, next-hop: self
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 52)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Response, length: 24, routes: 1 or less
+ AFI IPv4, 10.70.178.0/24, tag 0x0000, metric: 1, next-hop: self
--- /dev/null
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 72)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Request, length: 44, routes: 2 or less
+ Simple Text Authentication data: abcdefghijklmnop
+ AFI 0, 0.0.0.0/0 , tag 0x0000, metric: 16, next-hop: self
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 72)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Response, length: 44, routes: 2 or less
+ Simple Text Authentication data: abcdefghijklmnop
+ AFI IPv4, 10.70.178.0/24, tag 0x0000, metric: 1, next-hop: self
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 92)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Request, length: 64, routes: 3 or less
+ Auth header: Packet Len 44, Key-ID 45, Auth Data Len 16, SeqNo 1339429688, MBZ 0, MBZ 0
+ AFI 0, 0.0.0.0/0 , tag 0x0000, metric: 16, next-hop: self
+ Auth trailer:
+ 0x0000: a2fe c865 f120 8808 2326 1369 d6c2 3593
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 92)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Response, length: 64, routes: 3 or less
+ Auth header: Packet Len 44, Key-ID 45, Auth Data Len 16, SeqNo 1339429692, MBZ 0, MBZ 0
+ AFI IPv4, 10.70.178.0/24, tag 0x0000, metric: 1, next-hop: self
+ Auth trailer:
+ 0x0000: 6d21 5dd5 6d27 a6f4 8a51 e2c2 fcc2 af0f
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 96)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Request, length: 68, routes: 3 or less
+ Auth header: Packet Len 44, Key-ID 45, Auth Data Len 20, SeqNo 1339429713, MBZ 0, MBZ 0
+ AFI 0, 0.0.0.0/0 , tag 0x0000, metric: 16, next-hop: self
+ Auth trailer:
+ 0x0000: 728c 5b16 9a1b 3913 0021 a73f 7a73 bc1b
+ 0x0010: eee0 e6a2
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 96)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Response, length: 68, routes: 3 or less
+ Auth header: Packet Len 44, Key-ID 45, Auth Data Len 20, SeqNo 1339429716, MBZ 0, MBZ 0
+ AFI IPv4, 10.70.178.0/24, tag 0x0000, metric: 1, next-hop: self
+ Auth trailer:
+ 0x0000: 375c 8a50 f77f 543b 2425 a695 a27d 6b95
+ 0x0010: 3375 fc89
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 108)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Request, length: 80, routes: 4 or less
+ Auth header: Packet Len 44, Key-ID 45, Auth Data Len 32, SeqNo 1339429740, MBZ 0, MBZ 0
+ AFI 0, 0.0.0.0/0 , tag 0x0000, metric: 16, next-hop: self
+ Auth trailer:
+ 0x0000: 4ae5 fb9c 9702 03b8 5a93 812d 0258 6740
+ 0x0010: 451a bd20 cee4 8a3d a466 17a0 e550 5b4b
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 108)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Response, length: 80, routes: 4 or less
+ Auth header: Packet Len 44, Key-ID 45, Auth Data Len 32, SeqNo 1339429744, MBZ 0, MBZ 0
+ AFI IPv4, 10.70.178.0/24, tag 0x0000, metric: 1, next-hop: self
+ Auth trailer:
+ 0x0000: 3965 b755 535a 3375 e83a 973c 60c9 1693
+ 0x0010: f2de 8132 9e87 3f7f b763 3cb0 b3dc 3ba2
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 124)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Request, length: 96, routes: 4 or less
+ Auth header: Packet Len 44, Key-ID 45, Auth Data Len 48, SeqNo 1339429761, MBZ 0, MBZ 0
+ AFI 0, 0.0.0.0/0 , tag 0x0000, metric: 16, next-hop: self
+ Auth trailer:
+ 0x0000: a1f2 20f6 6f72 f45b e8e0 291f 2322 a198
+ 0x0010: 1b6b 67bc 9279 7d3b 8e05 c683 8b7e 05bc
+ 0x0020: 230c abc8 1470 8e30 5470 fb27 6fe3 4506
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 124)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Response, length: 96, routes: 4 or less
+ Auth header: Packet Len 44, Key-ID 45, Auth Data Len 48, SeqNo 1339429765, MBZ 0, MBZ 0
+ AFI IPv4, 10.70.178.0/24, tag 0x0000, metric: 1, next-hop: self
+ Auth trailer:
+ 0x0000: 64de 1dec 3632 e210 0258 2404 0b32 a947
+ 0x0010: aa86 59a1 fef3 9248 3115 c266 0386 f183
+ 0x0020: 4f31 1df0 0681 e1cc ba10 b4c1 7795 9773
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 140)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Request, length: 112, routes: 5 or less
+ Auth header: Packet Len 44, Key-ID 45, Auth Data Len 64, SeqNo 1339429781, MBZ 0, MBZ 0
+ AFI 0, 0.0.0.0/0 , tag 0x0000, metric: 16, next-hop: self
+ Auth trailer:
+ 0x0000: 73ad b6e3 5fe6 07bd 0bc5 ca25 41cc 63ec
+ 0x0010: bd06 55b1 77a4 e223 ef52 8ea2 7480 e39c
+ 0x0020: ee51 96bd 4e35 8cb7 f185 ba49 9892 e683
+ 0x0030: e756 788d aa23 bf90 0b01 5c2d 241d 2d8e
+IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 140)
+ 10.0.0.20.520 > 224.0.0.9.520:
+ RIPv2, Response, length: 112, routes: 5 or less
+ Auth header: Packet Len 44, Key-ID 45, Auth Data Len 64, SeqNo 1339429785, MBZ 0, MBZ 0
+ AFI IPv4, 10.70.178.0/24, tag 0x0000, metric: 1, next-hop: self
+ Auth trailer:
+ 0x0000: ad5a 5d8a a1a8 b023 1ec3 5c1c ba6a 45fb
+ 0x0010: bee1 5584 6b1c 724d b1b7 f02e 7365 f038
+ 0x0020: 7558 0914 6762 00d1 a92f d499 5da2 43ad
+ 0x0030: 202c 7a9b 8065 49ad 260b 2142 0f8d d83f
--- /dev/null
+IP6 (hlim 64, next-header ICMPv6 (58) payload length: 24) fe80::216:3eff:fe11:3424 > ff02::1: [icmp6 sum ok] ICMP6, RPL, (CLR)Destination Advertisement Object [dagid:pandora is fun0x0al,seq:1,instance:1,Dagid,40]
--- /dev/null
+IP6 (hlim 64, next-header ICMPv6 (58) payload length: 56) fe80::216:3eff:fe11:3424 > fe80::216:3eff:fe11:3424: [icmp6 sum ok] ICMP6, RPL, (CLR)Destination Advertisement Object [dagid:T10x000x000x000x000x000x000x000x000x000x000x000x000x000x00,seq:10,instance:42,Dagid,40] opt:rpltarget len:25 opt:pad0 opt:pad0 opt:pad0 opt:pad0 opt:pad0 opt:pad0 opt:pad0
--- /dev/null
+IP6 (hlim 64, next-header ICMPv6 (58) payload length: 56) fe80::216:3eff:fe11:3424 > fe80::216:3eff:fe11:3424: [icmp6 sum ok] ICMP6, RPL, (CLR)Destination Advertisement Object [dagid:T10x000x000x000x000x000x000x000x000x000x000x000x000x000x00,seq:10,instance:42,Dagid,40] opt:rpltarget len:25 0x0000: 0080 2001 0db8 0001 0000 0216 3eff fe11 0x0010: 3424 0000 0000 00 opt:pad0 opt:pad0 opt:pad0 opt:pad0 opt:pad0 opt:pad0 opt:pad0
--- /dev/null
+IP6 (hlim 64, next-header ICMPv6 (58) payload length: 24) fe80::216:3eff:fe11:3424 > ff02::1: [icmp6 sum ok] ICMP6, RPL, (CLR)Destination Advertisement Object Ack [dagid:thisismydicedag2,seq:11,instance:43,status:0]
--- /dev/null
+DTPv1, length 38
+ Domain TLV (0x0001) TLV, length 10, cisco
+ Status TLV (0x0002) TLV, length 5, 0x81
+ DTP type TLV (0x0003) TLV, length 5, 0xa5
+ Neighbor TLV (0x0004) TLV, length 10, 00:1f:6d:96:ec:04
+DTPv1, length 38
+ Domain TLV (0x0001) TLV, length 10, cisco
+ Status TLV (0x0002) TLV, length 5, 0x81
+ DTP type TLV (0x0003) TLV, length 5, 0xa5
+ Neighbor TLV (0x0004) TLV, length 10, 00:1f:6d:96:ec:04
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:1f:6d:96:ec:00.8004, length 42
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:1f:6d:96:ec:00.8004, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8005.00:1f:6d:96:ec:00.8004, length 42
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8005.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:1f:6d:96:ec:00.8004, length 42
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:1f:6d:96:ec:00.8004, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8005.00:1f:6d:96:ec:00.8004, length 42
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8005.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:1f:6d:96:ec:00.8004, length 42
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:1f:6d:96:ec:00.8004, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8005.00:1f:6d:96:ec:00.8004, length 42
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8005.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+VTPv1, Message Summary advertisement (0x01), length 77
+ Domain name: cisco, Followers: 0
+ Config Rev 2, Updater 155.1.37.7, Timestamp 0x39333033 0x30313030 0x30393030, MD5 digest: fb393cf67014e50aa79c7c5b193f6fe1
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:1f:6d:96:ec:00.8004, length 42
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:1f:6d:96:ec:00.8004, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8005.00:1f:6d:96:ec:00.8004, length 42
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8005.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:1f:6d:96:ec:00.8004, length 42
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:1f:6d:96:ec:00.8004, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8005.00:1f:6d:96:ec:00.8004, length 42
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8005.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:1f:6d:96:ec:00.8004, length 42
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:1f:6d:96:ec:00.8004, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8005.00:1f:6d:96:ec:00.8004, length 42
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8005.00:1f:6d:96:ec:00, root-pathcost 0, port-role Designated
+Loopback, skipCount 0, Reply, receipt number 0, data (40 octets)
--- /dev/null
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal, Learn], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal, Learn], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal, Learn], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal, Learn], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal, Learn], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal, Learn], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Proposal, Learn], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Topology change, Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Topology change, Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Topology change, Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
+STP 802.1w, Rapid STP, Flags [Learn, Forward], bridge-id 8001.00:19:06:ea:b8:80.800c, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0, port-role Designated
--- /dev/null
+IP (tos 0x0, ttl 128, id 0, offset 0, flags [DF], proto RSVP (46), length 40)
+ 208.208.77.43 > 192.168.1.1:
+ RSVPv1 Hello Message (20), Flags: [none], length: 20, ttl: 64, checksum: 0x98ce
+ ERO Object (20) Flags: [reject if unknown], Class-Type: IPv4 (1), length: 8
+ Subobject Type: Label, length 0
+ ERROR: zero length ERO subtype
+ ERROR: object header too short 0 < 4
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto RSVP (46), length 40)
+ 199.106.167.61 > 192.168.1.1:
+ RSVPv1 Hello Message (20), Flags: [none], length: 20, ttl: 64, checksum: 0x98ce
+ ERO Object (20) Flags: [reject if unknown], Class-Type: IPv4 (1), length: 8
+ Subobject Type: Label, length 0
+ ERROR: zero length ERO subtype
+ ERROR: object header too short 0 < 4
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto RSVP (46), length 40)
+ 179.9.22.16 > 192.168.1.1:
+ RSVPv1 Hello Message (20), Flags: [none], length: 20, ttl: 128, checksum: 0x58ce
+ ERO Object (20) Flags: [reject if unknown], Class-Type: IPv4 (1), length: 8
+ Subobject Type: Label, length 0
+ ERROR: zero length ERO subtype
+ ERROR: object header too short 0 < 4
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto RSVP (46), length 40)
+ 99.107.153.33 > 192.168.1.1:
+ RSVPv1 Hello Message (20), Flags: [none], length: 20, ttl: 128, checksum: 0x58ce
+ ERO Object (20) Flags: [reject if unknown], Class-Type: IPv4 (1), length: 8
+ Subobject Type: Label, length 0
+ ERROR: zero length ERO subtype
+ ERROR: object header too short 0 < 4
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto RSVP (46), length 40)
+ 188.46.23.116 > 192.168.1.1:
+ RSVPv1 Hello Message (20), Flags: [none], length: 20, ttl: 128, checksum: 0x58ce
+ ERO Object (20) Flags: [reject if unknown], Class-Type: IPv4 (1), length: 8
+ Subobject Type: Label, length 0
+ ERROR: zero length ERO subtype
+ ERROR: object header too short 0 < 4
--- /dev/null
+IP 15.184.1.76.40948 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.8.4, agent-id 2, length 1288
+IP 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, length 1288
+IP 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, length 1288
+IP 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, length 1288
+IP 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, length 1288
+IP 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, length 1108
+IP 15.184.1.76.40948 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.8.4, agent-id 2, length 208
+IP 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, length 1288
+IP 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, length 1288
+IP 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, length 1288
+IP 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, length 1288
+IP 15.184.4.165.49408 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.4.165, agent-id 100, length 460
+IP 168.87.240.2.40000 > 15.184.3.9.6343: sFlow version 327681 packet not supported
+IP 15.184.3.1.41024 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.129, agent-id 2, length 1288
+IP 15.184.3.1.41024 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.129, agent-id 2, length 568
+IP 168.87.240.3.50340 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.129, agent-id 6, length 928
+IP 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, length 1108
+IP 15.184.13.248.50229 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.13.52, agent-id 100, length 424
+IP 168.87.240.1.40000 > 15.184.3.9.6343: sFlow version 327681 packet not supported
+IP 168.87.240.1.40000 > 15.184.3.9.6343: sFlow version 327682 packet not supported
+IP 168.87.240.1.40000 > 15.184.3.9.6343: sFlow version 327681 packet not supported
+IP 168.87.240.2.40000 > 15.184.3.9.6343: sFlow version 327682 packet not supported
+IP 168.87.240.3.50340 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.129, agent-id 6, length 568
+IP 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, length 1288
+IP 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, length 1288
+IP 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, length 1288
+IP 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, length 1288
+IP 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, length 1108
+IP 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, length 1288
+IP 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, length 1288
--- /dev/null
+IP (tos 0x0, ttl 253, id 23654, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.76.40948 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.8.4, agent-id 2, seqnum 204720, uptime 2612972293, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 87096, type 0, idx 55, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 55, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 820721, unicast pkts 9601, multicast pkts 0, broadcast pkts 1302, discards 0
+ In errors 0, unknown protos 0
+ Out octets 178785248, unicast pkts 9736, multicast pkts 132958, broadcast pkts 2213534, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 87096, type 0, idx 56, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 56, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 156084746, unicast pkts 473593, multicast pkts 0, broadcast pkts 1862745, discards 0
+ In errors 0, unknown protos 0
+ Out octets 59635889, unicast pkts 8834, multicast pkts 132958, broadcast pkts 352092, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 87099, type 0, idx 57, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 57, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3051593057, unicast pkts 52919488, multicast pkts 1491, broadcast pkts 956, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1525716840, unicast pkts 30013667, multicast pkts 131467, broadcast pkts 2213880, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 87096, type 0, idx 60, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 60, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 0, unicast pkts 0, multicast pkts 0, broadcast pkts 0, discards 0
+ In errors 0, unknown protos 0
+ Out octets 178404732, unicast pkts 3035, multicast pkts 132958, broadcast pkts 2214836, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 87016, type 0, idx 61, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 61, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 0, unicast pkts 0, multicast pkts 0, broadcast pkts 0, discards 0
+ In errors 0, unknown protos 0
+ Out octets 178368955, unicast pkts 3031, multicast pkts 132840, broadcast pkts 2214791, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 87096, type 0, idx 62, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 62, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 0, unicast pkts 0, multicast pkts 0, broadcast pkts 0, discards 0
+ In errors 0, unknown protos 0
+ Out octets 178404650, unicast pkts 3034, multicast pkts 132958, broadcast pkts 2214836, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 87096, type 0, idx 63, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 63, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 0, unicast pkts 0, multicast pkts 0, broadcast pkts 0, discards 0
+ In errors 0, unknown protos 0
+ Out octets 178404732, unicast pkts 3035, multicast pkts 132958, broadcast pkts 2214836, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 12208, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, seqnum 10499682, uptime 12973660, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2007195, type 0, idx 1, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 1, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 2460750, unicast pkts 22544, multicast pkts 5, broadcast pkts 6408, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3991394888, unicast pkts 131978, multicast pkts 2198965, broadcast pkts 48358863, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2006745, type 0, idx 2, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 2, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 122196260, unicast pkts 82823825, multicast pkts 710, broadcast pkts 38540, discards 0
+ In errors 2, unknown protos 0
+ Out octets 3744715166, unicast pkts 93942161, multicast pkts 2218252, broadcast pkts 48317917, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 2, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007118, type 0, idx 3, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 3, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 87175881, unicast pkts 11173387, multicast pkts 1312, broadcast pkts 7310, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2575091711, unicast pkts 8663056, multicast pkts 1949260, broadcast pkts 8701202, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007648, type 0, idx 4, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 4, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3013636604, unicast pkts 424917316, multicast pkts 1216, broadcast pkts 196654, discards 0
+ In errors 0, unknown protos 0
+ Out octets 584566587, unicast pkts 294167676, multicast pkts 1948957, broadcast pkts 8512276, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 1832884, type 0, idx 5, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 5, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3835856598, unicast pkts 6812799, multicast pkts 1145, broadcast pkts 705277, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2182764482, unicast pkts 8284848, multicast pkts 2738770, broadcast pkts 7987023, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007139, type 0, idx 6, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 6, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 21722, unicast pkts 0, multicast pkts 12, broadcast pkts 37, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1874046310, unicast pkts 98496, multicast pkts 1955062, broadcast pkts 20311831, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2006986, type 0, idx 7, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 7, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3474926128, unicast pkts 10088201, multicast pkts 1463, broadcast pkts 14105, discards 0
+ In errors 0, unknown protos 0
+ Out octets 831378523, unicast pkts 12805926, multicast pkts 1954494, broadcast pkts 20293366, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 12209, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, seqnum 10499683, uptime 12973661, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2007114, type 0, idx 8, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 8, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3858988244, unicast pkts 13191097, multicast pkts 1215, broadcast pkts 24593, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2559231968, unicast pkts 16126546, multicast pkts 1954848, broadcast pkts 20284429, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007001, type 0, idx 9, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 9, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3386316332, unicast pkts 14360061, multicast pkts 1244, broadcast pkts 16485, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1675798901, unicast pkts 15790519, multicast pkts 1954451, broadcast pkts 20291225, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2005309, type 0, idx 10, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 10, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1558898282, unicast pkts 162603641, multicast pkts 1331, broadcast pkts 188407, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3568458580, unicast pkts 162582480, multicast pkts 1953553, broadcast pkts 20106780, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007256, type 0, idx 11, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 11, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 125808339, unicast pkts 691735, multicast pkts 2539, broadcast pkts 22184, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1249750181, unicast pkts 33020559, multicast pkts 2196657, broadcast pkts 48342104, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007178, type 0, idx 12, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 12, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 45949249, unicast pkts 205456, multicast pkts 1743, broadcast pkts 8308, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4019313234, unicast pkts 210496, multicast pkts 2197587, broadcast pkts 48353561, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007155, type 0, idx 13, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 13, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 32111027, unicast pkts 143922, multicast pkts 1193, broadcast pkts 5276, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4050797426, unicast pkts 198665, multicast pkts 2197850, broadcast pkts 48353779, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2006875, type 0, idx 14, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 14, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 19576, unicast pkts 19, multicast pkts 5, broadcast pkts 30, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3990801228, unicast pkts 107683, multicast pkts 2199048, broadcast pkts 48364452, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 12210, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, seqnum 10499684, uptime 12973663, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2007174, type 0, idx 15, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 15, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 96700793, unicast pkts 453020, multicast pkts 2568, broadcast pkts 22804, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4042743345, unicast pkts 379591, multicast pkts 2196676, broadcast pkts 48338646, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007085, type 0, idx 16, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 16, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 289703711, unicast pkts 1654844, multicast pkts 37302, broadcast pkts 22784, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4098637095, unicast pkts 801788, multicast pkts 2166613, broadcast pkts 48320960, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007171, type 0, idx 17, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 17, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 45204461, unicast pkts 194096, multicast pkts 1700, broadcast pkts 8788, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4014792810, unicast pkts 198133, multicast pkts 2197652, broadcast pkts 48351768, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007169, type 0, idx 18, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 18, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 95210366, unicast pkts 443561, multicast pkts 2169, broadcast pkts 24997, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4035379503, unicast pkts 332327, multicast pkts 2196767, broadcast pkts 48336027, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007264, type 0, idx 19, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 19, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1379521296, unicast pkts 50010620, multicast pkts 1046, broadcast pkts 48921, discards 0
+ In errors 0, unknown protos 0
+ Out octets 435976335, unicast pkts 57993600, multicast pkts 2197958, broadcast pkts 48315375, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007257, type 0, idx 20, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 20, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 312017292, unicast pkts 47238597, multicast pkts 1476, broadcast pkts 23377, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3242136708, unicast pkts 57532634, multicast pkts 2198069, broadcast pkts 48339981, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2009604, type 0, idx 21, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 21, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 4127607826, unicast pkts 29906144, multicast pkts 1233, broadcast pkts 69575, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2091792747, unicast pkts 3024931093, multicast pkts 2198065, broadcast pkts 48294332, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 12211, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, seqnum 10499685, uptime 12973664, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2007104, type 0, idx 22, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 22, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 124432239, unicast pkts 511115, multicast pkts 21969, broadcast pkts 120004, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3066166092, unicast pkts 2595939, multicast pkts 2177143, broadcast pkts 48244891, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2008568, type 0, idx 23, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 23, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 142412715, unicast pkts 4067695849, multicast pkts 1301, broadcast pkts 59350, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3335716564, unicast pkts 2083658988, multicast pkts 2198160, broadcast pkts 48304443, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2009649, type 0, idx 24, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 24, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1376243919, unicast pkts 42736656, multicast pkts 1161, broadcast pkts 37177, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3949008841, unicast pkts 3045234063, multicast pkts 2197974, broadcast pkts 48326808, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2009621, type 0, idx 25, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 25, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1314601210, unicast pkts 4258058414, multicast pkts 1154, broadcast pkts 42425, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2836953588, unicast pkts 2986750860, multicast pkts 2197982, broadcast pkts 48321714, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007193, type 0, idx 26, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 26, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 2022052468, unicast pkts 13527038, multicast pkts 933, broadcast pkts 57921, discards 0
+ In errors 0, unknown protos 0
+ Out octets 620629707, unicast pkts 19469425, multicast pkts 2198358, broadcast pkts 48305869, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007253, type 0, idx 27, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 27, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3262458931, unicast pkts 47684835, multicast pkts 1039, broadcast pkts 5299, discards 0
+ In errors 3, unknown protos 0
+ Out octets 3900626480, unicast pkts 54120142, multicast pkts 2198706, broadcast pkts 48356894, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 2, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2005148, type 0, idx 28, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 28, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 259120552, unicast pkts 1107924, multicast pkts 198, broadcast pkts 3429, discards 0
+ In errors 2, unknown protos 0
+ Out octets 653805810, unicast pkts 4189777, multicast pkts 2198871, broadcast pkts 48346830, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 2, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 12212, offset 0, flags [none], proto UDP (17), length 1136)
+ 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, seqnum 10499686, uptime 12973800, samples 6, length 1108
+ expanded counter sample (4), length 172, seqnum 2007268, type 0, idx 29, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 29, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1267844166, unicast pkts 49781127, multicast pkts 1368, broadcast pkts 40480, discards 0
+ In errors 0, unknown protos 0
+ Out octets 321243842, unicast pkts 57718818, multicast pkts 2197767, broadcast pkts 48323189, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2009633, type 0, idx 30, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 30, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1960827113, unicast pkts 4258067543, multicast pkts 1249, broadcast pkts 60280, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3144893898, unicast pkts 3032873251, multicast pkts 2198370, broadcast pkts 48301571, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2017264, type 0, idx 50, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 50, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 4161963595, unicast pkts 3263163886, multicast pkts 1151176, broadcast pkts 287880328, discards 0
+ In errors 0, unknown protos 0
+ Out octets 296840057, unicast pkts 1684325909, multicast pkts 1126235, broadcast pkts 1405132663, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2017179, type 0, idx 51, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 51, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 2214905605, unicast pkts 2466386895, multicast pkts 5276601, broadcast pkts 1225128676, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3025945518, unicast pkts 2183065991, multicast pkts 899419, broadcast pkts 2308600565, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 1220659, type 0, idx 52, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 52, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3618900052, unicast pkts 334487763, multicast pkts 651947, broadcast pkts 3712423535, discards 0
+ In errors 1, unknown protos 0
+ Out octets 697413100, unicast pkts 537120139, multicast pkts 163886, broadcast pkts 4083094099, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 1, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 1
+ expanded counter sample (4), length 172, seqnum 1220562, type 0, idx 53, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 53, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 851207797, unicast pkts 325440428, multicast pkts 164171, broadcast pkts 21946044, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1855403849, unicast pkts 517660679, multicast pkts 163669, broadcast pkts 21301, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 23656, offset 0, flags [none], proto UDP (17), length 236)
+ 15.184.1.76.40948 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.8.4, agent-id 2, seqnum 204721, uptime 2612972594, samples 1, length 208
+ expanded counter sample (4), length 172, seqnum 87243, type 0, idx 105, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 105, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1063772406, unicast pkts 81120, multicast pkts 174318, broadcast pkts 3847558651, discards 0
+ In errors 6, unknown protos 0
+ Out octets 3728106697, unicast pkts 53832149, multicast pkts 218554, broadcast pkts 2160868, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 6, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 4
+IP (tos 0x0, ttl 253, id 27097, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, seqnum 10354082, uptime 15617401, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2007459, type 0, idx 1, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 1, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 398, unicast pkts 0, multicast pkts 5, broadcast pkts 0, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3980656605, unicast pkts 65082, multicast pkts 2199480, broadcast pkts 48372199, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007455, type 0, idx 2, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 2, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1444442513, unicast pkts 69372226, multicast pkts 1207, broadcast pkts 31114, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1845546441, unicast pkts 41823689, multicast pkts 2201740, broadcast pkts 48335077, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007396, type 0, idx 3, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 3, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 200763454, unicast pkts 891785, multicast pkts 982, broadcast pkts 13320, discards 0
+ In errors 1, unknown protos 0
+ Out octets 3317395016, unicast pkts 5225674, multicast pkts 1949791, broadcast pkts 8711770, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 1, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007402, type 0, idx 4, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 4, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 165801154, unicast pkts 662297, multicast pkts 491, broadcast pkts 15752, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2164450538, unicast pkts 1115261, multicast pkts 1949901, broadcast pkts 8709518, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 1993492, type 0, idx 5, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 5, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 198991268, unicast pkts 941829, multicast pkts 664, broadcast pkts 33726, discards 0
+ In errors 1, unknown protos 0
+ Out octets 4052534333, unicast pkts 2591418, multicast pkts 1994963, broadcast pkts 8691000, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 1, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 1, frames too long 0, mac receive errors 0, symbol errors 1
+ expanded counter sample (4), length 172, seqnum 2007737, type 0, idx 6, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 6, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 561751280, unicast pkts 575605209, multicast pkts 1250, broadcast pkts 15322854, discards 0
+ In errors 1, unknown protos 0
+ Out octets 1513353683, unicast pkts 602598577, multicast pkts 1954404, broadcast pkts 4990177, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2008403, type 0, idx 7, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 7, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3193665198, unicast pkts 642460773, multicast pkts 1401, broadcast pkts 219741, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2913194238, unicast pkts 390983681, multicast pkts 1955407, broadcast pkts 20090610, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 27098, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, seqnum 10354083, uptime 15617403, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2008394, type 0, idx 8, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 8, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1089063112, unicast pkts 559652885, multicast pkts 634, broadcast pkts 224712, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3489201031, unicast pkts 383200930, multicast pkts 1955795, broadcast pkts 20085985, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2008429, type 0, idx 9, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 9, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 2436646808, unicast pkts 568003495, multicast pkts 906, broadcast pkts 16545, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1717246279, unicast pkts 389888234, multicast pkts 1955669, broadcast pkts 20294132, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2005878, type 0, idx 10, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 10, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 105616289, unicast pkts 531333, multicast pkts 768, broadcast pkts 9159, discards 0
+ In errors 0, unknown protos 0
+ Out octets 10387408, unicast pkts 2209569, multicast pkts 1954606, broadcast pkts 20288646, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007661, type 0, idx 11, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 11, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1801369357, unicast pkts 137590483, multicast pkts 2109, broadcast pkts 55528, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1769140298, unicast pkts 113363667, multicast pkts 2197521, broadcast pkts 48315560, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007552, type 0, idx 12, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 12, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 4201581256, unicast pkts 45842890, multicast pkts 1610, broadcast pkts 22730, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1948082196, unicast pkts 53163690, multicast pkts 2198297, broadcast pkts 48348226, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007540, type 0, idx 13, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 13, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1019109063, unicast pkts 46613839, multicast pkts 1236, broadcast pkts 22226, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2052469045, unicast pkts 53287225, multicast pkts 2198499, broadcast pkts 48348754, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2010424, type 0, idx 14, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 14, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 36138805, unicast pkts 2267783883, multicast pkts 298, broadcast pkts 38306126, discards 0
+ In errors 2, unknown protos 0
+ Out octets 614425293, unicast pkts 2014274284, multicast pkts 2199305, broadcast pkts 10065409, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 2, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 27099, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, seqnum 10354084, uptime 15617404, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2009508, type 0, idx 15, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 15, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 601225935, unicast pkts 4276033652, multicast pkts 1612, broadcast pkts 34856, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1981555755, unicast pkts 2886814164, multicast pkts 2198139, broadcast pkts 48336014, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007691, type 0, idx 16, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 16, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 4196949353, unicast pkts 109362236, multicast pkts 10140, broadcast pkts 40757, discards 0
+ In errors 0, unknown protos 0
+ Out octets 703618451, unicast pkts 113710944, multicast pkts 2190477, broadcast pkts 48326386, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007530, type 0, idx 17, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 17, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 4170852137, unicast pkts 45863536, multicast pkts 1559, broadcast pkts 27211, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2026848065, unicast pkts 53131746, multicast pkts 2198420, broadcast pkts 48343547, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2009475, type 0, idx 18, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 18, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 125400617, unicast pkts 3953942566, multicast pkts 1121, broadcast pkts 35754, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3010600832, unicast pkts 2658737621, multicast pkts 2198495, broadcast pkts 48334857, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007417, type 0, idx 19, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 19, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 97068375, unicast pkts 444889, multicast pkts 1007, broadcast pkts 8350, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4110456622, unicast pkts 336462, multicast pkts 2198059, broadcast pkts 48354968, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007243, type 0, idx 20, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 20, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 85827864, unicast pkts 397199, multicast pkts 1855, broadcast pkts 9570, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4029102009, unicast pkts 295961, multicast pkts 2196786, broadcast pkts 48315955, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007206, type 0, idx 21, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 21, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 91053304, unicast pkts 438205, multicast pkts 1011, broadcast pkts 7940, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4103297026, unicast pkts 317273, multicast pkts 2197586, broadcast pkts 48306440, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 27100, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, seqnum 10354085, uptime 15617405, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2006231, type 0, idx 22, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 22, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 34112098, unicast pkts 105160, multicast pkts 21890, broadcast pkts 87902, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3973831211, unicast pkts 170034, multicast pkts 2177391, broadcast pkts 48280299, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007385, type 0, idx 23, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 23, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 88669719, unicast pkts 426910, multicast pkts 1274, broadcast pkts 9963, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4040560781, unicast pkts 263325, multicast pkts 2198421, broadcast pkts 48355369, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007419, type 0, idx 24, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 24, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 91303939, unicast pkts 434713, multicast pkts 1082, broadcast pkts 9160, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4108976190, unicast pkts 328918, multicast pkts 2198317, broadcast pkts 48355036, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007417, type 0, idx 25, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 25, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 92997371, unicast pkts 447348, multicast pkts 1121, broadcast pkts 9663, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4037714536, unicast pkts 258087, multicast pkts 2198271, broadcast pkts 48354566, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007413, type 0, idx 26, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 26, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 736394053, unicast pkts 4302342, multicast pkts 1537, broadcast pkts 9112, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4154005710, unicast pkts 612617, multicast pkts 2197991, broadcast pkts 48350433, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007109, type 0, idx 27, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 27, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 7325604, unicast pkts 91520, multicast pkts 1016, broadcast pkts 2335, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4107132478, unicast pkts 154975, multicast pkts 2199118, broadcast pkts 48364314, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2004644, type 0, idx 28, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 28, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 15584594, unicast pkts 232478, multicast pkts 12, broadcast pkts 1252, discards 0
+ In errors 0, unknown protos 0
+ Out octets 250802552, unicast pkts 447550, multicast pkts 2198406, broadcast pkts 48250290, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto UDP (17), length 488)
+ 15.184.4.165.49408 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.4.165, agent-id 100, seqnum 304697, uptime 568980408, samples 1, length 460
+ counter sample (2), length 424, seqnum 304697, type 2, idx 1, records 6
+ enterprise 0, Unknown (2001) length 68
+ 0x0000: 0000 0004 0000 0002 0000 0001 1cc1 de18
+ 0x0010: 96f0 0000 0000 0003 0000 0001 1cc1 de18
+ 0x0020: 96f0 0000 0000 0005 0000 0001 1cc1 de18
+ 0x0030: 96f0 0000 0000 0006 0000 0001 0000 0000
+ 0x0040: 0000 0000
+ enterprise 0, Unknown (2005) length 52
+ 0x0000: 0000 01ce 1562 3800 0000 01b5 5abb 6000
+ 0x0010: 0000 07a2 0002 2ed1 0000 0000 ad27 5000
+ 0x0020: 0011 36a1 03c8 c6c6 0000 014c e1b6 8800
+ 0x0030: 1016 b722
+ enterprise 0, Unknown (2004) length 72
+ 0x0000: 0000 0005 e225 c000 0000 0003 848a 3000
+ 0x0010: 0000 0000 0000 0000 0000 0000 13bf c000
+ 0x0020: 0000 0002 3662 0000 0000 0000 0000 0000
+ 0x0030: 0000 0000 0000 0000 0015 af62 299c 36d1
+ 0x0040: 0000 0000 0000 0000
+ enterprise 0, Unknown (2003) length 68
+ 0x0000: 3ca3 d70a 3c23 d70a 3d23 d70a 0000 0001
+ 0x0010: 0000 0186 0000 0018 0000 0640 0096 43b9
+ 0x0020: 1e74 d09c 0187 6bc0 142d 000a cc79 de36
+ 0x0030: 00a5 dd9a 0051 60bc 041a 9f4c 7a8f 6da7
+ 0x0040: 3842 8b86
+ enterprise 0, Unknown (2006) length 40
+ 0x0000: 0000 16b2 0b31 f24e fcb8 d0dc 0000 0000
+ 0x0010: 0000 032a 0000 36b3 f8ae 8e96 0ab2 541e
+ 0x0020: 0000 0000 0000 0000
+ enterprise 0, Unknown (2000) length 64
+ 0x0000: 0000 0010 7072 6f78 792d 7573 6530 3331
+ 0x0010: 3437 6b32 3638 3935 3431 5355 4530 3331
+ 0x0020: 3437 4b32 0000 0003 0000 0002 0000 000e
+ 0x0030: 322e 362e 3138 2d31 3934 2e65 6c35 0000
+IP (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto UDP (17), length 100)
+ 168.87.240.2.40000 > 15.184.3.9.6343: sFlow version 327681 packet not supported
+IP (tos 0x0, ttl 255, id 16476, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.3.1.41024 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.129, agent-id 2, seqnum 211306, uptime 2441326183, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 81390, type 0, idx 56, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 56, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 809903675, unicast pkts 3736015, multicast pkts 162927, broadcast pkts 30039, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3159365496, unicast pkts 3749574, multicast pkts 328087, broadcast pkts 279825377, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 6536, type 0, idx 33, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 33, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 2950591154, unicast pkts 334880915, multicast pkts 13078, broadcast pkts 633, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3019300047, unicast pkts 221588667, multicast pkts 13070, broadcast pkts 62903, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 81076, type 0, idx 34, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 34, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 49685433, unicast pkts 2528128710, multicast pkts 162056, broadcast pkts 1220, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2876151927, unicast pkts 678847059, multicast pkts 163438, broadcast pkts 1810770236, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 81493, type 0, idx 35, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 35, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 408342602, unicast pkts 2796427385, multicast pkts 751161, broadcast pkts 740734824, discards 0
+ In errors 0, unknown protos 0
+ Out octets 642300096, unicast pkts 1951849543, multicast pkts 183235, broadcast pkts 22658, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 81669, type 0, idx 37, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 37, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1461246724, unicast pkts 1380492582, multicast pkts 163835, broadcast pkts 140670, discards 0
+ In errors 0, unknown protos 0
+ Out octets 498812438, unicast pkts 3834735035, multicast pkts 174908, broadcast pkts 1255093219, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 81390, type 0, idx 38, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 38, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 71981454, unicast pkts 214133, multicast pkts 162760, broadcast pkts 157, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3267993738, unicast pkts 2856556, multicast pkts 164514, broadcast pkts 1813907262, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 81434, type 0, idx 39, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 39, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3630784674, unicast pkts 832589817, multicast pkts 162837, broadcast pkts 84051, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3008452523, unicast pkts 1179091938, multicast pkts 164436, broadcast pkts 1814098221, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 255, id 16477, offset 0, flags [none], proto UDP (17), length 596)
+ 15.184.3.1.41024 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.129, agent-id 2, seqnum 211307, uptime 2441326343, samples 3, length 568
+ expanded counter sample (4), length 172, seqnum 81390, type 0, idx 40, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 40, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 38989430, unicast pkts 0, multicast pkts 162755, broadcast pkts 3, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2802182351, unicast pkts 56820, multicast pkts 165686, broadcast pkts 1814332502, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 81138, type 0, idx 41, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 41, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 46653626, unicast pkts 85863, multicast pkts 27682, broadcast pkts 478300, discards 0
+ In errors 0, unknown protos 0
+ Out octets 311406364, unicast pkts 80002, multicast pkts 1261847, broadcast pkts 1178283, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 81376, type 0, idx 50, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 50, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 2331728577, unicast pkts 108446058, multicast pkts 81380, broadcast pkts 1837, discards 0
+ In errors 0, unknown protos 0
+ Out octets 330353971, unicast pkts 160483289, multicast pkts 1588895, broadcast pkts 1448152, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 254, id 50953, offset 0, flags [none], proto UDP (17), length 956)
+ 168.87.240.3.50340 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.129, agent-id 6, seqnum 444098, uptime 127118529, samples 5, length 928
+ expanded counter sample (4), length 172, seqnum 147400, type 0, idx 60, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 60, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 72510805, unicast pkts 0, multicast pkts 294749, broadcast pkts 0, discards 0
+ In errors 0, unknown protos 0
+ Out octets 123866349, unicast pkts 13446, multicast pkts 736973, broadcast pkts 117224, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 147400, type 0, idx 61, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 61, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 72511166, unicast pkts 0, multicast pkts 294750, broadcast pkts 0, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2101933816, unicast pkts 33990, multicast pkts 368505, broadcast pkts 42768255, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 147400, type 0, idx 62, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 62, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 89171611, unicast pkts 5392, multicast pkts 294750, broadcast pkts 49641, discards 0
+ In errors 0, unknown protos 0
+ Out octets 124086999, unicast pkts 11982, multicast pkts 736973, broadcast pkts 117224, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 147400, type 0, idx 63, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 63, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 71037120, unicast pkts 0, multicast pkts 294748, broadcast pkts 0, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2101596784, unicast pkts 29476, multicast pkts 368505, broadcast pkts 42768255, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 147400, type 0, idx 64, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 64, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 71037922, unicast pkts 0, multicast pkts 294751, broadcast pkts 0, discards 0
+ In errors 0, unknown protos 0
+ Out octets 123494040, unicast pkts 7500, multicast pkts 736973, broadcast pkts 117224, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 27101, offset 0, flags [none], proto UDP (17), length 1136)
+ 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, seqnum 10354086, uptime 15618312, samples 6, length 1108
+ expanded counter sample (4), length 172, seqnum 2007421, type 0, idx 29, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 29, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 82208831, unicast pkts 403685, multicast pkts 1054, broadcast pkts 8246, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4103781979, unicast pkts 294994, multicast pkts 2198185, broadcast pkts 48352457, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007311, type 0, idx 30, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 30, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 92569896, unicast pkts 433051, multicast pkts 1312, broadcast pkts 12292, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4037227515, unicast pkts 268387, multicast pkts 2197973, broadcast pkts 48326301, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2018134, type 0, idx 50, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 50, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1215684621, unicast pkts 3179986010, multicast pkts 4299773, broadcast pkts 2959481171, discards 0
+ In errors 0, unknown protos 0
+ Out octets 832983248, unicast pkts 684975702, multicast pkts 1115367, broadcast pkts 45280648, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 1221174, type 0, idx 51, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 51, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 576720530, unicast pkts 537564819, multicast pkts 1613151, broadcast pkts 660268633, discards 0
+ In errors 0, unknown protos 0
+ Out octets 428264565, unicast pkts 1068854786, multicast pkts 344705, broadcast pkts 9140809, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 1221287, type 0, idx 52, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 52, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3028289271, unicast pkts 458255786, multicast pkts 651461, broadcast pkts 541454, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3361225808, unicast pkts 1109386475, multicast pkts 163507, broadcast pkts 8683, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 1221183, type 0, idx 53, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 53, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 2050689076, unicast pkts 476082627, multicast pkts 164214, broadcast pkts 21756786, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2159078261, unicast pkts 1043897297, multicast pkts 163510, broadcast pkts 210489, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 62, id 0, offset 0, flags [DF], proto UDP (17), length 452)
+ 15.184.13.248.50229 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.13.52, agent-id 100, seqnum 26626, uptime 798762000, samples 1, length 424
+ counter sample (2), length 388, seqnum 26626, type 2, idx 1, records 6
+ enterprise 0, Unknown (2001) length 36
+ 0x0000: 0000 0002 0000 0002 0000 0001 d485 64cc
+ 0x0010: 6024 0000 0000 0003 0000 0001 d485 64cc
+ 0x0020: 6025 0000
+ enterprise 0, Unknown (2005) length 52
+ 0x0000: 0000 0018 3daa e800 0000 0016 50cb 8000
+ 0x0010: 0000 07e5 0000 bac1 0000 0000 29ac 2400
+ 0x0020: 0003 3cc1 0044 1f88 0000 000c eeff 1000
+ 0x0030: 0011 78ce
+ enterprise 0, Unknown (2004) length 72
+ 0x0000: 0000 0003 caa6 5000 0000 0003 9dc3 3000
+ 0x0010: 0000 0000 0000 0000 0000 0000 0a33 d000
+ 0x0020: 0000 0000 1a2a 4000 0000 0000 7ff5 6000
+ 0x0030: 0000 0000 7ff5 6000 0005 3fea 019d dfe2
+ 0x0040: 0000 0000 0000 0000
+ enterprise 0, Unknown (2003) length 68
+ 0x0000: 0000 0000 0000 0000 0000 0000 0000 0001
+ 0x0010: 0000 0153 0000 0018 0000 0640 000c 3077
+ 0x0020: 0033 efdc 0000 02da 0015 f7b6 7652 2a4a
+ 0x0030: 0002 204c 0000 36ba 0001 458c 306c a669
+ 0x0040: e653 ddf6
+ enterprise 0, Unknown (2006) length 40
+ 0x0000: 0000 0000 2550 2198 005a d481 0000 0000
+ 0x0010: 0000 0000 0000 0000 1a2e 15ef 002a 4d2a
+ 0x0020: 0000 0000 0000 0000
+ enterprise 0, Unknown (2000) length 60
+ 0x0000: 0000 000a 7573 6530 3337 3130 6666 0000
+ 0x0010: 3431 3036 3630 5355 4530 3337 3130 4646
+ 0x0020: 0000 0003 0000 0002 0000 000e 322e 362e
+ 0x0030: 3138 2d31 3934 2e65 6c35 0000
+IP (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto UDP (17), length 100)
+ 168.87.240.1.40000 > 15.184.3.9.6343: sFlow version 327681 packet not supported
+IP (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto UDP (17), length 148)
+ 168.87.240.1.40000 > 15.184.3.9.6343: sFlow version 327682 packet not supported
+IP (tos 0x0, ttl 254, id 8886, offset 0, flags [none], proto UDP (17), length 100)
+ 168.87.240.1.40000 > 15.184.3.9.6343: sFlow version 327681 packet not supported
+IP (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto UDP (17), length 148)
+ 168.87.240.2.40000 > 15.184.3.9.6343: sFlow version 327682 packet not supported
+IP (tos 0x0, ttl 254, id 50954, offset 0, flags [none], proto UDP (17), length 596)
+ 168.87.240.3.50340 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.129, agent-id 6, seqnum 444099, uptime 127119529, samples 3, length 568
+ expanded counter sample (4), length 172, seqnum 147400, type 0, idx 65, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 65, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 71855431, unicast pkts 5778, multicast pkts 294751, broadcast pkts 0, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2102528585, unicast pkts 40099, multicast pkts 368505, broadcast pkts 42768255, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 147400, type 0, idx 66, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 66, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 1, adminstatus: up, operstatus: down
+ In octets 25177702, unicast pkts 0, multicast pkts 104472, broadcast pkts 4, discards 0
+ In errors 0, unknown protos 0
+ Out octets 39878920, unicast pkts 4387, multicast pkts 261178, broadcast pkts 1, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 147400, type 0, idx 67, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 67, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 1, adminstatus: up, operstatus: down
+ In octets 25284454, unicast pkts 0, multicast pkts 104859, broadcast pkts 4, discards 0
+ In errors 0, unknown protos 0
+ Out octets 31308450, unicast pkts 5841, multicast pkts 133252, broadcast pkts 299, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 12213, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, seqnum 10499687, uptime 12975660, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2007196, type 0, idx 1, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 1, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 2460750, unicast pkts 22544, multicast pkts 5, broadcast pkts 6408, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3991394888, unicast pkts 131978, multicast pkts 2198965, broadcast pkts 48358863, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2006746, type 0, idx 2, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 2, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 122196260, unicast pkts 82823825, multicast pkts 710, broadcast pkts 38540, discards 0
+ In errors 2, unknown protos 0
+ Out octets 3744715166, unicast pkts 93942161, multicast pkts 2218252, broadcast pkts 48317917, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 2, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007119, type 0, idx 3, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 3, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 87175881, unicast pkts 11173387, multicast pkts 1312, broadcast pkts 7310, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2575091711, unicast pkts 8663056, multicast pkts 1949260, broadcast pkts 8701202, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007649, type 0, idx 4, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 4, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3013639728, unicast pkts 424917338, multicast pkts 1216, broadcast pkts 196654, discards 0
+ In errors 0, unknown protos 0
+ Out octets 584569975, unicast pkts 294167698, multicast pkts 1948957, broadcast pkts 8512276, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 1832885, type 0, idx 5, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 5, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3835856598, unicast pkts 6812799, multicast pkts 1145, broadcast pkts 705277, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2182764482, unicast pkts 8284848, multicast pkts 2738770, broadcast pkts 7987023, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007140, type 0, idx 6, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 6, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 21722, unicast pkts 0, multicast pkts 12, broadcast pkts 37, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1874046630, unicast pkts 98496, multicast pkts 1955062, broadcast pkts 20311836, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2006987, type 0, idx 7, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 7, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3474926128, unicast pkts 10088201, multicast pkts 1463, broadcast pkts 14105, discards 0
+ In errors 0, unknown protos 0
+ Out octets 831378843, unicast pkts 12805926, multicast pkts 1954494, broadcast pkts 20293371, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 12214, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, seqnum 10499688, uptime 12975661, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2007115, type 0, idx 8, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 8, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3858988244, unicast pkts 13191097, multicast pkts 1215, broadcast pkts 24593, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2559232288, unicast pkts 16126546, multicast pkts 1954848, broadcast pkts 20284434, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007002, type 0, idx 9, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 9, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3386316332, unicast pkts 14360061, multicast pkts 1244, broadcast pkts 16485, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1675799221, unicast pkts 15790519, multicast pkts 1954451, broadcast pkts 20291230, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2005310, type 0, idx 10, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 10, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1558898282, unicast pkts 162603641, multicast pkts 1331, broadcast pkts 188407, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3568458900, unicast pkts 162582480, multicast pkts 1953553, broadcast pkts 20106785, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007257, type 0, idx 11, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 11, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 125808339, unicast pkts 691735, multicast pkts 2539, broadcast pkts 22184, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1249750181, unicast pkts 33020559, multicast pkts 2196657, broadcast pkts 48342104, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007179, type 0, idx 12, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 12, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 45949249, unicast pkts 205456, multicast pkts 1743, broadcast pkts 8308, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4019313234, unicast pkts 210496, multicast pkts 2197587, broadcast pkts 48353561, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007156, type 0, idx 13, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 13, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 32111027, unicast pkts 143922, multicast pkts 1193, broadcast pkts 5276, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4050797426, unicast pkts 198665, multicast pkts 2197850, broadcast pkts 48353779, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2006876, type 0, idx 14, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 14, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 19576, unicast pkts 19, multicast pkts 5, broadcast pkts 30, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3990801228, unicast pkts 107683, multicast pkts 2199048, broadcast pkts 48364452, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 12215, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, seqnum 10499689, uptime 12975663, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2007175, type 0, idx 15, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 15, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 96700793, unicast pkts 453020, multicast pkts 2568, broadcast pkts 22804, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4042743345, unicast pkts 379591, multicast pkts 2196676, broadcast pkts 48338646, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007086, type 0, idx 16, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 16, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 289703711, unicast pkts 1654844, multicast pkts 37302, broadcast pkts 22784, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4098637095, unicast pkts 801788, multicast pkts 2166613, broadcast pkts 48320960, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007172, type 0, idx 17, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 17, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 45204461, unicast pkts 194096, multicast pkts 1700, broadcast pkts 8788, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4014792810, unicast pkts 198133, multicast pkts 2197652, broadcast pkts 48351768, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007170, type 0, idx 18, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 18, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 95210366, unicast pkts 443561, multicast pkts 2169, broadcast pkts 24997, discards 0
+ In errors 0, unknown protos 0
+ Out octets 4035379503, unicast pkts 332327, multicast pkts 2196767, broadcast pkts 48336027, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007265, type 0, idx 19, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 19, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1379521296, unicast pkts 50010620, multicast pkts 1046, broadcast pkts 48921, discards 0
+ In errors 0, unknown protos 0
+ Out octets 435976335, unicast pkts 57993600, multicast pkts 2197958, broadcast pkts 48315375, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007258, type 0, idx 20, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 20, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 312017292, unicast pkts 47238597, multicast pkts 1476, broadcast pkts 23377, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3242136708, unicast pkts 57532634, multicast pkts 2198069, broadcast pkts 48339981, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2009605, type 0, idx 21, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 21, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 4127607826, unicast pkts 29906144, multicast pkts 1233, broadcast pkts 69575, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2091792747, unicast pkts 3024931093, multicast pkts 2198065, broadcast pkts 48294332, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 12216, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, seqnum 10499690, uptime 12975664, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2007105, type 0, idx 22, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 22, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 124432239, unicast pkts 511115, multicast pkts 21969, broadcast pkts 120004, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3066166092, unicast pkts 2595939, multicast pkts 2177143, broadcast pkts 48244891, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2008569, type 0, idx 23, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 23, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 142412715, unicast pkts 4067695849, multicast pkts 1301, broadcast pkts 59350, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3335716564, unicast pkts 2083658988, multicast pkts 2198160, broadcast pkts 48304443, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2009650, type 0, idx 24, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 24, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1376243919, unicast pkts 42736656, multicast pkts 1161, broadcast pkts 37177, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3949008841, unicast pkts 3045234063, multicast pkts 2197974, broadcast pkts 48326808, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2009622, type 0, idx 25, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 25, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1314601210, unicast pkts 4258058414, multicast pkts 1154, broadcast pkts 42425, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2836953588, unicast pkts 2986750860, multicast pkts 2197982, broadcast pkts 48321714, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007194, type 0, idx 26, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 26, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 2022052468, unicast pkts 13527038, multicast pkts 933, broadcast pkts 57921, discards 0
+ In errors 0, unknown protos 0
+ Out octets 620629707, unicast pkts 19469425, multicast pkts 2198358, broadcast pkts 48305869, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007254, type 0, idx 27, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 27, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3262458931, unicast pkts 47684835, multicast pkts 1039, broadcast pkts 5299, discards 0
+ In errors 3, unknown protos 0
+ Out octets 3900626480, unicast pkts 54120142, multicast pkts 2198706, broadcast pkts 48356894, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 2, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2005149, type 0, idx 28, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 28, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 259120552, unicast pkts 1107924, multicast pkts 198, broadcast pkts 3429, discards 0
+ In errors 2, unknown protos 0
+ Out octets 653805810, unicast pkts 4189777, multicast pkts 2198871, broadcast pkts 48346830, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 2, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 12217, offset 0, flags [none], proto UDP (17), length 1136)
+ 15.184.1.195.4942 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.195, agent-id 1, seqnum 10499691, uptime 12975801, samples 6, length 1108
+ expanded counter sample (4), length 172, seqnum 2007269, type 0, idx 29, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 29, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1267844166, unicast pkts 49781127, multicast pkts 1368, broadcast pkts 40480, discards 0
+ In errors 0, unknown protos 0
+ Out octets 321243842, unicast pkts 57718818, multicast pkts 2197767, broadcast pkts 48323189, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2009634, type 0, idx 30, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 30, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1960827113, unicast pkts 4258067543, multicast pkts 1249, broadcast pkts 60280, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3144893898, unicast pkts 3032873251, multicast pkts 2198370, broadcast pkts 48301571, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2017265, type 0, idx 50, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 50, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 4161963799, unicast pkts 3263163886, multicast pkts 1151176, broadcast pkts 287880331, discards 0
+ In errors 0, unknown protos 0
+ Out octets 296849779, unicast pkts 1684325936, multicast pkts 1126235, broadcast pkts 1405132663, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2017180, type 0, idx 51, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 51, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 2214905605, unicast pkts 2466386895, multicast pkts 5276601, broadcast pkts 1225128676, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3025945518, unicast pkts 2183065991, multicast pkts 899419, broadcast pkts 2308600565, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 1220660, type 0, idx 52, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 52, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3618900052, unicast pkts 334487763, multicast pkts 651947, broadcast pkts 3712423535, discards 0
+ In errors 1, unknown protos 0
+ Out octets 697413100, unicast pkts 537120139, multicast pkts 163886, broadcast pkts 4083094099, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 1, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 1
+ expanded counter sample (4), length 172, seqnum 1220563, type 0, idx 53, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 53, iftype 117, ifspeed 10000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 851211409, unicast pkts 325440450, multicast pkts 164171, broadcast pkts 21946046, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1855403849, unicast pkts 517660679, multicast pkts 163669, broadcast pkts 21301, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 27102, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, seqnum 10354087, uptime 15619401, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2007460, type 0, idx 1, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 1, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 398, unicast pkts 0, multicast pkts 5, broadcast pkts 0, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3980656605, unicast pkts 65082, multicast pkts 2199480, broadcast pkts 48372199, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007456, type 0, idx 2, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 2, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1444442513, unicast pkts 69372226, multicast pkts 1207, broadcast pkts 31114, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1845546441, unicast pkts 41823689, multicast pkts 2201740, broadcast pkts 48335077, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007397, type 0, idx 3, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 3, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 200763454, unicast pkts 891785, multicast pkts 982, broadcast pkts 13320, discards 0
+ In errors 1, unknown protos 0
+ Out octets 3317395016, unicast pkts 5225674, multicast pkts 1949791, broadcast pkts 8711770, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 1, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007403, type 0, idx 4, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 4, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 165801154, unicast pkts 662297, multicast pkts 491, broadcast pkts 15752, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2164450538, unicast pkts 1115261, multicast pkts 1949901, broadcast pkts 8709518, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 1993493, type 0, idx 5, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 5, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 198991268, unicast pkts 941829, multicast pkts 664, broadcast pkts 33726, discards 0
+ In errors 1, unknown protos 0
+ Out octets 4052534333, unicast pkts 2591418, multicast pkts 1994963, broadcast pkts 8691000, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 1, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 1, frames too long 0, mac receive errors 0, symbol errors 1
+ expanded counter sample (4), length 172, seqnum 2007738, type 0, idx 6, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 6, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 561751280, unicast pkts 575605209, multicast pkts 1250, broadcast pkts 15322854, discards 0
+ In errors 1, unknown protos 0
+ Out octets 1513354003, unicast pkts 602598577, multicast pkts 1954404, broadcast pkts 4990182, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2008404, type 0, idx 7, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 7, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 3193665262, unicast pkts 642460773, multicast pkts 1401, broadcast pkts 219742, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2913194494, unicast pkts 390983681, multicast pkts 1955407, broadcast pkts 20090614, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+IP (tos 0x0, ttl 253, id 27103, offset 0, flags [none], proto UDP (17), length 1316)
+ 15.184.1.194.3099 > 15.184.3.9.6343: sFlowv5, IPv4 agent 15.184.1.194, agent-id 1, seqnum 10354088, uptime 15619403, samples 7, length 1288
+ expanded counter sample (4), length 172, seqnum 2008395, type 0, idx 8, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 8, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1089063112, unicast pkts 559652885, multicast pkts 634, broadcast pkts 224712, discards 0
+ In errors 0, unknown protos 0
+ Out octets 3489201351, unicast pkts 383200930, multicast pkts 1955795, broadcast pkts 20085990, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2008430, type 0, idx 9, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 9, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 2436646808, unicast pkts 568003495, multicast pkts 906, broadcast pkts 16545, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1717246599, unicast pkts 389888234, multicast pkts 1955669, broadcast pkts 20294137, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2005879, type 0, idx 10, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 10, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 105616289, unicast pkts 531333, multicast pkts 768, broadcast pkts 9159, discards 0
+ In errors 0, unknown protos 0
+ Out octets 10387728, unicast pkts 2209569, multicast pkts 1954606, broadcast pkts 20288651, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007662, type 0, idx 11, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 11, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1801371574, unicast pkts 137590493, multicast pkts 2109, broadcast pkts 55528, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1769141617, unicast pkts 113363676, multicast pkts 2197521, broadcast pkts 48315560, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007553, type 0, idx 12, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 12, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 4201581256, unicast pkts 45842890, multicast pkts 1610, broadcast pkts 22730, discards 0
+ In errors 0, unknown protos 0
+ Out octets 1948082196, unicast pkts 53163690, multicast pkts 2198297, broadcast pkts 48348226, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2007541, type 0, idx 13, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 13, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 1019109063, unicast pkts 46613839, multicast pkts 1236, broadcast pkts 22226, discards 0
+ In errors 0, unknown protos 0
+ Out octets 2052469045, unicast pkts 53287225, multicast pkts 2198499, broadcast pkts 48348754, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 0, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
+ expanded counter sample (4), length 172, seqnum 2010425, type 0, idx 14, records 2
+ enterprise 0, Generic counter (1) length 88
+ ifindex 14, iftype 117, ifspeed 1000000000, ifdirection 1 (full-duplex)
+ ifstatus 3, adminstatus: up, operstatus: up
+ In octets 36138805, unicast pkts 2267783883, multicast pkts 298, broadcast pkts 38306126, discards 0
+ In errors 2, unknown protos 0
+ Out octets 614425293, unicast pkts 2014274284, multicast pkts 2199305, broadcast pkts 10065409, discards 0
+ Out errors 0, promisc mode 2
+ enterprise 0, Ethernet counter (2) length 52
+ align errors 0, fcs errors 2, single collision 0, multiple collision 0, test error 0
+ deferred 0, late collision 0, excessive collision 0, mac trans error 0
+ carrier error 0, frames too long 0, mac receive errors 0, symbol errors 0
--- /dev/null
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, L1 LSP, lsp-id 2222.2222.2222.00-00, seq 0x0000000f, lifetime 1200s, length 149
+IS-IS, L1 PSNP, src-id 8888.8888.8888.00, length 35
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, L1 LSP, lsp-id 2222.2222.2222.00-00, seq 0x00000010, lifetime 1200s, length 149
+IS-IS, L1 PSNP, src-id 8888.8888.8888.00, length 35
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
+IS-IS, p2p IIH, src-id 2222.2222.2222, length 1492
+IS-IS, p2p IIH, src-id 8888.8888.8888, length 1492
--- /dev/null
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
+STP 802.1aq, Rapid STP, CIST Flags [Learn, Forward], length 205
--- /dev/null
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
+STP 802.1d, Config, Flags [none], bridge-id 8001.00:19:06:ea:b8:80.8005, length 43
+ message-age 0.00s, max-age 20.00s, hello-time 2.00s, forwarding-delay 15.00s
+ root-id 8001.00:19:06:ea:b8:80, root-pathcost 0
--- /dev/null
+IP (tos 0x0, ttl 64, id 30929, offset 0, flags [DF], proto UDP (17), length 79)
+ 10.0.0.20.47565 > 10.0.0.72.514: SYSLOG, length: 51
+ Facility kernel (0), Severity notice (5)
+ Msg: Sep 12 19:16:12 through logger: test message 21\0x00
+IP (tos 0x0, ttl 64, id 37393, offset 0, flags [DF], proto UDP (17), length 79)
+ 10.0.0.20.33884 > 10.0.0.72.514: SYSLOG, length: 51
+ Facility user (1), Severity alert (1)
+ Msg: Sep 12 19:16:18 through logger: test message 22\0x00
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 107)
+ 10.0.0.20.52693 > 10.0.0.71.514: SYSLOG, length: 79
+ Facility user (1), Severity notice (5)
+ Msg: 2013-09-12T19:16:34.457849+04:00 localhost through rsyslog: test message 23
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 106)
+ 10.0.0.20.52693 > 10.0.0.71.514: SYSLOG, length: 78
+ Facility user (1), Severity alert (1)
+ Msg: 2013-09-12T19:16:43.513746+04:00 localhost through rsyslog: test message 24
--- /dev/null
+IP 192.168.0.100.13047 > 3.3.3.3.13054: Flags [S], seq 218476388, win 1400, options [exp-tfo cookiereq], length 0
+IP 9.9.9.9.13047 > 3.3.3.3.13054: Flags [S], seq 218476388, win 1400, options [mss 1460,exp-tfo cookiereq], length 0
+IP 3.3.3.3.13054 > 9.9.9.9.13047: Flags [S.], seq 4035392501, ack 218476389, win 1400, options [exp-tfo cookie 090909090000,nop,nop], length 0
+IP 3.3.3.3.13054 > 192.168.0.100.13047: Flags [S.], seq 4035392501, ack 218476389, win 1400, options [mss 1500,exp-tfo cookie 090909090000,nop,nop], length 0
+IP 192.168.0.100.13047 > 3.3.3.3.13054: Flags [.], ack 1, win 1400, length 0
+IP 9.9.9.9.13047 > 3.3.3.3.13054: Flags [.], ack 1, win 1400, length 0
+IP 192.168.0.100.13047 > 3.3.3.3.13054: Flags [F.], seq 1, ack 1, win 1400, length 0
+IP 9.9.9.9.13047 > 3.3.3.3.13054: Flags [F.], seq 1, ack 1, win 1400, length 0
+IP 3.3.3.3.13054 > 9.9.9.9.13047: Flags [F.], seq 1, ack 2, win 1400, length 0
+IP 3.3.3.3.13054 > 192.168.0.100.13047: Flags [F.], seq 1, ack 2, win 1400, length 0
+IP 192.168.0.100.13047 > 3.3.3.3.13054: Flags [.], ack 2, win 1400, length 0
+IP 9.9.9.9.13047 > 3.3.3.3.13054: Flags [.], ack 2, win 1400, length 0
+IP 192.168.0.100.13048 > 3.3.3.3.13054: Flags [S], seq 936732547:936732551, win 1400, options [exp-tfo cookie 090909090000,nop,nop], length 4
+IP 192.168.0.100.13048 > 3.3.3.3.13054: Flags [F.], seq 936732552, ack 0, win 1400, length 0
--- /dev/null
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x03), length 60
+ Checksum 0x6d85 (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 4,
+ Message Interval TLV (0x0004) TLV, length 1, 7s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 1
+UDLDv1, Code Echo message (2), Flags [RT] (0x00), length 80
+ Checksum 0x805d (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 7s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 1
+UDLDv1, Code Echo message (2), Flags [RT] (0x00), length 80
+ Checksum 0x805e (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 7s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 1
+UDLDv1, Code Echo message (2), Flags [RT] (0x00), length 80
+ Checksum 0x805c (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 7s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 2
+UDLDv1, Code Echo message (2), Flags [RT] (0x00), length 80
+ Checksum 0x805d (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 7s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 2
+UDLDv1, Code Echo message (2), Flags [RT] (0x00), length 80
+ Checksum 0x805b (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 7s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 3
+UDLDv1, Code Echo message (2), Flags [RT] (0x00), length 80
+ Checksum 0x805c (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 7s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 3
+UDLDv1, Code Echo message (2), Flags [RT] (0x00), length 80
+ Checksum 0x805a (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 7s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 4
+UDLDv1, Code Echo message (2), Flags [RT] (0x00), length 80
+ Checksum 0x805b (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 7s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 4
+UDLDv1, Code Echo message (2), Flags [RT] (0x00), length 80
+ Checksum 0x8059 (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 7s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 5
+UDLDv1, Code Echo message (2), Flags [RT] (0x00), length 80
+ Checksum 0x805a (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 7s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 5
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x795c (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 1
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x795d (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 1
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x795b (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 2
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x795c (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 2
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x795a (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 3
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x795b (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 3
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x7959 (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 4
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x795a (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 4
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x7958 (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 5
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x7959 (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 5
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x7957 (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 6
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x7958 (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 6
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x7956 (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 7
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x7957 (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 7
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x7955 (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 8
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x7956 (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 8
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x7954 (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1025X4W3
+ Port-ID TLV (0x0002) TLV, length 5, Fa0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S2
+ Sequence Number TLV (0x0007) TLV, length 4, 9
+UDLDv1, Code Probe message (1), Flags [RT, RSY] (0x01), length 80
+ Checksum 0x7955 (unverified)
+ Device-ID TLV (0x0001) TLV, length 11, FOC1031Z7JG
+ Port-ID TLV (0x0002) TLV, length 5, Gi0/1
+ Echo TLV (0x0003) TLV, length 24,
+ Message Interval TLV (0x0004) TLV, length 1, 15s
+ Timeout Interval TLV (0x0005) TLV, length 1, 5s
+ Device Name TLV (0x0006) TLV, length 2, S1
+ Sequence Number TLV (0x0007) TLV, length 4, 9
--- /dev/null
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.91 > 224.0.0.18: vrrp 10.0.0.91 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 191, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.91 > 224.0.0.18: vrrp 10.0.0.91 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 191, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.91 > 224.0.0.18: vrrp 10.0.0.91 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 191, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.91 > 224.0.0.18: vrrp 10.0.0.91 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 191, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.91 > 224.0.0.18: vrrp 10.0.0.91 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 191, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe66:cf60 > ff02::12: ip-proto-112 40
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe66:cf60 > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.91 > 224.0.0.18: vrrp 10.0.0.91 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 191, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.91 > 224.0.0.18: vrrp 10.0.0.91 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 191, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.91 > 224.0.0.18: vrrp 10.0.0.91 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 191, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe66:cf60 > ff02::12: ip-proto-112 88
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe66:cf60 > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.91 > 224.0.0.18: vrrp 10.0.0.91 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 191, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.92 > 224.0.0.18: vrrp 10.0.0.92 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 192, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.92 > 224.0.0.18: vrrp 10.0.0.92 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 192, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.92 > 224.0.0.18: vrrp 10.0.0.92 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 192, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe66:cf60 > ff02::12: ip-proto-112 40
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe66:cf60 > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.92 > 224.0.0.18: vrrp 10.0.0.92 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 192, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.92 > 224.0.0.18: vrrp 10.0.0.92 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 192, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.92 > 224.0.0.18: vrrp 10.0.0.92 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 192, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe72:b1da > ff02::12: ip-proto-112 88
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe72:b1da > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.92 > 224.0.0.18: vrrp 10.0.0.92 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 192, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.92 > 224.0.0.18: vrrp 10.0.0.92 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 192, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.92 > 224.0.0.18: vrrp 10.0.0.92 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 192, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe72:b1da > ff02::12: ip-proto-112 40
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe72:b1da > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.93 > 224.0.0.18: vrrp 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 193, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.93 > 224.0.0.18: vrrp 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 193, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.93 > 224.0.0.18: vrrp 10.0.0.93 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 193, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe72:b1da > ff02::12: ip-proto-112 88
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe72:b1da > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.93 > 224.0.0.18: vrrp 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 193, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.93 > 224.0.0.18: vrrp 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 193, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 88
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.93 > 224.0.0.18: vrrp 10.0.0.93 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 193, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.93 > 224.0.0.18: vrrp 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 193, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.93 > 224.0.0.18: vrrp 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 193, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 88
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.93 > 224.0.0.18: vrrp 10.0.0.93 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 193, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.93 > 224.0.0.18: vrrp 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 193, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.93 > 224.0.0.18: vrrp 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 193, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 88
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.93 > 224.0.0.18: vrrp 10.0.0.93 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 193, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 194, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 194, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 194, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 88
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 194, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 194, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 194, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 194, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 194, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 194, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 40
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 194, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 194, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 194, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 194, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 194, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.94 > 224.0.0.18: vrrp 10.0.0.94 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 194, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 40
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.95 > 224.0.0.18: vrrp 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 195, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.95 > 224.0.0.18: vrrp 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 195, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.95 > 224.0.0.18: vrrp 10.0.0.95 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 195, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 40
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.95 > 224.0.0.18: vrrp 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 195, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.95 > 224.0.0.18: vrrp 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 195, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.95 > 224.0.0.18: vrrp 10.0.0.95 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 195, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 40
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.95 > 224.0.0.18: vrrp 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 195, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.95 > 224.0.0.18: vrrp 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 195, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.95 > 224.0.0.18: vrrp 10.0.0.95 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 195, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.95 > 224.0.0.18: vrrp 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 195, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.95 > 224.0.0.18: vrrp 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 195, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.95 > 224.0.0.18: vrrp 10.0.0.95 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 195, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 40
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 196, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 196, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 196, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 40
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 196, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 196, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 196, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 196, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 196, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 196, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 196, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 196, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 196, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 196, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 196, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.96 > 224.0.0.18: vrrp 10.0.0.96 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 196, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 40
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP6 (hlim 255, next-header VRRP (112) payload length: 40) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 36)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16, addrs(2): 10.4.44.100,10.4.44.200
+IP6 (hlim 255, next-header VRRP (112) payload length: 88) fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 48)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28, addrs(3): 10.4.42.1,10.4.42.2,10.4.42.3 auth "abcdefgh"
+IP (tos 0x0, ttl 255, id 4660, offset 0, flags [none], proto VRRP (112), length 40)
+ 10.0.0.97 > 224.0.0.18: vrrp 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20, addrs: 10.4.43.150
--- /dev/null
+IP 10.0.0.91 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 191, authtype simple, intvl 10s, length 28
+IP 10.0.0.91 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 191, authtype none, intvl 10s, length 20
+IP 10.0.0.91 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 191, intvl 1000cs, length 16
+IP 10.0.0.91 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 191, authtype simple, intvl 10s, length 28
+IP 10.0.0.91 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 191, authtype none, intvl 10s, length 20
+IP6 fe80::d6ca:6dff:fe66:cf60 > ff02::12: ip-proto-112 40
+IP6 fe80::d6ca:6dff:fe66:cf60 > ff02::12: ip-proto-112 88
+IP 10.0.0.91 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 191, intvl 1000cs, length 16
+IP 10.0.0.91 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 191, authtype simple, intvl 10s, length 28
+IP 10.0.0.91 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 191, authtype none, intvl 10s, length 20
+IP6 fe80::d6ca:6dff:fe66:cf60 > ff02::12: ip-proto-112 88
+IP6 fe80::d6ca:6dff:fe66:cf60 > ff02::12: ip-proto-112 40
+IP 10.0.0.91 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 191, intvl 1000cs, length 16
+IP 10.0.0.92 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 192, authtype simple, intvl 10s, length 28
+IP 10.0.0.92 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 192, authtype none, intvl 10s, length 20
+IP 10.0.0.92 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 192, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe66:cf60 > ff02::12: ip-proto-112 40
+IP6 fe80::d6ca:6dff:fe66:cf60 > ff02::12: ip-proto-112 88
+IP 10.0.0.92 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 192, authtype simple, intvl 10s, length 28
+IP 10.0.0.92 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 192, authtype none, intvl 10s, length 20
+IP 10.0.0.92 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 192, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe72:b1da > ff02::12: ip-proto-112 88
+IP6 fe80::d6ca:6dff:fe72:b1da > ff02::12: ip-proto-112 40
+IP 10.0.0.92 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 192, authtype simple, intvl 10s, length 28
+IP 10.0.0.92 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 192, authtype none, intvl 10s, length 20
+IP 10.0.0.92 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 192, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe72:b1da > ff02::12: ip-proto-112 40
+IP6 fe80::d6ca:6dff:fe72:b1da > ff02::12: ip-proto-112 88
+IP 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 193, authtype simple, intvl 10s, length 28
+IP 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 193, authtype none, intvl 10s, length 20
+IP 10.0.0.93 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 193, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe72:b1da > ff02::12: ip-proto-112 88
+IP6 fe80::d6ca:6dff:fe72:b1da > ff02::12: ip-proto-112 40
+IP 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 193, authtype simple, intvl 10s, length 28
+IP 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 193, authtype none, intvl 10s, length 20
+IP6 fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 88
+IP6 fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 40
+IP 10.0.0.93 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 193, intvl 1000cs, length 16
+IP 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 193, authtype simple, intvl 10s, length 28
+IP 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 193, authtype none, intvl 10s, length 20
+IP6 fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 88
+IP6 fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 40
+IP 10.0.0.93 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 193, intvl 1000cs, length 16
+IP 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 193, authtype none, intvl 10s, length 20
+IP 10.0.0.93 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 193, authtype simple, intvl 10s, length 28
+IP6 fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 88
+IP6 fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 40
+IP 10.0.0.93 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 193, intvl 1000cs, length 16
+IP 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 194, authtype simple, intvl 10s, length 28
+IP 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 194, authtype none, intvl 10s, length 20
+IP 10.0.0.94 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 194, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 88
+IP6 fe80::d6ca:6dff:fe66:cf65 > ff02::12: ip-proto-112 40
+IP 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 194, authtype simple, intvl 10s, length 28
+IP 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 194, authtype none, intvl 10s, length 20
+IP6 fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 40
+IP 10.0.0.94 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 194, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 88
+IP 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 194, authtype simple, intvl 10s, length 28
+IP 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 194, authtype none, intvl 10s, length 20
+IP 10.0.0.94 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 194, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 40
+IP6 fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 88
+IP 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 194, authtype simple, intvl 10s, length 28
+IP 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 194, authtype none, intvl 10s, length 20
+IP6 fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 40
+IP 10.0.0.94 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 194, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 88
+IP 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 194, authtype simple, intvl 10s, length 28
+IP 10.0.0.94 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 194, authtype none, intvl 10s, length 20
+IP 10.0.0.94 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 194, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 40
+IP6 fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 88
+IP 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 195, authtype simple, intvl 10s, length 28
+IP 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 195, authtype none, intvl 10s, length 20
+IP 10.0.0.95 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 195, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 40
+IP6 fe80::d6ca:6dff:fe65:d45c > ff02::12: ip-proto-112 88
+IP 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 195, authtype simple, intvl 10s, length 28
+IP 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 195, authtype none, intvl 10s, length 20
+IP 10.0.0.95 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 195, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 40
+IP6 fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 88
+IP 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 195, authtype simple, intvl 10s, length 28
+IP 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 195, authtype none, intvl 10s, length 20
+IP6 fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 40
+IP 10.0.0.95 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 195, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 88
+IP 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 195, authtype simple, intvl 10s, length 28
+IP 10.0.0.95 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 195, authtype none, intvl 10s, length 20
+IP 10.0.0.95 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 195, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 40
+IP6 fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 88
+IP 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 196, authtype simple, intvl 10s, length 28
+IP 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 196, authtype none, intvl 10s, length 20
+IP 10.0.0.96 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 196, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 40
+IP6 fe80::d6ca:6dff:fe65:d46b > ff02::12: ip-proto-112 88
+IP 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 196, authtype simple, intvl 10s, length 28
+IP 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 196, authtype none, intvl 10s, length 20
+IP6 fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 40
+IP 10.0.0.96 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 196, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 88
+IP 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 196, authtype simple, intvl 10s, length 28
+IP 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 196, authtype none, intvl 10s, length 20
+IP6 fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 40
+IP 10.0.0.96 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 196, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 88
+IP 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 196, authtype none, intvl 10s, length 20
+IP 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 196, authtype simple, intvl 10s, length 28
+IP6 fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 40
+IP 10.0.0.96 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 196, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 88
+IP 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 196, authtype simple, intvl 10s, length 28
+IP 10.0.0.96 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 196, authtype none, intvl 10s, length 20
+IP6 fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 40
+IP 10.0.0.96 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 196, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 88
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20
+IP 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16
+IP6 fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 40
+IP6 fe80::d6ca:6dff:fe72:b1e4 > ff02::12: ip-proto-112 88
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 40
+IP 10.0.0.97 > 224.0.0.18: VRRPv3, Advertisement, vrid 44, prio 197, intvl 1000cs, length 16
+IP6 fe80::20c:42ff:fe5e:c2dc > ff02::12: ip-proto-112 88
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 42, prio 197, authtype simple, intvl 10s, length 28
+IP 10.0.0.97 > 224.0.0.18: VRRPv2, Advertisement, vrid 43, prio 197, authtype none, intvl 10s, length 20
--- /dev/null
+IP (tos 0x0, ttl 64, id 17993, offset 0, flags [DF], proto TCP (6), length 60)
+ 127.0.0.1.55358 > 127.0.0.1.33000: Flags [S], cksum 0xfe30 (incorrect -> 0x1a9d), seq 2523978814, win 32792, options [mss 16396,sackOK,TS val 245537399 ecr 0,nop,wscale 7], length 0
+IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
+ 127.0.0.1.33000 > 127.0.0.1.55358: Flags [S.], cksum 0xfe30 (incorrect -> 0x31b6), seq 3988083230, ack 2523978815, win 32768, options [mss 16396,sackOK,TS val 245537399 ecr 245537399,nop,wscale 7], length 0
+IP (tos 0x0, ttl 64, id 17994, offset 0, flags [DF], proto TCP (6), length 52)
+ 127.0.0.1.55358 > 127.0.0.1.33000: Flags [.], cksum 0xfe28 (incorrect -> 0x19da), ack 1, win 257, options [nop,nop,TS val 245537399 ecr 245537399], length 0
+IP (tos 0x0, ttl 64, id 17995, offset 0, flags [DF], proto TCP (6), length 54)
+ 127.0.0.1.55358 > 127.0.0.1.33000: Flags [P.], cksum 0xfe2a (incorrect -> 0x18d0), seq 1:3, ack 1, win 257, options [nop,nop,TS val 245537399 ecr 245537399], length 2: ZMTP/1.0
+ frame flags+body (8-bit) length 1, flags 0x00 (-|-|-|-|-|-|-|-)
+IP (tos 0x0, ttl 64, id 51304, offset 0, flags [DF], proto TCP (6), length 52)
+ 127.0.0.1.33000 > 127.0.0.1.55358: Flags [.], cksum 0xfe28 (incorrect -> 0x19d9), ack 3, win 256, options [nop,nop,TS val 245537399 ecr 245537399], length 0
+IP (tos 0x0, ttl 64, id 51305, offset 0, flags [DF], proto TCP (6), length 54)
+ 127.0.0.1.33000 > 127.0.0.1.55358: Flags [P.], cksum 0xfe2a (incorrect -> 0x18cf), seq 1:3, ack 3, win 256, options [nop,nop,TS val 245537399 ecr 245537399], length 2: ZMTP/1.0
+ frame flags+body (8-bit) length 1, flags 0x00 (-|-|-|-|-|-|-|-)
+IP (tos 0x0, ttl 64, id 17996, offset 0, flags [DF], proto TCP (6), length 52)
+ 127.0.0.1.55358 > 127.0.0.1.33000: Flags [.], cksum 0xfe28 (incorrect -> 0x19d6), ack 3, win 257, options [nop,nop,TS val 245537399 ecr 245537399], length 0
+IP (tos 0x0, ttl 64, id 17997, offset 0, flags [DF], proto TCP (6), length 148)
+ 127.0.0.1.55358 > 127.0.0.1.33000: Flags [P.], cksum 0xfe88 (incorrect -> 0x11da), seq 3:99, ack 3, win 257, options [nop,nop,TS val 245537399 ecr 245537399], length 96: ZMTP/1.0
+ frame flags+body (8-bit) length 1, flags 0x01 (-|-|-|-|-|-|-|MORE)
+ frame flags+body (8-bit) length 93, flags 0x00 (-|-|-|-|-|-|-|-), first 92 byte(s) of body:
+ 0x0000: 5468 6973 2069 7320 6120 7368 6f72 7420 This.is.a.short.
+ 0x0010: 4153 4349 4920 6d65 7373 6167 6520 666f ASCII.message.fo
+ 0x0020: 6c6c 6f77 6564 2062 7920 6120 7368 6f72 llowed.by.a.shor
+ 0x0030: 7420 6269 6e61 7279 206d 6573 7361 6765 t.binary.message
+ 0x0040: 2061 6e64 2061 206c 6f6e 6765 7220 4153 .and.a.longer.AS
+ 0x0050: 4349 4920 6d65 7373 6167 652e CII.message.
+
+IP (tos 0x0, ttl 64, id 51306, offset 0, flags [DF], proto TCP (6), length 84)
+ 127.0.0.1.33000 > 127.0.0.1.55358: Flags [P.], cksum 0xfe48 (incorrect -> 0xc80f), seq 3:35, ack 99, win 256, options [nop,nop,TS val 245537399 ecr 245537399], length 32: ZMTP/1.0
+ frame flags+body (8-bit) length 1, flags 0x01 (-|-|-|-|-|-|-|MORE)
+ frame flags+body (8-bit) length 29, flags 0x00 (-|-|-|-|-|-|-|-), first 28 byte(s) of body:
+ 0x0000: 5468 6973 2069 7320 6120 7368 6f72 7420 This.is.a.short.
+ 0x0010: 4153 4349 4920 7265 706c 792e ASCII.reply.
+
+IP (tos 0x0, ttl 64, id 17998, offset 0, flags [DF], proto TCP (6), length 72)
+ 127.0.0.1.55358 > 127.0.0.1.33000: Flags [P.], cksum 0xfe3c (incorrect -> 0xcef8), seq 99:119, ack 35, win 257, options [nop,nop,TS val 245537399 ecr 245537399], length 20: ZMTP/1.0
+ frame flags+body (8-bit) length 1, flags 0x01 (-|-|-|-|-|-|-|MORE)
+ frame flags+body (8-bit) length 17, flags 0x00 (-|-|-|-|-|-|-|-), first 16 byte(s) of body:
+ 0x0000: 0001 0203 0405 0607 0809 0a0b 0c0d 0e0f ................
+
+IP (tos 0x0, ttl 64, id 51307, offset 0, flags [DF], proto TCP (6), length 84)
+ 127.0.0.1.33000 > 127.0.0.1.55358: Flags [P.], cksum 0xfe48 (incorrect -> 0xc7da), seq 35:67, ack 119, win 256, options [nop,nop,TS val 245537400 ecr 245537399], length 32: ZMTP/1.0
+ frame flags+body (8-bit) length 1, flags 0x01 (-|-|-|-|-|-|-|MORE)
+ frame flags+body (8-bit) length 29, flags 0x00 (-|-|-|-|-|-|-|-), first 28 byte(s) of body:
+ 0x0000: 5468 6973 2069 7320 6120 7368 6f72 7420 This.is.a.short.
+ 0x0010: 4153 4349 4920 7265 706c 792e ASCII.reply.
+
+IP (tos 0x0, ttl 64, id 17999, offset 0, flags [DF], proto TCP (6), length 603)
+ 127.0.0.1.55358 > 127.0.0.1.33000: Flags [P.], cksum 0x0050 (incorrect -> 0xafc1), seq 119:670, ack 67, win 257, options [nop,nop,TS val 245537400 ecr 245537400], length 551: ZMTP/1.0
+ frame flags+body (8-bit) length 1, flags 0x01 (-|-|-|-|-|-|-|MORE)
+ frame flags+body (64-bit) length 540, flags 0x00 (-|-|-|-|-|-|-|-), first 128 byte(s) of body:
+ 0x0000: 5468 6520 7175 6963 6b20 6272 6f77 6e20 The.quick.brown.
+ 0x0010: 666f 7820 6a75 6d70 7320 6f76 6572 2074 fox.jumps.over.t
+ 0x0020: 6865 206c 617a 7920 646f 672e 2054 6865 he.lazy.dog..The
+ 0x0030: 2071 7569 636b 2062 726f 776e 2066 6f78 .quick.brown.fox
+ 0x0040: 206a 756d 7073 206f 7665 7220 7468 6520 .jumps.over.the.
+ 0x0050: 6c61 7a79 2064 6f67 2e20 5468 6520 7175 lazy.dog..The.qu
+ 0x0060: 6963 6b20 6272 6f77 6e20 666f 7820 6a75 ick.brown.fox.ju
+ 0x0070: 6d70 7320 6f76 6572 2074 6865 206c 617a mps.over.the.laz
+
+IP (tos 0x0, ttl 64, id 51308, offset 0, flags [DF], proto TCP (6), length 84)
+ 127.0.0.1.33000 > 127.0.0.1.55358: Flags [P.], cksum 0xfe48 (incorrect -> 0xc592), seq 67:99, ack 670, win 256, options [nop,nop,TS val 245537400 ecr 245537400], length 32: ZMTP/1.0
+ frame flags+body (8-bit) length 1, flags 0x01 (-|-|-|-|-|-|-|MORE)
+ frame flags+body (8-bit) length 29, flags 0x00 (-|-|-|-|-|-|-|-), first 28 byte(s) of body:
+ 0x0000: 5468 6973 2069 7320 6120 7368 6f72 7420 This.is.a.short.
+ 0x0010: 4153 4349 4920 7265 706c 792e ASCII.reply.
+
+IP (tos 0x0, ttl 64, id 18000, offset 0, flags [DF], proto TCP (6), length 52)
+ 127.0.0.1.55358 > 127.0.0.1.33000: Flags [F.], cksum 0xfe28 (incorrect -> 0x16d8), seq 670, ack 99, win 257, options [nop,nop,TS val 245537400 ecr 245537400], length 0
+IP (tos 0x0, ttl 64, id 51309, offset 0, flags [DF], proto TCP (6), length 52)
+ 127.0.0.1.33000 > 127.0.0.1.55358: Flags [F.], cksum 0xfe28 (incorrect -> 0x16d8), seq 99, ack 671, win 256, options [nop,nop,TS val 245537400 ecr 245537400], length 0
+IP (tos 0x0, ttl 64, id 18001, offset 0, flags [DF], proto TCP (6), length 52)
+ 127.0.0.1.55358 > 127.0.0.1.33000: Flags [.], cksum 0xfe28 (incorrect -> 0x16d7), ack 100, win 257, options [nop,nop,TS val 245537400 ecr 245537400], length 0
--- /dev/null
+/*
+ * Copyright (c) 1982, 1986, 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.
+ *
+ * @(#)udp.h 8.1 (Berkeley) 6/10/93
+ */
+
+/*
+ * Udp protocol header.
+ * Per RFC 768, September, 1981.
+ */
+struct udphdr {
+ uint16_t uh_sport; /* source port */
+ uint16_t uh_dport; /* destination port */
+ uint16_t uh_ulen; /* udp length */
+ uint16_t uh_sum; /* udp checksum */
+};
+
+#define BOOTPS_PORT 67 /* RFC951 */
+#define BOOTPC_PORT 68 /* RFC951 */
+#define TFTP_PORT 69 /*XXX*/
+#define KERBEROS_PORT 88 /*XXX*/
+#define SUNRPC_PORT 111 /*XXX*/
+#define SNMP_PORT 161 /*XXX*/
+#define NTP_PORT 123 /*XXX*/
+#define SNMPTRAP_PORT 162 /*XXX*/
+#define ISAKMP_PORT 500 /*XXX*/
+#define SYSLOG_PORT 514 /* rfc3164 */
+#define TIMED_PORT 525 /*XXX*/
+#define RIP_PORT 520 /*XXX*/
+#define LDP_PORT 646
+#define AODV_PORT 654 /*XXX*/
+#define OLSR_PORT 698 /* rfc3626 */
+#define KERBEROS_SEC_PORT 750 /*XXX*/
+#define L2TP_PORT 1701 /*XXX*/
+#define SIP_PORT 5060
+#define ISAKMP_PORT_NATT 4500 /* rfc3948 */
+#define ISAKMP_PORT_USER1 7500 /*XXX - nonstandard*/
+#define ISAKMP_PORT_USER2 8500 /*XXX - nonstandard*/
+#define RX_PORT_LOW 7000 /*XXX*/
+#define RX_PORT_HIGH 7009 /*XXX*/
+#define NETBIOS_NS_PORT 137
+#define NETBIOS_DGRAM_PORT 138
+#define CISCO_AUTORP_PORT 496 /*XXX*/
+#define RADIUS_PORT 1645
+#define RADIUS_NEW_PORT 1812
+#define RADIUS_ACCOUNTING_PORT 1646
+#define RADIUS_NEW_ACCOUNTING_PORT 1813
+#define RADIUS_COA_PORT 3799
+#define HSRP_PORT 1985 /*XXX*/
+#define LMP_PORT 701 /* rfc4204 */
+#define LWRES_PORT 921
+#define VQP_PORT 1589
+#define ZEPHYR_SRV_PORT 2103
+#define ZEPHYR_CLT_PORT 2104
+#define VAT_PORT 3456
+#define MPLS_LSP_PING_PORT 3503 /* draft-ietf-mpls-lsp-ping-02.txt */
+#define BFD_CONTROL_PORT 3784 /* draft-katz-ward-bfd-v4v6-1hop-00.txt */
+#define BFD_ECHO_PORT 3785 /* draft-katz-ward-bfd-v4v6-1hop-00.txt */
+#define WB_PORT 4567
+#define SFLOW_PORT 6343 /* http://www.sflow.org/developers/specifications.php */
+#define LWAPP_DATA_PORT 12222 /* RFC 5412 */
+#define LWAPP_CONTROL_PORT 12223 /* RFC 5412 */
+#define OTV_PORT 8472 /* draft-hasmit-otv-04 */
+#define VXLAN_PORT 4789 /* RFC 7348 */
+#define GENEVE_PORT 6081 /* draft-gross-geneve-02 */
+
+#ifdef INET6
+#define RIPNG_PORT 521 /* RFC 2080 */
+#define DHCP6_SERV_PORT 546 /*XXX*/
+#define DHCP6_CLI_PORT 547 /*XXX*/
+#define AHCP_PORT 5359 /* draft-chroboczek-ahcp-00 */
+#define BABEL_PORT 6696 /* RFC 6126 errata */
+#define BABEL_PORT_OLD 6697 /* RFC 6126 */
+#endif
--- /dev/null
+/*
+ * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: util.c,v 1.5 2015/03/31 21:59:35 christos Exp $");
+#endif
+
+/*
+ * txtproto_print() derived from original code by Hannes Gredler
+ * (hannes@juniper.net):
+ *
+ * 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.
+ */
+
+#define NETDISSECT_REWORKED
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <sys/stat.h>
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "interface.h"
+
+/*
+ * Print out a null-terminated filename (or other ascii string).
+ * If ep is NULL, assume no truncation check is needed.
+ * Return true if truncated.
+ */
+int
+fn_print(netdissect_options *ndo,
+ register const u_char *s, register const u_char *ep)
+{
+ register int ret;
+ register u_char c;
+
+ ret = 1; /* assume truncated */
+ while (ep == NULL || s < ep) {
+ c = *s++;
+ if (c == '\0') {
+ ret = 0;
+ break;
+ }
+ if (!ND_ISASCII(c)) {
+ c = ND_TOASCII(c);
+ ND_PRINT((ndo, "M-"));
+ }
+ if (!ND_ISPRINT(c)) {
+ c ^= 0x40; /* DEL to ?, others to alpha */
+ ND_PRINT((ndo, "^"));
+ }
+ ND_PRINT((ndo, "%c", c));
+ }
+ return(ret);
+}
+
+/*
+ * Print out a counted filename (or other ascii string).
+ * If ep is NULL, assume no truncation check is needed.
+ * Return true if truncated.
+ */
+int
+fn_printn(netdissect_options *ndo,
+ register const u_char *s, register u_int n, register const u_char *ep)
+{
+ register u_char c;
+
+ while (n > 0 && (ep == NULL || s < ep)) {
+ n--;
+ c = *s++;
+ if (!ND_ISASCII(c)) {
+ c = ND_TOASCII(c);
+ ND_PRINT((ndo, "M-"));
+ }
+ if (!ND_ISPRINT(c)) {
+ c ^= 0x40; /* DEL to ?, others to alpha */
+ ND_PRINT((ndo, "^"));
+ }
+ ND_PRINT((ndo, "%c", c));
+ }
+ return (n == 0) ? 0 : 1;
+}
+
+/*
+ * Print out a null-padded filename (or other ascii string).
+ * If ep is NULL, assume no truncation check is needed.
+ * Return true if truncated.
+ */
+int
+fn_printzp(netdissect_options *ndo,
+ register const u_char *s, register u_int n,
+ register const u_char *ep)
+{
+ register int ret;
+ register u_char c;
+
+ ret = 1; /* assume truncated */
+ while (n > 0 && (ep == NULL || s < ep)) {
+ n--;
+ c = *s++;
+ if (c == '\0') {
+ ret = 0;
+ break;
+ }
+ if (!ND_ISASCII(c)) {
+ c = ND_TOASCII(c);
+ ND_PRINT((ndo, "M-"));
+ }
+ if (!ND_ISPRINT(c)) {
+ c ^= 0x40; /* DEL to ?, others to alpha */
+ ND_PRINT((ndo, "^"));
+ }
+ ND_PRINT((ndo, "%c", c));
+ }
+ return (n == 0) ? 0 : ret;
+}
+
+/*
+ * Format the timestamp
+ */
+static char *
+ts_format(netdissect_options *ndo
+#ifndef HAVE_PCAP_SET_TSTAMP_PRECISION
+_U_
+#endif
+, int sec, int usec)
+{
+ static char buf[sizeof("00:00:00.000000000")];
+ const char *format;
+
+#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
+ switch (ndo->ndo_tstamp_precision) {
+
+ case PCAP_TSTAMP_PRECISION_MICRO:
+ format = "%02d:%02d:%02d.%06u";
+ break;
+
+ case PCAP_TSTAMP_PRECISION_NANO:
+ format = "%02d:%02d:%02d.%09u";
+ break;
+
+ default:
+ format = "%02d:%02d:%02d.{unknown precision}";
+ break;
+ }
+#else
+ format = "%02d:%02d:%02d.%06u";
+#endif
+
+ snprintf(buf, sizeof(buf), format,
+ sec / 3600, (sec % 3600) / 60, sec % 60, usec);
+
+ return buf;
+}
+
+/*
+ * Print the timestamp
+ */
+void
+ts_print(netdissect_options *ndo,
+ register const struct timeval *tvp)
+{
+ register int s;
+ struct tm *tm;
+ time_t Time;
+ static unsigned b_sec;
+ static unsigned b_usec;
+ int d_usec;
+ int d_sec;
+
+ switch (ndo->ndo_tflag) {
+
+ case 0: /* Default */
+ s = (tvp->tv_sec + thiszone) % 86400;
+ ND_PRINT((ndo, "%s ", ts_format(ndo, s, tvp->tv_usec)));
+ break;
+
+ case 1: /* No time stamp */
+ break;
+
+ case 2: /* Unix timeval style */
+ ND_PRINT((ndo, "%u.%06u ",
+ (unsigned)tvp->tv_sec,
+ (unsigned)tvp->tv_usec));
+ break;
+
+ case 3: /* Microseconds since previous packet */
+ case 5: /* Microseconds since first packet */
+ if (b_sec == 0) {
+ /* init timestamp for first packet */
+ b_usec = tvp->tv_usec;
+ b_sec = tvp->tv_sec;
+ }
+
+ d_usec = tvp->tv_usec - b_usec;
+ d_sec = tvp->tv_sec - b_sec;
+
+ while (d_usec < 0) {
+ d_usec += 1000000;
+ d_sec--;
+ }
+
+ ND_PRINT((ndo, "%s ", ts_format(ndo, d_sec, d_usec)));
+
+ if (ndo->ndo_tflag == 3) { /* set timestamp for last packet */
+ b_sec = tvp->tv_sec;
+ b_usec = tvp->tv_usec;
+ }
+ break;
+
+ case 4: /* Default + Date*/
+ s = (tvp->tv_sec + thiszone) % 86400;
+ Time = (tvp->tv_sec + thiszone) - s;
+ tm = gmtime (&Time);
+ if (!tm)
+ ND_PRINT((ndo, "Date fail "));
+ else
+ ND_PRINT((ndo, "%04d-%02d-%02d %s ",
+ tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
+ ts_format(ndo, s, tvp->tv_usec)));
+ break;
+ }
+}
+
+/*
+ * Print a relative number of seconds (e.g. hold time, prune timer)
+ * in the form 5m1s. This does no truncation, so 32230861 seconds
+ * is represented as 1y1w1d1h1m1s.
+ */
+void
+relts_print(netdissect_options *ndo,
+ int secs)
+{
+ static const char *lengths[] = {"y", "w", "d", "h", "m", "s"};
+ static const int seconds[] = {31536000, 604800, 86400, 3600, 60, 1};
+ const char **l = lengths;
+ const int *s = seconds;
+
+ if (secs == 0) {
+ ND_PRINT((ndo, "0s"));
+ return;
+ }
+ if (secs < 0) {
+ ND_PRINT((ndo, "-"));
+ secs = -secs;
+ }
+ while (secs > 0) {
+ if (secs >= *s) {
+ ND_PRINT((ndo, "%d%s", secs / *s, *l));
+ secs -= (secs / *s) * *s;
+ }
+ s++;
+ l++;
+ }
+}
+
+/*
+ * this is a generic routine for printing unknown data;
+ * we pass on the linefeed plus indentation string to
+ * get a proper output - returns 0 on error
+ */
+
+int
+print_unknown_data(netdissect_options *ndo, const u_char *cp,const char *ident,int len)
+{
+ if (len < 0) {
+ ND_PRINT((ndo,"%sDissector error: print_unknown_data called with negative length",
+ ident));
+ return(0);
+ }
+ if (ndo->ndo_snapend - cp < len)
+ len = ndo->ndo_snapend - cp;
+ if (len < 0) {
+ ND_PRINT((ndo,"%sDissector error: print_unknown_data called with pointer past end of packet",
+ ident));
+ return(0);
+ }
+ hex_print(ndo, ident,cp,len);
+ return(1); /* everything is ok */
+}
+
+/*
+ * Convert a token value to a string; use "fmt" if not found.
+ */
+const char *
+tok2strbuf(register const struct tok *lp, register const char *fmt,
+ register u_int v, char *buf, size_t bufsize)
+{
+ if (lp != NULL) {
+ while (lp->s != NULL) {
+ if (lp->v == v)
+ return (lp->s);
+ ++lp;
+ }
+ }
+ if (fmt == NULL)
+ fmt = "#%d";
+
+ (void)snprintf(buf, bufsize, fmt, v);
+ return (const char *)buf;
+}
+
+/*
+ * Convert a token value to a string; use "fmt" if not found.
+ */
+const char *
+tok2str(register const struct tok *lp, register const char *fmt,
+ register int v)
+{
+ static char buf[4][128];
+ static int idx = 0;
+ char *ret;
+
+ ret = buf[idx];
+ idx = (idx+1) & 3;
+ return tok2strbuf(lp, fmt, v, ret, sizeof(buf[0]));
+}
+
+/*
+ * Convert a bit token value to a string; use "fmt" if not found.
+ * this is useful for parsing bitfields, the output strings are seperated
+ * if the s field is positive.
+ */
+static char *
+bittok2str_internal(register const struct tok *lp, register const char *fmt,
+ register int v, register int sep)
+{
+ static char buf[256]; /* our stringbuffer */
+ int buflen=0;
+ register int rotbit; /* this is the bit we rotate through all bitpositions */
+ register int tokval;
+ const char * sepstr = "";
+
+ while (lp != NULL && lp->s != NULL) {
+ tokval=lp->v; /* load our first value */
+ rotbit=1;
+ while (rotbit != 0) {
+ /*
+ * lets AND the rotating bit with our token value
+ * and see if we have got a match
+ */
+ if (tokval == (v&rotbit)) {
+ /* ok we have found something */
+ buflen+=snprintf(buf+buflen, sizeof(buf)-buflen, "%s%s",
+ sepstr, lp->s);
+ sepstr = sep ? ", " : "";
+ break;
+ }
+ rotbit=rotbit<<1; /* no match - lets shift and try again */
+ }
+ lp++;
+ }
+
+ if (buflen == 0)
+ /* bummer - lets print the "unknown" message as advised in the fmt string if we got one */
+ (void)snprintf(buf, sizeof(buf), fmt == NULL ? "#%d" : fmt, v);
+ return (buf);
+}
+
+/*
+ * Convert a bit token value to a string; use "fmt" if not found.
+ * this is useful for parsing bitfields, the output strings are not seperated.
+ */
+char *
+bittok2str_nosep(register const struct tok *lp, register const char *fmt,
+ register int v)
+{
+ return (bittok2str_internal(lp, fmt, v, 0));
+}
+
+/*
+ * Convert a bit token value to a string; use "fmt" if not found.
+ * this is useful for parsing bitfields, the output strings are comma seperated.
+ */
+char *
+bittok2str(register const struct tok *lp, register const char *fmt,
+ register int v)
+{
+ return (bittok2str_internal(lp, fmt, v, 1));
+}
+
+/*
+ * Convert a value to a string using an array; the macro
+ * tok2strary() in <interface.h> is the public interface to
+ * this function and ensures that the second argument is
+ * correct for bounds-checking.
+ */
+const char *
+tok2strary_internal(register const char **lp, int n, register const char *fmt,
+ register int v)
+{
+ static char buf[128];
+
+ if (v >= 0 && v < n && lp[v] != NULL)
+ return lp[v];
+ if (fmt == NULL)
+ fmt = "#%d";
+ (void)snprintf(buf, sizeof(buf), fmt, v);
+ return (buf);
+}
+
+/*
+ * Convert a 32-bit netmask to prefixlen if possible
+ * the function returns the prefix-len; if plen == -1
+ * then conversion was not possible;
+ */
+
+int
+mask2plen(uint32_t mask)
+{
+ uint32_t bitmasks[33] = {
+ 0x00000000,
+ 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000,
+ 0xf8000000, 0xfc000000, 0xfe000000, 0xff000000,
+ 0xff800000, 0xffc00000, 0xffe00000, 0xfff00000,
+ 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000,
+ 0xffff8000, 0xffffc000, 0xffffe000, 0xfffff000,
+ 0xfffff800, 0xfffffc00, 0xfffffe00, 0xffffff00,
+ 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0,
+ 0xfffffff8, 0xfffffffc, 0xfffffffe, 0xffffffff
+ };
+ int prefix_len = 32;
+
+ /* let's see if we can transform the mask into a prefixlen */
+ while (prefix_len >= 0) {
+ if (bitmasks[prefix_len] == mask)
+ break;
+ prefix_len--;
+ }
+ return (prefix_len);
+}
+
+#ifdef INET6
+int
+mask62plen(const u_char *mask)
+{
+ u_char bitmasks[9] = {
+ 0x00,
+ 0x80, 0xc0, 0xe0, 0xf0,
+ 0xf8, 0xfc, 0xfe, 0xff
+ };
+ int byte;
+ int cidr_len = 0;
+
+ for (byte = 0; byte < 16; byte++) {
+ u_int bits;
+
+ for (bits = 0; bits < (sizeof (bitmasks) / sizeof (bitmasks[0])); bits++) {
+ if (mask[byte] == bitmasks[bits]) {
+ cidr_len += bits;
+ break;
+ }
+ }
+
+ if (mask[byte] != 0xff)
+ break;
+ }
+ return (cidr_len);
+}
+#endif /* INET6 */
+
+/*
+ * Routine to print out information for text-based protocols such as FTP,
+ * HTTP, SMTP, RTSP, SIP, ....
+ */
+#define MAX_TOKEN 128
+
+/*
+ * Fetch a token from a packet, starting at the specified index,
+ * and return the length of the token.
+ *
+ * Returns 0 on error; yes, this is indistinguishable from an empty
+ * token, but an "empty token" isn't a valid token - it just means
+ * either a space character at the beginning of the line (this
+ * includes a blank line) or no more tokens remaining on the line.
+ */
+static int
+fetch_token(netdissect_options *ndo, const u_char *pptr, u_int idx, u_int len,
+ u_char *tbuf, size_t tbuflen)
+{
+ size_t toklen = 0;
+
+ for (; idx < len; idx++) {
+ if (!ND_TTEST(*(pptr + idx))) {
+ /* ran past end of captured data */
+ return (0);
+ }
+ if (!isascii(*(pptr + idx))) {
+ /* not an ASCII character */
+ return (0);
+ }
+ if (isspace(*(pptr + idx))) {
+ /* end of token */
+ break;
+ }
+ if (!isprint(*(pptr + idx))) {
+ /* not part of a command token or response code */
+ return (0);
+ }
+ if (toklen + 2 > tbuflen) {
+ /* no room for this character and terminating '\0' */
+ return (0);
+ }
+ tbuf[toklen] = *(pptr + idx);
+ toklen++;
+ }
+ if (toklen == 0) {
+ /* no token */
+ return (0);
+ }
+ tbuf[toklen] = '\0';
+
+ /*
+ * Skip past any white space after the token, until we see
+ * an end-of-line (CR or LF).
+ */
+ for (; idx < len; idx++) {
+ if (!ND_TTEST(*(pptr + idx))) {
+ /* ran past end of captured data */
+ break;
+ }
+ if (*(pptr + idx) == '\r' || *(pptr + idx) == '\n') {
+ /* end of line */
+ break;
+ }
+ if (!isascii(*(pptr + idx)) || !isprint(*(pptr + idx))) {
+ /* not a printable ASCII character */
+ break;
+ }
+ if (!isspace(*(pptr + idx))) {
+ /* beginning of next token */
+ break;
+ }
+ }
+ return (idx);
+}
+
+/*
+ * Scan a buffer looking for a line ending - LF or CR-LF.
+ * Return the index of the character after the line ending or 0 if
+ * we encounter a non-ASCII or non-printable character or don't find
+ * the line ending.
+ */
+static u_int
+print_txt_line(netdissect_options *ndo, const char *protoname,
+ const char *prefix, const u_char *pptr, u_int idx, u_int len)
+{
+ u_int startidx;
+ u_int linelen;
+
+ startidx = idx;
+ while (idx < len) {
+ ND_TCHECK(*(pptr+idx));
+ if (*(pptr+idx) == '\n') {
+ /*
+ * LF without CR; end of line.
+ * Skip the LF and print the line, with the
+ * exception of the LF.
+ */
+ linelen = idx - startidx;
+ idx++;
+ goto print;
+ } else if (*(pptr+idx) == '\r') {
+ /* CR - any LF? */
+ if ((idx+1) >= len) {
+ /* not in this packet */
+ return (0);
+ }
+ ND_TCHECK(*(pptr+idx+1));
+ if (*(pptr+idx+1) == '\n') {
+ /*
+ * CR-LF; end of line.
+ * Skip the CR-LF and print the line, with
+ * the exception of the CR-LF.
+ */
+ linelen = idx - startidx;
+ idx += 2;
+ goto print;
+ }
+
+ /*
+ * CR followed by something else; treat this
+ * as if it were binary data, and don't print
+ * it.
+ */
+ return (0);
+ } else if (!isascii(*(pptr+idx)) ||
+ (!isprint(*(pptr+idx)) && *(pptr+idx) != '\t')) {
+ /*
+ * Not a printable ASCII character and not a tab;
+ * treat this as if it were binary data, and
+ * don't print it.
+ */
+ return (0);
+ }
+ idx++;
+ }
+
+ /*
+ * All printable ASCII, but no line ending after that point
+ * in the buffer; treat this as if it were truncated.
+ */
+trunc:
+ linelen = idx - startidx;
+ ND_PRINT((ndo, "%s%.*s[!%s]", prefix, (int)linelen, pptr + startidx,
+ protoname));
+ return (0);
+
+print:
+ ND_PRINT((ndo, "%s%.*s", prefix, (int)linelen, pptr + startidx));
+ return (idx);
+}
+
+void
+txtproto_print(netdissect_options *ndo, const u_char *pptr, u_int len,
+ const char *protoname, const char **cmds, u_int flags)
+{
+ u_int idx, eol;
+ u_char token[MAX_TOKEN+1];
+ const char *cmd;
+ int is_reqresp = 0;
+ const char *pnp;
+
+ if (cmds != NULL) {
+ /*
+ * This protocol has more than just request and
+ * response lines; see whether this looks like a
+ * request or response.
+ */
+ idx = fetch_token(ndo, pptr, 0, len, token, sizeof(token));
+ if (idx != 0) {
+ /* Is this a valid request name? */
+ while ((cmd = *cmds++) != NULL) {
+ if (strcasecmp((const char *)token, cmd) == 0) {
+ /* Yes. */
+ is_reqresp = 1;
+ break;
+ }
+ }
+
+ /*
+ * No - is this a valid response code (3 digits)?
+ *
+ * Is this token the response code, or is the next
+ * token the response code?
+ */
+ if (flags & RESP_CODE_SECOND_TOKEN) {
+ /*
+ * Next token - get it.
+ */
+ idx = fetch_token(ndo, pptr, idx, len, token,
+ sizeof(token));
+ }
+ if (idx != 0) {
+ if (isdigit(token[0]) && isdigit(token[1]) &&
+ isdigit(token[2]) && token[3] == '\0') {
+ /* Yes. */
+ is_reqresp = 1;
+ }
+ }
+ }
+ } else {
+ /*
+ * This protocol has only request and response lines
+ * (e.g., FTP, where all the data goes over a
+ * different connection); assume the payload is
+ * a request or response.
+ */
+ is_reqresp = 1;
+ }
+
+ /* Capitalize the protocol name */
+ for (pnp = protoname; *pnp != '\0'; pnp++)
+ ND_PRINT((ndo, "%c", toupper((unsigned char)*pnp)));
+
+ if (is_reqresp) {
+ /*
+ * In non-verbose mode, just print the protocol, followed
+ * by the first line as the request or response info.
+ *
+ * In verbose mode, print lines as text until we run out
+ * of characters or see something that's not a
+ * printable-ASCII line.
+ */
+ if (ndo->ndo_vflag) {
+ /*
+ * We're going to print all the text lines in the
+ * request or response; just print the length
+ * on the first line of the output.
+ */
+ ND_PRINT((ndo, ", length: %u", len));
+ for (idx = 0;
+ idx < len && (eol = print_txt_line(ndo, protoname, "\n\t", pptr, idx, len)) != 0;
+ idx = eol)
+ ;
+ } else {
+ /*
+ * Just print the first text line.
+ */
+ print_txt_line(ndo, protoname, ": ", pptr, 0, len);
+ }
+ }
+}
+
+/* VARARGS */
+void
+error(const char *fmt, ...)
+{
+ va_list ap;
+
+ (void)fprintf(stderr, "%s: ", program_name);
+ va_start(ap, fmt);
+ (void)vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ if (*fmt) {
+ fmt += strlen(fmt);
+ if (fmt[-1] != '\n')
+ (void)fputc('\n', stderr);
+ }
+ exit(1);
+ /* NOTREACHED */
+}
+
+/* VARARGS */
+void
+warning(const char *fmt, ...)
+{
+ va_list ap;
+
+ (void)fprintf(stderr, "%s: WARNING: ", program_name);
+ va_start(ap, fmt);
+ (void)vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ if (*fmt) {
+ fmt += strlen(fmt);
+ if (fmt[-1] != '\n')
+ (void)fputc('\n', stderr);
+ }
+}
+
+/*
+ * Copy arg vector into a new buffer, concatenating arguments with spaces.
+ */
+char *
+copy_argv(register char **argv)
+{
+ register char **p;
+ register u_int len = 0;
+ char *buf;
+ char *src, *dst;
+
+ p = argv;
+ if (*p == 0)
+ return 0;
+
+ while (*p)
+ len += strlen(*p++) + 1;
+
+ buf = (char *)malloc(len);
+ if (buf == NULL)
+ error("copy_argv: malloc");
+
+ p = argv;
+ dst = buf;
+ while ((src = *p++) != NULL) {
+ while ((*dst++ = *src++) != '\0')
+ ;
+ dst[-1] = ' ';
+ }
+ dst[-1] = '\0';
+
+ return buf;
+}
+
+/*
+ * On Windows, we need to open the file in binary mode, so that
+ * we get all the bytes specified by the size we get from "fstat()".
+ * On UNIX, that's not necessary. O_BINARY is defined on Windows;
+ * we define it as 0 if it's not defined, so it does nothing.
+ */
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+char *
+read_infile(char *fname)
+{
+ register int i, fd, cc;
+ register char *cp;
+ struct stat buf;
+
+ fd = open(fname, O_RDONLY|O_BINARY);
+ if (fd < 0)
+ error("can't open %s: %s", fname, pcap_strerror(errno));
+
+ if (fstat(fd, &buf) < 0)
+ error("can't stat %s: %s", fname, pcap_strerror(errno));
+
+ cp = malloc((u_int)buf.st_size + 1);
+ if (cp == NULL)
+ error("malloc(%d) for %s: %s", (u_int)buf.st_size + 1,
+ fname, pcap_strerror(errno));
+ cc = read(fd, cp, (u_int)buf.st_size);
+ if (cc < 0)
+ error("read %s: %s", fname, pcap_strerror(errno));
+ if (cc != buf.st_size)
+ error("short read %s (%d != %d)", fname, cc, (int)buf.st_size);
+
+ close(fd);
+ /* replace "# comment" with spaces */
+ for (i = 0; i < cc; i++) {
+ if (cp[i] == '#')
+ while (i < cc && cp[i] != '\n')
+ cp[i++] = ' ';
+ }
+ cp[cc] = '\0';
+ return (cp);
+}
+
+void
+safeputs(netdissect_options *ndo,
+ const u_char *s, const u_int maxlen)
+{
+ u_int idx = 0;
+
+ while (*s && idx < maxlen) {
+ safeputchar(ndo, *s);
+ idx++;
+ s++;
+ }
+}
+
+void
+safeputchar(netdissect_options *ndo,
+ const u_char c)
+{
+ ND_PRINT((ndo, (c < 0x80 && ND_ISPRINT(c)) ? "%c" : "\\0x%02x", c));
+}
+
+#ifdef LBL_ALIGN
+/*
+ * Some compilers try to optimize memcpy(), using the alignment constraint
+ * on the argument pointer type. by using this function, we try to avoid the
+ * optimization.
+ */
+void
+unaligned_memcpy(void *p, const void *q, size_t l)
+{
+ memcpy(p, q, l);
+}
+
+/* As with memcpy(), so with memcmp(). */
+int
+unaligned_memcmp(const void *p, const void *q, size_t l)
+{
+ return (memcmp(p, q, l));
+}
+#endif
--- /dev/null
+/*
+ * Copyright (c) 1995
+ * 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: (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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: vfprintf.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "interface.h"
+
+/*
+ * Stock 4.3 doesn't have vfprintf.
+ * This routine is due to Chris Torek.
+ */
+vfprintf(f, fmt, args)
+ FILE *f;
+ char *fmt;
+ va_list args;
+{
+ int ret;
+
+ if ((f->_flag & _IOWRT) == 0) {
+ if (f->_flag & _IORW)
+ f->_flag |= _IOWRT;
+ else
+ return EOF;
+ }
+ ret = _doprnt(fmt, args, f);
+ return ferror(f) ? EOF : ret;
+}
--- /dev/null
+/*
+ * Copyright (c) 1999
+ * NetGroup, Politecnico di Torino (Italy)
+ * 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 Politecnico di Torino 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 COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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 _WINSOCKAPI_
+#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */
+#endif /* _WINSOCKAPI_ */
+#include <windows.h>
+#include <winsock2.h>
+
+extern int progress;
+int wsockinit();
+void InitP();
+void PrintCapBegins (char* program_name, char* device);
+extern char* AdapterName1;
+#ifndef WIN95
+WCHAR* SChar2WChar(char* nome);
+#else
+BOOLEAN StartPacketDriver(LPTSTR ServiceName);
+#endif
--- /dev/null
+# Makefile for cygwin gcc
+# Nate Lawson <nate@rootlabs.oom>
+
+# Location of your pcap src tree, build it first
+PCAP_DIR = ../../../winpcap
+
+# OPTFLAGS = -g
+OPTFLAGS = -O
+# -O2 may break things. Use at your own risk.
+
+CFLAGS = -I ${PCAP_DIR}/wpcap/libpcap/bpf \
+ -I ${PCAP_DIR}/wpcap/libpcap \
+ -I ${PCAP_DIR}/wpcap/libpcap/Win32/Include \
+ -I ${PCAP_DIR}/wpcap/libpcap/Win32/Include/net \
+ -I ../../Win32/Include -I ../../linux-Include \
+ -I ../../lbl -I../.. \
+ -DWIN32 -DINET6 -DHAVE_ADDRINFO=1 -DHAVE_SOCKADDR_STORAGE=1 \
+ -DHAVE_PCAP_LIST_DATALINKS=1 -DHAVE_PCAP_SET_DATALINK=1 \
+ -DHAVE_PCAP_DATALINK_NAME_TO_VAL=1 \
+ -DHAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION=1 \
+ -DHAVE_PCAP_DUMP_FTELL=1 -DHAVE_BPF_DUMP=1 \
+ -DHAVE_PCAP_DUMP_FLUSH=1 -DHAVE_PCAP_FINDALLDEVS=1 \
+ -DHAVE_PCAP_IF_T=1 -DHAVE_PCAP_LIB_VERSION=1 \
+ -D_U_="__attribute__((unused))" \
+ -D_WIN32_WINNT=0x0501 \
+ -mno-cygwin ${OPTFLAGS}
+LDFLAGS =
+LIBS = -L ${PCAP_DIR}/WPCAP/LIB -lwpcap -lws2_32
+OBJS = \
+ ../../addrtoname.o \
+ ../../af.o \
+ ../../checksum.o \
+ ../../gmpls.o \
+ ../../gmt2local.o \
+ ../../missing/inet_aton.o \
+ ../../missing/inet_ntop.o \
+ ../../missing/strlcpy.o \
+ ../../missing/dlnames.o \
+ ../../missing/datalinks.o \
+ ../../missing/strsep.o \
+ ../../missing/inet_pton.o \
+ ../../missing/getopt_long.o \
+ ../../machdep.o \
+ ../../oui.o \
+ ../../parsenfsfh.o \
+ ../../print-802_11.o \
+ ../../print-ah.o \
+ ../../print-aodv.o \
+ ../../print-ap1394.o \
+ ../../print-arcnet.o \
+ ../../print-arp.o \
+ ../../print-ascii.o \
+ ../../print-atalk.o \
+ ../../print-atm.o \
+ ../../print-beep.o \
+ ../../print-bfd.o \
+ ../../print-bgp.o \
+ ../../print-bootp.o \
+ ../../print-cdp.o \
+ ../../print-cfm.o \
+ ../../print-chdlc.o \
+ ../../print-cip.o \
+ ../../print-cnfp.o \
+ ../../print-decnet.o \
+ ../../print-dhcp6.o \
+ ../../print-domain.o \
+ ../../print-dtp.o \
+ ../../print-dvmrp.o \
+ ../../print-egp.o \
+ ../../print-enc.o \
+ ../../print-esp.o \
+ ../../print-ether.o \
+ ../../print-fddi.o \
+ ../../print-fr.o \
+ ../../print-frag6.o \
+ ../../print-gre.o \
+ ../../print-hsrp.o \
+ ../../print-icmp.o \
+ ../../print-icmp6.o \
+ ../../print-igmp.o \
+ ../../print-igrp.o \
+ ../../print-ip.o \
+ ../../print-ip6.o \
+ ../../print-ip6opts.o \
+ ../../print-ipcomp.o \
+ ../../print-ipfc.o \
+ ../../print-ipx.o \
+ ../../print-isakmp.o \
+ ../../print-isoclns.o \
+ ../../print-krb.o \
+ ../../print-l2tp.o \
+ ../../print-lane.o \
+ ../../print-ldp.o \
+ ../../print-lldp.o \
+ ../../print-llc.o \
+ ../../print-lwapp.o \
+ ../../print-lwres.o \
+ ../../print-mobile.o \
+ ../../print-mobility.o \
+ ../../print-mpcp.o \
+ ../../print-mpls.o \
+ ../../print-msdp.o \
+ ../../print-nfs.o \
+ ../../print-ntp.o \
+ ../../print-null.o \
+ ../../print-olsr.o \
+ ../../print-ospf.o \
+ ../../print-ospf6.o \
+ ../../print-pim.o \
+ ../../print-pgm.o \
+ ../../print-ppp.o \
+ ../../print-pppoe.o \
+ ../../print-pptp.o \
+ ../../print-radius.o \
+ ../../print-raw.o \
+ ../../print-rrcp.o \
+ ../../print-rip.o \
+ ../../print-ripng.o \
+ ../../print-rsvp.o \
+ ../../print-rt6.o \
+ ../../print-rx.o \
+ ../../print-sctp.o \
+ ../../print-sflow.o \
+ ../../print-sl.o \
+ ../../print-sll.o \
+ ../../print-slow.o \
+ ../../print-smb.o \
+ ../../print-snmp.o \
+ ../../print-stp.o \
+ ../../print-sunatm.o \
+ ../../print-sunrpc.o \
+ ../../print-symantec.o \
+ ../../print-tcp.o \
+ ../../print-telnet.o \
+ ../../print-tftp.o \
+ ../../print-timed.o \
+ ../../print-token.o \
+ ../../print-udld.o \
+ ../../print-udp.o \
+ ../../print-vjc.o \
+ ../../print-vqp.o \
+ ../../print-vrrp.o \
+ ../../print-vtp.o \
+ ../../print-wb.o \
+ ../../print-zephyr.o \
+ ../../setsignal.o \
+ ../../smbutil.o \
+ ../../tcpdump.o \
+ ../../util.o \
+ ../../cpack.o \
+ ../../ipproto.o \
+ ../../l2vpn.o \
+ ../../nlpid.o \
+ ../../print-eigrp.o \
+ ../../print-juniper.o \
+ ../../print-lspping.o \
+ ../../print-sip.o \
+ ../../print-eap.o \
+ ../../print-lmp.o \
+ ../../print-syslog.o \
+ ../../print-dccp.o \
+ ../../print-bt.o \
+ ../../signature.o
+
+main: ${OBJS}
+ ${CC} ${CFLAGS} ${LDFLAGS} -o windump.exe ${OBJS} ${LIBS}
+
+install: windump.exe
+ cp windump.exe c:/windows
+
+clean:
+ rm -f ${OBJS} windump.exe
+
+.c.o:
+ ${CC} ${CFLAGS} -o $*.o -c $<
--- /dev/null
+# Microsoft Developer Studio Project File - Name="WinDump" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=WinDump - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "WinDump.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "WinDump.mak" CFG="WinDump - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "WinDump - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "WinDump - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 1
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "WinDump - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "../../"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../winpcap/wpcap/libpcap/bpf" /I "../../../winpcap/wpcap/libpcap" /I "../../../winpcap/wpcap/libpcap/Win32/Include" /I "../../../winpcap/wpcap/libpcap/Win32/Include/net" /I "../../Win32/Include" /I "../../linux-Include" /I "../../lbl" /I "../../" /I "../../../winpcap/wpcap/win32-extensions" /D "NDEBUG" /D "INET6" /D "WIN32" /D "_MBCS" /D "_CONSOLE" /D "__STDC__" /D "WPCAP" /D HAVE_ADDRINFO=1 /D HAVE_SOCKADDR_STORAGE=1 /D HAVE_PCAP_LIST_DATALINKS=1 /D HAVE_PCAP_SET_DATALINK=1 /D HAVE_PCAP_DATALINK_NAME_TO_VAL=1 /D HAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION=1 /D HAVE_PCAP_DUMP_FTELL=1 /D HAVE_BPF_DUMP=1 /D HAVE_PCAP_DUMP_FLUSH=1 /D HAVE_PCAP_FINDALLDEVS=1 /D HAVE_PCAP_IF_T=1 /D HAVE_PCAP_LIB_VERSION=1 /D "HAVE_REMOTE" /D _U_= /DUSE_ETHER_NTOHOST /YX /FD /c
+# ADD BASE RSC /l 0x410 /d "NDEBUG"
+# ADD RSC /l 0x410 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib wpcap.lib /nologo /subsystem:console /machine:I386 /out:"release/WinDump.exe" /libpath:"../../../winpcap/wpcap/lib"
+
+!ELSEIF "$(CFG)" == "WinDump - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "WinDump_"
+# PROP BASE Intermediate_Dir "WinDump_"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "../../"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /Gm /Gi /GX /ZI /I "../../../winpcap/wpcap/libpcap/bpf" /I "../../../winpcap/wpcap/libpcap" /I "../../../winpcap/wpcap/libpcap/Win32/Include" /I "../../../winpcap/wpcap/libpcap/Win32/Include/net" /I "../../Win32/Include" /I "../../linux-Include" /I "../../lbl" /I "../../" /I "../../../winpcap/wpcap/win32-extensions" /D "_DEBUG" /D "_WINDOWS" /D "INET6" /D "WIN32" /D "_MBCS" /D "_CONSOLE" /D "__STDC__" /D "WPCAP" /D HAVE_ADDRINFO=1 /D HAVE_SOCKADDR_STORAGE=1 /D HAVE_PCAP_LIST_DATALINKS=1 /D HAVE_PCAP_SET_DATALINK=1 /D HAVE_PCAP_DATALINK_NAME_TO_VAL=1 /D HAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION=1 /D HAVE_PCAP_DUMP_FTELL=1 /D HAVE_BPF_DUMP=1 /D HAVE_PCAP_DUMP_FLUSH=1 /D HAVE_PCAP_FINDALLDEVS=1 /D HAVE_PCAP_IF_T=1 /D HAVE_PCAP_LIB_VERSION=1 /D "HAVE_REMOTE" /D _U_= /DUSE_ETHER_NTOHOST /FR /YX /FD /c
+# ADD BASE RSC /l 0x410 /d "_DEBUG"
+# ADD RSC /l 0x410 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 wpcap.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /subsystem:console /map /debug /debugtype:both /machine:I386 /out:"debug/WinDump.exe" /pdbtype:sept /libpath:"../../../winpcap/wpcap/lib"
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "WinDump - Win32 Release"
+# Name "WinDump - Win32 Debug"
+# Begin Source File
+
+SOURCE=..\..\addrtoname.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\af.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\bpf_dump.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\checksum.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\cpack.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\missing\datalinks.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\missing\dlnames.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\missing\getopt_long.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gmpls.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gmt2local.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\missing\inet_aton.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\missing\inet_ntop.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\missing\inet_pton.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ipproto.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\l2vpn.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\machdep.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\nlpid.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\oui.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\parsenfsfh.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-802_11.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ah.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-aodv.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ap1394.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-arcnet.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-arp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ascii.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-atalk.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-atm.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-beep.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-bfd.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-bgp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-bootp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-bt.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-cdp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-cfm.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-chdlc.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-cip.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-cnfp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-dccp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-decnet.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-dhcp6.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-domain.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-dtp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-dvmrp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-eap.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-egp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-eigrp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-enc.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-esp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ether.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-fddi.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-fr.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-frag6.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-gre.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-hsrp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-icmp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-icmp6.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-igmp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-igrp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ip.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ip6.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ip6opts.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ipcomp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ipfc.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ipx.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-isakmp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-isoclns.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-juniper.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-krb.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-l2tp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-lane.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ldp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-llc.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-lldp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-lmp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-lspping.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-lwapp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-lwres.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-mobile.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-mobility.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-mpcp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-mpls.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-msdp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-netbios.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-nfs.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ntp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-null.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-olsr.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ospf.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ospf6.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-pgm.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-pim.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ppp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-pppoe.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-pptp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-radius.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-raw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-rrcp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-rip.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-ripng.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-rpki-rtr.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-rsvp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-rt6.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-rx.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-sctp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-sflow.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-sip.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-sl.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-sll.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-slow.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-smb.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-snmp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-stp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-sunatm.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-sunrpc.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-symantec.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-syslog.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-tcp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-telnet.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-tftp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-timed.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-token.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-udld.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-udp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-vjc.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-vqp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-vrrp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-vtp.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-wb.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\print-zephyr.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\setsignal.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\smbutil.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\strcasecmp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\missing\strlcat.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\missing\strlcpy.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\missing\strsep.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\Tcpdump.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\Src\ether_ntohost.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\util.c
+# End Source File
+# End Target
+# End Project
--- /dev/null
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "WinDump"=".\WinDump.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
--- /dev/null
+/* config.h. Generated from config.h.in by configure. */
+/* config.h.in. Generated from configure.in by autoheader. */
+
+/* define if you have the addrinfo function */
+#define HAVE_ADDRINFO 1
+
+/* Define to 1 if you have the `alarm' function. */
+#define HAVE_ALARM 1
+
+/* Define to 1 if you have the `bpf_dump' function. */
+#define HAVE_BPF_DUMP 1
+
+/* capsicum support available */
+/* #undef HAVE_CAPSICUM */
+
+/* Define to 1 if you have the `cap_enter' function. */
+/* #undef HAVE_CAP_ENTER */
+
+/* Define to 1 if you have the `cap_ioctls_limit' function. */
+/* #undef HAVE_CAP_IOCTLS_LIMIT */
+
+/* Define to 1 if you have the <cap-ng.h> header file. */
+/* #undef HAVE_CAP_NG_H */
+
+/* Define to 1 if you have the `cap_rights_limit' function. */
+/* #undef HAVE_CAP_RIGHTS_LIMIT */
+
+/* Define to 1 if you have the declaration of `ether_ntohost', and to 0 if you
+ don't. */
+#define HAVE_DECL_ETHER_NTOHOST 1
+
+/* define if you have the dnet_htoa function */
+/* #undef HAVE_DNET_HTOA */
+
+/* Define to 1 if you have the `ether_ntohost' function. */
+#define HAVE_ETHER_NTOHOST 1
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the `fork' function. */
+#define HAVE_FORK 1
+
+/* Define to 1 if you have the `getnameinfo' function. */
+#define HAVE_GETNAMEINFO 1
+
+/* Define to 1 if you have the `getopt_long' function. */
+#define HAVE_GETOPT_LONG 1
+
+/* define if you have getrpcbynumber() */
+#define HAVE_GETRPCBYNUMBER 1
+
+/* define if you have the h_errno variable */
+#define HAVE_H_ERRNO 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `cap-ng' library (-lcap-ng). */
+/* #undef HAVE_LIBCAP_NG */
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+#define HAVE_LIBCRYPTO 1
+
+/* Define to 1 if you have the `rpc' library (-lrpc). */
+/* #undef HAVE_LIBRPC */
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the <netdnet/dnetdb.h> header file. */
+/* #undef HAVE_NETDNET_DNETDB_H */
+
+/* define if you have a dnet_htoa declaration in <netdnet/dnetdb.h> */
+/* #undef HAVE_NETDNET_DNETDB_H_DNET_HTOA */
+
+/* Define to 1 if you have the <netinet/ether.h> header file. */
+/* #undef HAVE_NETINET_ETHER_H */
+
+/* Define to 1 if you have the <netinet/if_ether.h> header file. */
+#define HAVE_NETINET_IF_ETHER_H 1
+
+/* Define to 1 if you have the <net/pfvar.h> header file. */
+#define HAVE_NET_PFVAR_H 1
+
+/* Define to 1 if you have the `openat' function. */
+#define HAVE_OPENAT 1
+
+/* Define to 1 if you have the <openssl/evp.h> header file. */
+#define HAVE_OPENSSL_EVP_H 1
+
+/* if there's an os_proto.h for this platform, to use additional prototypes */
+/* #undef HAVE_OS_PROTO_H */
+
+/* Define to 1 if you have the <pcap/bluetooth.h> header file. */
+/* #undef HAVE_PCAP_BLUETOOTH_H */
+
+/* Define to 1 if you have the `pcap_breakloop' function. */
+#define HAVE_PCAP_BREAKLOOP 1
+
+/* Define to 1 if you have the `pcap_create' function. */
+#define HAVE_PCAP_CREATE 1
+
+/* define if libpcap has pcap_datalink_name_to_val() */
+#define HAVE_PCAP_DATALINK_NAME_TO_VAL 1
+
+/* define if libpcap has pcap_datalink_val_to_description() */
+#define HAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION 1
+
+/* define if libpcap has pcap_debug */
+#define HAVE_PCAP_DEBUG 1
+
+/* Define to 1 if you have the `pcap_dump_flush' function. */
+#define HAVE_PCAP_DUMP_FLUSH 1
+
+/* define if libpcap has pcap_dump_ftell() */
+#define HAVE_PCAP_DUMP_FTELL 1
+
+/* Define to 1 if you have the `pcap_findalldevs' function. */
+#define HAVE_PCAP_FINDALLDEVS 1
+
+/* Define to 1 if you have the `pcap_free_datalinks' function. */
+#define HAVE_PCAP_FREE_DATALINKS 1
+
+/* Define to 1 if the system has the type `pcap_if_t'. */
+#define HAVE_PCAP_IF_T 1
+
+/* Define to 1 if you have the `pcap_lib_version' function. */
+#define HAVE_PCAP_LIB_VERSION 1
+
+/* define if libpcap has pcap_list_datalinks() */
+#define HAVE_PCAP_LIST_DATALINKS 1
+
+/* Define to 1 if you have the <pcap/nflog.h> header file. */
+/* #undef HAVE_PCAP_NFLOG_H */
+
+/* Define to 1 if you have the `pcap_setdirection' function. */
+#define HAVE_PCAP_SETDIRECTION 1
+
+/* Define to 1 if you have the `pcap_set_datalink' function. */
+#define HAVE_PCAP_SET_DATALINK 1
+
+/* Define to 1 if you have the `pcap_set_immediate_mode' function. */
+#define HAVE_PCAP_SET_IMMEDIATE_MODE 1
+
+/* Define to 1 if you have the `pcap_set_tstamp_precision' function. */
+#define HAVE_PCAP_SET_TSTAMP_PRECISION 1
+
+/* Define to 1 if you have the `pcap_set_tstamp_type' function. */
+#define HAVE_PCAP_SET_TSTAMP_TYPE 1
+
+/* Define to 1 if you have the <pcap/usb.h> header file. */
+/* #undef HAVE_PCAP_USB_H */
+
+/* define if libpcap has pcap_version */
+/* #undef HAVE_PCAP_VERSION */
+
+/* Define to 1 if you have the `pfopen' function. */
+/* #undef HAVE_PFOPEN */
+
+/* Define to 1 if you have the <rpc/rpcent.h> header file. */
+#define HAVE_RPC_RPCENT_H 1
+
+/* Define to 1 if you have the <rpc/rpc.h> header file. */
+#define HAVE_RPC_RPC_H 1
+
+/* Define to 1 if you have the `setlinebuf' function. */
+#define HAVE_SETLINEBUF 1
+
+/* Define to 1 if you have the `sigaction' function. */
+#define HAVE_SIGACTION 1
+
+/* Define to 1 if you have the `sigset' function. */
+/* #undef HAVE_SIGSET */
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* if struct sockaddr has the sa_len member */
+#define HAVE_SOCKADDR_SA_LEN 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#define HAVE_STRCASECMP 1
+
+/* Define to 1 if you have the `strdup' function. */
+#define HAVE_STRDUP 1
+
+/* Define to 1 if you have the `strftime' function. */
+#define HAVE_STRFTIME 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strlcat' function. */
+#define HAVE_STRLCAT 1
+
+/* Define to 1 if you have the `strlcpy' function. */
+#define HAVE_STRLCPY 1
+
+/* Define to 1 if you have the `strsep' function. */
+#define HAVE_STRSEP 1
+
+/* Define to 1 if the system has the type `struct ether_addr'. */
+/* #undef HAVE_STRUCT_ETHER_ADDR */
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#define HAVE_UINTPTR_T 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the `vfork' function. */
+#define HAVE_VFORK 1
+
+/* Define to 1 if you have the `vfprintf' function. */
+#define HAVE_VFPRINTF 1
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* define if libpcap has yydebug */
+/* #undef HAVE_YYDEBUG */
+
+/* define if your compiler has __attribute__ */
+#define HAVE___ATTRIBUTE__ 1
+
+#if !defined(__NetBSD__) && !defined(__minix)
+/* set by build */
+/* Define if you enable IPv6 support */
+#define INET6 1
+#endif
+
+/* if unaligned access fails */
+#define LBL_ALIGN 1
+
+/* define if you need to include missing/addrinfo.h */
+/* #undef NEED_ADDRINFO_H */
+
+/* Define to 1 if netinet/ether.h declares `ether_ntohost' */
+/* #undef NETINET_ETHER_H_DECLARES_ETHER_NTOHOST */
+
+/* Define to 1 if netinet/if_ether.h declares `ether_ntohost' */
+#define NETINET_IF_ETHER_H_DECLARES_ETHER_NTOHOST /**/
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME ""
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING ""
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME ""
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION ""
+
+/* define if the platform doesn't define PRId64 */
+/* #undef PRId64 */
+
+/* define if the platform doesn't define PRIo64 */
+/* #undef PRIo64 */
+
+/* define if the platform doesn't define PRIx64 */
+/* #undef PRIu64 */
+
+/* define if the platform doesn't define PRIu64 */
+/* #undef PRIx64 */
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#define RETSIGTYPE void
+
+/* return value of signal handlers */
+#define RETSIGVAL /**/
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* define if you want to build the possibly-buggy SMB printer */
+#define TCPDUMP_DO_SMB 1
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#define TIME_WITH_SYS_TIME 1
+
+/* define if you have ether_ntohost() and it works */
+#define USE_ETHER_NTOHOST 1
+
+/* Define if you enable support for libsmi */
+/* #undef USE_LIBSMI */
+
+/* define if should chroot when dropping privileges */
+/* #undef WITH_CHROOT */
+
+/* define if should drop privileges by default */
+/* #undef WITH_USER */
+
+/* get BSD semantics on Irix */
+/* #undef _BSD_SIGNALS */
+
+/* define on AIX to get certain functions */
+/* #undef _SUN */
+
+/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+/* #undef _UINT32_T */
+
+/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+/* #undef _UINT64_T */
+
+/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+/* #undef _UINT8_T */
+
+/* define if your compiler allows __attribute__((format)) without a warning */
+#define __ATTRIBUTE___FORMAT_OK 1
+
+/* define if your compiler allows __attribute__((format)) to be applied to
+ function pointers */
+#define __ATTRIBUTE___FORMAT_OK_FOR_FUNCTION_POINTERS 1
+
+/* define if your compiler allows __attribute__((noreturn)) to be applied to
+ function pointers */
+#define __ATTRIBUTE___NORETURN_OK_FOR_FUNCTION_POINTERS 1
+
+/* to handle Ultrix compilers that don't support const in prototypes */
+/* #undef const */
+
+/* Define as token for inline if inlining supported */
+#define inline inline
+
+/* Define to the type of a signed integer type of width exactly 16 bits if
+ such a type exists and the standard includes do not define it. */
+/* #undef int16_t */
+
+/* Define to the type of a signed integer type of width exactly 32 bits if
+ such a type exists and the standard includes do not define it. */
+/* #undef int32_t */
+
+/* Define to the type of a signed integer type of width exactly 64 bits if
+ such a type exists and the standard includes do not define it. */
+/* #undef int64_t */
+
+/* Define to the type of a signed integer type of width exactly 8 bits if such
+ a type exists and the standard includes do not define it. */
+/* #undef int8_t */
+
+/* Define to `uint16_t' if u_int16_t not defined. */
+/* #undef u_int16_t */
+
+/* Define to `uint32_t' if u_int32_t not defined. */
+/* #undef u_int32_t */
+
+/* Define to `uint64_t' if u_int64_t not defined. */
+/* #undef u_int64_t */
+
+/* Define to `uint8_t' if u_int8_t not defined. */
+/* #undef u_int8_t */
+
+/* Define to the type of an unsigned integer type of width exactly 16 bits if
+ such a type exists and the standard includes do not define it. */
+/* #undef uint16_t */
+
+/* Define to the type of an unsigned integer type of width exactly 32 bits if
+ such a type exists and the standard includes do not define it. */
+/* #undef uint32_t */
+
+/* Define to the type of an unsigned integer type of width exactly 64 bits if
+ such a type exists and the standard includes do not define it. */
+/* #undef uint64_t */
+
+/* Define to the type of an unsigned integer type of width exactly 8 bits if
+ such a type exists and the standard includes do not define it. */
+/* #undef uint8_t */
+
+/* Define to the type of an unsigned integer type wide enough to hold a
+ pointer, if such a type exists, and if the system does not define it. */
+/* #undef uintptr_t */
--- /dev/null
+#! /bin/sh
+#
+# $NetBSD: tcpdump2netbsd,v 1.1 2013/04/06 19:33:07 christos Exp $
+#
+# Copyright (c) 2000 The NetBSD Foundation, Inc.
+# 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.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+#
+# amd2netbsd: convert an amd source tree into a
+# netbsd amd source tree, under src/dist,
+# based on bind2netbsd by Bernd Ernesti and changes by Simon Burge
+#
+# Rough instructions for importing new amd release:
+#
+# $ cd /some/where/temporary
+# $ tar xpfz /new/amd/release/tar/file
+# $ sh /usr/src/external/bsd/tcpdump/dist/tcpdump2netbsd tcpdump-x.y.z `pwd`
+# $ cd src/dist/am-utils
+# $ cvs -d cvs.netbsd.org:/cvsroot import -m "Import tcpdump x.y.z" src/external/bsd/tcpdump/dist TCPDUMP tcpdump-x_y_z
+# $ cd ../../../tcpdump-x.y.z
+# $ run ./configure
+# copy newly generated config.h with /usr/src/external/bsd/tcpdump/include/config.h
+# - check makefiles to see if any extra sources have been added.
+# - update distrib/sets if necessary.
+
+if [ $# -ne 1 ]; then echo "tcpdump2netbsd src"; exit 1; fi
+
+r=$1
+
+case "$d" in
+ /*)
+ ;;
+ *)
+ d=`/bin/pwd`/$d
+ ;;
+esac
+
+case "$r" in
+ /*)
+ ;;
+ *)
+ r=`/bin/pwd`/$r
+ ;;
+esac
+
+### Remove the $'s around RCS tags
+cleantags $r
+
+### Clean up any CVS directories that might be around.
+echo "cleaning up CVS residue."
+(
+ cd $r
+ find . -type d -name "CVS" -print | xargs rm -r
+)
+echo done
+
+### Fixing file and directory permissions.
+echo "Fixing file/directory permissions."
+(
+ cd $r
+ find . -type f -print | xargs chmod u+rw,go+r
+ find . -type d -print | xargs chmod u+rwx,go+rx
+)
+echo done
+
+exit 0