diff --git a/Makefile.in b/Makefile.in index ecd43c25..aefd3a47 100644 --- a/Makefile.in +++ b/Makefile.in @@ -77,7 +77,7 @@ CSRC = addrtoname.c af.c checksum.c cpack.c gmpls.c oui.c gmt2local.c ipproto.c print-chdlc.c print-cip.c print-cnfp.c print-dccp.c print-decnet.c \ print-domain.c print-dtp.c print-dvmrp.c print-enc.c print-egp.c \ print-eap.c print-eigrp.c\ - print-esp.c print-ether.c print-fddi.c print-fr.c \ + print-esp.c print-ether.c print-fddi.c print-forces.c print-fr.c \ print-gre.c print-hsrp.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-isoclns.c print-juniper.c print-krb.c \ @@ -91,8 +91,8 @@ CSRC = addrtoname.c af.c checksum.c cpack.c gmpls.c oui.c gmt2local.c ipproto.c print-rx.c print-sctp.c print-sflow.c print-sip.c print-sl.c print-sll.c \ print-slow.c print-snmp.c print-stp.c print-sunatm.c print-sunrpc.c \ print-symantec.c print-syslog.c print-tcp.c print-telnet.c print-tftp.c \ - print-timed.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-forces.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-wb.c print-zephyr.c signature.c setsignal.c tcpdump.c util.c LIBNETDISSECT_SRC=print-isakmp.c diff --git a/aclocal.m4 b/aclocal.m4 index 9570de53..7573fae3 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -445,7 +445,14 @@ AC_DEFUN(AC_LBL_LIBPCAP, [ AC_MSG_ERROR( [Report this to tcpdump-workers@lists.tcpdump.org, and include the -config.log file in your report]) +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 diff --git a/configure b/configure index f481d333..6acce54f 100755 --- a/configure +++ b/configure @@ -7554,9 +7554,23 @@ if test $ac_cv_func_pcap_loop = yes; then else { { echo "$as_me:$LINENO: error: Report this to tcpdump-workers@lists.tcpdump.org, and include the -config.log file in your report" >&5 +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." >&5 echo "$as_me: error: Report this to tcpdump-workers@lists.tcpdump.org, and include the -config.log file in your report" >&2;} +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." >&2;} { (exit 1); exit 1; }; } fi @@ -9330,7 +9344,7 @@ fi done if test $ac_cv_func_pcap_findalldevs = "yes" ; then - savedppflags="$CPPLAGS" + savedppflags="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $V_INCLS" { echo "$as_me:$LINENO: checking for pcap_if_t" >&5 echo $ECHO_N "checking for pcap_if_t... $ECHO_C" >&6; } @@ -11748,7 +11762,7 @@ _ACEOF fi - savedppflags="$CPPLAGS" + savedppflags="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $V_INCLS" for ac_header in openssl/evp.h diff --git a/configure.in b/configure.in index 4ac664ec..f1300d73 100644 --- a/configure.in +++ b/configure.in @@ -732,7 +732,7 @@ 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. - savedppflags="$CPPLAGS" + savedppflags="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $V_INCLS" AC_CHECK_TYPES(pcap_if_t, , , [#include ]) CPPFLAGS="$savedcppflags" @@ -1067,7 +1067,7 @@ if test "$want_libcrypto" != "no"; then fi AC_CHECK_LIB(crypto, DES_cbc_encrypt) - savedppflags="$CPPLAGS" + savedppflags="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $V_INCLS" AC_CHECK_HEADERS(openssl/evp.h) CPPFLAGS="$savedcppflags" diff --git a/ethertype.h b/ethertype.h index fc5e515c..8c063396 100644 --- a/ethertype.h +++ b/ethertype.h @@ -100,6 +100,9 @@ #ifndef ETHERTYPE_AARP #define ETHERTYPE_AARP 0x80f3 #endif +#ifndef ETHERTYPE_TIPC +#define ETHERTYPE_TIPC 0x88ca +#endif #ifndef ETHERTYPE_8021Q #define ETHERTYPE_8021Q 0x8100 #endif diff --git a/netdissect.h b/netdissect.h index 0c66dfaf..821949fa 100644 --- a/netdissect.h +++ b/netdissect.h @@ -280,6 +280,7 @@ extern int esp_print(netdissect_options *, register const u_char *bp, int len, register 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 icmp6_print(netdissect_options *ndo, const u_char *, u_int, const u_char *, int); extern void isakmp_print(netdissect_options *,const u_char *, diff --git a/print-bgp.c b/print-bgp.c index 41cab220..36f9a345 100644 --- a/print-bgp.c +++ b/print-bgp.c @@ -93,6 +93,7 @@ struct bgp_opt { /* 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 */ #define BGP_UPDATE_MINSIZE 23 @@ -2159,15 +2160,98 @@ trunc: return 0; } +static void +bgp_capabilities_print(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) { + TCHECK2(opt[i], BGP_CAP_HEADER_SIZE); + cap_type=opt[i]; + cap_len=opt[i+1]; + tcap_len=cap_len; + printf("\n\t %s (%u), length: %u", + tok2strbuf(bgp_capcode_values, "Unknown", + cap_type, tokbuf, sizeof(tokbuf)), + cap_type, + cap_len); + TCHECK2(opt[i+2], cap_len); + switch (cap_type) { + case BGP_CAPCODE_MP: + printf("\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: + printf("\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) { + printf("\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) { + printf("\n\t\t 4 Byte AS %s", + as_printf(astostr, sizeof(astostr), + EXTRACT_32BITS(opt + i + 2))); + } + break; + default: + printf("\n\t\tno decoder for Capability %u", + cap_type); + if (vflag <= 1) + print_unknown_data(&opt[i+2],"\n\t\t",cap_len); + break; + } + if (vflag > 1 && cap_len > 0) { + print_unknown_data(&opt[i+2],"\n\t\t",cap_len); + } + i += BGP_CAP_HEADER_SIZE + cap_len; + } + return; + +trunc: + printf("[|BGP]"); +} + static void bgp_open_print(const u_char *dat, int length) { struct bgp_open bgpo; struct bgp_opt bgpopt; const u_char *opt; - int i,cap_type,cap_len,tcap_len,cap_offset; + int i; char tokbuf[TOKBUFSIZE]; - char tokbuf2[TOKBUFSIZE]; TCHECK2(dat[0], BGP_OPEN_SIZE); memcpy(&bgpo, dat, BGP_OPEN_SIZE); @@ -2192,96 +2276,31 @@ bgp_open_print(const u_char *dat, int length) TCHECK2(opt[i], BGP_OPT_SIZE); memcpy(&bgpopt, &opt[i], BGP_OPT_SIZE); if (i + 2 + bgpopt.bgpopt_len > bgpo.bgpo_optlen) { - printf("\n\t Option %d, length: %u", bgpopt.bgpopt_type, bgpopt.bgpopt_len); + printf("\n\t Option %d, length: %u", bgpopt.bgpopt_type, bgpopt.bgpopt_len); break; } printf("\n\t Option %s (%u), length: %u", - tok2strbuf(bgp_opt_values,"Unknown", + tok2strbuf(bgp_opt_values,"Unknown", bgpopt.bgpopt_type, tokbuf, sizeof(tokbuf)), - bgpopt.bgpopt_type, - bgpopt.bgpopt_len); + bgpopt.bgpopt_type, + bgpopt.bgpopt_len); - /* now lets decode the options we know*/ - switch(bgpopt.bgpopt_type) { - case BGP_OPT_CAP: - cap_type=opt[i+BGP_OPT_SIZE]; - cap_len=opt[i+BGP_OPT_SIZE+1]; - tcap_len=cap_len; - printf("\n\t %s (%u), length: %u", - tok2strbuf(bgp_capcode_values, "Unknown", - cap_type, tokbuf, sizeof(tokbuf)), - cap_type, - cap_len); - switch(cap_type) { - case BGP_CAPCODE_MP: - printf("\n\t\tAFI %s (%u), SAFI %s (%u)", - tok2strbuf(af_values, "Unknown", - EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+2), - tokbuf, sizeof(tokbuf)), - EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+2), - tok2strbuf(bgp_safi_values, "Unknown", - opt[i+BGP_OPT_SIZE+5], - tokbuf, sizeof(tokbuf)), - opt[i+BGP_OPT_SIZE+5]); - break; - case BGP_CAPCODE_RESTART: - printf("\n\t\tRestart Flags: [%s], Restart Time %us", - ((opt[i+BGP_OPT_SIZE+2])&0x80) ? "R" : "none", - EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+2)&0xfff); - tcap_len-=2; - cap_offset=4; - while(tcap_len>=4) { - printf("\n\t\t AFI %s (%u), SAFI %s (%u), Forwarding state preserved: %s", - tok2strbuf(af_values,"Unknown", - EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+cap_offset), - tokbuf, sizeof(tokbuf)), - EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+cap_offset), - tok2strbuf(bgp_safi_values,"Unknown", - opt[i+BGP_OPT_SIZE+cap_offset+2], - tokbuf2, sizeof(tokbuf2)), - opt[i+BGP_OPT_SIZE+cap_offset+2], - ((opt[i+BGP_OPT_SIZE+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: + /* now let's decode the options we know*/ + switch(bgpopt.bgpopt_type) { - /* - * Extract the 4 byte AS number encoded. - */ - TCHECK2(opt[i + BGP_OPT_SIZE + 2], cap_len); - if (cap_len == 4) { - printf("\n\t\t 4 Byte AS %s", - as_printf(astostr, sizeof(astostr), - EXTRACT_32BITS(opt + i + BGP_OPT_SIZE + 2))); - } - break; - default: - TCHECK2(opt[i+BGP_OPT_SIZE+2],cap_len); - printf("\n\t\tno decoder for Capability %u", - cap_type); - if (vflag <= 1) - print_unknown_data(&opt[i+BGP_OPT_SIZE+2],"\n\t\t",cap_len); - break; - } - if (vflag > 1) { - TCHECK2(opt[i+BGP_OPT_SIZE+2],cap_len); - print_unknown_data(&opt[i+BGP_OPT_SIZE+2],"\n\t\t",cap_len); - } - break; - case BGP_OPT_AUTH: - default: - printf("\n\t no decoder for option %u", - bgpopt.bgpopt_type); - break; - } + case BGP_OPT_CAP: + bgp_capabilities_print(&opt[i+BGP_OPT_SIZE], + bgpopt.bgpopt_len); + break; + case BGP_OPT_AUTH: + default: + printf("\n\t no decoder for option %u", + bgpopt.bgpopt_type); + break; + } i += BGP_OPT_SIZE + bgpopt.bgpopt_len; } return; diff --git a/print-ether.c b/print-ether.c index 76505721..e2f487c2 100644 --- a/print-ether.c +++ b/print-ether.c @@ -37,7 +37,6 @@ static const char rcsid[] _U_ = #include "extract.h" #include "addrtoname.h" #include "ethertype.h" - #include "ether.h" const struct tok ethertype_values[] = { @@ -84,6 +83,7 @@ const struct tok ethertype_values[] = { { ETHERTYPE_CFM_OLD, "CFM (old)" }, { ETHERTYPE_CFM, "CFM" }, { ETHERTYPE_LLDP, "LLDP" }, + { ETHERTYPE_TIPC, "TIPC"}, { 0, NULL} }; @@ -408,6 +408,10 @@ ethertype_print(netdissect_options *ndo, mpls_print(/*ndo,*/p, length); return (1); + case ETHERTYPE_TIPC: + tipc_print(ndo, p, length, caplen); + return (1); + case ETHERTYPE_LAT: case ETHERTYPE_SCA: case ETHERTYPE_MOPRC: diff --git a/print-ip6opts.c b/print-ip6opts.c index 7a4bf559..2121b460 100644 --- a/print-ip6opts.c +++ b/print-ip6opts.c @@ -141,6 +141,8 @@ ip6_opt_print(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; @@ -271,10 +273,11 @@ ip6_opt_print(const u_char *bp, int len) printf("(type %d: trunc)", bp[i]); goto trunc; } - printf("(opt_type 0x%02x: len=%d) ", bp[i], bp[i + 1]); + printf("(opt_type 0x%02x: len=%d)", bp[i], bp[i + 1]); break; } } + printf(" "); #if 0 end: diff --git a/print-lldp.c b/print-lldp.c index 0ee2f955..8735e58c 100644 --- a/print-lldp.c +++ b/print-lldp.c @@ -385,9 +385,9 @@ static const struct tok lldp_tia_application_type_values[] = { { 0, NULL} }; -#define LLDP_TIA_NETWORK_POLICY_U_BIT (1 << 5) +#define LLDP_TIA_NETWORK_POLICY_X_BIT (1 << 5) #define LLDP_TIA_NETWORK_POLICY_T_BIT (1 << 6) -#define LLDP_TIA_NETWORK_POLICY_X_BIT (1 << 7) +#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"}, diff --git a/print-tipc.c b/print-tipc.c new file mode 100644 index 00000000..8f2f7691 --- /dev/null +++ b/print-tipc.c @@ -0,0 +1,392 @@ +/* + * 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. + */ + +#ifndef lint +static const char rcsid[] _U_ = + "@(#) $Header: /tcpdump/master/tcpdump/print-arp.c,v 1.66 2006-03-03 22:53:21 hannes Exp $ (LBL)"; +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include + +#include "netdissect.h" +#include "addrtoname.h" +#include "ether.h" +#include "ethertype.h" +#include "extract.h" /* must come after interface.h */ + +/* + * 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 { + u_int32_t w0; + u_int32_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 { + u_int32_t w0; + u_int32_t w1; + u_int32_t w2; + u_int32_t prev_node; + u_int32_t orig_port; + u_int32_t dest_port; + u_int32_t orig_node; + u_int32_t dest_node; + u_int32_t name_type; + u_int32_t w9; + u_int32_t wA; +}; + +struct internal_tipc_pkthdr { + u_int32_t w0; + u_int32_t w1; + u_int32_t w2; + u_int32_t prev_node; + u_int32_t w4; + u_int32_t w5; + u_int32_t orig_node; + u_int32_t dest_node; + u_int32_t trans_seq; + u_int32_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 { + u_int32_t w0; + u_int32_t w1; + u_int32_t dest_domain; + u_int32_t prev_node; + u_int32_t ntwrk_id; + u_int32_t w5; + u_int8_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) +{ + u_int32_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, "[|TIPC]")); +} + +static void +print_internal(netdissect_options *ndo, const struct internal_tipc_pkthdr *ap) +{ + u_int32_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, "[|TIPC]")); +} + +static void +print_link_conf(netdissect_options *ndo, const struct link_conf_tipc_pkthdr *ap) +{ + u_int32_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); + prev_node = EXTRACT_32BITS(&ap->prev_node); + 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, "[|TIPC]")); +} + +void +tipc_print(netdissect_options *ndo, const u_char *bp, u_int length _U_, + u_int caplen _U_) +{ + const struct tipc_pkthdr *ap; + u_int32_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, "[|TIPC]")); +} + +/* + * Local Variables: + * c-style: bsd + * End: + */ + diff --git a/tcpdump.c b/tcpdump.c index ac35b2b3..587ed321 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -87,6 +87,12 @@ extern int SIZE_BUF; #define NAME_MAX 255 #endif +#ifdef SIGINFO +#define SIGNAL_REQ_INFO SIGINFO +#elif SIGUSR1 +#define SIGNAL_REQ_INFO SIGUSR1 +#endif + netdissect_options Gndo; netdissect_options *gndo = &Gndo; @@ -119,7 +125,7 @@ static void ndo_error(netdissect_options *ndo, const char *fmt, ...) __attribute__ ((noreturn, format (printf, 2, 3))); static void ndo_warning(netdissect_options *ndo, const char *fmt, ...); -#ifdef SIGINFO +#ifdef SIGNAL_REQ_INFO RETSIGTYPE requestinfo(int); #endif @@ -1349,13 +1355,13 @@ main(int argc, char **argv) pcap_userdata = (u_char *)&printinfo; } -#ifdef SIGINFO +#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(SIGINFO, requestinfo); + (void)setsignal(SIGNAL_REQ_INFO, requestinfo); #endif if (vflag > 0 && WFileName) { @@ -1844,7 +1850,7 @@ default_print(const u_char *bp, u_int length) ndo_default_print(gndo, bp, length); } -#ifdef SIGINFO +#ifdef SIGNAL_REQ_INFO RETSIGTYPE requestinfo(int signo _U_) { if (infodelay) diff --git a/tests/TESTrun.sh b/tests/TESTrun.sh index 656974dd..1f5fee0b 100755 --- a/tests/TESTrun.sh +++ b/tests/TESTrun.sh @@ -14,10 +14,10 @@ do then echo $i: passed. rm -f DIFF/$i.result - passed=$(($passed + 1)) + passed=`expr $passed + 1` else echo $i: failed. - failed=$(($failed + 1)) + failed=`expr $failed + 1` fi done @@ -36,11 +36,11 @@ do then echo $name: passed. rm -f DIFF/$output.diff - passed=$(($passed + 1)) + passed=`expr passed + 1` echo $passed >.passed else echo $name: failed. - failed=$(($failed + 1)) + failed=`expr $failed + 1` echo $failed >.failed fi done diff --git a/tests/icmpv6.out b/tests/icmpv6.out new file mode 100644 index 00000000..ccacefd6 --- /dev/null +++ b/tests/icmpv6.out @@ -0,0 +1,21 @@ +IP6 (hlim 255, next-header ICMPv6 (58) payload length: 80) fe80::d498:f9ff:fee7:896 > ff02::1: 0000: fe 80 00 00 00 00 00 00 d4 98 f9 ff fe e7 08 96 ................ . +0010: ff 02 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ . +0020: 00 00 00 50 00 00 00 3a ...P...: . +0000: 86 00 37 de 40 20 00 0f 00 00 00 00 00 00 00 00 ..7.@ .......... . +0010: 08 01 00 00 c3 51 00 0f 07 01 00 00 00 00 13 88 .....Q.......... . +0020: 03 04 48 c0 00 27 8d 00 00 09 3a 80 00 00 00 00 ..H..'....:..... . +0030: 22 22 33 33 44 44 55 55 66 00 00 00 00 00 00 00 ""33DDUUf....... . +0040: 01 01 d6 98 f9 e7 08 96 05 01 00 00 00 00 00 64 ...............d . +[icmp6 sum ok] ICMP6, router advertisement, length 80 + hop limit 64, Flags [home agent], pref medium, router lifetime 15s, reachable time 0s, retrans time 0s + homeagent information option (8), length 8 (1): preference 50001, lifetime 15 + 0x0000: 0000 c351 000f + advertisement interval option (7), length 8 (1): 5000ms + 0x0000: 0000 0000 1388 + 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 + source link-address option (1), length 8 (1): d6:98:f9:e7:08:96 + 0x0000: d698 f9e7 0896 + mtu option (5), length 8 (1): 100 + 0x0000: 0000 0000 0064 diff --git a/tests/icmpv6.pcap b/tests/icmpv6.pcap new file mode 100644 index 00000000..993baab5 Binary files /dev/null and b/tests/icmpv6.pcap differ