Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Bill Fenner 2012-03-06 08:26:26 -08:00
commit 4d4f42a37b
15 changed files with 575 additions and 105 deletions

View 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-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-domain.c print-dtp.c print-dvmrp.c print-enc.c print-egp.c \
print-eap.c print-eigrp.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-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-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 \ 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-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-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-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-timed.c print-tipc.c print-token.c print-udld.c print-udp.c \
print-vjc.c print-vqp.c print-vrrp.c print-vtp.c print-forces.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 print-wb.c print-zephyr.c signature.c setsignal.c tcpdump.c util.c
LIBNETDISSECT_SRC=print-isakmp.c LIBNETDISSECT_SRC=print-isakmp.c

9
aclocal.m4 vendored
View File

@ -445,7 +445,14 @@ AC_DEFUN(AC_LBL_LIBPCAP,
[ [
AC_MSG_ERROR( AC_MSG_ERROR(
[Report this to tcpdump-workers@lists.tcpdump.org, and include the [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 dnl

22
configure vendored
View File

@ -7554,9 +7554,23 @@ if test $ac_cv_func_pcap_loop = yes; then
else else
{ { echo "$as_me:$LINENO: error: Report this to tcpdump-workers@lists.tcpdump.org, and include the { { 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 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; }; } { (exit 1); exit 1; }; }
fi fi
@ -9330,7 +9344,7 @@ fi
done done
if test $ac_cv_func_pcap_findalldevs = "yes" ; then if test $ac_cv_func_pcap_findalldevs = "yes" ; then
savedppflags="$CPPLAGS" savedppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $V_INCLS" CPPFLAGS="$CPPFLAGS $V_INCLS"
{ echo "$as_me:$LINENO: checking for pcap_if_t" >&5 { echo "$as_me:$LINENO: checking for pcap_if_t" >&5
echo $ECHO_N "checking for pcap_if_t... $ECHO_C" >&6; } echo $ECHO_N "checking for pcap_if_t... $ECHO_C" >&6; }
@ -11748,7 +11762,7 @@ _ACEOF
fi fi
savedppflags="$CPPLAGS" savedppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $V_INCLS" CPPFLAGS="$CPPFLAGS $V_INCLS"
for ac_header in openssl/evp.h for ac_header in openssl/evp.h

View 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 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 be 0.8; this means that lib has pcap_findalldevs but header doesn't
dnl have pcap_if_t. dnl have pcap_if_t.
savedppflags="$CPPLAGS" savedppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $V_INCLS" CPPFLAGS="$CPPFLAGS $V_INCLS"
AC_CHECK_TYPES(pcap_if_t, , , [#include <pcap.h>]) AC_CHECK_TYPES(pcap_if_t, , , [#include <pcap.h>])
CPPFLAGS="$savedcppflags" CPPFLAGS="$savedcppflags"
@ -1067,7 +1067,7 @@ if test "$want_libcrypto" != "no"; then
fi fi
AC_CHECK_LIB(crypto, DES_cbc_encrypt) AC_CHECK_LIB(crypto, DES_cbc_encrypt)
savedppflags="$CPPLAGS" savedppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $V_INCLS" CPPFLAGS="$CPPFLAGS $V_INCLS"
AC_CHECK_HEADERS(openssl/evp.h) AC_CHECK_HEADERS(openssl/evp.h)
CPPFLAGS="$savedcppflags" CPPFLAGS="$savedcppflags"

View File

@ -100,6 +100,9 @@
#ifndef ETHERTYPE_AARP #ifndef ETHERTYPE_AARP
#define ETHERTYPE_AARP 0x80f3 #define ETHERTYPE_AARP 0x80f3
#endif #endif
#ifndef ETHERTYPE_TIPC
#define ETHERTYPE_TIPC 0x88ca
#endif
#ifndef ETHERTYPE_8021Q #ifndef ETHERTYPE_8021Q
#define ETHERTYPE_8021Q 0x8100 #define ETHERTYPE_8021Q 0x8100
#endif #endif

View File

@ -280,6 +280,7 @@ extern int esp_print(netdissect_options *,
register const u_char *bp, int len, register const u_char *bp2, register const u_char *bp, int len, register const u_char *bp2,
int *nhdr, int *padlen); int *nhdr, int *padlen);
extern void arp_print(netdissect_options *,const u_char *, u_int, u_int); 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 *, extern void icmp6_print(netdissect_options *ndo, const u_char *,
u_int, const u_char *, int); u_int, const u_char *, int);
extern void isakmp_print(netdissect_options *,const u_char *, extern void isakmp_print(netdissect_options *,const u_char *,

View File

@ -93,6 +93,7 @@ struct bgp_opt {
/* variable length */ /* variable length */
}; };
#define BGP_OPT_SIZE 2 /* some compilers may pad to 4 bytes */ #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 #define BGP_UPDATE_MINSIZE 23
@ -2159,15 +2160,98 @@ trunc:
return 0; 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 static void
bgp_open_print(const u_char *dat, int length) bgp_open_print(const u_char *dat, int length)
{ {
struct bgp_open bgpo; struct bgp_open bgpo;
struct bgp_opt bgpopt; struct bgp_opt bgpopt;
const u_char *opt; const u_char *opt;
int i,cap_type,cap_len,tcap_len,cap_offset; int i;
char tokbuf[TOKBUFSIZE]; char tokbuf[TOKBUFSIZE];
char tokbuf2[TOKBUFSIZE];
TCHECK2(dat[0], BGP_OPEN_SIZE); TCHECK2(dat[0], BGP_OPEN_SIZE);
memcpy(&bgpo, dat, BGP_OPEN_SIZE); memcpy(&bgpo, dat, BGP_OPEN_SIZE);
@ -2203,85 +2287,20 @@ bgp_open_print(const u_char *dat, int length)
bgpopt.bgpopt_type, bgpopt.bgpopt_type,
bgpopt.bgpopt_len); bgpopt.bgpopt_len);
/* now lets decode the options we know*/ /* now let's decode the options we know*/
switch(bgpopt.bgpopt_type) { 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:
/* case BGP_OPT_CAP:
* Extract the 4 byte AS number encoded. bgp_capabilities_print(&opt[i+BGP_OPT_SIZE],
*/ bgpopt.bgpopt_len);
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; break;
case BGP_OPT_AUTH: case BGP_OPT_AUTH:
default: default:
printf("\n\t no decoder for option %u", printf("\n\t no decoder for option %u",
bgpopt.bgpopt_type); bgpopt.bgpopt_type);
break; break;
} }
i += BGP_OPT_SIZE + bgpopt.bgpopt_len; i += BGP_OPT_SIZE + bgpopt.bgpopt_len;
} }
return; return;

View File

@ -37,7 +37,6 @@ static const char rcsid[] _U_ =
#include "extract.h" #include "extract.h"
#include "addrtoname.h" #include "addrtoname.h"
#include "ethertype.h" #include "ethertype.h"
#include "ether.h" #include "ether.h"
const struct tok ethertype_values[] = { const struct tok ethertype_values[] = {
@ -84,6 +83,7 @@ const struct tok ethertype_values[] = {
{ ETHERTYPE_CFM_OLD, "CFM (old)" }, { ETHERTYPE_CFM_OLD, "CFM (old)" },
{ ETHERTYPE_CFM, "CFM" }, { ETHERTYPE_CFM, "CFM" },
{ ETHERTYPE_LLDP, "LLDP" }, { ETHERTYPE_LLDP, "LLDP" },
{ ETHERTYPE_TIPC, "TIPC"},
{ 0, NULL} { 0, NULL}
}; };
@ -408,6 +408,10 @@ ethertype_print(netdissect_options *ndo,
mpls_print(/*ndo,*/p, length); mpls_print(/*ndo,*/p, length);
return (1); return (1);
case ETHERTYPE_TIPC:
tipc_print(ndo, p, length, caplen);
return (1);
case ETHERTYPE_LAT: case ETHERTYPE_LAT:
case ETHERTYPE_SCA: case ETHERTYPE_SCA:
case ETHERTYPE_MOPRC: case ETHERTYPE_MOPRC:

View File

@ -141,6 +141,8 @@ ip6_opt_print(const u_char *bp, int len)
int i; int i;
int optlen = 0; int optlen = 0;
if (len == 0)
return;
for (i = 0; i < len; i += optlen) { for (i = 0; i < len; i += optlen) {
if (bp[i] == IP6OPT_PAD1) if (bp[i] == IP6OPT_PAD1)
optlen = 1; optlen = 1;
@ -271,10 +273,11 @@ ip6_opt_print(const u_char *bp, int len)
printf("(type %d: trunc)", bp[i]); printf("(type %d: trunc)", bp[i]);
goto trunc; 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; break;
} }
} }
printf(" ");
#if 0 #if 0
end: end:

View File

@ -385,9 +385,9 @@ static const struct tok lldp_tia_application_type_values[] = {
{ 0, NULL} { 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_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[] = { static const struct tok lldp_tia_network_policy_bits_values[] = {
{ LLDP_TIA_NETWORK_POLICY_U_BIT, "Unknown"}, { LLDP_TIA_NETWORK_POLICY_U_BIT, "Unknown"},

392
print-tipc.c Normal file
View File

@ -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:
*/

View File

@ -87,6 +87,12 @@ extern int SIZE_BUF;
#define NAME_MAX 255 #define NAME_MAX 255
#endif #endif
#ifdef SIGINFO
#define SIGNAL_REQ_INFO SIGINFO
#elif SIGUSR1
#define SIGNAL_REQ_INFO SIGUSR1
#endif
netdissect_options Gndo; netdissect_options Gndo;
netdissect_options *gndo = &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))); __attribute__ ((noreturn, format (printf, 2, 3)));
static void ndo_warning(netdissect_options *ndo, const char *fmt, ...); static void ndo_warning(netdissect_options *ndo, const char *fmt, ...);
#ifdef SIGINFO #ifdef SIGNAL_REQ_INFO
RETSIGTYPE requestinfo(int); RETSIGTYPE requestinfo(int);
#endif #endif
@ -1349,13 +1355,13 @@ main(int argc, char **argv)
pcap_userdata = (u_char *)&printinfo; pcap_userdata = (u_char *)&printinfo;
} }
#ifdef SIGINFO #ifdef SIGNAL_REQ_INFO
/* /*
* We can't get statistics when reading from a file rather * We can't get statistics when reading from a file rather
* than capturing from a device. * than capturing from a device.
*/ */
if (RFileName == NULL) if (RFileName == NULL)
(void)setsignal(SIGINFO, requestinfo); (void)setsignal(SIGNAL_REQ_INFO, requestinfo);
#endif #endif
if (vflag > 0 && WFileName) { if (vflag > 0 && WFileName) {
@ -1844,7 +1850,7 @@ default_print(const u_char *bp, u_int length)
ndo_default_print(gndo, bp, length); ndo_default_print(gndo, bp, length);
} }
#ifdef SIGINFO #ifdef SIGNAL_REQ_INFO
RETSIGTYPE requestinfo(int signo _U_) RETSIGTYPE requestinfo(int signo _U_)
{ {
if (infodelay) if (infodelay)

View File

@ -14,10 +14,10 @@ do
then then
echo $i: passed. echo $i: passed.
rm -f DIFF/$i.result rm -f DIFF/$i.result
passed=$(($passed + 1)) passed=`expr $passed + 1`
else else
echo $i: failed. echo $i: failed.
failed=$(($failed + 1)) failed=`expr $failed + 1`
fi fi
done done
@ -36,11 +36,11 @@ do
then then
echo $name: passed. echo $name: passed.
rm -f DIFF/$output.diff rm -f DIFF/$output.diff
passed=$(($passed + 1)) passed=`expr passed + 1`
echo $passed >.passed echo $passed >.passed
else else
echo $name: failed. echo $name: failed.
failed=$(($failed + 1)) failed=`expr $failed + 1`
echo $failed >.failed echo $failed >.failed
fi fi
done done

21
tests/icmpv6.out Normal file
View File

@ -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

BIN
tests/icmpv6.pcap Normal file

Binary file not shown.