#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-isoclns.c,v 1.48 2002-05-25 15:11:37 hannes Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-isoclns.c,v 1.52 2002-06-29 04:33:31 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
#define NLPID_ESIS 130 /* 0x82 */
#define NLPID_ISIS 131 /* 0x83 */
#define NLPID_IP6 0x8e
-#define NLPID_IP 0xcc
+#define NLPID_IP 0xcc
#define NLPID_NULLNS 0
/*
*/
#define SYSTEM_ID_LEN ETHER_ADDR_LEN
+#define NODE_ID_LEN SYSTEM_ID_LEN+1
+#define LSP_ID_LEN SYSTEM_ID_LEN+2
+
#define ISIS_VERSION 1
#define PDU_TYPE_MASK 0x1F
#define PRIORITY_MASK 0x7F
static struct tok isis_pdu_values[] = {
{ L1_LAN_IIH, "L1 Lan IIH"},
- { L2_LAN_IIH, "L2 Lan IIH"},
- { PTP_IIH, "p2p IIH"},
- { L1_LSP, "L1 LSP"},
- { L2_LSP, "L2 LSP"},
- { L1_CSNP, "L1 CSNP"},
+ { L2_LAN_IIH, "L2 Lan IIH"},
+ { PTP_IIH, "p2p IIH"},
+ { L1_LSP, "L1 LSP"},
+ { L2_LSP, "L2 LSP"},
+ { L1_CSNP, "L1 CSNP"},
{ L2_CSNP, "L2 CSNP"},
- { L1_PSNP, "L1 PSNP"},
+ { L1_PSNP, "L1 PSNP"},
{ L2_PSNP, "L2 PSNP"},
{ 0, NULL}
};
#define TLV_IS_REACH 2
#define TLV_ESNEIGH 3
#define TLV_PART_DIS 4
-#define TLV_SUMMARY 5
+#define TLV_PREFIX_NEIGH 5
#define TLV_ISNEIGH 6
+#define TLV_ISNEIGH_VARLEN 7
#define TLV_PADDING 8
#define TLV_LSP 9
#define TLV_AUTH 10
#define TLV_HOSTNAME 137
#define TLV_SHARED_RISK_GROUP 138
#define TLV_NORTEL_PRIVATE1 176
-#define TLV_NORTEL_PRIVATE2 177
+#define TLV_NORTEL_PRIVATE2 177
#define TLV_RESTART_SIGNALING 211
#define TLV_MT_IS_REACH 222
#define TLV_MT_SUPPORTED 229
static struct tok isis_tlv_values[] = {
{ TLV_AREA_ADDR, "Area address(es)"},
- { TLV_IS_REACH, "IS Reachability"},
- { TLV_ESNEIGH, "IS Neighbor(s)"},
- { TLV_PART_DIS, "Partition DIS"},
- { TLV_SUMMARY, "Prefix Neighbors"},
- { TLV_ISNEIGH, "IS Neighbor(s)"},
- { TLV_PADDING, "Padding"},
- { TLV_LSP, "LSP entries"},
- { TLV_AUTH, "Authentication"},
- { TLV_CHECKSUM, "Checksum"},
- { TLV_LSP_BUFFERSIZE, "LSP Buffersize"},
- { TLV_EXT_IS_REACH, "Extended IS Reachability"},
+ { TLV_IS_REACH, "IS Reachability"},
+ { TLV_ESNEIGH, "ES Neighbor(s)"},
+ { TLV_PART_DIS, "Partition DIS"},
+ { TLV_PREFIX_NEIGH, "Prefix Neighbors"},
+ { TLV_ISNEIGH, "IS Neighbor(s)"},
+ { TLV_ISNEIGH_VARLEN, "IS Neighbor(s) (variable length)"},
+ { TLV_PADDING, "Padding"},
+ { TLV_LSP, "LSP entries"},
+ { TLV_AUTH, "Authentication"},
+ { TLV_CHECKSUM, "Checksum"},
+ { TLV_LSP_BUFFERSIZE, "LSP Buffersize"},
+ { TLV_EXT_IS_REACH, "Extended IS Reachability"},
{ TLV_IS_ALIAS_ID, "IS Alias ID"},
- { TLV_DECNET_PHASE4, "DECnet Phase IV"},
- { TLV_LUCENT_PRIVATE, "Lucent Proprietary"},
- { TLV_IP_REACH, "IPv4 Internal reachability"},
- { TLV_PROTOCOLS, "Protocols supported"},
- { TLV_IP_REACH_EXT, "IPv4 External reachability"},
- { TLV_IDRP_INFO, "Inter-Domain Information Type"},
- { TLV_IPADDR, "IPv4 Interface address(es)"},
- { TLV_IPAUTH, "IPv4 authentication (deprecated)"},
- { TLV_TE_ROUTER_ID, "Traffic Engineering Router ID"},
- { TLV_EXT_IP_REACH, "Extended IPv4 reachability"},
- { TLV_HOSTNAME, "Hostname"},
- { TLV_SHARED_RISK_GROUP, "Shared Risk Link Group"},
- { TLV_NORTEL_PRIVATE1, "Nortel Proprietary"},
- { TLV_NORTEL_PRIVATE2, "Nortel Proprietary"},
- { TLV_RESTART_SIGNALING, "Restart Signaling"},
- { TLV_MT_IS_REACH, "Multi Topology IS Reachability"},
- { TLV_MT_SUPPORTED, "Multi Topology"},
- { TLV_IP6ADDR, "IPv6 Interface address(es)"},
- { TLV_MT_IP_REACH, "Multi-Topology IPv4 reachability"},
- { TLV_IP6_REACH, "IPv6 reachability"},
- { TLV_MT_IP6_REACH, "Multi-Topology IP6 reachability"},
- { TLV_PTP_ADJ, "Point-to-point Adjacency State"},
+ { TLV_DECNET_PHASE4, "DECnet Phase IV"},
+ { TLV_LUCENT_PRIVATE, "Lucent Proprietary"},
+ { TLV_IP_REACH, "IPv4 Internal reachability"},
+ { TLV_PROTOCOLS, "Protocols supported"},
+ { TLV_IP_REACH_EXT, "IPv4 External reachability"},
+ { TLV_IDRP_INFO, "Inter-Domain Information Type"},
+ { TLV_IPADDR, "IPv4 Interface address(es)"},
+ { TLV_IPAUTH, "IPv4 authentication (deprecated)"},
+ { TLV_TE_ROUTER_ID, "Traffic Engineering Router ID"},
+ { TLV_EXT_IP_REACH, "Extended IPv4 reachability"},
+ { TLV_HOSTNAME, "Hostname"},
+ { TLV_SHARED_RISK_GROUP, "Shared Risk Link Group"},
+ { TLV_NORTEL_PRIVATE1, "Nortel Proprietary"},
+ { TLV_NORTEL_PRIVATE2, "Nortel Proprietary"},
+ { TLV_RESTART_SIGNALING, "Restart Signaling"},
+ { TLV_MT_IS_REACH, "Multi Topology IS Reachability"},
+ { TLV_MT_SUPPORTED, "Multi Topology"},
+ { TLV_IP6ADDR, "IPv6 Interface address(es)"},
+ { TLV_MT_IP_REACH, "Multi-Topology IPv4 reachability"},
+ { TLV_IP6_REACH, "IPv6 reachability"},
+ { TLV_MT_IP6_REACH, "Multi-Topology IP6 reachability"},
+ { TLV_PTP_ADJ, "Point-to-point Adjacency State"},
{ 0, NULL }
};
{ 0, NULL}
};
-#define ISIS_8BIT_MASK(x) ((x)&0xff)
+#define ISIS_8BIT_MASK(x) ((x)&0xff)
#define ISIS_MASK_LSP_OL_BIT(x) ((x)&0x4)
#define ISIS_MASK_LSP_ISTYPE_BITS(x) ((x)&0x3)
struct isis_tlv_ptp_adj {
u_char adjacency_state;
- u_char ext_local_circuit_id[4];
+ u_char extd_local_circuit_id[4];
u_char neighbor_sysid[SYSTEM_ID_LEN];
- u_char neighbor_ext_local_circuit_id[4];
+ u_char neighbor_extd_local_circuit_id[4];
};
static int osi_cksum(const u_char *, u_int);
static void esis_print(const u_char *, u_int);
static int isis_print(const u_char *, u_int);
-struct isis_tlv_ip_reach {
+struct isis_metric_block {
u_char metric_default;
u_char metric_delay;
u_char metric_expense;
u_char metric_error;
- u_char prefix[4];
- u_char mask[4];
};
struct isis_tlv_is_reach {
- u_char metric_default;
- u_char metric_delay;
- u_char metric_expense;
- u_char metric_error;
- u_char neighbor_nodeid[SYSTEM_ID_LEN+1];
+ struct isis_metric_block isis_metric_block;
+ u_char neighbor_nodeid[NODE_ID_LEN];
+};
+
+struct isis_tlv_es_reach {
+ struct isis_metric_block isis_metric_block;
+ u_char neighbor_sysid[SYSTEM_ID_LEN];
+};
+
+struct isis_tlv_ip_reach {
+ struct isis_metric_block isis_metric_block;
+ u_char prefix[4];
+ u_char mask[4];
};
static struct tok isis_is_reach_virtual_values[] = {
u_char holding_time[2];
u_char pdu_len[2];
u_char priority;
- u_char lan_id[SYSTEM_ID_LEN+1];
+ u_char lan_id[NODE_ID_LEN];
};
struct isis_iih_ptp_header {
struct isis_lsp_header {
u_char pdu_len[2];
u_char remaining_lifetime[2];
- u_char lsp_id[SYSTEM_ID_LEN+2];
+ u_char lsp_id[LSP_ID_LEN];
u_char sequence_number[4];
u_char checksum[2];
u_char typeblock;
struct isis_csnp_header {
u_char pdu_len[2];
- u_char source_id[SYSTEM_ID_LEN+1];
- u_char start_lsp_id[SYSTEM_ID_LEN+2];
- u_char end_lsp_id[SYSTEM_ID_LEN+2];
+ u_char source_id[NODE_ID_LEN];
+ u_char start_lsp_id[LSP_ID_LEN];
+ u_char end_lsp_id[LSP_ID_LEN];
};
struct isis_psnp_header {
u_char pdu_len[2];
- u_char source_id[SYSTEM_ID_LEN+1];
+ u_char source_id[NODE_ID_LEN];
};
struct isis_tlv_lsp {
u_char remaining_lifetime[2];
- u_char lsp_id[SYSTEM_ID_LEN+2];
+ u_char lsp_id[LSP_ID_LEN];
u_char sequence_number[4];
u_char checksum[2];
};
-
+
#define ISIS_COMMON_HEADER_SIZE (sizeof(struct isis_common_header))
#define ISIS_IIH_LAN_HEADER_SIZE (sizeof(struct isis_iih_lan_header))
#define ISIS_IIH_PTP_HEADER_SIZE (sizeof(struct isis_iih_ptp_header))
{
u_char pdu_type;
const struct isis_common_header *header;
-
+
header = (const struct isis_common_header *)p;
pdu_type = header->pdu_type & PDU_TYPE_MASK;
/* allocate space for the following string
* xx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx
* 32 bytes plus one termination byte */
-char nsap[33];
-char *
+static char *
print_nsap(register const u_char *cp, register int length)
{
int i;
+ static char nsap[33];
char *pos = nsap;
+ if (length==0) {
+ *(pos) = '0';
+ *(pos+1) = '\0';
+ return (nsap);
+ }
+
for (i = 0; i < length; i++) {
if (!TTEST2(*cp, 1))
return (0);
return (nsap);
}
-char *isis_print_sysid (const u_char *);
/* allocate space for the following string
* xxxx.xxxx.xxxx
* 14 bytes plus one termination byte */
-char sysid[15];
-char *
-isis_print_sysid(const u_char *cp)
+static char *
+isis_print_sysid(const u_char *cp, int sysid_len)
{
int i;
+ static char sysid[15];
char *pos = sysid;
- for (i = 1; i <= 6; i++) {
+ for (i = 1; i <= sysid_len; i++) {
if (!TTEST2(*cp, 1))
return (0);
pos+=sprintf(pos, "%02x", *cp++);
}
-char *isis_print_nodeid (const u_char *);
/* allocate space for the following string
* xxxx.xxxx.xxxx.yy
* 17 bytes plus one termination byte */
-char nodeid[18];
-char *
+static char *
isis_print_nodeid(const u_char *cp)
{
int i;
+ static char nodeid[18];
char *pos = nodeid;
for (i = 1; i <= 7; i++) {
return (nodeid);
}
-char *isis_print_lspid (const u_char *);
/* allocate space for the following string
* xxxx.xxxx.xxxx.yy-zz
* 20 bytes plus one termination byte */
-char lspid[21];
-char *
+static char *
isis_print_lspid(const u_char *cp)
{
int i;
+ static char lspid[21];
char *pos = lspid;
for (i = 1; i <= 7; i++) {
isis_print_unknown_data(const u_char *cp,const char *lf,int len)
{
int i;
-
+
printf("%s0x0000: ",lf);
for(i=0;i<len;i++) {
if (!TTEST2(*(cp+i), 1))
}
+/* print the 4-byte metric block which is common found in the old-style TLVs */
+
+static int
+isis_print_metric_block (const struct isis_metric_block *isis_metric_block)
+{
+ printf(", Default Metric: %d, %s",
+ ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block->metric_default),
+ ISIS_LSP_TLV_METRIC_IE(isis_metric_block->metric_default) ? "External" : "Internal");
+ if (!ISIS_LSP_TLV_METRIC_SUPPORTED(isis_metric_block->metric_delay))
+ printf("\n\t\t\t Delay Metric: %d, %s",
+ ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block->metric_delay),
+ ISIS_LSP_TLV_METRIC_IE(isis_metric_block->metric_delay) ? "External" : "Internal");
+ if (!ISIS_LSP_TLV_METRIC_SUPPORTED(isis_metric_block->metric_expense))
+ printf("\n\t\t\t Expense Metric: %d, %s",
+ ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block->metric_expense),
+ ISIS_LSP_TLV_METRIC_IE(isis_metric_block->metric_expense) ? "External" : "Internal");
+ if (!ISIS_LSP_TLV_METRIC_SUPPORTED(isis_metric_block->metric_error))
+ printf("\n\t\t\t Error Metric: %d, %s",
+ ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block->metric_error),
+ ISIS_LSP_TLV_METRIC_IE(isis_metric_block->metric_error) ? "External" : "Internal");
+
+ return(1); /* everything is ok */
+}
+
static int
isis_print_tlv_ip_reach (const u_char *cp, int length)
{
* 34 indicates no match -> must be a discontiguous netmask
* lets dump the mask, otherwise print the prefix_len
*/
- if (prefix_len == 34)
+ if (prefix_len == 34)
printf("\n\t\t\tIPv4 prefix: %s mask %s",
ipaddr_string((tlv_ip_reach->prefix)),
ipaddr_string((tlv_ip_reach->mask)));
- else
+ else
printf("\n\t\t\tIPv4 prefix: %s/%u",
ipaddr_string((tlv_ip_reach->prefix)),
prefix_len);
printf("\n\t\t\t Default Metric: %02d, %s, Distribution: %s",
- ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->metric_default),
- ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->metric_default) ? "External" : "Internal",
- ISIS_LSP_TLV_METRIC_UPDOWN(tlv_ip_reach->metric_default) ? "down" : "up");
+ ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->isis_metric_block.metric_default),
+ ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->isis_metric_block.metric_default) ? "External" : "Internal",
+ ISIS_LSP_TLV_METRIC_UPDOWN(tlv_ip_reach->isis_metric_block.metric_default) ? "down" : "up");
- if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach->metric_delay))
+ if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach->isis_metric_block.metric_delay))
printf("\n\t\t\t Delay Metric: %02d, %s",
- ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->metric_delay),
- ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->metric_delay) ? "External" : "Internal");
+ ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->isis_metric_block.metric_delay),
+ ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->isis_metric_block.metric_delay) ? "External" : "Internal");
- if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach->metric_expense))
+ if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach->isis_metric_block.metric_expense))
printf("\n\t\t\t Expense Metric: %02d, %s",
- ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->metric_expense),
- ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->metric_expense) ? "External" : "Internal");
+ ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->isis_metric_block.metric_expense),
+ ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->isis_metric_block.metric_expense) ? "External" : "Internal");
- if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach->metric_error))
+ if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach->isis_metric_block.metric_error))
printf("\n\t\t\t Error Metric: %02d, %s",
- ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->metric_error),
- ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->metric_error) ? "External" : "Internal");
+ ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->isis_metric_block.metric_error),
+ ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->isis_metric_block.metric_error) ? "External" : "Internal");
length -= sizeof(struct isis_tlv_ip_reach);
tlv_ip_reach++;
subl))
return(0);
break;
- }
+ }
return(1);
trunctlv:
if (!TTEST2(*tptr,4))
goto trunctlv;
j = EXTRACT_32BITS(tptr);
- memcpy (&bw, &j, 4);
+ memcpy (&bw, &j, 4);
printf("%sMaximum link bandwidth : %.3f Mbps",
lf,
bw*8/1000000 );
- break;
+ break;
case SUBTLV_EXT_IS_REACH_RESERVABLE_BW :
if (!TTEST2(*tptr,4))
goto trunctlv;
j = EXTRACT_32BITS(tptr);
- memcpy (&bw, &j, 4);
+ memcpy (&bw, &j, 4);
printf("%sReservable link bandwidth: %.3f Mbps",
lf,
bw*8/1000000 );
if (!TTEST2(*(tptr+i*4),4))
goto trunctlv;
j = EXTRACT_32BITS(tptr);
- memcpy (&bw, &j, 4);
+ memcpy (&bw, &j, 4);
printf("%s priority level %d: %.3f Mbps",
lf,
i,
bw*8/1000000 );
}
- break;
+ break;
case SUBTLV_EXT_IS_REACH_TE_METRIC:
if (!TTEST2(*tptr,3))
goto trunctlv;
printf("%sTraffic Engineering Metric: %d",
lf,
EXTRACT_24BITS(tptr));
- break;
+ break;
case SUBTLV_EXT_IS_REACH_IPV4_INTF_ADDR:
if (!TTEST2(*tptr,4))
goto trunctlv;
printf("%sIPv4 interface address: %s",
lf,
ipaddr_string(tptr));
- break;
+ break;
case SUBTLV_EXT_IS_REACH_IPV4_NEIGHBOR_ADDR:
if (!TTEST2(*tptr,4))
goto trunctlv;
if (!TTEST2(*(tptr+(i*4)+4),4))
goto trunctlv;
j = EXTRACT_32BITS(tptr);
- memcpy (&bw, &j, 4);
+ memcpy (&bw, &j, 4);
printf("%s priority level %d: %.3f Mbps",
lf,
i,
lf,
subt,
subl);
- break;
+ break;
default:
printf("%sunknown subTLV, type %d, length %d",
lf,
subl))
return(0);
break;
- }
+ }
return(1);
trunctlv:
const struct isis_tlv_lsp *tlv_lsp;
const struct isis_tlv_ptp_adj *tlv_ptp_adj;
const struct isis_tlv_is_reach *tlv_is_reach;
+ const struct isis_tlv_es_reach *tlv_es_reach;
- u_char pdu_type, max_area, id_length, type, len, tmp, alen, subl, subt, tslen;
+ u_char pdu_type, max_area, id_length, type, len, tmp, alen, lan_alen, prefix_len, subl, subt, tslen;
const u_char *optr, *pptr, *tptr;
u_short packet_len,pdu_len,time_remain;
u_int i,j,bit_length,byte_length,metric,ra,rr;
packet_len=length;
optr = p; /* initialize the _o_riginal pointer to the packet start -
need it for parsing the checksum TLV */
- header = (const struct isis_common_header *)p;
+ header = (const struct isis_common_header *)p;
TCHECK(*header);
- pptr = p+(ISIS_COMMON_HEADER_SIZE);
+ pptr = p+(ISIS_COMMON_HEADER_SIZE);
header_iih_lan = (const struct isis_iih_lan_header *)pptr;
header_iih_ptp = (const struct isis_iih_ptp_header *)pptr;
header_lsp = (const struct isis_lsp_header *)pptr;
header_csnp = (const struct isis_csnp_header *)pptr;
header_psnp = (const struct isis_psnp_header *)pptr;
-
+
/*
* Sanity checking of the header.
*/
header->id_length);
return (0);
}
-
+
if (header->pkt_version != ISIS_VERSION) {
printf(", version %d packet not supported", header->pkt_version);
return (0);
case 0:
id_length = 6; /* silly shit again */
break;
- case 1: /* 1-8 are valid sys-ID lenghts */
+ case 1: /* 1-8 are valid sys-ID lenghts */
case 2:
case 3:
case 4:
id_length = 0; /* entirely useless */
break;
default:
- printf(", bad packet -- illegal sys-ID length (%u)", id_length);
+ printf(", bad packet -- illegal sys-ID length (%u)", id_length);
return (0);
break;
}
header->id_length,
max_area,
header->max_area);
-
+
pdu_type=header->pdu_type;
/* first lets see if we know the PDU name*/
tok2str(isis_pdu_values,
"unknown PDU, type %d",
pdu_type));
-
+
switch (pdu_type) {
- case L1_LAN_IIH:
+ case L1_LAN_IIH:
case L2_LAN_IIH:
if (header->fixed_len != (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_LAN_HEADER_SIZE)) {
printf(", bogus fixed header length %u should be %lu",
TCHECK(*header_iih_lan);
printf("\n\t\t source-id: %s, holding time: %u, %s",
- isis_print_sysid(header_iih_lan->source_id),
+ isis_print_sysid(header_iih_lan->source_id,SYSTEM_ID_LEN),
EXTRACT_16BITS(header_iih_lan->holding_time),
tok2str(isis_iih_circuit_type_values,
"unknown circuit type 0x%02x",
printf("\n\t\t lan-id: %s, Priority: %u, PDU length: %u",
isis_print_nodeid(header_iih_lan->lan_id),
(header_iih_lan->priority) & PRIORITY_MASK,
- pdu_len);
+ pdu_len);
packet_len -= (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_LAN_HEADER_SIZE);
pptr = p + (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_LAN_HEADER_SIZE);
header->fixed_len, (unsigned long)ISIS_IIH_PTP_HEADER_SIZE);
return (0);
}
-
+
pdu_len=EXTRACT_16BITS(header_iih_ptp->pdu_len);
if (packet_len>pdu_len) {
packet_len=pdu_len; /* do TLV decoding as long as it makes sense */
length=pdu_len;
}
-
+
TCHECK(*header_iih_ptp);
printf("\n\t\t source-id: %s, holding time: %us, circuit-id: 0x%02x, %s, PDU length: %u",
- isis_print_sysid(header_iih_ptp->source_id),
+ isis_print_sysid(header_iih_ptp->source_id,SYSTEM_ID_LEN),
EXTRACT_16BITS(header_iih_ptp->holding_time),
header_iih_ptp->circuit_id,
tok2str(isis_iih_circuit_type_values,
header->fixed_len, (unsigned long)ISIS_LSP_HEADER_SIZE);
return (0);
}
-
+
pdu_len=EXTRACT_16BITS(header_lsp->pdu_len);
if (packet_len>pdu_len) {
packet_len=pdu_len; /* do TLV decoding as long as it makes sense */
EXTRACT_16BITS(header_lsp->checksum),
(osi_cksum(optr+12, length-12)) ? "incorrect" : "correct",
pdu_len);
-
+
printf(", %s", ISIS_MASK_LSP_OL_BIT(header_lsp->typeblock) ? "Overload bit set, " : "");
if (ISIS_MASK_LSP_ATT_BITS(header_lsp->typeblock)) {
header->fixed_len, (unsigned long)ISIS_CSNP_HEADER_SIZE);
return (0);
}
-
+
pdu_len=EXTRACT_16BITS(header_csnp->pdu_len);
if (packet_len>pdu_len) {
packet_len=pdu_len; /* do TLV decoding as long as it makes sense */
TCHECK(*header_csnp);
printf("\n\t\t source-id: %s, PDU length: %u",
isis_print_nodeid(header_csnp->source_id),
- pdu_len);
+ pdu_len);
printf("\n\t\t start lsp-id: %s",
- isis_print_lspid(header_csnp->start_lsp_id));
+ isis_print_lspid(header_csnp->start_lsp_id));
printf("\n\t\t end lsp-id: %s",
isis_print_lspid(header_csnp->end_lsp_id));
TCHECK(*header_psnp);
printf("\n\t\t source-id: %s",
- isis_print_nodeid(header_psnp->source_id));
-
+ isis_print_nodeid(header_psnp->source_id));
+
packet_len -= (ISIS_COMMON_HEADER_SIZE+ISIS_PSNP_HEADER_SIZE);
pptr = p + (ISIS_COMMON_HEADER_SIZE+ISIS_PSNP_HEADER_SIZE);
break;
default:
if(!isis_print_unknown_data(pptr,"\n\t\t ",length))
- return(0);
+ return(0);
return (0);
}
/*
* Now print the TLV's.
*/
-
+
while (packet_len >= 2) {
if (pptr == snapend) {
return (1);
if (len > packet_len) {
break;
}
-
+
/* first lets see if we know the TLVs name*/
printf("\n\t\t %s TLV #%u, length: %u",
tok2str(isis_tlv_values,
break;
case TLV_ISNEIGH:
while (tmp >= ETHER_ADDR_LEN) {
- printf("\n\t\t\tIS Neighbor: %s",isis_print_sysid(tptr));
- tmp -= ETHER_ADDR_LEN;
- tptr += ETHER_ADDR_LEN;
+ if (!TTEST2(*tptr, ETHER_ADDR_LEN))
+ goto trunctlv;
+ printf("\n\t\t\tIS Neighbor: %s",isis_print_sysid(tptr,ETHER_ADDR_LEN));
+ tmp -= ETHER_ADDR_LEN;
+ tptr += ETHER_ADDR_LEN;
}
break;
+ case TLV_ISNEIGH_VARLEN:
+ if (!TTEST2(*tptr, 1))
+ goto trunctlv;
+ lan_alen = *tptr++; /* LAN adress length */
+ tmp --;
+ printf("\n\t\t\tLAN address length %u bytes ",lan_alen);
+ while (tmp >= lan_alen) {
+ if (!TTEST2(*tptr, lan_alen))
+ goto trunctlv;
+ printf("\n\t\t\tIS Neighbor: %s",isis_print_sysid(tptr,lan_alen));
+ tmp -= lan_alen;
+ tptr +=lan_alen;
+ }
+ break;
+
case TLV_PADDING:
break;
printf(" Topology (0x%03x)",
ISIS_MASK_MTID(EXTRACT_16BITS(tptr)));
tptr+=2;
- printf("\n\t\t\t IS Neighbor: %s", isis_print_nodeid(tptr));
- tptr+=(SYSTEM_ID_LEN+1);
+ if (!TTEST2(*tptr, NODE_ID_LEN))
+ goto trunctlv;
+ printf("\n\t\t\t IS Neighbor: %s", isis_print_nodeid(tptr));
+ tptr+=(NODE_ID_LEN);
if (!TTEST2(*tptr, 3))
goto trunctlv;
printf(", Metric: %d",EXTRACT_24BITS(tptr));
tslen=*(tptr++);
printf(", %ssub-TLVs present",tslen ? "" : "no ");
if (tslen) {
- printf(" (%u)",tslen);
+ printf(" (%u)",tslen);
while (tslen>0) {
if (!TTEST2(*tptr,2))
goto trunctlv;
- subt=*(tptr++);
- subl=*(tptr++);
+ subt=*(tptr++);
+ subl=*(tptr++);
if(!isis_print_is_reach_subtlv(tptr,subt,subl,"\n\t\t\t "))
return(0);
tptr+=subl;
tslen-=(subl+2);
tmp-=(subl+2);
}
- }
+ }
tmp-=(SYSTEM_ID_LEN+7);
}
break;
case TLV_EXT_IS_REACH:
while (tmp>0) {
- if (!TTEST2(*tptr, SYSTEM_ID_LEN+1))
+ if (!TTEST2(*tptr, NODE_ID_LEN))
goto trunctlv;
- printf("\n\t\t\tIS Neighbor: %s", isis_print_nodeid(tptr));
- tptr+=(SYSTEM_ID_LEN+1);
+ printf("\n\t\t\tIS Neighbor: %s", isis_print_nodeid(tptr));
+ tptr+=(NODE_ID_LEN);
if (!TTEST2(*tptr, 3))
goto trunctlv;
tslen=*(tptr++); /* read out subTLV length */
printf(", %ssub-TLVs present",tslen ? "" : "no ");
if (tslen) {
- printf(" (%u)",tslen);
+ printf(" (%u)",tslen);
while (tslen>0) {
if (!TTEST2(*tptr,2))
goto trunctlv;
- subt=*(tptr++);
- subl=*(tptr++);
+ subt=*(tptr++);
+ subl=*(tptr++);
if(!isis_print_is_reach_subtlv(tptr,subt,subl,"\n\t\t\t "))
return(0);
tptr+=subl;
tslen-=(subl+2);
tmp-=(subl+2);
}
- }
+ }
tmp-=(SYSTEM_ID_LEN+5);
}
break;
case TLV_IS_REACH:
if (!TTEST2(*tptr,1)) /* check if there is one byte left to read out the virtual flag */
goto trunctlv;
-
printf("\n\t\t\t%s",
tok2str(isis_is_reach_virtual_values,
"bogus virtual flag 0x%02x",
*tptr++));
-
tlv_is_reach = (const struct isis_tlv_is_reach *)tptr;
-
while (tmp >= sizeof(struct isis_tlv_is_reach)) {
if (!TTEST(*tlv_is_reach))
goto trunctlv;
-
printf("\n\t\t\tIS Neighbor: %s", isis_print_nodeid(tlv_is_reach->neighbor_nodeid));
- printf(", Default Metric: %d, %s",
- ISIS_LSP_TLV_METRIC_VALUE(tlv_is_reach->metric_default),
- ISIS_LSP_TLV_METRIC_IE(tlv_is_reach->metric_default) ? "External" : "Internal");
-
- if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_is_reach->metric_delay))
- printf("\n\t\t\t Delay Metric: %d, %s",
- ISIS_LSP_TLV_METRIC_VALUE(tlv_is_reach->metric_delay),
- ISIS_LSP_TLV_METRIC_IE(tlv_is_reach->metric_delay) ? "External" : "Internal");
-
- if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_is_reach->metric_expense))
- printf("\n\t\t\t Expense Metric: %d, %s",
- ISIS_LSP_TLV_METRIC_VALUE(tlv_is_reach->metric_expense),
- ISIS_LSP_TLV_METRIC_IE(tlv_is_reach->metric_expense) ? "External" : "Internal");
-
- if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_is_reach->metric_error))
- printf("\n\t\t\t Error Metric: %d, %s",
- ISIS_LSP_TLV_METRIC_VALUE(tlv_is_reach->metric_error),
- ISIS_LSP_TLV_METRIC_IE(tlv_is_reach->metric_error) ? "External" : "Internal");
-
+ isis_print_metric_block(&tlv_is_reach->isis_metric_block);
tmp -= sizeof(struct isis_tlv_is_reach);
tlv_is_reach++;
}
break;
+ case TLV_ESNEIGH:
+ tlv_es_reach = (const struct isis_tlv_es_reach *)tptr;
+ while (tmp >= sizeof(struct isis_tlv_es_reach)) {
+ if (!TTEST(*tlv_es_reach))
+ goto trunctlv;
+ printf("\n\t\t\tES Neighbor: %s",
+ isis_print_sysid(tlv_es_reach->neighbor_sysid,SYSTEM_ID_LEN));
+ isis_print_metric_block(&tlv_es_reach->isis_metric_block);
+ tmp -= sizeof(struct isis_tlv_es_reach);
+ tlv_es_reach++;
+ }
+ break;
+
/* those two TLVs share the same format */
case TLV_IP_REACH:
case TLV_IP_REACH_EXT:
return (1);
memcpy(prefix,tptr,byte_length);
tptr+=byte_length;
- printf("\n\t\t\tIPv4 prefix: %s/%d",
+ printf("\n\t\t\tIPv4 prefix: %s/%d",
ipaddr_string(prefix),
bit_length);
return (1);
tslen=*(tptr++);
tmp--;
- printf(" (%u)",tslen); /* print out subTLV length */
+ printf(" (%u)",tslen); /* print out subTLV length */
while (tslen>0) {
if (!TTEST2(*tptr,2))
goto trunctlv;
- subt=*(tptr++);
- subl=*(tptr++);
+ subt=*(tptr++);
+ subl=*(tptr++);
if(!isis_print_ip_reach_subtlv(tptr,subt,subl,"\n\t\t\t "))
return(0);
tptr+=subl;
return (1);
memcpy(prefix,tptr,byte_length);
tptr+=byte_length;
- printf("\n\t\t\tIPv4 prefix: %s/%d",
+ printf("\n\t\t\tIPv4 prefix: %s/%d",
ipaddr_string(prefix),
bit_length);
return (1);
tslen=*(tptr++);
tmp--;
- printf(" (%u)",tslen); /* print out subTLV length */
+ printf(" (%u)",tslen); /* print out subTLV length */
while (tslen>0) {
if (!TTEST2(*tptr,2))
goto trunctlv;
- subt=*(tptr++);
- subl=*(tptr++);
+ subt=*(tptr++);
+ subl=*(tptr++);
if(!isis_print_ip_reach_subtlv(tptr,subt,subl,"\n\t\t\t "))
return(0);
tptr+=subl;
the aggregate bytecount of the subTLVs for this prefix
*/
if (!TTEST2(*tptr, 1))
- return (1);
+ return (1);
tslen=*(tptr++);
tmp--;
- printf(" (%u)",tslen); /* print out subTLV length */
+ printf(" (%u)",tslen); /* print out subTLV length */
while (tslen>0) {
if (!TTEST2(*tptr,2))
goto trunctlv;
- subt=*(tptr++);
- subl=*(tptr++);
+ subt=*(tptr++);
+ subl=*(tptr++);
if(!isis_print_ip_reach_subtlv(tptr,subt,subl,"\n\t\t\t "))
return(0);
tptr+=subl;
case SUBTLV_AUTH_PRIVATE:
default:
if(!isis_print_unknown_data(tptr+1,"\n\t\t\t ",len-1))
- return(0);
+ return(0);
break;
}
break;
tok2str(isis_ptp_adjancey_values, "0x%02x", *tptr));
tmp--;
}
- if(tmp>=4) {
- if (!TTEST2(tlv_ptp_adj->ext_local_circuit_id, 4))
+ if(tmp>sizeof(tlv_ptp_adj->extd_local_circuit_id)) {
+ if (!TTEST2(tlv_ptp_adj->extd_local_circuit_id,
+ sizeof(tlv_ptp_adj->extd_local_circuit_id)))
goto trunctlv;
printf("\n\t\t\tExtended Local circuit ID: 0x%08x",
- EXTRACT_32BITS(tlv_ptp_adj->ext_local_circuit_id));
- tmp-=4;
+ EXTRACT_32BITS(tlv_ptp_adj->extd_local_circuit_id));
+ tmp-=sizeof(tlv_ptp_adj->extd_local_circuit_id);
}
- if(tmp>=6) {
- if (!TTEST2(tlv_ptp_adj->neighbor_sysid, 6))
+ if(tmp>=SYSTEM_ID_LEN) {
+ if (!TTEST2(tlv_ptp_adj->neighbor_sysid, SYSTEM_ID_LEN))
goto trunctlv;
printf("\n\t\t\tNeighbor SystemID: %s",
- isis_print_sysid(tlv_ptp_adj->neighbor_sysid));
- tmp-=6;
+ isis_print_sysid(tlv_ptp_adj->neighbor_sysid,SYSTEM_ID_LEN));
+ tmp-=SYSTEM_ID_LEN;
}
- if(tmp>=4) {
- if (!TTEST2(tlv_ptp_adj->neighbor_ext_local_circuit_id, 4))
+ if(tmp>=sizeof(tlv_ptp_adj->neighbor_extd_local_circuit_id)) {
+ if (!TTEST2(tlv_ptp_adj->neighbor_extd_local_circuit_id,
+ sizeof(tlv_ptp_adj->neighbor_extd_local_circuit_id)))
goto trunctlv;
printf("\n\t\t\tNeighbor Extended Local circuit ID: 0x%08x",
- EXTRACT_32BITS(tlv_ptp_adj->neighbor_ext_local_circuit_id));
+ EXTRACT_32BITS(tlv_ptp_adj->neighbor_extd_local_circuit_id));
}
break;
break;
case TLV_SHARED_RISK_GROUP:
- if (!TTEST2(*tptr, 7))
+ if (!TTEST2(*tptr, NODE_ID_LEN))
goto trunctlv;
printf("\n\t\t\tIS Neighbor: %s", isis_print_nodeid(tptr));
- tptr+=(SYSTEM_ID_LEN+1);
- len-=(SYSTEM_ID_LEN+1);
+ tptr+=(NODE_ID_LEN);
+ len-=(NODE_ID_LEN);
if (!TTEST2(*tptr, 1))
goto trunctlv;
goto trunctlv;
printf("\n\t\t\tIPv4 neighbor address: %s", ipaddr_string(tptr));
tptr+=4;
- len-=4;
+ len-=4;
while (tmp>0) {
if (!TTEST2(*tptr, 4))
- goto trunctlv;
+ goto trunctlv;
printf("\n\t\t\tLink-ID: 0x%08x", EXTRACT_32BITS(tptr));
tptr+=4;
- len-=4;
+ len-=4;
}
break;
- case TLV_LSP:
- tlv_lsp = (const struct isis_tlv_lsp *)tptr;
+ case TLV_LSP:
+ tlv_lsp = (const struct isis_tlv_lsp *)tptr;
while(tmp>0) {
printf("\n\t\t\tlsp-id: %s",
isis_print_nodeid(tlv_lsp->lsp_id));
- if (!TTEST((tlv_lsp->lsp_id)[SYSTEM_ID_LEN+1]))
+ if (!TTEST((tlv_lsp->lsp_id)[NODE_ID_LEN]))
goto trunctlv;
- printf("-%02x",(tlv_lsp->lsp_id)[SYSTEM_ID_LEN+1]);
+ printf("-%02x",(tlv_lsp->lsp_id)[NODE_ID_LEN]);
if (!TTEST2(tlv_lsp->sequence_number, 4))
goto trunctlv;
printf(", seq: 0x%08x",EXTRACT_32BITS(tlv_lsp->sequence_number));
case TLV_CHECKSUM:
if (!TTEST2(*tptr, 2))
goto trunctlv;
- printf("\n\t\t\tchecksum: 0x%04x (%s)",
+ printf("\n\t\t\tchecksum: 0x%04x (%s)",
EXTRACT_16BITS(tptr),
(osi_cksum(optr, length)) ? "incorrect" : "correct");
break;
case TLV_MT_SUPPORTED:
while (tmp>1) {
- /* length can only be a multiple of 2, otherwise there is
+ /* length can only be a multiple of 2, otherwise there is
something broken -> so decode down until length is 1 */
if (tmp!=1) {
if (!TTEST2(*tptr, 2))
case TLV_RESTART_SIGNALING:
if (!TTEST2(*tptr, 3))
- goto trunctlv;
+ goto trunctlv;
rr = ISIS_MASK_TLV_RESTART_RR(*tptr);
ra = ISIS_MASK_TLV_RESTART_RA(*tptr);
tptr++;
printf("\n\t\t\tInter-Domain Information Type: %s",
tok2str(isis_subtlv_idrp_values,
"Unknown (0x%02x)",
- *tptr));
+ *tptr));
switch (*tptr++) {
case SUBTLV_IDRP_ASN:
if (!TTEST2(*tptr, 2)) /* fetch AS number */
case TLV_LSP_BUFFERSIZE:
if (!TTEST2(*tptr, 2))
- goto trunctlv;
+ goto trunctlv;
printf("LSP Buffersize: %u",EXTRACT_16BITS(tptr));
break;
+ case TLV_PART_DIS:
+ while (tmp >= SYSTEM_ID_LEN) {
+ if (!TTEST2(*tptr, SYSTEM_ID_LEN))
+ goto trunctlv;
+ printf("%s",isis_print_sysid(tptr,SYSTEM_ID_LEN));
+ tptr+=SYSTEM_ID_LEN;
+ tmp-=SYSTEM_ID_LEN;
+ }
+ break;
+
+ case TLV_PREFIX_NEIGH:
+ if (!TTEST2(*tptr, sizeof(struct isis_metric_block)))
+ goto trunctlv;
+ printf("Metric Block");
+ isis_print_metric_block((const struct isis_metric_block *)tptr);
+ tptr+=sizeof(struct isis_metric_block);
+ tmp-=sizeof(struct isis_metric_block);
+
+ while(tmp>0) {
+ if (!TTEST2(*tptr, 1))
+ goto trunctlv;
+ prefix_len=*tptr++; /* read out prefix length in semioctets*/
+ tmp--;
+ if (!TTEST2(*tptr, prefix_len/2))
+ goto trunctlv;
+ printf("\n\t\t\tAddress: %s/%u",
+ print_nsap(tptr,prefix_len/2),
+ prefix_len*4);
+ tptr+=prefix_len/2;
+ tmp-=prefix_len/2;
+ }
+ break;
+
/*
* FIXME those are the defined TLVs that lack a decoder
* you are welcome to contribute code ;-)
*/
- case TLV_ESNEIGH:
- case TLV_PART_DIS:
- case TLV_SUMMARY:
case TLV_IS_ALIAS_ID:
case TLV_DECNET_PHASE4:
case TLV_LUCENT_PRIVATE: