]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Merge remote-tracking branch 'upstream/master'
authorBill Fenner <[email protected]>
Tue, 6 Mar 2012 16:26:26 +0000 (08:26 -0800)
committerBill Fenner <[email protected]>
Tue, 6 Mar 2012 16:26:26 +0000 (08:26 -0800)
15 files changed:
Makefile.in
aclocal.m4
configure
configure.in
ethertype.h
netdissect.h
print-bgp.c
print-ether.c
print-ip6opts.c
print-lldp.c
print-tipc.c [new file with mode: 0644]
tcpdump.c
tests/TESTrun.sh
tests/icmpv6.out [new file with mode: 0644]
tests/icmpv6.pcap [new file with mode: 0644]

index ecd43c25d23f026a75d87e633fdfb99a304a98e4..aefd3a478d158efe94ad111df4d4af6bd8f0b269 100644 (file)
@@ -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
index 9570de5309afd0f67a0d5ee24591c3b1f7feb4cc..7573fae3be34d1281f8ba94e07e7db0ca0a301b1 100644 (file)
@@ -445,7 +445,14 @@ AC_DEFUN(AC_LBL_LIBPCAP,
        [
            AC_MSG_ERROR(
 [Report this to [email protected], 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
index f481d333d3f9fe5786962ab03d1e4d2353198c77..6acce54ffc62b17e5c65f283184cf7c272c9c0e9 100755 (executable)
--- 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 [email protected], 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 [email protected], 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
index 4ac664ecf099508410469699d8c05ace4667e000..f1300d7315665f65ee4f3fd8c5b05a829741475f 100644 (file)
@@ -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 <pcap.h>])
     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"
index fc5e515c6bb7bb8dbec92fc3984f726a7f511e5d..8c063396d9ec9b242e93a6b63c23133c07b13c0b 100644 (file)
 #ifndef ETHERTYPE_AARP
 #define ETHERTYPE_AARP         0x80f3
 #endif
+#ifndef        ETHERTYPE_TIPC
+#define        ETHERTYPE_TIPC          0x88ca
+#endif
 #ifndef        ETHERTYPE_8021Q
 #define        ETHERTYPE_8021Q         0x8100
 #endif
index 0c66dfaf809487800dcb10db80f5c8f89829ab4a..821949fab488299ab30d981d5cdd9ef793361d43 100644 (file)
@@ -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 *,
index 41cab22014675619df0b81e6ab506712031076df..36f9a345d0a775d754791ad3804366212b1cfc2e 100644 (file)
@@ -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);
-
-                /* 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:
-
-                        /*
-                         * 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;
-                }
+                      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(&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;
index 76505721af3e0594589fd7caa449f8148d7525c9..e2f487c2a36ac49bbb486789e6b0ac4ef74b0418 100644 (file)
@@ -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:
index 7a4bf5593a8694d5721e28d10e0d954c2ae29d7d..2121b46039ad02576af34d9b2aa0f1857335f657 100644 (file)
@@ -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:
index 0ee2f955db0b4ae33ee3724ebafb10ba1c67181b..8735e58ceef980e1793401f2acf9cd20b4667216 100644 (file)
@@ -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 (file)
index 0000000..8f2f769
--- /dev/null
@@ -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 <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#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:
+ */
+
index ac35b2b3490986d3d8c08b16a1478f62e6a55a6f..587ed32170ac925df013cd2d8cb8473737e71003 100644 (file)
--- 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)
index 656974dd7c7fb6f878b0b81f35073ff6d18e12ba..1f5fee0b77c65fe29d71a7ed287ce9018b70d0b2 100755 (executable)
@@ -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 (file)
index 0000000..ccacefd
--- /dev/null
@@ -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 (file)
index 0000000..993baab
Binary files /dev/null and b/tests/icmpv6.pcap differ