]> Zhao Yanbai Git Server - minix.git/commitdiff
Import NetBSD tcpdump(8) 70/3470/1
authorDavid van Moolenbroek <david@minix3.org>
Sun, 19 Feb 2017 00:56:10 +0000 (00:56 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Tue, 21 Mar 2017 22:00:21 +0000 (22:00 +0000)
For now, printing of Sun RPC requests is disabled because we do not
yet have the RPC header files.  This should affect basically noone,
as we do not have any RPC-based programs yet, for the same reason.

Change-Id: Ie7818faaaacdc104d8b2c37a68866b4ce18247d6

583 files changed:
distrib/sets/lists/minix-base/mi
distrib/sets/lists/minix-debug/mi
distrib/sets/lists/minix-man/mi
etc/mtree/NetBSD.dist.base
external/bsd/Makefile
external/bsd/tcpdump/Makefile [new file with mode: 0644]
external/bsd/tcpdump/bin/Makefile [new file with mode: 0644]
external/bsd/tcpdump/dist/CHANGES [new file with mode: 0644]
external/bsd/tcpdump/dist/CREDITS [new file with mode: 0644]
external/bsd/tcpdump/dist/INSTALL.txt [new file with mode: 0644]
external/bsd/tcpdump/dist/LICENSE [new file with mode: 0644]
external/bsd/tcpdump/dist/Makefile-devel-adds [new file with mode: 0644]
external/bsd/tcpdump/dist/Makefile.in [new file with mode: 0644]
external/bsd/tcpdump/dist/README.md [new file with mode: 0644]
external/bsd/tcpdump/dist/Readme.Win32 [new file with mode: 0644]
external/bsd/tcpdump/dist/VERSION [new file with mode: 0644]
external/bsd/tcpdump/dist/aclocal.m4 [new file with mode: 0644]
external/bsd/tcpdump/dist/addrtoname.c [new file with mode: 0644]
external/bsd/tcpdump/dist/addrtoname.h [new file with mode: 0644]
external/bsd/tcpdump/dist/af.c [new file with mode: 0644]
external/bsd/tcpdump/dist/af.h [new file with mode: 0644]
external/bsd/tcpdump/dist/ah.h [new file with mode: 0644]
external/bsd/tcpdump/dist/appletalk.h [new file with mode: 0644]
external/bsd/tcpdump/dist/atime.awk [new file with mode: 0644]
external/bsd/tcpdump/dist/atm.h [new file with mode: 0644]
external/bsd/tcpdump/dist/atmuni31.h [new file with mode: 0644]
external/bsd/tcpdump/dist/bpf_dump.c [new file with mode: 0644]
external/bsd/tcpdump/dist/chdlc.h [new file with mode: 0644]
external/bsd/tcpdump/dist/checksum.c [new file with mode: 0644]
external/bsd/tcpdump/dist/config.guess [new file with mode: 0755]
external/bsd/tcpdump/dist/config.h.in [new file with mode: 0644]
external/bsd/tcpdump/dist/config.sub [new file with mode: 0755]
external/bsd/tcpdump/dist/configure [new file with mode: 0755]
external/bsd/tcpdump/dist/configure.in [new file with mode: 0644]
external/bsd/tcpdump/dist/cpack.c [new file with mode: 0644]
external/bsd/tcpdump/dist/cpack.h [new file with mode: 0644]
external/bsd/tcpdump/dist/ether.h [new file with mode: 0644]
external/bsd/tcpdump/dist/ethertype.h [new file with mode: 0644]
external/bsd/tcpdump/dist/extract.h [new file with mode: 0644]
external/bsd/tcpdump/dist/getopt_long.h [new file with mode: 0644]
external/bsd/tcpdump/dist/gmpls.c [new file with mode: 0644]
external/bsd/tcpdump/dist/gmpls.h [new file with mode: 0644]
external/bsd/tcpdump/dist/gmt2local.c [new file with mode: 0644]
external/bsd/tcpdump/dist/gmt2local.h [new file with mode: 0644]
external/bsd/tcpdump/dist/in_cksum.c [new file with mode: 0644]
external/bsd/tcpdump/dist/install-sh [new file with mode: 0755]
external/bsd/tcpdump/dist/interface.h [new file with mode: 0644]
external/bsd/tcpdump/dist/ip.h [new file with mode: 0644]
external/bsd/tcpdump/dist/ip6.h [new file with mode: 0644]
external/bsd/tcpdump/dist/ipproto.c [new file with mode: 0644]
external/bsd/tcpdump/dist/ipproto.h [new file with mode: 0644]
external/bsd/tcpdump/dist/l2vpn.c [new file with mode: 0644]
external/bsd/tcpdump/dist/l2vpn.h [new file with mode: 0644]
external/bsd/tcpdump/dist/lbl/os-osf4.h [new file with mode: 0644]
external/bsd/tcpdump/dist/lbl/os-solaris2.h [new file with mode: 0644]
external/bsd/tcpdump/dist/lbl/os-sunos4.h [new file with mode: 0644]
external/bsd/tcpdump/dist/lbl/os-ultrix4.h [new file with mode: 0644]
external/bsd/tcpdump/dist/llc.h [new file with mode: 0644]
external/bsd/tcpdump/dist/machdep.c [new file with mode: 0644]
external/bsd/tcpdump/dist/machdep.h [new file with mode: 0644]
external/bsd/tcpdump/dist/makemib [new file with mode: 0644]
external/bsd/tcpdump/dist/mib.h [new file with mode: 0644]
external/bsd/tcpdump/dist/missing/addrinfo.h [new file with mode: 0644]
external/bsd/tcpdump/dist/missing/datalinks.c [new file with mode: 0644]
external/bsd/tcpdump/dist/missing/dlnames.c [new file with mode: 0644]
external/bsd/tcpdump/dist/missing/getnameinfo.c [new file with mode: 0644]
external/bsd/tcpdump/dist/missing/getopt_long.c [new file with mode: 0644]
external/bsd/tcpdump/dist/missing/inet_aton.c [new file with mode: 0644]
external/bsd/tcpdump/dist/missing/inet_ntop.c [new file with mode: 0644]
external/bsd/tcpdump/dist/missing/inet_pton.c [new file with mode: 0644]
external/bsd/tcpdump/dist/missing/snprintf.c [new file with mode: 0644]
external/bsd/tcpdump/dist/missing/strdup.c [new file with mode: 0644]
external/bsd/tcpdump/dist/missing/strlcat.c [new file with mode: 0644]
external/bsd/tcpdump/dist/missing/strlcpy.c [new file with mode: 0644]
external/bsd/tcpdump/dist/missing/strsep.c [new file with mode: 0644]
external/bsd/tcpdump/dist/mkdep [new file with mode: 0755]
external/bsd/tcpdump/dist/mpls.h [new file with mode: 0644]
external/bsd/tcpdump/dist/nameser.h [new file with mode: 0644]
external/bsd/tcpdump/dist/netdissect.h [new file with mode: 0644]
external/bsd/tcpdump/dist/nfs.h [new file with mode: 0644]
external/bsd/tcpdump/dist/nfsfh.h [new file with mode: 0644]
external/bsd/tcpdump/dist/nlpid.c [new file with mode: 0644]
external/bsd/tcpdump/dist/nlpid.h [new file with mode: 0644]
external/bsd/tcpdump/dist/openflow.h [new file with mode: 0644]
external/bsd/tcpdump/dist/ospf.h [new file with mode: 0644]
external/bsd/tcpdump/dist/oui.c [new file with mode: 0644]
external/bsd/tcpdump/dist/oui.h [new file with mode: 0644]
external/bsd/tcpdump/dist/packetdat.awk [new file with mode: 0644]
external/bsd/tcpdump/dist/parsenfsfh.c [new file with mode: 0644]
external/bsd/tcpdump/dist/pcap-missing.h [new file with mode: 0644]
external/bsd/tcpdump/dist/pcap_dump_ftell.c [new file with mode: 0644]
external/bsd/tcpdump/dist/pf.h [new file with mode: 0644]
external/bsd/tcpdump/dist/pf_print_state.c [new file with mode: 0644]
external/bsd/tcpdump/dist/ppp.h [new file with mode: 0644]
external/bsd/tcpdump/dist/print-802_11.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-802_15_4.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ah.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ahcp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-aodv.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-aoe.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ap1394.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-arcnet.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-arp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ascii.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-atalk.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-atm.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-babel.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-beep.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-bfd.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-bgp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-bootp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-bt.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-calm-fast.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-carp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-cdp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-cfm.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-chdlc.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-cip.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-cnfp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-dccp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-decnet.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-dhcp6.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-domain.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-dtp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-dvmrp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-eap.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-egp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-eigrp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-enc.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-esp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ether.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-fddi.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-forces.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-fr.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-frag6.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ftp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-geneve.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-geonet.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-gre.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-hsrp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-http.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-icmp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-icmp6.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-igmp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-igrp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ip.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ip6.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ip6opts.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ipcomp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ipfc.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ipnet.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ipx.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-isakmp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-isoclns.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-juniper.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-krb.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-l2tp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-lane.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ldp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-llc.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-lldp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-lmp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-loopback.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-lspping.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-lwapp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-lwres.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-m3ua.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-mobile.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-mobility.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-mpcp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-mpls.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-mptcp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-msdp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-msnlb.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-nflog.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-nfs.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ntp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-null.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-olsr.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-openflow-1.0.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-openflow.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ospf.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ospf6.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-otv.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-pflog.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-pfsync.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-pgm.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-pim.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-pktap.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ppi.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ppp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-pppoe.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-pptp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-radius.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-raw.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-rip.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-ripng.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-rpki-rtr.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-rrcp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-rsvp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-rt6.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-rtsp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-rx.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-sctp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-sflow.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-sip.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-sl.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-sll.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-slow.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-smb.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-smtp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-snmp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-stp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-sunatm.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-sunrpc.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-symantec.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-syslog.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-tcp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-telnet.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-tftp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-timed.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-tipc.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-token.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-udld.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-udp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-usb.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-vjc.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-vqp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-vrrp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-vtp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-vxlan.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-wb.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-zephyr.c [new file with mode: 0644]
external/bsd/tcpdump/dist/print-zeromq.c [new file with mode: 0644]
external/bsd/tcpdump/dist/rpc_auth.h [new file with mode: 0644]
external/bsd/tcpdump/dist/rpc_msg.h [new file with mode: 0644]
external/bsd/tcpdump/dist/rpl.h [new file with mode: 0644]
external/bsd/tcpdump/dist/send-ack.awk [new file with mode: 0644]
external/bsd/tcpdump/dist/setsignal.c [new file with mode: 0644]
external/bsd/tcpdump/dist/setsignal.h [new file with mode: 0644]
external/bsd/tcpdump/dist/signature.c [new file with mode: 0644]
external/bsd/tcpdump/dist/signature.h [new file with mode: 0644]
external/bsd/tcpdump/dist/slcompress.h [new file with mode: 0644]
external/bsd/tcpdump/dist/smb.h [new file with mode: 0644]
external/bsd/tcpdump/dist/smbutil.c [new file with mode: 0644]
external/bsd/tcpdump/dist/stime.awk [new file with mode: 0644]
external/bsd/tcpdump/dist/strcasecmp.c [new file with mode: 0644]
external/bsd/tcpdump/dist/tcp.h [new file with mode: 0644]
external/bsd/tcpdump/dist/tcpdump-stdinc.h [new file with mode: 0644]
external/bsd/tcpdump/dist/tcpdump.1.in [new file with mode: 0644]
external/bsd/tcpdump/dist/tcpdump.c [new file with mode: 0644]
external/bsd/tcpdump/dist/tcpdump2netbsd [new file with mode: 0755]
external/bsd/tcpdump/dist/tests/02-sunrise-sunset-esp.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/08-sunrise-sunset-aes.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/08-sunrise-sunset-esp2.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/3560_CDP.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/802.1D_spanning_tree.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/802.1w_rapid_STP.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/AoE_Linux.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/DECnet_Phone.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/DTP.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/EIGRP_adjacency.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/EIGRP_goodbye.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/EIGRP_subnet_down.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/EIGRP_subnet_up.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/HDLC.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/HSRP_coup.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/HSRP_election.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/HSRP_failover.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/IGMP_V1.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/IGMP_V2.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ISAKMP_sa_setup.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ISIS_external_lsp.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ISIS_level1_adjacency.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ISIS_level2_adjacency.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ISIS_p2p_adjacency.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/LACP.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/LLDP_and_CDP.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/MSTP_Intra-Region_BPDUs.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/OSPFv3_NBMA_adjacencies.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/OSPFv3_broadcast_adjacency.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/OSPFv3_multipoint_adjacencies.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/OSPFv3_with_AH.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/PIM-DM_pruning.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/PIM-SM_join_prune.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/PIM_register_register-stop.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/PIMv2_bootstrap.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/PIMv2_hellos.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/QinQpacket.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/QinQpacket.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/QinQpacketv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/RADIUS-RFC4675.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/RADIUS-RFC5176.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/RADIUS.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/TESTLIST [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/TESTonce [new file with mode: 0755]
external/bsd/tcpdump/dist/tests/TESTrun.sh [new file with mode: 0755]
external/bsd/tcpdump/dist/tests/UDLD.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ahcp-vv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ahcp.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/aoe_1-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/aoe_1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/babel.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/babel1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/babel1v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/babel_auth.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/babel_auth.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/babel_pad1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/babel_pad1.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/babel_rtt.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/babel_rtt.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/bgp-infinite-loop.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/bgp_infloop-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/bgp_vpn_attrset.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/bgp_vpn_attrset.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/cdp-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/chdlc-slarp-short.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/chdlc-slarp.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/crypto.sh [new file with mode: 0755]
external/bsd/tcpdump/dist/tests/cve2015-0261-crash.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/cve2015-0261-crash.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/cve2015-0261-ipv6.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/cve2015-0261-ipv6.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dcb_ets.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dcb_ets.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dcb_pfc.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dcb_pfc.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dcb_qcn.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dcb_qcn.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_longer.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_longer.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_simple.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_simple.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_longer.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_longer.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_simple.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_simple.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/decnet.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcp-rfc3004-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcp-rfc3004.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcp-rfc5859-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcp-rfc5859.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-AFTR-Name-RFC6334.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-AFTR-Name-RFC6334.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-domain-list.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-domain-list.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-ia-na.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-ia-na.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-ia-pd.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-ia-pd.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-ia-ta.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-ia-ta.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-ntp-server.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-ntp-server.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-sip-server-d.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dhcpv6-sip-server-d.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dtp-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/dvmrp.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/e1000g.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/e1000g.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/eapon1.gdbinit [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/eapon1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/eapon1.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/eigrp1-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/eigrp2-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/eigrp3-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/eigrp4-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/epgm_zmtp1.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/epgm_zmtp1v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/epgmv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/esp-secrets.txt [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/esp0.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/esp1.gdbinit [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/esp1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/esp2.gdbinit [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/esp2.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/esp3.gdbinit [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/esp4.gdbinit [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/esp5.gdbinit [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/esp5.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/espudp1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/espudp1.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/evb.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/evb.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/failure-outputs.txt [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/forces1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/forces1.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/forces1vvv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/forces1vvvv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/forces2v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/forces2vv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/forces2vvv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/forces3.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/forces3vvv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/geneve-tcp.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/geneve-vni.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/geneve-vv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/geneve.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/geonet_and_calm_fast.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/geonet_and_calm_fast.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/hdlc1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/hdlc2.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/hdlc3.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/hdlc4.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/hdlc_slarp.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/hsrp_1-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/hsrp_1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/hsrp_2-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/hsrp_3-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/icmpv6.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/icmpv6.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/icmpv6_opt24-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/icmpv6_opt24.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ieee802.11_exthdr.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ieee802.11_exthdr.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ieee802.11_rx-stbc.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ieee802.11_rx-stbc.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/igmpv1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/igmpv2.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/igmpv3-queries.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/igmpv3-queries.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ikev2four.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ikev2four.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ikev2fourv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ikev2fourv4.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ikev2pI2-secrets.txt [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ikev2pI2.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ikev2pI2.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ipv6-bad-version.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ipv6-bad-version.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ipv6-routing-header.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ipv6-routing-header.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isakmp-delete-segfault.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isakmp-identification-segfault.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isakmp-pointer-loop.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isakmp1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isakmp2.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isakmp3.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isakmp4.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isakmp4500.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isakmp5-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isis-infinite-loop.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isis_1-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isis_1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isis_2-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isis_3-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isis_4-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isis_infloop-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isup.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isup.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/isupvv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday1.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday2.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday2.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday3.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday3.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday4.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday4.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday5.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday5.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday6.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday6.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday7.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday7.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday8.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/kday8.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/lacp-ev.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ldp-infinite-loop.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ldp_infloop.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/lldp_cdp-ev.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/lmp-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/lmp-v.sh [new file with mode: 0755]
external/bsd/tcpdump/dist/tests/lmp.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/lmp.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/loopback.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/loopback.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/lspping-fec-ldp.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/lspping-fec-rsvp.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/mpbgp-linklocal-nexthop.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/mpbgp-linklocal-nexthop.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/mpls-ldp-hello.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/mpls-ldp-hello.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/mpls-traceroute.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/mptcp-fclose.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/mptcp-fclose.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/mptcp.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/mptcp.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/mrinfo_query.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/msnlb.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/msnlb.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/msnlb2.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/msnlb2.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/mstp-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/mtrace.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/mtrace.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/nflog-e.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/nflog-e.sh [new file with mode: 0755]
external/bsd/tcpdump/dist/tests/nflog.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/of10_7050q-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/of10_7050q.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/of10_7050sx_bsn-vv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/of10_7050sx_bsn.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/of10_p3295-vv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/of10_p3295.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/of10_pf5240-vv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/of10_pf5240.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/of10_s4810-vvvv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/of10_s4810.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ospf-gmpls.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ospf-gmpls.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ospf3_ah-vv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ospf3_auth-vv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ospf3_auth.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ospf3_bc-vv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ospf3_mp-vv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ospf3_nbma-vv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/pgm_zmtp1.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/pgm_zmtp1v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/pgmv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/pimv2_bootstrap-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/pimv2_dm-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/pimv2_hellos-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/pimv2_register-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/pimv2_sm-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/pppoe.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/pppoe.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/pppoes.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/pppoes.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/pppoes_id.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/print-A.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/print-AA.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/print-capX.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/print-capXX.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/print-flags.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/print-x.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/print-xx.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/radius-rfc4675-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/radius-rfc5176-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/radius-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ripv1v2.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ripv1v2.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ripv2_auth.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/ripv2_auth.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/rpl-14-dao.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/rpl-14-daovvv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/rpl-19-pickdag.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/rpl-19-pickdag.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/rpl-19-pickdagvvv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/rpl-26-senddaoack.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/rpl-26-senddaovv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/rpvst-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/rpvstp-trunk-native-vid5.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/rstp-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/rsvp-infinite-loop.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/rsvp_infloop-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/sflow_multiple_counter_30_pdus-nv.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/sflow_multiple_counter_30_pdus.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/sflow_multiple_counter_30_pdus.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/spb.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/spb.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/spb_bpduv4.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/spb_bpduv4.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/stp-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/syslog-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/syslog_udp.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/tfo-5c1fa7f9ae91.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/tfo.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/udld-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/vrrp-v.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/vrrp.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/vrrp.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/zmtp1.out [new file with mode: 0644]
external/bsd/tcpdump/dist/tests/zmtp1.pcap [new file with mode: 0644]
external/bsd/tcpdump/dist/udp.h [new file with mode: 0644]
external/bsd/tcpdump/dist/util.c [new file with mode: 0644]
external/bsd/tcpdump/dist/vfprintf.c [new file with mode: 0644]
external/bsd/tcpdump/dist/win32/Include/w32_fzs.h [new file with mode: 0644]
external/bsd/tcpdump/dist/win32/prj/GNUmakefile [new file with mode: 0644]
external/bsd/tcpdump/dist/win32/prj/WinDump.dsp [new file with mode: 0644]
external/bsd/tcpdump/dist/win32/prj/WinDump.dsw [new file with mode: 0644]
external/bsd/tcpdump/include/config.h [new file with mode: 0644]
external/bsd/tcpdump/tcpdump2netbsd [new file with mode: 0755]

index ccbf371e0769e9dcf432f5c337e3231632f14808..ef2be08885f84a83669a58cf63d63ed59b457ebf 100644 (file)
 ./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
index 181f7c43effd72c3173a29a559bfaf46a0c91008..465e022aa3d9daf04c7c880652de7125b1bc7ad5 100644 (file)
 ./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
index 7879701870edfb1cd0c5fb7f7c494b9d872cdbad..e664a455ae9aaf9c391b3a7331267f511c34977d 100644 (file)
 ./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
index 0f58885812e07a48322afdb40bc0bf0209c3d20e..96f36e31cb065372ab17ff134ea3a70a00cc08e9 100644 (file)
 ./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
index e13ef109bb97fba78040e778894097f202cae76c..19bb291bf33ea108017788c259a14e8b7bb8db08 100644 (file)
@@ -6,7 +6,7 @@
 SUBDIR=        bind byacc dhcpcd \
        fetch file flex less \
        libarchive libevent libpcap mdocml \
-       openresolv tmux top
+       openresolv tcpdump tmux top
 
 .if (${MKATF} != "no")
 SUBDIR+= atf
diff --git a/external/bsd/tcpdump/Makefile b/external/bsd/tcpdump/Makefile
new file mode 100644 (file)
index 0000000..cdcf6ab
--- /dev/null
@@ -0,0 +1,5 @@
+#      $NetBSD: Makefile,v 1.2 2010/12/05 05:24:21 christos Exp $
+
+SUBDIR=        bin
+
+.include <bsd.subdir.mk>
diff --git a/external/bsd/tcpdump/bin/Makefile b/external/bsd/tcpdump/bin/Makefile
new file mode 100644 (file)
index 0000000..e0e83b2
--- /dev/null
@@ -0,0 +1,201 @@
+#      $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>
diff --git a/external/bsd/tcpdump/dist/CHANGES b/external/bsd/tcpdump/dist/CHANGES
new file mode 100644 (file)
index 0000000..2dbcfa9
--- /dev/null
@@ -0,0 +1,1130 @@
+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.
diff --git a/external/bsd/tcpdump/dist/CREDITS b/external/bsd/tcpdump/dist/CREDITS
new file mode 100644 (file)
index 0000000..a21311a
--- /dev/null
@@ -0,0 +1,229 @@
+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/
diff --git a/external/bsd/tcpdump/dist/INSTALL.txt b/external/bsd/tcpdump/dist/INSTALL.txt
new file mode 100644 (file)
index 0000000..dcb52b8
--- /dev/null
@@ -0,0 +1,213 @@
+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
diff --git a/external/bsd/tcpdump/dist/LICENSE b/external/bsd/tcpdump/dist/LICENSE
new file mode 100644 (file)
index 0000000..dea5f7d
--- /dev/null
@@ -0,0 +1,19 @@
+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.
diff --git a/external/bsd/tcpdump/dist/Makefile-devel-adds b/external/bsd/tcpdump/dist/Makefile-devel-adds
new file mode 100644 (file)
index 0000000..7bf6420
--- /dev/null
@@ -0,0 +1,22 @@
+#
+# 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
diff --git a/external/bsd/tcpdump/dist/Makefile.in b/external/bsd/tcpdump/dist/Makefile.in
new file mode 100644 (file)
index 0000000..a0dc559
--- /dev/null
@@ -0,0 +1,454 @@
+#  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)
diff --git a/external/bsd/tcpdump/dist/README.md b/external/bsd/tcpdump/dist/README.md
new file mode 100644 (file)
index 0000000..c83ffab
--- /dev/null
@@ -0,0 +1,243 @@
+# 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".
+```
diff --git a/external/bsd/tcpdump/dist/Readme.Win32 b/external/bsd/tcpdump/dist/Readme.Win32
new file mode 100644 (file)
index 0000000..fdf8b12
--- /dev/null
@@ -0,0 +1,24 @@
+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
diff --git a/external/bsd/tcpdump/dist/VERSION b/external/bsd/tcpdump/dist/VERSION
new file mode 100644 (file)
index 0000000..87b18a5
--- /dev/null
@@ -0,0 +1 @@
+4.7.3
diff --git a/external/bsd/tcpdump/dist/aclocal.m4 b/external/bsd/tcpdump/dist/aclocal.m4
new file mode 100644 (file)
index 0000000..285000d
--- /dev/null
@@ -0,0 +1,1438 @@
+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
+])
diff --git a/external/bsd/tcpdump/dist/addrtoname.c b/external/bsd/tcpdump/dist/addrtoname.c
new file mode 100644 (file)
index 0000000..d42a236
--- /dev/null
@@ -0,0 +1,1233 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/addrtoname.h b/external/bsd/tcpdump/dist/addrtoname.h
new file mode 100644 (file)
index 0000000..b07d8b2
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/af.c b/external/bsd/tcpdump/dist/af.c
new file mode 100644 (file)
index 0000000..ee78b4a
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * 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}
+};
diff --git a/external/bsd/tcpdump/dist/af.h b/external/bsd/tcpdump/dist/af.h
new file mode 100644 (file)
index 0000000..bbe1a16
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/ah.h b/external/bsd/tcpdump/dist/ah.h
new file mode 100644 (file)
index 0000000..f949ca2
--- /dev/null
@@ -0,0 +1,57 @@
+/*     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_*/
diff --git a/external/bsd/tcpdump/dist/appletalk.h b/external/bsd/tcpdump/dist/appletalk.h
new file mode 100644 (file)
index 0000000..3fbcbce
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * 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))
diff --git a/external/bsd/tcpdump/dist/atime.awk b/external/bsd/tcpdump/dist/atime.awk
new file mode 100644 (file)
index 0000000..fa1c7a1
--- /dev/null
@@ -0,0 +1,18 @@
+$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
+       }
diff --git a/external/bsd/tcpdump/dist/atm.h b/external/bsd/tcpdump/dist/atm.h
new file mode 100644 (file)
index 0000000..8d1737e
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/atmuni31.h b/external/bsd/tcpdump/dist/atmuni31.h
new file mode 100644 (file)
index 0000000..0f85430
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/bpf_dump.c b/external/bsd/tcpdump/dist/bpf_dump.c
new file mode 100644 (file)
index 0000000..1d8df5c
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * 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));
+       }
+}
diff --git a/external/bsd/tcpdump/dist/chdlc.h b/external/bsd/tcpdump/dist/chdlc.h
new file mode 100644 (file)
index 0000000..d5a2d91
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/checksum.c b/external/bsd/tcpdump/dist/checksum.c
new file mode 100644 (file)
index 0000000..0e6d0a2
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/config.guess b/external/bsd/tcpdump/dist/config.guess
new file mode 100755 (executable)
index 0000000..44290b8
--- /dev/null
@@ -0,0 +1,1435 @@
+#! /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:
diff --git a/external/bsd/tcpdump/dist/config.h.in b/external/bsd/tcpdump/dist/config.h.in
new file mode 100644 (file)
index 0000000..914289a
--- /dev/null
@@ -0,0 +1,397 @@
+/* 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
diff --git a/external/bsd/tcpdump/dist/config.sub b/external/bsd/tcpdump/dist/config.sub
new file mode 100755 (executable)
index 0000000..bc855a2
--- /dev/null
@@ -0,0 +1,1807 @@
+#! /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:
diff --git a/external/bsd/tcpdump/dist/configure b/external/bsd/tcpdump/dist/configure
new file mode 100755 (executable)
index 0000000..43b3068
--- /dev/null
@@ -0,0 +1,9731 @@
+#! /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", &current, &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
diff --git a/external/bsd/tcpdump/dist/configure.in b/external/bsd/tcpdump/dist/configure.in
new file mode 100644 (file)
index 0000000..cd1c62f
--- /dev/null
@@ -0,0 +1,1174 @@
+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", &current, &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
diff --git a/external/bsd/tcpdump/dist/cpack.c b/external/bsd/tcpdump/dist/cpack.c
new file mode 100644 (file)
index 0000000..a662be3
--- /dev/null
@@ -0,0 +1,153 @@
+/*-
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/cpack.h b/external/bsd/tcpdump/dist/cpack.h
new file mode 100644 (file)
index 0000000..e75ef04
--- /dev/null
@@ -0,0 +1,53 @@
+/*-
+ * 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 */
diff --git a/external/bsd/tcpdump/dist/ether.h b/external/bsd/tcpdump/dist/ether.h
new file mode 100644 (file)
index 0000000..880663f
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/ethertype.h b/external/bsd/tcpdump/dist/ethertype.h
new file mode 100644 (file)
index 0000000..8039917
--- /dev/null
@@ -0,0 +1,200 @@
+/*
+ * 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[];
diff --git a/external/bsd/tcpdump/dist/extract.h b/external/bsd/tcpdump/dist/extract.h
new file mode 100644 (file)
index 0000000..c628c98
--- /dev/null
@@ -0,0 +1,323 @@
+/*
+ * 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__ */
diff --git a/external/bsd/tcpdump/dist/getopt_long.h b/external/bsd/tcpdump/dist/getopt_long.h
new file mode 100644 (file)
index 0000000..9d10375
--- /dev/null
@@ -0,0 +1,66 @@
+/*     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_ */
diff --git a/external/bsd/tcpdump/dist/gmpls.c b/external/bsd/tcpdump/dist/gmpls.c
new file mode 100644 (file)
index 0000000..5bf4c91
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ * 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 }
+};
diff --git a/external/bsd/tcpdump/dist/gmpls.h b/external/bsd/tcpdump/dist/gmpls.h
new file mode 100644 (file)
index 0000000..8b44f94
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * 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[];
diff --git a/external/bsd/tcpdump/dist/gmt2local.c b/external/bsd/tcpdump/dist/gmt2local.c
new file mode 100644 (file)
index 0000000..552bccf
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/gmt2local.h b/external/bsd/tcpdump/dist/gmt2local.h
new file mode 100644 (file)
index 0000000..89254df
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/in_cksum.c b/external/bsd/tcpdump/dist/in_cksum.c
new file mode 100644 (file)
index 0000000..171728a
--- /dev/null
@@ -0,0 +1,201 @@
+/* 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;
+}
diff --git a/external/bsd/tcpdump/dist/install-sh b/external/bsd/tcpdump/dist/install-sh
new file mode 100755 (executable)
index 0000000..b44de09
--- /dev/null
@@ -0,0 +1,250 @@
+#! /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
diff --git a/external/bsd/tcpdump/dist/interface.h b/external/bsd/tcpdump/dist/interface.h
new file mode 100644 (file)
index 0000000..1ec6ea8
--- /dev/null
@@ -0,0 +1,231 @@
+/*     $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
diff --git a/external/bsd/tcpdump/dist/ip.h b/external/bsd/tcpdump/dist/ip.h
new file mode 100644 (file)
index 0000000..75a017f
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ * 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 */
diff --git a/external/bsd/tcpdump/dist/ip6.h b/external/bsd/tcpdump/dist/ip6.h
new file mode 100644 (file)
index 0000000..e9db5bd
--- /dev/null
@@ -0,0 +1,197 @@
+/*     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_ */
diff --git a/external/bsd/tcpdump/dist/ipproto.c b/external/bsd/tcpdump/dist/ipproto.c
new file mode 100644 (file)
index 0000000..40e35a2
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * 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 }
+};
+
diff --git a/external/bsd/tcpdump/dist/ipproto.h b/external/bsd/tcpdump/dist/ipproto.h
new file mode 100644 (file)
index 0000000..3b219ba
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/l2vpn.c b/external/bsd/tcpdump/dist/l2vpn.c
new file mode 100644 (file)
index 0000000..15cadc4
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * 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}
+};
diff --git a/external/bsd/tcpdump/dist/l2vpn.h b/external/bsd/tcpdump/dist/l2vpn.h
new file mode 100644 (file)
index 0000000..151228f
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * 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[];
diff --git a/external/bsd/tcpdump/dist/lbl/os-osf4.h b/external/bsd/tcpdump/dist/lbl/os-osf4.h
new file mode 100644 (file)
index 0000000..359bf36
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * 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);
diff --git a/external/bsd/tcpdump/dist/lbl/os-solaris2.h b/external/bsd/tcpdump/dist/lbl/os-solaris2.h
new file mode 100644 (file)
index 0000000..9f94da9
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * 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 *);
diff --git a/external/bsd/tcpdump/dist/lbl/os-sunos4.h b/external/bsd/tcpdump/dist/lbl/os-sunos4.h
new file mode 100644 (file)
index 0000000..b735857
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/lbl/os-ultrix4.h b/external/bsd/tcpdump/dist/lbl/os-ultrix4.h
new file mode 100644 (file)
index 0000000..fa1f770
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * 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 *);
diff --git a/external/bsd/tcpdump/dist/llc.h b/external/bsd/tcpdump/dist/llc.h
new file mode 100644 (file)
index 0000000..ec8d069
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * 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 */
diff --git a/external/bsd/tcpdump/dist/machdep.c b/external/bsd/tcpdump/dist/machdep.c
new file mode 100644 (file)
index 0000000..ea5edc9
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/machdep.h b/external/bsd/tcpdump/dist/machdep.h
new file mode 100644 (file)
index 0000000..d1c7d4b
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/makemib b/external/bsd/tcpdump/dist/makemib
new file mode 100644 (file)
index 0000000..97e7875
--- /dev/null
@@ -0,0 +1,247 @@
+#!/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
diff --git a/external/bsd/tcpdump/dist/mib.h b/external/bsd/tcpdump/dist/mib.h
new file mode 100644 (file)
index 0000000..92c6c2c
--- /dev/null
@@ -0,0 +1,1460 @@
+/*
+ * 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;
diff --git a/external/bsd/tcpdump/dist/missing/addrinfo.h b/external/bsd/tcpdump/dist/missing/addrinfo.h
new file mode 100644 (file)
index 0000000..bf4bbf6
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/missing/datalinks.c b/external/bsd/tcpdump/dist/missing/datalinks.c
new file mode 100644 (file)
index 0000000..e7d526b
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/missing/dlnames.c b/external/bsd/tcpdump/dist/missing/dlnames.c
new file mode 100644 (file)
index 0000000..a10cd39
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/missing/getnameinfo.c b/external/bsd/tcpdump/dist/missing/getnameinfo.c
new file mode 100644 (file)
index 0000000..63aba73
--- /dev/null
@@ -0,0 +1,276 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/missing/getopt_long.c b/external/bsd/tcpdump/dist/missing/getopt_long.c
new file mode 100644 (file)
index 0000000..73b1865
--- /dev/null
@@ -0,0 +1,612 @@
+/*     $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));
+}
diff --git a/external/bsd/tcpdump/dist/missing/inet_aton.c b/external/bsd/tcpdump/dist/missing/inet_aton.c
new file mode 100644 (file)
index 0000000..e85ad5f
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/missing/inet_ntop.c b/external/bsd/tcpdump/dist/missing/inet_ntop.c
new file mode 100644 (file)
index 0000000..8c6f7eb
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+ * 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;
+    }
+}
diff --git a/external/bsd/tcpdump/dist/missing/inet_pton.c b/external/bsd/tcpdump/dist/missing/inet_pton.c
new file mode 100644 (file)
index 0000000..3466f42
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/missing/snprintf.c b/external/bsd/tcpdump/dist/missing/snprintf.c
new file mode 100644 (file)
index 0000000..21d235d
--- /dev/null
@@ -0,0 +1,625 @@
+/*
+ * 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
+
diff --git a/external/bsd/tcpdump/dist/missing/strdup.c b/external/bsd/tcpdump/dist/missing/strdup.c
new file mode 100644 (file)
index 0000000..9fca752
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/missing/strlcat.c b/external/bsd/tcpdump/dist/missing/strlcat.c
new file mode 100644 (file)
index 0000000..93fa42e
--- /dev/null
@@ -0,0 +1,73 @@
+/*     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 */
+}
diff --git a/external/bsd/tcpdump/dist/missing/strlcpy.c b/external/bsd/tcpdump/dist/missing/strlcpy.c
new file mode 100644 (file)
index 0000000..c8cf633
--- /dev/null
@@ -0,0 +1,70 @@
+/*     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 */
+}
diff --git a/external/bsd/tcpdump/dist/missing/strsep.c b/external/bsd/tcpdump/dist/missing/strsep.c
new file mode 100644 (file)
index 0000000..a1e6b30
--- /dev/null
@@ -0,0 +1,80 @@
+/*-
+ * 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 */
+}
diff --git a/external/bsd/tcpdump/dist/mkdep b/external/bsd/tcpdump/dist/mkdep
new file mode 100755 (executable)
index 0000000..1486b18
--- /dev/null
@@ -0,0 +1,112 @@
+#!/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
diff --git a/external/bsd/tcpdump/dist/mpls.h b/external/bsd/tcpdump/dist/mpls.h
new file mode 100644 (file)
index 0000000..03cb4bf
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * 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)
diff --git a/external/bsd/tcpdump/dist/nameser.h b/external/bsd/tcpdump/dist/nameser.h
new file mode 100644 (file)
index 0000000..1f8eb30
--- /dev/null
@@ -0,0 +1,310 @@
+/*
+ * 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_ */
diff --git a/external/bsd/tcpdump/dist/netdissect.h b/external/bsd/tcpdump/dist/netdissect.h
new file mode 100644 (file)
index 0000000..2484dd0
--- /dev/null
@@ -0,0 +1,637 @@
+/*
+ * 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 */
diff --git a/external/bsd/tcpdump/dist/nfs.h b/external/bsd/tcpdump/dist/nfs.h
new file mode 100644 (file)
index 0000000..b63c9ee
--- /dev/null
@@ -0,0 +1,434 @@
+/*     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;
+};
diff --git a/external/bsd/tcpdump/dist/nfsfh.h b/external/bsd/tcpdump/dist/nfsfh.h
new file mode 100644 (file)
index 0000000..cfd073b
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * 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);
diff --git a/external/bsd/tcpdump/dist/nlpid.c b/external/bsd/tcpdump/dist/nlpid.c
new file mode 100644 (file)
index 0000000..2998b5d
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * 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 }
+};
diff --git a/external/bsd/tcpdump/dist/nlpid.h b/external/bsd/tcpdump/dist/nlpid.h
new file mode 100644 (file)
index 0000000..63a2e70
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/openflow.h b/external/bsd/tcpdump/dist/openflow.h
new file mode 100644 (file)
index 0000000..31ef03c
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * 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);
diff --git a/external/bsd/tcpdump/dist/ospf.h b/external/bsd/tcpdump/dist/ospf.h
new file mode 100644 (file)
index 0000000..b47aaf6
--- /dev/null
@@ -0,0 +1,325 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/oui.c b/external/bsd/tcpdump/dist/oui.c
new file mode 100644 (file)
index 0000000..1b78134
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * 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}
+};
diff --git a/external/bsd/tcpdump/dist/oui.h b/external/bsd/tcpdump/dist/oui.h
new file mode 100644 (file)
index 0000000..4a983ec
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/packetdat.awk b/external/bsd/tcpdump/dist/packetdat.awk
new file mode 100644 (file)
index 0000000..292e219
--- /dev/null
@@ -0,0 +1,61 @@
+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]
+       }
diff --git a/external/bsd/tcpdump/dist/parsenfsfh.c b/external/bsd/tcpdump/dist/parsenfsfh.c
new file mode 100644 (file)
index 0000000..29bf67e
--- /dev/null
@@ -0,0 +1,472 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/pcap-missing.h b/external/bsd/tcpdump/dist/pcap-missing.h
new file mode 100644 (file)
index 0000000..d776810
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * 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
+
+
+
+
+
+
+
+
+
diff --git a/external/bsd/tcpdump/dist/pcap_dump_ftell.c b/external/bsd/tcpdump/dist/pcap_dump_ftell.c
new file mode 100644 (file)
index 0000000..789a113
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/pf.h b/external/bsd/tcpdump/dist/pf.h
new file mode 100644 (file)
index 0000000..b6530a5
--- /dev/null
@@ -0,0 +1,78 @@
+
+/*
+ * 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)
diff --git a/external/bsd/tcpdump/dist/pf_print_state.c b/external/bsd/tcpdump/dist/pf_print_state.c
new file mode 100644 (file)
index 0000000..d27d933
--- /dev/null
@@ -0,0 +1,329 @@
+/*     $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);
+}
diff --git a/external/bsd/tcpdump/dist/ppp.h b/external/bsd/tcpdump/dist/ppp.h
new file mode 100644 (file)
index 0000000..9d53423
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/print-802_11.c b/external/bsd/tcpdump/dist/print-802_11.c
new file mode 100644 (file)
index 0000000..05be97a
--- /dev/null
@@ -0,0 +1,3016 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-802_15_4.c b/external/bsd/tcpdump/dist/print-802_15_4.c
new file mode 100644 (file)
index 0000000..26c28ee
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/print-ah.c b/external/bsd/tcpdump/dist/print-ah.c
new file mode 100644 (file)
index 0000000..0f171aa
--- /dev/null
@@ -0,0 +1,69 @@
+/*     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;
+}
diff --git a/external/bsd/tcpdump/dist/print-ahcp.c b/external/bsd/tcpdump/dist/print-ahcp.c
new file mode 100644 (file)
index 0000000..cc72bd7
--- /dev/null
@@ -0,0 +1,426 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-aodv.c b/external/bsd/tcpdump/dist/print-aodv.c
new file mode 100644 (file)
index 0000000..f64e215
--- /dev/null
@@ -0,0 +1,590 @@
+/*
+ * 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]"));
+}
diff --git a/external/bsd/tcpdump/dist/print-aoe.c b/external/bsd/tcpdump/dist/print-aoe.c
new file mode 100644 (file)
index 0000000..a4393b7
--- /dev/null
@@ -0,0 +1,437 @@
+/*
+ * 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));
+}
+
diff --git a/external/bsd/tcpdump/dist/print-ap1394.c b/external/bsd/tcpdump/dist/print-ap1394.c
new file mode 100644 (file)
index 0000000..aacf719
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/print-arcnet.c b/external/bsd/tcpdump/dist/print-arcnet.c
new file mode 100644 (file)
index 0000000..d7c2680
--- /dev/null
@@ -0,0 +1,363 @@
+/*
+ * 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:
+ */
+
diff --git a/external/bsd/tcpdump/dist/print-arp.c b/external/bsd/tcpdump/dist/print-arp.c
new file mode 100644 (file)
index 0000000..c0e3e55
--- /dev/null
@@ -0,0 +1,419 @@
+/*
+ * 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:
+ */
+
diff --git a/external/bsd/tcpdump/dist/print-ascii.c b/external/bsd/tcpdump/dist/print-ascii.c
new file mode 100644 (file)
index 0000000..1b2d229
--- /dev/null
@@ -0,0 +1,206 @@
+/*     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 */
diff --git a/external/bsd/tcpdump/dist/print-atalk.c b/external/bsd/tcpdump/dist/print-atalk.c
new file mode 100644 (file)
index 0000000..a4cd227
--- /dev/null
@@ -0,0 +1,627 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-atm.c b/external/bsd/tcpdump/dist/print-atm.c
new file mode 100644 (file)
index 0000000..e7f47bb
--- /dev/null
@@ -0,0 +1,466 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/print-babel.c b/external/bsd/tcpdump/dist/print-babel.c
new file mode 100644 (file)
index 0000000..75cb32c
--- /dev/null
@@ -0,0 +1,606 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/print-beep.c b/external/bsd/tcpdump/dist/print-beep.c
new file mode 100644 (file)
index 0000000..3539e5f
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * 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)"));
+}
diff --git a/external/bsd/tcpdump/dist/print-bfd.c b/external/bsd/tcpdump/dist/print-bfd.c
new file mode 100644 (file)
index 0000000..b8424db
--- /dev/null
@@ -0,0 +1,287 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-bgp.c b/external/bsd/tcpdump/dist/print-bgp.c
new file mode 100644 (file)
index 0000000..d2c4266
--- /dev/null
@@ -0,0 +1,2788 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-bootp.c b/external/bsd/tcpdump/dist/print-bootp.c
new file mode 100644 (file)
index 0000000..6b9a84e
--- /dev/null
@@ -0,0 +1,1093 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/print-bt.c b/external/bsd/tcpdump/dist/print-bt.c
new file mode 100644 (file)
index 0000000..e8e1a22
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-calm-fast.c b/external/bsd/tcpdump/dist/print-calm-fast.c
new file mode 100644 (file)
index 0000000..5cc39f4
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-carp.c b/external/bsd/tcpdump/dist/print-carp.c
new file mode 100644 (file)
index 0000000..7b9f28c
--- /dev/null
@@ -0,0 +1,82 @@
+/*     $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]"));
+}
diff --git a/external/bsd/tcpdump/dist/print-cdp.c b/external/bsd/tcpdump/dist/print-cdp.c
new file mode 100644 (file)
index 0000000..4ce79ff
--- /dev/null
@@ -0,0 +1,410 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/print-cfm.c b/external/bsd/tcpdump/dist/print-cfm.c
new file mode 100644 (file)
index 0000000..b41f92d
--- /dev/null
@@ -0,0 +1,642 @@
+/*
+ * 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"));
+}
diff --git a/external/bsd/tcpdump/dist/print-chdlc.c b/external/bsd/tcpdump/dist/print-chdlc.c
new file mode 100644 (file)
index 0000000..df85bda
--- /dev/null
@@ -0,0 +1,210 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-cip.c b/external/bsd/tcpdump/dist/print-cip.c
new file mode 100644 (file)
index 0000000..bea39c8
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-cnfp.c b/external/bsd/tcpdump/dist/print-cnfp.c
new file mode 100644 (file)
index 0000000..f44886d
--- /dev/null
@@ -0,0 +1,476 @@
+/*     $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;
+}
diff --git a/external/bsd/tcpdump/dist/print-dccp.c b/external/bsd/tcpdump/dist/print-dccp.c
new file mode 100644 (file)
index 0000000..f2d8e7a
--- /dev/null
@@ -0,0 +1,676 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/print-decnet.c b/external/bsd/tcpdump/dist/print-decnet.c
new file mode 100644 (file)
index 0000000..c26b976
--- /dev/null
@@ -0,0 +1,1350 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/print-dhcp6.c b/external/bsd/tcpdump/dist/print-dhcp6.c
new file mode 100644 (file)
index 0000000..b42ffdf
--- /dev/null
@@ -0,0 +1,815 @@
+/*
+ * 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]"));
+}
diff --git a/external/bsd/tcpdump/dist/print-domain.c b/external/bsd/tcpdump/dist/print-domain.c
new file mode 100644 (file)
index 0000000..eab8df1
--- /dev/null
@@ -0,0 +1,755 @@
+/*
+ * 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]"));
+}
diff --git a/external/bsd/tcpdump/dist/print-dtp.c b/external/bsd/tcpdump/dist/print-dtp.c
new file mode 100644 (file)
index 0000000..5d84a77
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-dvmrp.c b/external/bsd/tcpdump/dist/print-dvmrp.c
new file mode 100644 (file)
index 0000000..9bcea46
--- /dev/null
@@ -0,0 +1,371 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-eap.c b/external/bsd/tcpdump/dist/print-eap.c
new file mode 100644 (file)
index 0000000..7755cd7
--- /dev/null
@@ -0,0 +1,301 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-egp.c b/external/bsd/tcpdump/dist/print-egp.c
new file mode 100644 (file)
index 0000000..23c38d5
--- /dev/null
@@ -0,0 +1,361 @@
+/*
+ * 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;
+       }
+}
diff --git a/external/bsd/tcpdump/dist/print-eigrp.c b/external/bsd/tcpdump/dist/print-eigrp.c
new file mode 100644 (file)
index 0000000..06bdc4c
--- /dev/null
@@ -0,0 +1,479 @@
+/*
+ * 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"));
+}
diff --git a/external/bsd/tcpdump/dist/print-enc.c b/external/bsd/tcpdump/dist/print-enc.c
new file mode 100644 (file)
index 0000000..51a410c
--- /dev/null
@@ -0,0 +1,142 @@
+/*     $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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-esp.c b/external/bsd/tcpdump/dist/print-esp.c
new file mode 100644 (file)
index 0000000..246adee
--- /dev/null
@@ -0,0 +1,727 @@
+/*     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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-ether.c b/external/bsd/tcpdump/dist/print-ether.c
new file mode 100644 (file)
index 0000000..0ddabc5
--- /dev/null
@@ -0,0 +1,450 @@
+/*
+ * 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:
+ */
+
diff --git a/external/bsd/tcpdump/dist/print-fddi.c b/external/bsd/tcpdump/dist/print-fddi.c
new file mode 100644 (file)
index 0000000..1de85b7
--- /dev/null
@@ -0,0 +1,354 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-forces.c b/external/bsd/tcpdump/dist/print-forces.c
new file mode 100644 (file)
index 0000000..6c02b25
--- /dev/null
@@ -0,0 +1,1760 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-fr.c b/external/bsd/tcpdump/dist/print-fr.c
new file mode 100644 (file)
index 0000000..9b3de89
--- /dev/null
@@ -0,0 +1,934 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-frag6.c b/external/bsd/tcpdump/dist/print-frag6.c
new file mode 100644 (file)
index 0000000..bf9be9b
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * 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 */
diff --git a/external/bsd/tcpdump/dist/print-ftp.c b/external/bsd/tcpdump/dist/print-ftp.c
new file mode 100644 (file)
index 0000000..c8b662c
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-geneve.c b/external/bsd/tcpdump/dist/print-geneve.c
new file mode 100644 (file)
index 0000000..2187ab8
--- /dev/null
@@ -0,0 +1,223 @@
+/*
+ * 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]"));
+}
diff --git a/external/bsd/tcpdump/dist/print-geonet.c b/external/bsd/tcpdump/dist/print-geonet.c
new file mode 100644 (file)
index 0000000..edfb7f2
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-gre.c b/external/bsd/tcpdump/dist/print-gre.c
new file mode 100644 (file)
index 0000000..cac713f
--- /dev/null
@@ -0,0 +1,401 @@
+/*     $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;
+       }
+}
diff --git a/external/bsd/tcpdump/dist/print-hsrp.c b/external/bsd/tcpdump/dist/print-hsrp.c
new file mode 100644 (file)
index 0000000..f39758a
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * 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]"));
+}
diff --git a/external/bsd/tcpdump/dist/print-http.c b/external/bsd/tcpdump/dist/print-http.c
new file mode 100644 (file)
index 0000000..85ea1e3
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-icmp.c b/external/bsd/tcpdump/dist/print-icmp.c
new file mode 100644 (file)
index 0000000..c5caee0
--- /dev/null
@@ -0,0 +1,702 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-icmp6.c b/external/bsd/tcpdump/dist/print-icmp6.c
new file mode 100644 (file)
index 0000000..acfdf9c
--- /dev/null
@@ -0,0 +1,1985 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-igmp.c b/external/bsd/tcpdump/dist/print-igmp.c
new file mode 100644 (file)
index 0000000..3c5a735
--- /dev/null
@@ -0,0 +1,345 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-igrp.c b/external/bsd/tcpdump/dist/print-igrp.c
new file mode 100644 (file)
index 0000000..73d30e7
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * 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]"));
+}
diff --git a/external/bsd/tcpdump/dist/print-ip.c b/external/bsd/tcpdump/dist/print-ip.c
new file mode 100644 (file)
index 0000000..0106aa3
--- /dev/null
@@ -0,0 +1,715 @@
+/*
+ * 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:
+ */
+
+
diff --git a/external/bsd/tcpdump/dist/print-ip6.c b/external/bsd/tcpdump/dist/print-ip6.c
new file mode 100644 (file)
index 0000000..f95313a
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+ * 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 */
diff --git a/external/bsd/tcpdump/dist/print-ip6opts.c b/external/bsd/tcpdump/dist/print-ip6opts.c
new file mode 100644 (file)
index 0000000..e7eb748
--- /dev/null
@@ -0,0 +1,219 @@
+/*
+ * 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 */
diff --git a/external/bsd/tcpdump/dist/print-ipcomp.c b/external/bsd/tcpdump/dist/print-ipcomp.c
new file mode 100644 (file)
index 0000000..862347a
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/print-ipfc.c b/external/bsd/tcpdump/dist/print-ipfc.c
new file mode 100644 (file)
index 0000000..150c981
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-ipnet.c b/external/bsd/tcpdump/dist/print-ipnet.c
new file mode 100644 (file)
index 0000000..c4ff16a
--- /dev/null
@@ -0,0 +1,116 @@
+#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 */
diff --git a/external/bsd/tcpdump/dist/print-ipx.c b/external/bsd/tcpdump/dist/print-ipx.c
new file mode 100644 (file)
index 0000000..0952ef0
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-isakmp.c b/external/bsd/tcpdump/dist/print-isakmp.c
new file mode 100644 (file)
index 0000000..f78b708
--- /dev/null
@@ -0,0 +1,3001 @@
+/*
+ * 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:
+ */
+
+
+
+
diff --git a/external/bsd/tcpdump/dist/print-isoclns.c b/external/bsd/tcpdump/dist/print-isoclns.c
new file mode 100644 (file)
index 0000000..c99298b
--- /dev/null
@@ -0,0 +1,3119 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-juniper.c b/external/bsd/tcpdump/dist/print-juniper.c
new file mode 100644 (file)
index 0000000..0837eac
--- /dev/null
@@ -0,0 +1,1464 @@
+/*     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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-krb.c b/external/bsd/tcpdump/dist/print-krb.c
new file mode 100644 (file)
index 0000000..916257b
--- /dev/null
@@ -0,0 +1,262 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/print-l2tp.c b/external/bsd/tcpdump/dist/print-l2tp.c
new file mode 100644 (file)
index 0000000..ec84cb1
--- /dev/null
@@ -0,0 +1,753 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-lane.c b/external/bsd/tcpdump/dist/print-lane.c
new file mode 100644 (file)
index 0000000..5bbe028
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-ldp.c b/external/bsd/tcpdump/dist/print-ldp.c
new file mode 100644 (file)
index 0000000..f2b951d
--- /dev/null
@@ -0,0 +1,704 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-llc.c b/external/bsd/tcpdump/dist/print-llc.c
new file mode 100644 (file)
index 0000000..26ce282
--- /dev/null
@@ -0,0 +1,543 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-lldp.c b/external/bsd/tcpdump/dist/print-lldp.c
new file mode 100644 (file)
index 0000000..2d76681
--- /dev/null
@@ -0,0 +1,1618 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-lmp.c b/external/bsd/tcpdump/dist/print-lmp.c
new file mode 100644 (file)
index 0000000..92953ac
--- /dev/null
@@ -0,0 +1,885 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-loopback.c b/external/bsd/tcpdump/dist/print-loopback.c
new file mode 100644 (file)
index 0000000..2960a4b
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * 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));
+}
+
diff --git a/external/bsd/tcpdump/dist/print-lspping.c b/external/bsd/tcpdump/dist/print-lspping.c
new file mode 100644 (file)
index 0000000..60e8fbf
--- /dev/null
@@ -0,0 +1,894 @@
+/*
+ * 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, &timestamp);
+
+    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, &timestamp);
+    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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-lwapp.c b/external/bsd/tcpdump/dist/print-lwapp.c
new file mode 100644 (file)
index 0000000..aed0ae2
--- /dev/null
@@ -0,0 +1,353 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-lwres.c b/external/bsd/tcpdump/dist/print-lwres.c
new file mode 100644 (file)
index 0000000..3877c67
--- /dev/null
@@ -0,0 +1,601 @@
+/*
+ * 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]"));
+}
diff --git a/external/bsd/tcpdump/dist/print-m3ua.c b/external/bsd/tcpdump/dist/print-m3ua.c
new file mode 100644 (file)
index 0000000..ef5cc93
--- /dev/null
@@ -0,0 +1,344 @@
+/* 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));
+}
+
diff --git a/external/bsd/tcpdump/dist/print-mobile.c b/external/bsd/tcpdump/dist/print-mobile.c
new file mode 100644 (file)
index 0000000..7469a21
--- /dev/null
@@ -0,0 +1,107 @@
+/*     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));
+       }
+}
diff --git a/external/bsd/tcpdump/dist/print-mobility.c b/external/bsd/tcpdump/dist/print-mobility.c
new file mode 100644 (file)
index 0000000..158d259
--- /dev/null
@@ -0,0 +1,339 @@
+/*
+ * 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 */
diff --git a/external/bsd/tcpdump/dist/print-mpcp.c b/external/bsd/tcpdump/dist/print-mpcp.c
new file mode 100644 (file)
index 0000000..5a40c56
--- /dev/null
@@ -0,0 +1,265 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-mpls.c b/external/bsd/tcpdump/dist/print-mpls.c
new file mode 100644 (file)
index 0000000..0de909c
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-mptcp.c b/external/bsd/tcpdump/dist/print-mptcp.c
new file mode 100644 (file)
index 0000000..f85f1d2
--- /dev/null
@@ -0,0 +1,429 @@
+/**
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-msdp.c b/external/bsd/tcpdump/dist/print-msdp.c
new file mode 100644 (file)
index 0000000..e0c5aa0
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-msnlb.c b/external/bsd/tcpdump/dist/print-msnlb.c
new file mode 100644 (file)
index 0000000..fcd0006
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * 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]"));
+}
diff --git a/external/bsd/tcpdump/dist/print-nflog.c b/external/bsd/tcpdump/dist/print-nflog.c
new file mode 100644 (file)
index 0000000..95da4cb
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * 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) */
diff --git a/external/bsd/tcpdump/dist/print-nfs.c b/external/bsd/tcpdump/dist/print-nfs.c
new file mode 100644 (file)
index 0000000..dd94e88
--- /dev/null
@@ -0,0 +1,1739 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-ntp.c b/external/bsd/tcpdump/dist/print-ntp.c
new file mode 100644 (file)
index 0000000..f702262
--- /dev/null
@@ -0,0 +1,432 @@
+/*
+ * 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));
+}
+
diff --git a/external/bsd/tcpdump/dist/print-null.c b/external/bsd/tcpdump/dist/print-null.c
new file mode 100644 (file)
index 0000000..4c74642
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-olsr.c b/external/bsd/tcpdump/dist/print-olsr.c
new file mode 100644 (file)
index 0000000..b90eea1
--- /dev/null
@@ -0,0 +1,644 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-openflow-1.0.c b/external/bsd/tcpdump/dist/print-openflow-1.0.c
new file mode 100644 (file)
index 0000000..a36c32f
--- /dev/null
@@ -0,0 +1,2560 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/print-openflow.c b/external/bsd/tcpdump/dist/print-openflow.c
new file mode 100644 (file)
index 0000000..8825ae3
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-ospf.c b/external/bsd/tcpdump/dist/print-ospf.c
new file mode 100644 (file)
index 0000000..f8f78e5
--- /dev/null
@@ -0,0 +1,1146 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-ospf6.c b/external/bsd/tcpdump/dist/print-ospf6.c
new file mode 100644 (file)
index 0000000..8b88f4b
--- /dev/null
@@ -0,0 +1,1014 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-otv.c b/external/bsd/tcpdump/dist/print-otv.c
new file mode 100644 (file)
index 0000000..53a79de
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-pflog.c b/external/bsd/tcpdump/dist/print-pflog.c
new file mode 100644 (file)
index 0000000..8e29a76
--- /dev/null
@@ -0,0 +1,190 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-pfsync.c b/external/bsd/tcpdump/dist/print-pfsync.c
new file mode 100644 (file)
index 0000000..3fd6b2e
--- /dev/null
@@ -0,0 +1,231 @@
+/*     $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;
+       }
+}
diff --git a/external/bsd/tcpdump/dist/print-pgm.c b/external/bsd/tcpdump/dist/print-pgm.c
new file mode 100644 (file)
index 0000000..c7a9dc1
--- /dev/null
@@ -0,0 +1,825 @@
+/*
+ * 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, ">"));
+}
diff --git a/external/bsd/tcpdump/dist/print-pim.c b/external/bsd/tcpdump/dist/print-pim.c
new file mode 100644 (file)
index 0000000..f2a1a4d
--- /dev/null
@@ -0,0 +1,1098 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-pktap.c b/external/bsd/tcpdump/dist/print-pktap.c
new file mode 100644 (file)
index 0000000..c6d28cc
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ * 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 */
diff --git a/external/bsd/tcpdump/dist/print-ppi.c b/external/bsd/tcpdump/dist/print-ppi.c
new file mode 100644 (file)
index 0000000..b403536
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * 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 */
diff --git a/external/bsd/tcpdump/dist/print-ppp.c b/external/bsd/tcpdump/dist/print-ppp.c
new file mode 100644 (file)
index 0000000..9e8a891
--- /dev/null
@@ -0,0 +1,1856 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-pppoe.c b/external/bsd/tcpdump/dist/print-pppoe.c
new file mode 100644 (file)
index 0000000..b005f05
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-pptp.c b/external/bsd/tcpdump/dist/print-pptp.c
new file mode 100644 (file)
index 0000000..a496857
--- /dev/null
@@ -0,0 +1,1010 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-radius.c b/external/bsd/tcpdump/dist/print-radius.c
new file mode 100644 (file)
index 0000000..d4f0989
--- /dev/null
@@ -0,0 +1,992 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-raw.c b/external/bsd/tcpdump/dist/print-raw.c
new file mode 100644 (file)
index 0000000..4346d94
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-rip.c b/external/bsd/tcpdump/dist/print-rip.c
new file mode 100644 (file)
index 0000000..62fb458
--- /dev/null
@@ -0,0 +1,277 @@
+/*
+ * 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;
+                }
+        }
+}
+
+
diff --git a/external/bsd/tcpdump/dist/print-ripng.c b/external/bsd/tcpdump/dist/print-ripng.c
new file mode 100644 (file)
index 0000000..29c01c6
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * 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 */
diff --git a/external/bsd/tcpdump/dist/print-rpki-rtr.c b/external/bsd/tcpdump/dist/print-rpki-rtr.c
new file mode 100644 (file)
index 0000000..43fb052
--- /dev/null
@@ -0,0 +1,370 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-rrcp.c b/external/bsd/tcpdump/dist/print-rrcp.c
new file mode 100644 (file)
index 0000000..9805ae5
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * 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]"));
+}
diff --git a/external/bsd/tcpdump/dist/print-rsvp.c b/external/bsd/tcpdump/dist/print-rsvp.c
new file mode 100644 (file)
index 0000000..b448eeb
--- /dev/null
@@ -0,0 +1,1940 @@
+/*
+ * 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"));
+}
diff --git a/external/bsd/tcpdump/dist/print-rt6.c b/external/bsd/tcpdump/dist/print-rt6.c
new file mode 100644 (file)
index 0000000..808835d
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * 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 */
diff --git a/external/bsd/tcpdump/dist/print-rtsp.c b/external/bsd/tcpdump/dist/print-rtsp.c
new file mode 100644 (file)
index 0000000..7facf9a
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-rx.c b/external/bsd/tcpdump/dist/print-rx.c
new file mode 100644 (file)
index 0000000..d92958d
--- /dev/null
@@ -0,0 +1,2889 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/print-sctp.c b/external/bsd/tcpdump/dist/print-sctp.c
new file mode 100644 (file)
index 0000000..9999a74
--- /dev/null
@@ -0,0 +1,765 @@
+/*
+ * 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]"));
+}
diff --git a/external/bsd/tcpdump/dist/print-sflow.c b/external/bsd/tcpdump/dist/print-sflow.c
new file mode 100644 (file)
index 0000000..f03226e
--- /dev/null
@@ -0,0 +1,946 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-sip.c b/external/bsd/tcpdump/dist/print-sip.c
new file mode 100644 (file)
index 0000000..c8e8c83
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-sl.c b/external/bsd/tcpdump/dist/print-sl.c
new file mode 100644 (file)
index 0000000..99f9606
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+ * 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)));
+}
diff --git a/external/bsd/tcpdump/dist/print-sll.c b/external/bsd/tcpdump/dist/print-sll.c
new file mode 100644 (file)
index 0000000..3dad53d
--- /dev/null
@@ -0,0 +1,313 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-slow.c b/external/bsd/tcpdump/dist/print-slow.c
new file mode 100644 (file)
index 0000000..832fa34
--- /dev/null
@@ -0,0 +1,663 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/print-smb.c b/external/bsd/tcpdump/dist/print-smb.c
new file mode 100644 (file)
index 0000000..52433fd
--- /dev/null
@@ -0,0 +1,1498 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-smtp.c b/external/bsd/tcpdump/dist/print-smtp.c
new file mode 100644 (file)
index 0000000..fe0bbc2
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-snmp.c b/external/bsd/tcpdump/dist/print-snmp.c
new file mode 100644 (file)
index 0000000..67a8b6b
--- /dev/null
@@ -0,0 +1,1914 @@
+/*
+ * 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, "} "));
+       }
+}
diff --git a/external/bsd/tcpdump/dist/print-stp.c b/external/bsd/tcpdump/dist/print-stp.c
new file mode 100644 (file)
index 0000000..7965a3a
--- /dev/null
@@ -0,0 +1,469 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-sunatm.c b/external/bsd/tcpdump/dist/print-sunatm.c
new file mode 100644 (file)
index 0000000..08e6953
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-sunrpc.c b/external/bsd/tcpdump/dist/print-sunrpc.c
new file mode 100644 (file)
index 0000000..2f19297
--- /dev/null
@@ -0,0 +1,260 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-symantec.c b/external/bsd/tcpdump/dist/print-symantec.c
new file mode 100644 (file)
index 0000000..a7118f6
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-syslog.c b/external/bsd/tcpdump/dist/print-syslog.c
new file mode 100644 (file)
index 0000000..cfaca0b
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-tcp.c b/external/bsd/tcpdump/dist/print-tcp.c
new file mode 100644 (file)
index 0000000..4b5e513
--- /dev/null
@@ -0,0 +1,897 @@
+/*     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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-telnet.c b/external/bsd/tcpdump/dist/print-telnet.c
new file mode 100644 (file)
index 0000000..2a8db4a
--- /dev/null
@@ -0,0 +1,545 @@
+/*     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, "]"));
+       }
+}
diff --git a/external/bsd/tcpdump/dist/print-tftp.c b/external/bsd/tcpdump/dist/print-tftp.c
new file mode 100644 (file)
index 0000000..89f7c63
--- /dev/null
@@ -0,0 +1,190 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/print-timed.c b/external/bsd/tcpdump/dist/print-timed.c
new file mode 100644 (file)
index 0000000..59a0435
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-tipc.c b/external/bsd/tcpdump/dist/print-tipc.c
new file mode 100644 (file)
index 0000000..b883fba
--- /dev/null
@@ -0,0 +1,385 @@
+/*
+ * 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:
+ */
+
diff --git a/external/bsd/tcpdump/dist/print-token.c b/external/bsd/tcpdump/dist/print-token.c
new file mode 100644 (file)
index 0000000..8c139e1
--- /dev/null
@@ -0,0 +1,255 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-udld.c b/external/bsd/tcpdump/dist/print-udld.c
new file mode 100644 (file)
index 0000000..15e2bf6
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-udp.c b/external/bsd/tcpdump/dist/print-udp.c
new file mode 100644 (file)
index 0000000..4cf1633
--- /dev/null
@@ -0,0 +1,721 @@
+/*
+ * 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:
+ */
+
diff --git a/external/bsd/tcpdump/dist/print-usb.c b/external/bsd/tcpdump/dist/print-usb.c
new file mode 100644 (file)
index 0000000..75f78fc
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * 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) */
+
diff --git a/external/bsd/tcpdump/dist/print-vjc.c b/external/bsd/tcpdump/dist/print-vjc.c
new file mode 100644 (file)
index 0000000..68dbdab
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * 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;
+       }
+}
diff --git a/external/bsd/tcpdump/dist/print-vqp.c b/external/bsd/tcpdump/dist/print-vqp.c
new file mode 100644 (file)
index 0000000..baf95e5
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * 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]"));
+}
diff --git a/external/bsd/tcpdump/dist/print-vrrp.c b/external/bsd/tcpdump/dist/print-vrrp.c
new file mode 100644 (file)
index 0000000..454df57
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * 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]"));
+}
diff --git a/external/bsd/tcpdump/dist/print-vtp.c b/external/bsd/tcpdump/dist/print-vtp.c
new file mode 100644 (file)
index 0000000..9fe86e3
--- /dev/null
@@ -0,0 +1,373 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/print-vxlan.c b/external/bsd/tcpdump/dist/print-vxlan.c
new file mode 100644 (file)
index 0000000..c4de68d
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/print-wb.c b/external/bsd/tcpdump/dist/print-wb.c
new file mode 100644 (file)
index 0000000..ca65792
--- /dev/null
@@ -0,0 +1,457 @@
+/*
+ * 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;
+       }
+}
diff --git a/external/bsd/tcpdump/dist/print-zephyr.c b/external/bsd/tcpdump/dist/print-zephyr.c
new file mode 100644 (file)
index 0000000..83565c6
--- /dev/null
@@ -0,0 +1,324 @@
+/*
+ * 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));
+}
diff --git a/external/bsd/tcpdump/dist/print-zeromq.c b/external/bsd/tcpdump/dist/print-zeromq.c
new file mode 100644 (file)
index 0000000..ba22c96
--- /dev/null
@@ -0,0 +1,219 @@
+/*
+ * 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);
+}
diff --git a/external/bsd/tcpdump/dist/rpc_auth.h b/external/bsd/tcpdump/dist/rpc_auth.h
new file mode 100644 (file)
index 0000000..3cc9b30
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * 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) */
diff --git a/external/bsd/tcpdump/dist/rpc_msg.h b/external/bsd/tcpdump/dist/rpc_msg.h
new file mode 100644 (file)
index 0000000..88e7319
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/rpl.h b/external/bsd/tcpdump/dist/rpl.h
new file mode 100644 (file)
index 0000000..c48784b
--- /dev/null
@@ -0,0 +1,174 @@
+#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:
+ */
+
diff --git a/external/bsd/tcpdump/dist/send-ack.awk b/external/bsd/tcpdump/dist/send-ack.awk
new file mode 100644 (file)
index 0000000..f55b7c2
--- /dev/null
@@ -0,0 +1,68 @@
+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
+       }
diff --git a/external/bsd/tcpdump/dist/setsignal.c b/external/bsd/tcpdump/dist/setsignal.c
new file mode 100644 (file)
index 0000000..ea27d26
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * 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
+}
+
diff --git a/external/bsd/tcpdump/dist/setsignal.h b/external/bsd/tcpdump/dist/setsignal.h
new file mode 100644 (file)
index 0000000..91a2048
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/signature.c b/external/bsd/tcpdump/dist/signature.c
new file mode 100644 (file)
index 0000000..ee37a7f
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/signature.h b/external/bsd/tcpdump/dist/signature.h
new file mode 100644 (file)
index 0000000..a052df8
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * 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 *);
diff --git a/external/bsd/tcpdump/dist/slcompress.h b/external/bsd/tcpdump/dist/slcompress.h
new file mode 100644 (file)
index 0000000..644c755
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/smb.h b/external/bsd/tcpdump/dist/smb.h
new file mode 100644 (file)
index 0000000..88eaa06
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * 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);
diff --git a/external/bsd/tcpdump/dist/smbutil.c b/external/bsd/tcpdump/dist/smbutil.c
new file mode 100644 (file)
index 0000000..7af54c1
--- /dev/null
@@ -0,0 +1,1899 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/stime.awk b/external/bsd/tcpdump/dist/stime.awk
new file mode 100644 (file)
index 0000000..61891f2
--- /dev/null
@@ -0,0 +1,19 @@
+$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
+       }
diff --git a/external/bsd/tcpdump/dist/strcasecmp.c b/external/bsd/tcpdump/dist/strcasecmp.c
new file mode 100644 (file)
index 0000000..20149a4
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * 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]);
+}
diff --git a/external/bsd/tcpdump/dist/tcp.h b/external/bsd/tcpdump/dist/tcp.h
new file mode 100644 (file)
index 0000000..ca313ba
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/tcpdump-stdinc.h b/external/bsd/tcpdump/dist/tcpdump-stdinc.h
new file mode 100644 (file)
index 0000000..68b3e86
--- /dev/null
@@ -0,0 +1,352 @@
+/*
+ * 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 */
diff --git a/external/bsd/tcpdump/dist/tcpdump.1.in b/external/bsd/tcpdump/dist/tcpdump.1.in
new file mode 100644 (file)
index 0000000..5f3b595
--- /dev/null
@@ -0,0 +1,1984 @@
+.\"    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.
diff --git a/external/bsd/tcpdump/dist/tcpdump.c b/external/bsd/tcpdump/dist/tcpdump.c
new file mode 100644 (file)
index 0000000..653f487
--- /dev/null
@@ -0,0 +1,2772 @@
+/*
+ * 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:
+ */
diff --git a/external/bsd/tcpdump/dist/tcpdump2netbsd b/external/bsd/tcpdump/dist/tcpdump2netbsd
new file mode 100755 (executable)
index 0000000..03e83e6
--- /dev/null
@@ -0,0 +1,96 @@
+#! /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
diff --git a/external/bsd/tcpdump/dist/tests/02-sunrise-sunset-esp.pcap b/external/bsd/tcpdump/dist/tests/02-sunrise-sunset-esp.pcap
new file mode 100644 (file)
index 0000000..e52af98
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/02-sunrise-sunset-esp.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/08-sunrise-sunset-aes.pcap b/external/bsd/tcpdump/dist/tests/08-sunrise-sunset-aes.pcap
new file mode 100644 (file)
index 0000000..1ebe3de
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/08-sunrise-sunset-aes.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/08-sunrise-sunset-esp2.pcap b/external/bsd/tcpdump/dist/tests/08-sunrise-sunset-esp2.pcap
new file mode 100644 (file)
index 0000000..c3e54cb
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/08-sunrise-sunset-esp2.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/3560_CDP.pcap b/external/bsd/tcpdump/dist/tests/3560_CDP.pcap
new file mode 100644 (file)
index 0000000..f29fd50
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/3560_CDP.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/802.1D_spanning_tree.pcap b/external/bsd/tcpdump/dist/tests/802.1D_spanning_tree.pcap
new file mode 100644 (file)
index 0000000..b21f71c
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/802.1D_spanning_tree.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/802.1w_rapid_STP.pcap b/external/bsd/tcpdump/dist/tests/802.1w_rapid_STP.pcap
new file mode 100644 (file)
index 0000000..db85a45
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/802.1w_rapid_STP.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/AoE_Linux.pcap b/external/bsd/tcpdump/dist/tests/AoE_Linux.pcap
new file mode 100644 (file)
index 0000000..de5c744
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/AoE_Linux.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/DECnet_Phone.pcap b/external/bsd/tcpdump/dist/tests/DECnet_Phone.pcap
new file mode 100644 (file)
index 0000000..20ff167
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/DECnet_Phone.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/DTP.pcap b/external/bsd/tcpdump/dist/tests/DTP.pcap
new file mode 100644 (file)
index 0000000..9f0c5f4
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/DTP.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/EIGRP_adjacency.pcap b/external/bsd/tcpdump/dist/tests/EIGRP_adjacency.pcap
new file mode 100644 (file)
index 0000000..a0966b6
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/EIGRP_adjacency.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/EIGRP_goodbye.pcap b/external/bsd/tcpdump/dist/tests/EIGRP_goodbye.pcap
new file mode 100644 (file)
index 0000000..6a73f5d
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/EIGRP_goodbye.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/EIGRP_subnet_down.pcap b/external/bsd/tcpdump/dist/tests/EIGRP_subnet_down.pcap
new file mode 100644 (file)
index 0000000..a85579d
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/EIGRP_subnet_down.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/EIGRP_subnet_up.pcap b/external/bsd/tcpdump/dist/tests/EIGRP_subnet_up.pcap
new file mode 100644 (file)
index 0000000..49f53ef
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/EIGRP_subnet_up.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/HDLC.pcap b/external/bsd/tcpdump/dist/tests/HDLC.pcap
new file mode 100644 (file)
index 0000000..0d94d3f
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/HDLC.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/HSRP_coup.pcap b/external/bsd/tcpdump/dist/tests/HSRP_coup.pcap
new file mode 100644 (file)
index 0000000..41f8ef0
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/HSRP_coup.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/HSRP_election.pcap b/external/bsd/tcpdump/dist/tests/HSRP_election.pcap
new file mode 100644 (file)
index 0000000..72ccdfb
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/HSRP_election.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/HSRP_failover.pcap b/external/bsd/tcpdump/dist/tests/HSRP_failover.pcap
new file mode 100644 (file)
index 0000000..cad4e61
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/HSRP_failover.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/IGMP_V1.pcap b/external/bsd/tcpdump/dist/tests/IGMP_V1.pcap
new file mode 100644 (file)
index 0000000..2a6e90d
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/IGMP_V1.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/IGMP_V2.pcap b/external/bsd/tcpdump/dist/tests/IGMP_V2.pcap
new file mode 100644 (file)
index 0000000..6d1d8db
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/IGMP_V2.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ISAKMP_sa_setup.pcap b/external/bsd/tcpdump/dist/tests/ISAKMP_sa_setup.pcap
new file mode 100644 (file)
index 0000000..28c5d61
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ISAKMP_sa_setup.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ISIS_external_lsp.pcap b/external/bsd/tcpdump/dist/tests/ISIS_external_lsp.pcap
new file mode 100644 (file)
index 0000000..5fbf975
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ISIS_external_lsp.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ISIS_level1_adjacency.pcap b/external/bsd/tcpdump/dist/tests/ISIS_level1_adjacency.pcap
new file mode 100644 (file)
index 0000000..9614218
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ISIS_level1_adjacency.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ISIS_level2_adjacency.pcap b/external/bsd/tcpdump/dist/tests/ISIS_level2_adjacency.pcap
new file mode 100644 (file)
index 0000000..9d8a329
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ISIS_level2_adjacency.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ISIS_p2p_adjacency.pcap b/external/bsd/tcpdump/dist/tests/ISIS_p2p_adjacency.pcap
new file mode 100644 (file)
index 0000000..a065ad7
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ISIS_p2p_adjacency.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/LACP.pcap b/external/bsd/tcpdump/dist/tests/LACP.pcap
new file mode 100644 (file)
index 0000000..9681961
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/LACP.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/LLDP_and_CDP.pcap b/external/bsd/tcpdump/dist/tests/LLDP_and_CDP.pcap
new file mode 100644 (file)
index 0000000..ebbf49e
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/LLDP_and_CDP.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/MSTP_Intra-Region_BPDUs.pcap b/external/bsd/tcpdump/dist/tests/MSTP_Intra-Region_BPDUs.pcap
new file mode 100644 (file)
index 0000000..559b234
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/MSTP_Intra-Region_BPDUs.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/OSPFv3_NBMA_adjacencies.pcap b/external/bsd/tcpdump/dist/tests/OSPFv3_NBMA_adjacencies.pcap
new file mode 100644 (file)
index 0000000..7aa8fae
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/OSPFv3_NBMA_adjacencies.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/OSPFv3_broadcast_adjacency.pcap b/external/bsd/tcpdump/dist/tests/OSPFv3_broadcast_adjacency.pcap
new file mode 100644 (file)
index 0000000..15cb2dd
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/OSPFv3_broadcast_adjacency.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/OSPFv3_multipoint_adjacencies.pcap b/external/bsd/tcpdump/dist/tests/OSPFv3_multipoint_adjacencies.pcap
new file mode 100644 (file)
index 0000000..9ba7698
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/OSPFv3_multipoint_adjacencies.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/OSPFv3_with_AH.pcap b/external/bsd/tcpdump/dist/tests/OSPFv3_with_AH.pcap
new file mode 100644 (file)
index 0000000..6c647b4
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/OSPFv3_with_AH.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/PIM-DM_pruning.pcap b/external/bsd/tcpdump/dist/tests/PIM-DM_pruning.pcap
new file mode 100644 (file)
index 0000000..ad0f80d
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/PIM-DM_pruning.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/PIM-SM_join_prune.pcap b/external/bsd/tcpdump/dist/tests/PIM-SM_join_prune.pcap
new file mode 100644 (file)
index 0000000..12396bf
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/PIM-SM_join_prune.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/PIM_register_register-stop.pcap b/external/bsd/tcpdump/dist/tests/PIM_register_register-stop.pcap
new file mode 100644 (file)
index 0000000..e2419ad
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/PIM_register_register-stop.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/PIMv2_bootstrap.pcap b/external/bsd/tcpdump/dist/tests/PIMv2_bootstrap.pcap
new file mode 100644 (file)
index 0000000..1bc0ae9
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/PIMv2_bootstrap.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/PIMv2_hellos.pcap b/external/bsd/tcpdump/dist/tests/PIMv2_hellos.pcap
new file mode 100644 (file)
index 0000000..6a5f49d
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/PIMv2_hellos.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/QinQpacket.out b/external/bsd/tcpdump/dist/tests/QinQpacket.out
new file mode 100644 (file)
index 0000000..0ef7015
--- /dev/null
@@ -0,0 +1,249 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/QinQpacket.pcap b/external/bsd/tcpdump/dist/tests/QinQpacket.pcap
new file mode 100644 (file)
index 0000000..eeabfe4
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/QinQpacket.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/QinQpacketv.out b/external/bsd/tcpdump/dist/tests/QinQpacketv.out
new file mode 100644 (file)
index 0000000..03ed7cf
--- /dev/null
@@ -0,0 +1,1977 @@
+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"
diff --git a/external/bsd/tcpdump/dist/tests/RADIUS-RFC4675.pcap b/external/bsd/tcpdump/dist/tests/RADIUS-RFC4675.pcap
new file mode 100644 (file)
index 0000000..a5d7505
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/RADIUS-RFC4675.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/RADIUS-RFC5176.pcap b/external/bsd/tcpdump/dist/tests/RADIUS-RFC5176.pcap
new file mode 100644 (file)
index 0000000..2ef19f2
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/RADIUS-RFC5176.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/RADIUS.pcap b/external/bsd/tcpdump/dist/tests/RADIUS.pcap
new file mode 100644 (file)
index 0000000..2e902e4
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/RADIUS.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/TESTLIST b/external/bsd/tcpdump/dist/tests/TESTLIST
new file mode 100644 (file)
index 0000000..35963c6
--- /dev/null
@@ -0,0 +1,291 @@
+# 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
diff --git a/external/bsd/tcpdump/dist/tests/TESTonce b/external/bsd/tcpdump/dist/tests/TESTonce
new file mode 100755 (executable)
index 0000000..30ffccd
--- /dev/null
@@ -0,0 +1,68 @@
+#!/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;
diff --git a/external/bsd/tcpdump/dist/tests/TESTrun.sh b/external/bsd/tcpdump/dist/tests/TESTrun.sh
new file mode 100755 (executable)
index 0000000..4cd0440
--- /dev/null
@@ -0,0 +1,72 @@
+#!/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
diff --git a/external/bsd/tcpdump/dist/tests/UDLD.pcap b/external/bsd/tcpdump/dist/tests/UDLD.pcap
new file mode 100644 (file)
index 0000000..d8d3ff6
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/UDLD.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ahcp-vv.out b/external/bsd/tcpdump/dist/tests/ahcp-vv.out
new file mode 100644 (file)
index 0000000..167dd43
--- /dev/null
@@ -0,0 +1,76 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/ahcp.pcap b/external/bsd/tcpdump/dist/tests/ahcp.pcap
new file mode 100644 (file)
index 0000000..e3bfdf1
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ahcp.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/aoe_1-v.out b/external/bsd/tcpdump/dist/tests/aoe_1-v.out
new file mode 100644 (file)
index 0000000..a85e993
--- /dev/null
@@ -0,0 +1,888 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/aoe_1.out b/external/bsd/tcpdump/dist/tests/aoe_1.out
new file mode 100644 (file)
index 0000000..1729195
--- /dev/null
@@ -0,0 +1,186 @@
+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]
diff --git a/external/bsd/tcpdump/dist/tests/babel.pcap b/external/bsd/tcpdump/dist/tests/babel.pcap
new file mode 100644 (file)
index 0000000..a9ab2b8
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/babel.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/babel1.out b/external/bsd/tcpdump/dist/tests/babel1.out
new file mode 100644 (file)
index 0000000..de3d37e
--- /dev/null
@@ -0,0 +1,25 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/babel1v.out b/external/bsd/tcpdump/dist/tests/babel1v.out
new file mode 100644 (file)
index 0000000..d483a14
--- /dev/null
@@ -0,0 +1,67 @@
+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)]
diff --git a/external/bsd/tcpdump/dist/tests/babel_auth.out b/external/bsd/tcpdump/dist/tests/babel_auth.out
new file mode 100644 (file)
index 0000000..c918495
--- /dev/null
@@ -0,0 +1,13 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/babel_auth.pcap b/external/bsd/tcpdump/dist/tests/babel_auth.pcap
new file mode 100644 (file)
index 0000000..941e628
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/babel_auth.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/babel_pad1.out b/external/bsd/tcpdump/dist/tests/babel_pad1.out
new file mode 100644 (file)
index 0000000..c42f2eb
--- /dev/null
@@ -0,0 +1,2 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/babel_pad1.pcap b/external/bsd/tcpdump/dist/tests/babel_pad1.pcap
new file mode 100644 (file)
index 0000000..0e87911
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/babel_pad1.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/babel_rtt.out b/external/bsd/tcpdump/dist/tests/babel_rtt.out
new file mode 100644 (file)
index 0000000..a95829a
--- /dev/null
@@ -0,0 +1,25 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/babel_rtt.pcap b/external/bsd/tcpdump/dist/tests/babel_rtt.pcap
new file mode 100644 (file)
index 0000000..b48d161
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/babel_rtt.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/bgp-infinite-loop.pcap b/external/bsd/tcpdump/dist/tests/bgp-infinite-loop.pcap
new file mode 100644 (file)
index 0000000..9f07d41
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/bgp-infinite-loop.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/bgp_infloop-v.out b/external/bsd/tcpdump/dist/tests/bgp_infloop-v.out
new file mode 100644 (file)
index 0000000..d79a6aa
--- /dev/null
@@ -0,0 +1,15 @@
+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]
diff --git a/external/bsd/tcpdump/dist/tests/bgp_vpn_attrset.out b/external/bsd/tcpdump/dist/tests/bgp_vpn_attrset.out
new file mode 100644 (file)
index 0000000..c62c8d5
--- /dev/null
@@ -0,0 +1,19 @@
+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)
diff --git a/external/bsd/tcpdump/dist/tests/bgp_vpn_attrset.pcap b/external/bsd/tcpdump/dist/tests/bgp_vpn_attrset.pcap
new file mode 100644 (file)
index 0000000..e60aff5
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/bgp_vpn_attrset.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/cdp-v.out b/external/bsd/tcpdump/dist/tests/cdp-v.out
new file mode 100644 (file)
index 0000000..eb578bf
--- /dev/null
@@ -0,0 +1,57 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/chdlc-slarp-short.pcap b/external/bsd/tcpdump/dist/tests/chdlc-slarp-short.pcap
new file mode 100644 (file)
index 0000000..41313dc
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/chdlc-slarp-short.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/chdlc-slarp.pcap b/external/bsd/tcpdump/dist/tests/chdlc-slarp.pcap
new file mode 100644 (file)
index 0000000..1521443
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/chdlc-slarp.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/crypto.sh b/external/bsd/tcpdump/dist/tests/crypto.sh
new file mode 100755 (executable)
index 0000000..bd41921
--- /dev/null
@@ -0,0 +1,36 @@
+#!/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
diff --git a/external/bsd/tcpdump/dist/tests/cve2015-0261-crash.out b/external/bsd/tcpdump/dist/tests/cve2015-0261-crash.out
new file mode 100644 (file)
index 0000000..1946280
--- /dev/null
@@ -0,0 +1 @@
+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]
diff --git a/external/bsd/tcpdump/dist/tests/cve2015-0261-crash.pcap b/external/bsd/tcpdump/dist/tests/cve2015-0261-crash.pcap
new file mode 100644 (file)
index 0000000..c876c1f
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/cve2015-0261-crash.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/cve2015-0261-ipv6.out b/external/bsd/tcpdump/dist/tests/cve2015-0261-ipv6.out
new file mode 100644 (file)
index 0000000..4674ada
--- /dev/null
@@ -0,0 +1,3 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/cve2015-0261-ipv6.pcap b/external/bsd/tcpdump/dist/tests/cve2015-0261-ipv6.pcap
new file mode 100644 (file)
index 0000000..a8a32ba
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/cve2015-0261-ipv6.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dcb_ets.out b/external/bsd/tcpdump/dist/tests/dcb_ets.out
new file mode 100644 (file)
index 0000000..c9a94a7
--- /dev/null
@@ -0,0 +1,1923 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/dcb_ets.pcap b/external/bsd/tcpdump/dist/tests/dcb_ets.pcap
new file mode 100644 (file)
index 0000000..995887b
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dcb_ets.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dcb_pfc.out b/external/bsd/tcpdump/dist/tests/dcb_pfc.out
new file mode 100644 (file)
index 0000000..005b0c1
--- /dev/null
@@ -0,0 +1,148 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/dcb_pfc.pcap b/external/bsd/tcpdump/dist/tests/dcb_pfc.pcap
new file mode 100644 (file)
index 0000000..c777a33
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dcb_pfc.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dcb_qcn.out b/external/bsd/tcpdump/dist/tests/dcb_qcn.out
new file mode 100644 (file)
index 0000000..747df9b
--- /dev/null
@@ -0,0 +1,363 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/dcb_qcn.pcap b/external/bsd/tcpdump/dist/tests/dcb_qcn.pcap
new file mode 100644 (file)
index 0000000..9034d7c
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dcb_qcn.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_longer.out b/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_longer.out
new file mode 100644 (file)
index 0000000..1ec7002
--- /dev/null
@@ -0,0 +1,30 @@
+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>
diff --git a/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_longer.pcap b/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_longer.pcap
new file mode 100644 (file)
index 0000000..f1176c0
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_longer.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_simple.out b/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_simple.out
new file mode 100644 (file)
index 0000000..6fee70d
--- /dev/null
@@ -0,0 +1,14 @@
+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>
diff --git a/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_simple.pcap b/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_simple.pcap
new file mode 100644 (file)
index 0000000..a9c3d66
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v4_simple.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_longer.out b/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_longer.out
new file mode 100644 (file)
index 0000000..76355d4
--- /dev/null
@@ -0,0 +1,9 @@
+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>
diff --git a/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_longer.pcap b/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_longer.pcap
new file mode 100644 (file)
index 0000000..644379d
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_longer.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_simple.out b/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_simple.out
new file mode 100644 (file)
index 0000000..317a68a
--- /dev/null
@@ -0,0 +1,7 @@
+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>
diff --git a/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_simple.pcap b/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_simple.pcap
new file mode 100644 (file)
index 0000000..c343d90
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dccp_partial_csum_v6_simple.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/decnet.out b/external/bsd/tcpdump/dist/tests/decnet.out
new file mode 100644 (file)
index 0000000..8767c62
--- /dev/null
@@ -0,0 +1,139 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/dhcp-rfc3004-v.out b/external/bsd/tcpdump/dist/tests/dhcp-rfc3004-v.out
new file mode 100644 (file)
index 0000000..2032817
--- /dev/null
@@ -0,0 +1,55 @@
+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"
diff --git a/external/bsd/tcpdump/dist/tests/dhcp-rfc3004.pcap b/external/bsd/tcpdump/dist/tests/dhcp-rfc3004.pcap
new file mode 100644 (file)
index 0000000..11806c3
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dhcp-rfc3004.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dhcp-rfc5859-v.out b/external/bsd/tcpdump/dist/tests/dhcp-rfc5859-v.out
new file mode 100644 (file)
index 0000000..6f31368
--- /dev/null
@@ -0,0 +1,44 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/dhcp-rfc5859.pcap b/external/bsd/tcpdump/dist/tests/dhcp-rfc5859.pcap
new file mode 100644 (file)
index 0000000..e16a6b3
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dhcp-rfc5859.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-AFTR-Name-RFC6334.out b/external/bsd/tcpdump/dist/tests/dhcpv6-AFTR-Name-RFC6334.out
new file mode 100644 (file)
index 0000000..13f6a4f
--- /dev/null
@@ -0,0 +1,4 @@
+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))
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-AFTR-Name-RFC6334.pcap b/external/bsd/tcpdump/dist/tests/dhcpv6-AFTR-Name-RFC6334.pcap
new file mode 100644 (file)
index 0000000..d6b353e
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dhcpv6-AFTR-Name-RFC6334.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-domain-list.out b/external/bsd/tcpdump/dist/tests/dhcpv6-domain-list.out
new file mode 100644 (file)
index 0000000..30b449c
--- /dev/null
@@ -0,0 +1 @@
+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.))
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-domain-list.pcap b/external/bsd/tcpdump/dist/tests/dhcpv6-domain-list.pcap
new file mode 100644 (file)
index 0000000..b0afeff
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dhcpv6-domain-list.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-ia-na.out b/external/bsd/tcpdump/dist/tests/dhcpv6-ia-na.out
new file mode 100644 (file)
index 0000000..b1dd0f0
--- /dev/null
@@ -0,0 +1,4 @@
+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))
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-ia-na.pcap b/external/bsd/tcpdump/dist/tests/dhcpv6-ia-na.pcap
new file mode 100644 (file)
index 0000000..3cafdc5
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dhcpv6-ia-na.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-ia-pd.out b/external/bsd/tcpdump/dist/tests/dhcpv6-ia-pd.out
new file mode 100644 (file)
index 0000000..f230467
--- /dev/null
@@ -0,0 +1,4 @@
+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))
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-ia-pd.pcap b/external/bsd/tcpdump/dist/tests/dhcpv6-ia-pd.pcap
new file mode 100644 (file)
index 0000000..5fdd067
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dhcpv6-ia-pd.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-ia-ta.out b/external/bsd/tcpdump/dist/tests/dhcpv6-ia-ta.out
new file mode 100644 (file)
index 0000000..5a8acef
--- /dev/null
@@ -0,0 +1,4 @@
+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))
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-ia-ta.pcap b/external/bsd/tcpdump/dist/tests/dhcpv6-ia-ta.pcap
new file mode 100644 (file)
index 0000000..b91f8b7
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dhcpv6-ia-ta.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-ntp-server.out b/external/bsd/tcpdump/dist/tests/dhcpv6-ntp-server.out
new file mode 100644 (file)
index 0000000..23db5bd
--- /dev/null
@@ -0,0 +1 @@
+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.))
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-ntp-server.pcap b/external/bsd/tcpdump/dist/tests/dhcpv6-ntp-server.pcap
new file mode 100644 (file)
index 0000000..5657692
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dhcpv6-ntp-server.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-sip-server-d.out b/external/bsd/tcpdump/dist/tests/dhcpv6-sip-server-d.out
new file mode 100644 (file)
index 0000000..4600e9f
--- /dev/null
@@ -0,0 +1 @@
+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.))
diff --git a/external/bsd/tcpdump/dist/tests/dhcpv6-sip-server-d.pcap b/external/bsd/tcpdump/dist/tests/dhcpv6-sip-server-d.pcap
new file mode 100644 (file)
index 0000000..7cb2103
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/dhcpv6-sip-server-d.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/dtp-v.out b/external/bsd/tcpdump/dist/tests/dtp-v.out
new file mode 100644 (file)
index 0000000..1d73418
--- /dev/null
@@ -0,0 +1,30 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/dvmrp.out b/external/bsd/tcpdump/dist/tests/dvmrp.out
new file mode 100644 (file)
index 0000000..d612f7d
--- /dev/null
@@ -0,0 +1,2 @@
+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)]
diff --git a/external/bsd/tcpdump/dist/tests/e1000g.out b/external/bsd/tcpdump/dist/tests/e1000g.out
new file mode 100644 (file)
index 0000000..0cc3b9e
--- /dev/null
@@ -0,0 +1,20 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/e1000g.pcap b/external/bsd/tcpdump/dist/tests/e1000g.pcap
new file mode 100644 (file)
index 0000000..11b0174
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/e1000g.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/eapon1.gdbinit b/external/bsd/tcpdump/dist/tests/eapon1.gdbinit
new file mode 100644 (file)
index 0000000..37ad0bc
--- /dev/null
@@ -0,0 +1 @@
+set args -r eapon1.pcap
diff --git a/external/bsd/tcpdump/dist/tests/eapon1.out b/external/bsd/tcpdump/dist/tests/eapon1.out
new file mode 100644 (file)
index 0000000..69f7537
--- /dev/null
@@ -0,0 +1,114 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/eapon1.pcap b/external/bsd/tcpdump/dist/tests/eapon1.pcap
new file mode 100644 (file)
index 0000000..4a87ed1
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/eapon1.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/eigrp1-v.out b/external/bsd/tcpdump/dist/tests/eigrp1-v.out
new file mode 100644 (file)
index 0000000..e2e75b2
--- /dev/null
@@ -0,0 +1,444 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/eigrp2-v.out b/external/bsd/tcpdump/dist/tests/eigrp2-v.out
new file mode 100644 (file)
index 0000000..112a1a4
--- /dev/null
@@ -0,0 +1,120 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/eigrp3-v.out b/external/bsd/tcpdump/dist/tests/eigrp3-v.out
new file mode 100644 (file)
index 0000000..4e344cb
--- /dev/null
@@ -0,0 +1,143 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/eigrp4-v.out b/external/bsd/tcpdump/dist/tests/eigrp4-v.out
new file mode 100644 (file)
index 0000000..f5cb165
--- /dev/null
@@ -0,0 +1,105 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/epgm_zmtp1.pcap b/external/bsd/tcpdump/dist/tests/epgm_zmtp1.pcap
new file mode 100644 (file)
index 0000000..1883579
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/epgm_zmtp1.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/epgm_zmtp1v.out b/external/bsd/tcpdump/dist/tests/epgm_zmtp1v.out
new file mode 100644 (file)
index 0000000..171ecac
--- /dev/null
@@ -0,0 +1,79 @@
+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]
diff --git a/external/bsd/tcpdump/dist/tests/epgmv.out b/external/bsd/tcpdump/dist/tests/epgmv.out
new file mode 100644 (file)
index 0000000..ffa1b82
--- /dev/null
@@ -0,0 +1,30 @@
+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]
diff --git a/external/bsd/tcpdump/dist/tests/esp-secrets.txt b/external/bsd/tcpdump/dist/tests/esp-secrets.txt
new file mode 100644 (file)
index 0000000..81847a0
--- /dev/null
@@ -0,0 +1,5 @@
+# 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
diff --git a/external/bsd/tcpdump/dist/tests/esp0.out b/external/bsd/tcpdump/dist/tests/esp0.out
new file mode 100644 (file)
index 0000000..a0ddf1b
--- /dev/null
@@ -0,0 +1,8 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/esp1.gdbinit b/external/bsd/tcpdump/dist/tests/esp1.gdbinit
new file mode 100644 (file)
index 0000000..6c8ae89
--- /dev/null
@@ -0,0 +1 @@
+set args -t -n -E "0x12345678@192.1.2.45 3des-cbc-hmac96:0x4043434545464649494a4a4c4c4f4f515152525454575758" -r 02-sunrise-sunset-esp.pcap 
diff --git a/external/bsd/tcpdump/dist/tests/esp1.out b/external/bsd/tcpdump/dist/tests/esp1.out
new file mode 100644 (file)
index 0000000..61b2967
--- /dev/null
@@ -0,0 +1,8 @@
+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)
diff --git a/external/bsd/tcpdump/dist/tests/esp2.gdbinit b/external/bsd/tcpdump/dist/tests/esp2.gdbinit
new file mode 100644 (file)
index 0000000..7c18407
--- /dev/null
@@ -0,0 +1 @@
+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 
diff --git a/external/bsd/tcpdump/dist/tests/esp2.out b/external/bsd/tcpdump/dist/tests/esp2.out
new file mode 100644 (file)
index 0000000..a829c8e
--- /dev/null
@@ -0,0 +1,8 @@
+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)
diff --git a/external/bsd/tcpdump/dist/tests/esp3.gdbinit b/external/bsd/tcpdump/dist/tests/esp3.gdbinit
new file mode 100644 (file)
index 0000000..7150118
--- /dev/null
@@ -0,0 +1 @@
+set args -t -n -E "3des-cbc-hmac96:0x43434545464649494a4a4c4c4f4f51515252545457575840" -r 08-sunrise-sunset-esp2.pcap 
diff --git a/external/bsd/tcpdump/dist/tests/esp4.gdbinit b/external/bsd/tcpdump/dist/tests/esp4.gdbinit
new file mode 100644 (file)
index 0000000..8007444
--- /dev/null
@@ -0,0 +1,2 @@
+set args -t -n -E "file esp-secrets.txt" -r 08-sunrise-sunset-esp2.pcap 
+
diff --git a/external/bsd/tcpdump/dist/tests/esp5.gdbinit b/external/bsd/tcpdump/dist/tests/esp5.gdbinit
new file mode 100644 (file)
index 0000000..2f578e3
--- /dev/null
@@ -0,0 +1,3 @@
+set args -t -n -E "file esp-secrets.txt" -r 08-sunrise-sunset-aes.pcap 
+
+
diff --git a/external/bsd/tcpdump/dist/tests/esp5.out b/external/bsd/tcpdump/dist/tests/esp5.out
new file mode 100644 (file)
index 0000000..73f35e0
--- /dev/null
@@ -0,0 +1,8 @@
+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)
diff --git a/external/bsd/tcpdump/dist/tests/espudp1.out b/external/bsd/tcpdump/dist/tests/espudp1.out
new file mode 100644 (file)
index 0000000..db8eafb
--- /dev/null
@@ -0,0 +1,8 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/espudp1.pcap b/external/bsd/tcpdump/dist/tests/espudp1.pcap
new file mode 100644 (file)
index 0000000..3387f9b
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/espudp1.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/evb.out b/external/bsd/tcpdump/dist/tests/evb.out
new file mode 100644 (file)
index 0000000..db8888c
--- /dev/null
@@ -0,0 +1,146 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/evb.pcap b/external/bsd/tcpdump/dist/tests/evb.pcap
new file mode 100644 (file)
index 0000000..1aea021
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/evb.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/failure-outputs.txt b/external/bsd/tcpdump/dist/tests/failure-outputs.txt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/external/bsd/tcpdump/dist/tests/forces1.out b/external/bsd/tcpdump/dist/tests/forces1.out
new file mode 100644 (file)
index 0000000..63bb581
--- /dev/null
@@ -0,0 +1,40 @@
+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] 
diff --git a/external/bsd/tcpdump/dist/tests/forces1.pcap b/external/bsd/tcpdump/dist/tests/forces1.pcap
new file mode 100644 (file)
index 0000000..b60fdd0
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/forces1.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/forces1vvv.out b/external/bsd/tcpdump/dist/tests/forces1vvv.out
new file mode 100644 (file)
index 0000000..ebd378c
--- /dev/null
@@ -0,0 +1,227 @@
+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] 
diff --git a/external/bsd/tcpdump/dist/tests/forces1vvvv.out b/external/bsd/tcpdump/dist/tests/forces1vvvv.out
new file mode 100644 (file)
index 0000000..e418839
--- /dev/null
@@ -0,0 +1,306 @@
+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] 
diff --git a/external/bsd/tcpdump/dist/tests/forces2v.out b/external/bsd/tcpdump/dist/tests/forces2v.out
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/external/bsd/tcpdump/dist/tests/forces2vv.out b/external/bsd/tcpdump/dist/tests/forces2vv.out
new file mode 100644 (file)
index 0000000..74f37c6
--- /dev/null
@@ -0,0 +1,378 @@
+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] 
diff --git a/external/bsd/tcpdump/dist/tests/forces2vvv.out b/external/bsd/tcpdump/dist/tests/forces2vvv.out
new file mode 100644 (file)
index 0000000..6a9bd5f
--- /dev/null
@@ -0,0 +1,751 @@
+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] 
diff --git a/external/bsd/tcpdump/dist/tests/forces3.pcap b/external/bsd/tcpdump/dist/tests/forces3.pcap
new file mode 100644 (file)
index 0000000..a968425
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/forces3.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/forces3vvv.out b/external/bsd/tcpdump/dist/tests/forces3vvv.out
new file mode 100644 (file)
index 0000000..6d2394d
--- /dev/null
@@ -0,0 +1,602 @@
+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] 
diff --git a/external/bsd/tcpdump/dist/tests/geneve-tcp.out b/external/bsd/tcpdump/dist/tests/geneve-tcp.out
new file mode 100644 (file)
index 0000000..e2cdc37
--- /dev/null
@@ -0,0 +1,33 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/geneve-vni.out b/external/bsd/tcpdump/dist/tests/geneve-vni.out
new file mode 100644 (file)
index 0000000..8b6858b
--- /dev/null
@@ -0,0 +1,20 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/geneve-vv.out b/external/bsd/tcpdump/dist/tests/geneve-vv.out
new file mode 100644 (file)
index 0000000..eb50e66
--- /dev/null
@@ -0,0 +1,156 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/geneve.pcap b/external/bsd/tcpdump/dist/tests/geneve.pcap
new file mode 100644 (file)
index 0000000..2795493
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/geneve.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/geonet_and_calm_fast.out b/external/bsd/tcpdump/dist/tests/geonet_and_calm_fast.out
new file mode 100644 (file)
index 0000000..eae996f
--- /dev/null
@@ -0,0 +1,169 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/geonet_and_calm_fast.pcap b/external/bsd/tcpdump/dist/tests/geonet_and_calm_fast.pcap
new file mode 100644 (file)
index 0000000..eaaebe5
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/geonet_and_calm_fast.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/hdlc1.out b/external/bsd/tcpdump/dist/tests/hdlc1.out
new file mode 100644 (file)
index 0000000..3c510e0
--- /dev/null
@@ -0,0 +1 @@
+SLARP (length: 18), keepalive: mineseen=0x000d0a31, yourseen=0x57405e26, reliability=0x04ff, link uptime=49d12h52m33s
diff --git a/external/bsd/tcpdump/dist/tests/hdlc2.out b/external/bsd/tcpdump/dist/tests/hdlc2.out
new file mode 100644 (file)
index 0000000..78a2663
--- /dev/null
@@ -0,0 +1 @@
+SLARP (length: 14), keepalive: mineseen=0x000d0a31, yourseen=0x57405e26, reliability=0x04ff
diff --git a/external/bsd/tcpdump/dist/tests/hdlc3.out b/external/bsd/tcpdump/dist/tests/hdlc3.out
new file mode 100644 (file)
index 0000000..edbc605
--- /dev/null
@@ -0,0 +1,38 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/hdlc4.out b/external/bsd/tcpdump/dist/tests/hdlc4.out
new file mode 100644 (file)
index 0000000..deffd79
--- /dev/null
@@ -0,0 +1,7 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/hdlc_slarp.pcap b/external/bsd/tcpdump/dist/tests/hdlc_slarp.pcap
new file mode 100644 (file)
index 0000000..3a24dca
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/hdlc_slarp.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/hsrp_1-v.out b/external/bsd/tcpdump/dist/tests/hsrp_1-v.out
new file mode 100644 (file)
index 0000000..61b8e2b
--- /dev/null
@@ -0,0 +1,102 @@
+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^@^@^@"
diff --git a/external/bsd/tcpdump/dist/tests/hsrp_1.out b/external/bsd/tcpdump/dist/tests/hsrp_1.out
new file mode 100644 (file)
index 0000000..326e57b
--- /dev/null
@@ -0,0 +1,51 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/hsrp_2-v.out b/external/bsd/tcpdump/dist/tests/hsrp_2-v.out
new file mode 100644 (file)
index 0000000..d96227f
--- /dev/null
@@ -0,0 +1,98 @@
+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^@^@^@"
diff --git a/external/bsd/tcpdump/dist/tests/hsrp_3-v.out b/external/bsd/tcpdump/dist/tests/hsrp_3-v.out
new file mode 100644 (file)
index 0000000..54a78f4
--- /dev/null
@@ -0,0 +1,78 @@
+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^@^@^@"
diff --git a/external/bsd/tcpdump/dist/tests/icmpv6.out b/external/bsd/tcpdump/dist/tests/icmpv6.out
new file mode 100644 (file)
index 0000000..bb7775e
--- /dev/null
@@ -0,0 +1,26 @@
+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 { }]
diff --git a/external/bsd/tcpdump/dist/tests/icmpv6.pcap b/external/bsd/tcpdump/dist/tests/icmpv6.pcap
new file mode 100644 (file)
index 0000000..d480e72
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/icmpv6.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/icmpv6_opt24-v.out b/external/bsd/tcpdump/dist/tests/icmpv6_opt24-v.out
new file mode 100644 (file)
index 0000000..2b7cf09
--- /dev/null
@@ -0,0 +1,16 @@
+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.
diff --git a/external/bsd/tcpdump/dist/tests/icmpv6_opt24.pcap b/external/bsd/tcpdump/dist/tests/icmpv6_opt24.pcap
new file mode 100644 (file)
index 0000000..974e7a3
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/icmpv6_opt24.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ieee802.11_exthdr.out b/external/bsd/tcpdump/dist/tests/ieee802.11_exthdr.out
new file mode 100644 (file)
index 0000000..dd1689d
--- /dev/null
@@ -0,0 +1,26 @@
+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 
diff --git a/external/bsd/tcpdump/dist/tests/ieee802.11_exthdr.pcap b/external/bsd/tcpdump/dist/tests/ieee802.11_exthdr.pcap
new file mode 100644 (file)
index 0000000..613a443
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ieee802.11_exthdr.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ieee802.11_rx-stbc.out b/external/bsd/tcpdump/dist/tests/ieee802.11_rx-stbc.out
new file mode 100644 (file)
index 0000000..9f483b9
--- /dev/null
@@ -0,0 +1,3 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/ieee802.11_rx-stbc.pcap b/external/bsd/tcpdump/dist/tests/ieee802.11_rx-stbc.pcap
new file mode 100644 (file)
index 0000000..b825a0a
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ieee802.11_rx-stbc.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/igmpv1.out b/external/bsd/tcpdump/dist/tests/igmpv1.out
new file mode 100644 (file)
index 0000000..ad8618f
--- /dev/null
@@ -0,0 +1,27 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/igmpv2.out b/external/bsd/tcpdump/dist/tests/igmpv2.out
new file mode 100644 (file)
index 0000000..ae340da
--- /dev/null
@@ -0,0 +1,18 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/igmpv3-queries.out b/external/bsd/tcpdump/dist/tests/igmpv3-queries.out
new file mode 100644 (file)
index 0000000..9db6f9b
--- /dev/null
@@ -0,0 +1,6 @@
+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]
diff --git a/external/bsd/tcpdump/dist/tests/igmpv3-queries.pcap b/external/bsd/tcpdump/dist/tests/igmpv3-queries.pcap
new file mode 100644 (file)
index 0000000..df653ce
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/igmpv3-queries.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ikev2four.out b/external/bsd/tcpdump/dist/tests/ikev2four.out
new file mode 100644 (file)
index 0000000..db2e8ef
--- /dev/null
@@ -0,0 +1,107 @@
+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)
diff --git a/external/bsd/tcpdump/dist/tests/ikev2four.pcap b/external/bsd/tcpdump/dist/tests/ikev2four.pcap
new file mode 100644 (file)
index 0000000..4b1d0bf
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ikev2four.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ikev2fourv.out b/external/bsd/tcpdump/dist/tests/ikev2fourv.out
new file mode 100644 (file)
index 0000000..15c482f
--- /dev/null
@@ -0,0 +1,107 @@
+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)
diff --git a/external/bsd/tcpdump/dist/tests/ikev2fourv4.out b/external/bsd/tcpdump/dist/tests/ikev2fourv4.out
new file mode 100644 (file)
index 0000000..dd6c3ee
--- /dev/null
@@ -0,0 +1,107 @@
+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)
diff --git a/external/bsd/tcpdump/dist/tests/ikev2pI2-secrets.txt b/external/bsd/tcpdump/dist/tests/ikev2pI2-secrets.txt
new file mode 100644 (file)
index 0000000..efe9636
--- /dev/null
@@ -0,0 +1,2 @@
+ikev2 I 0x0001020304050607 0xc02e7a3031a03188 sha1:0x4ea8e662b07cdd430f6944c6723e4b82d5722418 aes128:0x3f44bf47cafd8150591deb088199fcbf
+ikev2 R 0x0001020304050607 0xc02e7a3031a03188 sha1:0x515b0bd22e6d76b34fdb760aa7bfad80b109b75d aes128:0xbedb67ec7dc3d00cccac42e70cd63bde
diff --git a/external/bsd/tcpdump/dist/tests/ikev2pI2.out b/external/bsd/tcpdump/dist/tests/ikev2pI2.out
new file mode 100644 (file)
index 0000000..7940e8c
--- /dev/null
@@ -0,0 +1,41 @@
+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) ))
diff --git a/external/bsd/tcpdump/dist/tests/ikev2pI2.pcap b/external/bsd/tcpdump/dist/tests/ikev2pI2.pcap
new file mode 100644 (file)
index 0000000..8d5eb48
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ikev2pI2.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ipv6-bad-version.out b/external/bsd/tcpdump/dist/tests/ipv6-bad-version.out
new file mode 100644 (file)
index 0000000..cd9150b
--- /dev/null
@@ -0,0 +1,4 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/ipv6-bad-version.pcap b/external/bsd/tcpdump/dist/tests/ipv6-bad-version.pcap
new file mode 100644 (file)
index 0000000..357a6ee
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ipv6-bad-version.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ipv6-routing-header.out b/external/bsd/tcpdump/dist/tests/ipv6-routing-header.out
new file mode 100644 (file)
index 0000000..c19b879
--- /dev/null
@@ -0,0 +1,4 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/ipv6-routing-header.pcap b/external/bsd/tcpdump/dist/tests/ipv6-routing-header.pcap
new file mode 100644 (file)
index 0000000..683e01b
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ipv6-routing-header.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/isakmp-delete-segfault.pcap b/external/bsd/tcpdump/dist/tests/isakmp-delete-segfault.pcap
new file mode 100644 (file)
index 0000000..9c4ada1
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/isakmp-delete-segfault.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/isakmp-identification-segfault.pcap b/external/bsd/tcpdump/dist/tests/isakmp-identification-segfault.pcap
new file mode 100644 (file)
index 0000000..c14f04f
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/isakmp-identification-segfault.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/isakmp-pointer-loop.pcap b/external/bsd/tcpdump/dist/tests/isakmp-pointer-loop.pcap
new file mode 100644 (file)
index 0000000..578da0d
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/isakmp-pointer-loop.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/isakmp1.out b/external/bsd/tcpdump/dist/tests/isakmp1.out
new file mode 100644 (file)
index 0000000..355a8ea
--- /dev/null
@@ -0,0 +1 @@
+IP 127.0.0.1.500 > 127.0.0.1.500: isakmp:
diff --git a/external/bsd/tcpdump/dist/tests/isakmp2.out b/external/bsd/tcpdump/dist/tests/isakmp2.out
new file mode 100644 (file)
index 0000000..44c28db
--- /dev/null
@@ -0,0 +1 @@
+IP 129.170.249.126.500 > 129.170.249.87.500: isakmp: phase 1 ? base
diff --git a/external/bsd/tcpdump/dist/tests/isakmp3.out b/external/bsd/tcpdump/dist/tests/isakmp3.out
new file mode 100644 (file)
index 0000000..8619263
--- /dev/null
@@ -0,0 +1,3 @@
+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)
diff --git a/external/bsd/tcpdump/dist/tests/isakmp4.out b/external/bsd/tcpdump/dist/tests/isakmp4.out
new file mode 100644 (file)
index 0000000..0de3ebc
--- /dev/null
@@ -0,0 +1,35 @@
+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]
diff --git a/external/bsd/tcpdump/dist/tests/isakmp4500.pcap b/external/bsd/tcpdump/dist/tests/isakmp4500.pcap
new file mode 100644 (file)
index 0000000..8ff5ab4
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/isakmp4500.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/isakmp5-v.out b/external/bsd/tcpdump/dist/tests/isakmp5-v.out
new file mode 100644 (file)
index 0000000..58014af
--- /dev/null
@@ -0,0 +1,44 @@
+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]
diff --git a/external/bsd/tcpdump/dist/tests/isis-infinite-loop.pcap b/external/bsd/tcpdump/dist/tests/isis-infinite-loop.pcap
new file mode 100644 (file)
index 0000000..b482fc8
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/isis-infinite-loop.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/isis_1-v.out b/external/bsd/tcpdump/dist/tests/isis_1-v.out
new file mode 100644 (file)
index 0000000..bbe6e26
--- /dev/null
@@ -0,0 +1,270 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/isis_1.out b/external/bsd/tcpdump/dist/tests/isis_1.out
new file mode 100644 (file)
index 0000000..32edae9
--- /dev/null
@@ -0,0 +1,15 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/isis_2-v.out b/external/bsd/tcpdump/dist/tests/isis_2-v.out
new file mode 100644 (file)
index 0000000..8c05206
--- /dev/null
@@ -0,0 +1,403 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/isis_3-v.out b/external/bsd/tcpdump/dist/tests/isis_3-v.out
new file mode 100644 (file)
index 0000000..4894864
--- /dev/null
@@ -0,0 +1,774 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/isis_4-v.out b/external/bsd/tcpdump/dist/tests/isis_4-v.out
new file mode 100644 (file)
index 0000000..b4875f3
--- /dev/null
@@ -0,0 +1,400 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/isis_infloop-v.out b/external/bsd/tcpdump/dist/tests/isis_infloop-v.out
new file mode 100644 (file)
index 0000000..1bb8301
--- /dev/null
@@ -0,0 +1,40 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/isup.out b/external/bsd/tcpdump/dist/tests/isup.out
new file mode 100644 (file)
index 0000000..fb4d9af
--- /dev/null
@@ -0,0 +1,6 @@
+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] 
diff --git a/external/bsd/tcpdump/dist/tests/isup.pcap b/external/bsd/tcpdump/dist/tests/isup.pcap
new file mode 100644 (file)
index 0000000..39f16b9
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/isup.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/isupvv.out b/external/bsd/tcpdump/dist/tests/isupvv.out
new file mode 100644 (file)
index 0000000..8e8a008
--- /dev/null
@@ -0,0 +1,30 @@
+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)
diff --git a/external/bsd/tcpdump/dist/tests/kday1.out b/external/bsd/tcpdump/dist/tests/kday1.out
new file mode 100644 (file)
index 0000000..eaaacaa
--- /dev/null
@@ -0,0 +1,15 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/kday1.pcap b/external/bsd/tcpdump/dist/tests/kday1.pcap
new file mode 100644 (file)
index 0000000..ca2d960
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/kday1.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/kday2.out b/external/bsd/tcpdump/dist/tests/kday2.out
new file mode 100644 (file)
index 0000000..cf5e34a
--- /dev/null
@@ -0,0 +1,27 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/kday2.pcap b/external/bsd/tcpdump/dist/tests/kday2.pcap
new file mode 100644 (file)
index 0000000..28e921b
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/kday2.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/kday3.out b/external/bsd/tcpdump/dist/tests/kday3.out
new file mode 100644 (file)
index 0000000..85bb54e
--- /dev/null
@@ -0,0 +1,20 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/kday3.pcap b/external/bsd/tcpdump/dist/tests/kday3.pcap
new file mode 100644 (file)
index 0000000..e22de28
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/kday3.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/kday4.out b/external/bsd/tcpdump/dist/tests/kday4.out
new file mode 100644 (file)
index 0000000..ee3228e
--- /dev/null
@@ -0,0 +1,28 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/kday4.pcap b/external/bsd/tcpdump/dist/tests/kday4.pcap
new file mode 100644 (file)
index 0000000..f25e84a
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/kday4.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/kday5.out b/external/bsd/tcpdump/dist/tests/kday5.out
new file mode 100644 (file)
index 0000000..9f0fb80
--- /dev/null
@@ -0,0 +1,27 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/kday5.pcap b/external/bsd/tcpdump/dist/tests/kday5.pcap
new file mode 100644 (file)
index 0000000..759bf88
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/kday5.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/kday6.out b/external/bsd/tcpdump/dist/tests/kday6.out
new file mode 100644 (file)
index 0000000..3eba7e6
--- /dev/null
@@ -0,0 +1,460 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/kday6.pcap b/external/bsd/tcpdump/dist/tests/kday6.pcap
new file mode 100644 (file)
index 0000000..7c6ab89
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/kday6.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/kday7.out b/external/bsd/tcpdump/dist/tests/kday7.out
new file mode 100644 (file)
index 0000000..79b70a6
--- /dev/null
@@ -0,0 +1,28 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/kday7.pcap b/external/bsd/tcpdump/dist/tests/kday7.pcap
new file mode 100644 (file)
index 0000000..ec1da78
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/kday7.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/kday8.out b/external/bsd/tcpdump/dist/tests/kday8.out
new file mode 100644 (file)
index 0000000..fa84bf3
--- /dev/null
@@ -0,0 +1,27 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/kday8.pcap b/external/bsd/tcpdump/dist/tests/kday8.pcap
new file mode 100644 (file)
index 0000000..83577f6
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/kday8.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/lacp-ev.out b/external/bsd/tcpdump/dist/tests/lacp-ev.out
new file mode 100644 (file)
index 0000000..36ed753
--- /dev/null
@@ -0,0 +1,200 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/ldp-infinite-loop.pcap b/external/bsd/tcpdump/dist/tests/ldp-infinite-loop.pcap
new file mode 100644 (file)
index 0000000..ea31f0c
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ldp-infinite-loop.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ldp_infloop.out b/external/bsd/tcpdump/dist/tests/ldp_infloop.out
new file mode 100644 (file)
index 0000000..8c0a062
--- /dev/null
@@ -0,0 +1,5 @@
+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: 
diff --git a/external/bsd/tcpdump/dist/tests/lldp_cdp-ev.out b/external/bsd/tcpdump/dist/tests/lldp_cdp-ev.out
new file mode 100644 (file)
index 0000000..d9fc647
--- /dev/null
@@ -0,0 +1,252 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/lmp-v.out b/external/bsd/tcpdump/dist/tests/lmp-v.out
new file mode 100644 (file)
index 0000000..fcd3bed
--- /dev/null
@@ -0,0 +1,200 @@
+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)
diff --git a/external/bsd/tcpdump/dist/tests/lmp-v.sh b/external/bsd/tcpdump/dist/tests/lmp-v.sh
new file mode 100755 (executable)
index 0000000..138a0cd
--- /dev/null
@@ -0,0 +1,19 @@
+#!/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
diff --git a/external/bsd/tcpdump/dist/tests/lmp.out b/external/bsd/tcpdump/dist/tests/lmp.out
new file mode 100644 (file)
index 0000000..1338982
--- /dev/null
@@ -0,0 +1,18 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/lmp.pcap b/external/bsd/tcpdump/dist/tests/lmp.pcap
new file mode 100644 (file)
index 0000000..a07e3bb
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/lmp.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/loopback.out b/external/bsd/tcpdump/dist/tests/loopback.out
new file mode 100644 (file)
index 0000000..7b8dece
--- /dev/null
@@ -0,0 +1,6 @@
+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)
diff --git a/external/bsd/tcpdump/dist/tests/loopback.pcap b/external/bsd/tcpdump/dist/tests/loopback.pcap
new file mode 100644 (file)
index 0000000..384c0d3
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/loopback.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/lspping-fec-ldp.pcap b/external/bsd/tcpdump/dist/tests/lspping-fec-ldp.pcap
new file mode 100644 (file)
index 0000000..87e86c7
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/lspping-fec-ldp.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/lspping-fec-rsvp.pcap b/external/bsd/tcpdump/dist/tests/lspping-fec-rsvp.pcap
new file mode 100644 (file)
index 0000000..d9dcf54
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/lspping-fec-rsvp.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/mpbgp-linklocal-nexthop.out b/external/bsd/tcpdump/dist/tests/mpbgp-linklocal-nexthop.out
new file mode 100644 (file)
index 0000000..9a4c2bd
--- /dev/null
@@ -0,0 +1,10 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/mpbgp-linklocal-nexthop.pcap b/external/bsd/tcpdump/dist/tests/mpbgp-linklocal-nexthop.pcap
new file mode 100644 (file)
index 0000000..1ac823d
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/mpbgp-linklocal-nexthop.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/mpls-ldp-hello.out b/external/bsd/tcpdump/dist/tests/mpls-ldp-hello.out
new file mode 100644 (file)
index 0000000..a8b2373
--- /dev/null
@@ -0,0 +1,10 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/mpls-ldp-hello.pcap b/external/bsd/tcpdump/dist/tests/mpls-ldp-hello.pcap
new file mode 100644 (file)
index 0000000..a4a42b7
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/mpls-ldp-hello.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/mpls-traceroute.pcap b/external/bsd/tcpdump/dist/tests/mpls-traceroute.pcap
new file mode 100644 (file)
index 0000000..ac0b6b3
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/mpls-traceroute.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/mptcp-fclose.out b/external/bsd/tcpdump/dist/tests/mptcp-fclose.out
new file mode 100644 (file)
index 0000000..90ab599
--- /dev/null
@@ -0,0 +1,11 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/mptcp-fclose.pcap b/external/bsd/tcpdump/dist/tests/mptcp-fclose.pcap
new file mode 100644 (file)
index 0000000..6949548
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/mptcp-fclose.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/mptcp.out b/external/bsd/tcpdump/dist/tests/mptcp.out
new file mode 100644 (file)
index 0000000..e52cab1
--- /dev/null
@@ -0,0 +1,264 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/mptcp.pcap b/external/bsd/tcpdump/dist/tests/mptcp.pcap
new file mode 100644 (file)
index 0000000..c3eaae5
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/mptcp.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/mrinfo_query.pcap b/external/bsd/tcpdump/dist/tests/mrinfo_query.pcap
new file mode 100644 (file)
index 0000000..63a86d6
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/mrinfo_query.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/msnlb.out b/external/bsd/tcpdump/dist/tests/msnlb.out
new file mode 100644 (file)
index 0000000..194dbcd
--- /dev/null
@@ -0,0 +1,2 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/msnlb.pcap b/external/bsd/tcpdump/dist/tests/msnlb.pcap
new file mode 100644 (file)
index 0000000..dab88fe
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/msnlb.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/msnlb2.out b/external/bsd/tcpdump/dist/tests/msnlb2.out
new file mode 100644 (file)
index 0000000..00fc1a6
--- /dev/null
@@ -0,0 +1,2 @@
+[|MS NLB]
+[|MS NLB]
diff --git a/external/bsd/tcpdump/dist/tests/msnlb2.pcap b/external/bsd/tcpdump/dist/tests/msnlb2.pcap
new file mode 100644 (file)
index 0000000..270476d
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/msnlb2.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/mstp-v.out b/external/bsd/tcpdump/dist/tests/mstp-v.out
new file mode 100644 (file)
index 0000000..16127b5
--- /dev/null
@@ -0,0 +1,130 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/mtrace.out b/external/bsd/tcpdump/dist/tests/mtrace.out
new file mode 100644 (file)
index 0000000..2995f60
--- /dev/null
@@ -0,0 +1,2 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/mtrace.pcap b/external/bsd/tcpdump/dist/tests/mtrace.pcap
new file mode 100644 (file)
index 0000000..0d16dd3
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/mtrace.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/nflog-e.out b/external/bsd/tcpdump/dist/tests/nflog-e.out
new file mode 100644 (file)
index 0000000..636d38e
--- /dev/null
@@ -0,0 +1,4 @@
+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)
diff --git a/external/bsd/tcpdump/dist/tests/nflog-e.sh b/external/bsd/tcpdump/dist/tests/nflog-e.sh
new file mode 100755 (executable)
index 0000000..00ac4fd
--- /dev/null
@@ -0,0 +1,10 @@
+#!/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
diff --git a/external/bsd/tcpdump/dist/tests/nflog.pcap b/external/bsd/tcpdump/dist/tests/nflog.pcap
new file mode 100644 (file)
index 0000000..9151d6a
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/nflog.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/of10_7050q-v.out b/external/bsd/tcpdump/dist/tests/of10_7050q-v.out
new file mode 100644 (file)
index 0000000..4929920
--- /dev/null
@@ -0,0 +1,18 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/of10_7050q.pcap b/external/bsd/tcpdump/dist/tests/of10_7050q.pcap
new file mode 100644 (file)
index 0000000..43602af
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/of10_7050q.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/of10_7050sx_bsn-vv.out b/external/bsd/tcpdump/dist/tests/of10_7050sx_bsn-vv.out
new file mode 100644 (file)
index 0000000..a1674fc
--- /dev/null
@@ -0,0 +1,343 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/of10_7050sx_bsn.pcap b/external/bsd/tcpdump/dist/tests/of10_7050sx_bsn.pcap
new file mode 100644 (file)
index 0000000..c5164f1
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/of10_7050sx_bsn.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/of10_p3295-vv.out b/external/bsd/tcpdump/dist/tests/of10_p3295-vv.out
new file mode 100644 (file)
index 0000000..7d1a691
--- /dev/null
@@ -0,0 +1,798 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/of10_p3295.pcap b/external/bsd/tcpdump/dist/tests/of10_p3295.pcap
new file mode 100644 (file)
index 0000000..85f1b27
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/of10_p3295.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/of10_pf5240-vv.out b/external/bsd/tcpdump/dist/tests/of10_pf5240-vv.out
new file mode 100644 (file)
index 0000000..a7685e9
--- /dev/null
@@ -0,0 +1,428 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/of10_pf5240.pcap b/external/bsd/tcpdump/dist/tests/of10_pf5240.pcap
new file mode 100644 (file)
index 0000000..9f5aed2
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/of10_pf5240.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/of10_s4810-vvvv.out b/external/bsd/tcpdump/dist/tests/of10_s4810-vvvv.out
new file mode 100644 (file)
index 0000000..dabc2f2
--- /dev/null
@@ -0,0 +1,1333 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/of10_s4810.pcap b/external/bsd/tcpdump/dist/tests/of10_s4810.pcap
new file mode 100644 (file)
index 0000000..4c9c194
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/of10_s4810.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ospf-gmpls.out b/external/bsd/tcpdump/dist/tests/ospf-gmpls.out
new file mode 100644 (file)
index 0000000..e4dd9ab
--- /dev/null
@@ -0,0 +1,86 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/ospf-gmpls.pcap b/external/bsd/tcpdump/dist/tests/ospf-gmpls.pcap
new file mode 100644 (file)
index 0000000..d36982a
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ospf-gmpls.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ospf3_ah-vv.out b/external/bsd/tcpdump/dist/tests/ospf3_ah-vv.out
new file mode 100644 (file)
index 0000000..54a521b
--- /dev/null
@@ -0,0 +1,645 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/ospf3_auth-vv.out b/external/bsd/tcpdump/dist/tests/ospf3_auth-vv.out
new file mode 100644 (file)
index 0000000..69b7c26
--- /dev/null
@@ -0,0 +1,10 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/ospf3_auth.pcap b/external/bsd/tcpdump/dist/tests/ospf3_auth.pcap
new file mode 100644 (file)
index 0000000..4b5bc81
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ospf3_auth.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ospf3_bc-vv.out b/external/bsd/tcpdump/dist/tests/ospf3_bc-vv.out
new file mode 100644 (file)
index 0000000..3cc3f36
--- /dev/null
@@ -0,0 +1,335 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/ospf3_mp-vv.out b/external/bsd/tcpdump/dist/tests/ospf3_mp-vv.out
new file mode 100644 (file)
index 0000000..ee1ef04
--- /dev/null
@@ -0,0 +1,817 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/ospf3_nbma-vv.out b/external/bsd/tcpdump/dist/tests/ospf3_nbma-vv.out
new file mode 100644 (file)
index 0000000..5b8eed9
--- /dev/null
@@ -0,0 +1,912 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/pgm_zmtp1.pcap b/external/bsd/tcpdump/dist/tests/pgm_zmtp1.pcap
new file mode 100644 (file)
index 0000000..ee01e91
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/pgm_zmtp1.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/pgm_zmtp1v.out b/external/bsd/tcpdump/dist/tests/pgm_zmtp1v.out
new file mode 100644 (file)
index 0000000..09044a7
--- /dev/null
@@ -0,0 +1,76 @@
+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]
diff --git a/external/bsd/tcpdump/dist/tests/pgmv.out b/external/bsd/tcpdump/dist/tests/pgmv.out
new file mode 100644 (file)
index 0000000..606f3c0
--- /dev/null
@@ -0,0 +1,28 @@
+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]
diff --git a/external/bsd/tcpdump/dist/tests/pimv2_bootstrap-v.out b/external/bsd/tcpdump/dist/tests/pimv2_bootstrap-v.out
new file mode 100644 (file)
index 0000000..1d56445
--- /dev/null
@@ -0,0 +1,24 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/pimv2_dm-v.out b/external/bsd/tcpdump/dist/tests/pimv2_dm-v.out
new file mode 100644 (file)
index 0000000..334120b
--- /dev/null
@@ -0,0 +1,238 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/pimv2_hellos-v.out b/external/bsd/tcpdump/dist/tests/pimv2_hellos-v.out
new file mode 100644 (file)
index 0000000..535dd52
--- /dev/null
@@ -0,0 +1,42 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/pimv2_register-v.out b/external/bsd/tcpdump/dist/tests/pimv2_register-v.out
new file mode 100644 (file)
index 0000000..54d4407
--- /dev/null
@@ -0,0 +1,8 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/pimv2_sm-v.out b/external/bsd/tcpdump/dist/tests/pimv2_sm-v.out
new file mode 100644 (file)
index 0000000..546316a
--- /dev/null
@@ -0,0 +1,300 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/pppoe.out b/external/bsd/tcpdump/dist/tests/pppoe.out
new file mode 100644 (file)
index 0000000..b8f95e0
--- /dev/null
@@ -0,0 +1 @@
+PPPoE PADI [Service-Name] [PPP-Max-Payload 0x05DC] [Host-Uniq 0x16372C16]
diff --git a/external/bsd/tcpdump/dist/tests/pppoe.pcap b/external/bsd/tcpdump/dist/tests/pppoe.pcap
new file mode 100644 (file)
index 0000000..3296174
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/pppoe.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/pppoes.out b/external/bsd/tcpdump/dist/tests/pppoes.out
new file mode 100644 (file)
index 0000000..608c5d7
--- /dev/null
@@ -0,0 +1,2 @@
+PPPoE  [ses 0x17] LCP, Echo-Request (0x09), id 106, length 14
+PPPoE  [ses 0x3b] LCP, Echo-Request (0x09), id 103, length 14
diff --git a/external/bsd/tcpdump/dist/tests/pppoes.pcap b/external/bsd/tcpdump/dist/tests/pppoes.pcap
new file mode 100644 (file)
index 0000000..a2c7698
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/pppoes.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/pppoes_id.out b/external/bsd/tcpdump/dist/tests/pppoes_id.out
new file mode 100644 (file)
index 0000000..ef794fe
--- /dev/null
@@ -0,0 +1 @@
+PPPoE  [ses 0x3b] LCP, Echo-Request (0x09), id 103, length 14
diff --git a/external/bsd/tcpdump/dist/tests/print-A.out b/external/bsd/tcpdump/dist/tests/print-A.out
new file mode 100644 (file)
index 0000000..8a6dde6
--- /dev/null
@@ -0,0 +1,193 @@
+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..#
diff --git a/external/bsd/tcpdump/dist/tests/print-AA.out b/external/bsd/tcpdump/dist/tests/print-AA.out
new file mode 100644 (file)
index 0000000..e40bdab
--- /dev/null
@@ -0,0 +1,193 @@
+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..#
diff --git a/external/bsd/tcpdump/dist/tests/print-capX.out b/external/bsd/tcpdump/dist/tests/print-capX.out
new file mode 100644 (file)
index 0000000..8a27a96
--- /dev/null
@@ -0,0 +1,409 @@
+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..#
diff --git a/external/bsd/tcpdump/dist/tests/print-capXX.out b/external/bsd/tcpdump/dist/tests/print-capXX.out
new file mode 100644 (file)
index 0000000..8fc3095
--- /dev/null
@@ -0,0 +1,419 @@
+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                                     .#
diff --git a/external/bsd/tcpdump/dist/tests/print-flags.pcap b/external/bsd/tcpdump/dist/tests/print-flags.pcap
new file mode 100644 (file)
index 0000000..d4b0be3
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/print-flags.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/print-x.out b/external/bsd/tcpdump/dist/tests/print-x.out
new file mode 100644 (file)
index 0000000..f2a4e2c
--- /dev/null
@@ -0,0 +1,409 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/print-xx.out b/external/bsd/tcpdump/dist/tests/print-xx.out
new file mode 100644 (file)
index 0000000..542fdc3
--- /dev/null
@@ -0,0 +1,419 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/radius-rfc4675-v.out b/external/bsd/tcpdump/dist/tests/radius-rfc4675-v.out
new file mode 100644 (file)
index 0000000..ff0e96f
--- /dev/null
@@ -0,0 +1,43 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/radius-rfc5176-v.out b/external/bsd/tcpdump/dist/tests/radius-rfc5176-v.out
new file mode 100644 (file)
index 0000000..aa3210d
--- /dev/null
@@ -0,0 +1,24 @@
+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..
diff --git a/external/bsd/tcpdump/dist/tests/radius-v.out b/external/bsd/tcpdump/dist/tests/radius-v.out
new file mode 100644 (file)
index 0000000..6aae418
--- /dev/null
@@ -0,0 +1,47 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/ripv1v2.out b/external/bsd/tcpdump/dist/tests/ripv1v2.out
new file mode 100644 (file)
index 0000000..65243d8
--- /dev/null
@@ -0,0 +1,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, 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
diff --git a/external/bsd/tcpdump/dist/tests/ripv1v2.pcap b/external/bsd/tcpdump/dist/tests/ripv1v2.pcap
new file mode 100644 (file)
index 0000000..b98056f
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ripv1v2.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/ripv2_auth.out b/external/bsd/tcpdump/dist/tests/ripv2_auth.out
new file mode 100644 (file)
index 0000000..618e4a7
--- /dev/null
@@ -0,0 +1,94 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/ripv2_auth.pcap b/external/bsd/tcpdump/dist/tests/ripv2_auth.pcap
new file mode 100644 (file)
index 0000000..57b5a41
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/ripv2_auth.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/rpl-14-dao.pcap b/external/bsd/tcpdump/dist/tests/rpl-14-dao.pcap
new file mode 100644 (file)
index 0000000..9a164e4
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/rpl-14-dao.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/rpl-14-daovvv.out b/external/bsd/tcpdump/dist/tests/rpl-14-daovvv.out
new file mode 100644 (file)
index 0000000..7869e6b
--- /dev/null
@@ -0,0 +1 @@
+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]
diff --git a/external/bsd/tcpdump/dist/tests/rpl-19-pickdag.out b/external/bsd/tcpdump/dist/tests/rpl-19-pickdag.out
new file mode 100644 (file)
index 0000000..2460ada
--- /dev/null
@@ -0,0 +1 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/rpl-19-pickdag.pcap b/external/bsd/tcpdump/dist/tests/rpl-19-pickdag.pcap
new file mode 100644 (file)
index 0000000..3eca6c9
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/rpl-19-pickdag.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/rpl-19-pickdagvvv.out b/external/bsd/tcpdump/dist/tests/rpl-19-pickdagvvv.out
new file mode 100644 (file)
index 0000000..bd93453
--- /dev/null
@@ -0,0 +1 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/rpl-26-senddaoack.pcap b/external/bsd/tcpdump/dist/tests/rpl-26-senddaoack.pcap
new file mode 100644 (file)
index 0000000..fd397a4
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/rpl-26-senddaoack.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/rpl-26-senddaovv.out b/external/bsd/tcpdump/dist/tests/rpl-26-senddaovv.out
new file mode 100644 (file)
index 0000000..6d11c81
--- /dev/null
@@ -0,0 +1 @@
+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]
diff --git a/external/bsd/tcpdump/dist/tests/rpvst-v.out b/external/bsd/tcpdump/dist/tests/rpvst-v.out
new file mode 100644 (file)
index 0000000..c55c1eb
--- /dev/null
@@ -0,0 +1,68 @@
+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)
diff --git a/external/bsd/tcpdump/dist/tests/rpvstp-trunk-native-vid5.pcap b/external/bsd/tcpdump/dist/tests/rpvstp-trunk-native-vid5.pcap
new file mode 100644 (file)
index 0000000..4c9908b
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/rpvstp-trunk-native-vid5.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/rstp-v.out b/external/bsd/tcpdump/dist/tests/rstp-v.out
new file mode 100644 (file)
index 0000000..318b450
--- /dev/null
@@ -0,0 +1,90 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/rsvp-infinite-loop.pcap b/external/bsd/tcpdump/dist/tests/rsvp-infinite-loop.pcap
new file mode 100644 (file)
index 0000000..dc03dac
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/rsvp-infinite-loop.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/rsvp_infloop-v.out b/external/bsd/tcpdump/dist/tests/rsvp_infloop-v.out
new file mode 100644 (file)
index 0000000..9084e15
--- /dev/null
@@ -0,0 +1,35 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/sflow_multiple_counter_30_pdus-nv.out b/external/bsd/tcpdump/dist/tests/sflow_multiple_counter_30_pdus-nv.out
new file mode 100644 (file)
index 0000000..45a2d90
--- /dev/null
@@ -0,0 +1,30 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/sflow_multiple_counter_30_pdus.out b/external/bsd/tcpdump/dist/tests/sflow_multiple_counter_30_pdus.out
new file mode 100644 (file)
index 0000000..1b1938e
--- /dev/null
@@ -0,0 +1,1828 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/sflow_multiple_counter_30_pdus.pcap b/external/bsd/tcpdump/dist/tests/sflow_multiple_counter_30_pdus.pcap
new file mode 100644 (file)
index 0000000..5ec39c4
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/sflow_multiple_counter_30_pdus.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/spb.out b/external/bsd/tcpdump/dist/tests/spb.out
new file mode 100644 (file)
index 0000000..ef2f82a
--- /dev/null
@@ -0,0 +1,53 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/spb.pcap b/external/bsd/tcpdump/dist/tests/spb.pcap
new file mode 100644 (file)
index 0000000..99e2505
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/spb.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/spb_bpduv4.out b/external/bsd/tcpdump/dist/tests/spb_bpduv4.out
new file mode 100644 (file)
index 0000000..748d4d2
--- /dev/null
@@ -0,0 +1,25 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/spb_bpduv4.pcap b/external/bsd/tcpdump/dist/tests/spb_bpduv4.pcap
new file mode 100644 (file)
index 0000000..b12d4c1
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/spb_bpduv4.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/stp-v.out b/external/bsd/tcpdump/dist/tests/stp-v.out
new file mode 100644 (file)
index 0000000..66d3081
--- /dev/null
@@ -0,0 +1,42 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/syslog-v.out b/external/bsd/tcpdump/dist/tests/syslog-v.out
new file mode 100644 (file)
index 0000000..5ebed29
--- /dev/null
@@ -0,0 +1,16 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/syslog_udp.pcap b/external/bsd/tcpdump/dist/tests/syslog_udp.pcap
new file mode 100644 (file)
index 0000000..06d54e6
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/syslog_udp.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/tfo-5c1fa7f9ae91.pcap b/external/bsd/tcpdump/dist/tests/tfo-5c1fa7f9ae91.pcap
new file mode 100644 (file)
index 0000000..43ae5b7
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/tfo-5c1fa7f9ae91.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/tfo.out b/external/bsd/tcpdump/dist/tests/tfo.out
new file mode 100644 (file)
index 0000000..ff5a955
--- /dev/null
@@ -0,0 +1,14 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/udld-v.out b/external/bsd/tcpdump/dist/tests/udld-v.out
new file mode 100644 (file)
index 0000000..cb55b8a
--- /dev/null
@@ -0,0 +1,261 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/vrrp-v.out b/external/bsd/tcpdump/dist/tests/vrrp-v.out
new file mode 100644 (file)
index 0000000..47b3c7d
--- /dev/null
@@ -0,0 +1,266 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/vrrp.out b/external/bsd/tcpdump/dist/tests/vrrp.out
new file mode 100644 (file)
index 0000000..c9b1664
--- /dev/null
@@ -0,0 +1,165 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/vrrp.pcap b/external/bsd/tcpdump/dist/tests/vrrp.pcap
new file mode 100644 (file)
index 0000000..8db1e20
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/vrrp.pcap differ
diff --git a/external/bsd/tcpdump/dist/tests/zmtp1.out b/external/bsd/tcpdump/dist/tests/zmtp1.out
new file mode 100644 (file)
index 0000000..5b52877
--- /dev/null
@@ -0,0 +1,73 @@
+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
diff --git a/external/bsd/tcpdump/dist/tests/zmtp1.pcap b/external/bsd/tcpdump/dist/tests/zmtp1.pcap
new file mode 100644 (file)
index 0000000..55aebea
Binary files /dev/null and b/external/bsd/tcpdump/dist/tests/zmtp1.pcap differ
diff --git a/external/bsd/tcpdump/dist/udp.h b/external/bsd/tcpdump/dist/udp.h
new file mode 100644 (file)
index 0000000..54ade42
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/util.c b/external/bsd/tcpdump/dist/util.c
new file mode 100644 (file)
index 0000000..4593d24
--- /dev/null
@@ -0,0 +1,895 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/vfprintf.c b/external/bsd/tcpdump/dist/vfprintf.c
new file mode 100644 (file)
index 0000000..5d01d6a
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * 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;
+}
diff --git a/external/bsd/tcpdump/dist/win32/Include/w32_fzs.h b/external/bsd/tcpdump/dist/win32/Include/w32_fzs.h
new file mode 100644 (file)
index 0000000..8b5e598
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * 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
diff --git a/external/bsd/tcpdump/dist/win32/prj/GNUmakefile b/external/bsd/tcpdump/dist/win32/prj/GNUmakefile
new file mode 100644 (file)
index 0000000..d0504e3
--- /dev/null
@@ -0,0 +1,175 @@
+# 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 $<
diff --git a/external/bsd/tcpdump/dist/win32/prj/WinDump.dsp b/external/bsd/tcpdump/dist/win32/prj/WinDump.dsp
new file mode 100644 (file)
index 0000000..acafddd
--- /dev/null
@@ -0,0 +1,643 @@
+# 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
diff --git a/external/bsd/tcpdump/dist/win32/prj/WinDump.dsw b/external/bsd/tcpdump/dist/win32/prj/WinDump.dsw
new file mode 100644 (file)
index 0000000..6bf7408
--- /dev/null
@@ -0,0 +1,29 @@
+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>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/external/bsd/tcpdump/include/config.h b/external/bsd/tcpdump/include/config.h
new file mode 100644 (file)
index 0000000..8454c10
--- /dev/null
@@ -0,0 +1,401 @@
+/* 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 */
diff --git a/external/bsd/tcpdump/tcpdump2netbsd b/external/bsd/tcpdump/tcpdump2netbsd
new file mode 100755 (executable)
index 0000000..9b09a2f
--- /dev/null
@@ -0,0 +1,86 @@
+#! /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