2 * Copyright (c) 1992, 1993, 1994, 1995, 1996
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that: (1) source code distributions
7 * retain the above copyright notice and this paragraph in its entirety, (2)
8 * distributions including binary code include the above copyright notice and
9 * this paragraph in its entirety in the documentation or other materials
10 * provided with the distribution, and (3) all advertising materials mentioning
11 * features or use of this software display the following acknowledgement:
12 * ``This product includes software developed by the University of California,
13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14 * the University nor the names of its contributors may be used to endorse
15 * or promote products derived from this software without specific prior
17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21 * Original code by Matt Thomas, Digital Equipment Corporation
23 * Extensively modified by Hannes Gredler (hannes@juniper.net) for more
24 * complete IS-IS support.
28 static const char rcsid
[] =
29 "@(#) $Header: /tcpdump/master/tcpdump/print-isoclns.c,v 1.56 2002-08-01 08:53:13 risso Exp $ (LBL)";
36 #include <tcpdump-stdinc.h>
41 #include "interface.h"
42 #include "addrtoname.h"
43 #include "ethertype.h"
47 #define NLPID_CLNS 129 /* 0x81 */
48 #define NLPID_ESIS 130 /* 0x82 */
49 #define NLPID_ISIS 131 /* 0x83 */
50 #define NLPID_IP6 0x8e
52 #define NLPID_NULLNS 0
55 * IS-IS is defined in ISO 10589. Look there for protocol definitions.
58 #define SYSTEM_ID_LEN ETHER_ADDR_LEN
59 #define NODE_ID_LEN SYSTEM_ID_LEN+1
60 #define LSP_ID_LEN SYSTEM_ID_LEN+2
62 #define ISIS_VERSION 1
63 #define PDU_TYPE_MASK 0x1F
64 #define PRIORITY_MASK 0x7F
76 static struct tok isis_pdu_values
[] = {
77 { L1_LAN_IIH
, "L1 Lan IIH"},
78 { L2_LAN_IIH
, "L2 Lan IIH"},
79 { PTP_IIH
, "p2p IIH"},
82 { L1_CSNP
, "L1 CSNP"},
83 { L2_CSNP
, "L2 CSNP"},
84 { L1_PSNP
, "L1 PSNP"},
85 { L2_PSNP
, "L2 PSNP"},
90 * A TLV is a tuple of a type, length and a value and is normally used for
91 * encoding information in all sorts of places. This is an enumeration of
92 * the well known types.
94 * list taken from draft-ietf-isis-wg-tlv-codepoints-01.txt
97 #define TLV_AREA_ADDR 1
98 #define TLV_IS_REACH 2
100 #define TLV_PART_DIS 4
101 #define TLV_PREFIX_NEIGH 5
102 #define TLV_ISNEIGH 6
103 #define TLV_ISNEIGH_VARLEN 7
104 #define TLV_PADDING 8
107 #define TLV_CHECKSUM 12
108 #define TLV_LSP_BUFFERSIZE 14
109 #define TLV_EXT_IS_REACH 22
110 #define TLV_IS_ALIAS_ID 24
111 #define TLV_DECNET_PHASE4 42
112 #define TLV_LUCENT_PRIVATE 66
113 #define TLV_IP_REACH 128
114 #define TLV_PROTOCOLS 129
115 #define TLV_IP_REACH_EXT 130
116 #define TLV_IDRP_INFO 131
117 #define TLV_IPADDR 132
118 #define TLV_IPAUTH 133
119 #define TLV_TE_ROUTER_ID 134
120 #define TLV_EXT_IP_REACH 135
121 #define TLV_HOSTNAME 137
122 #define TLV_SHARED_RISK_GROUP 138
123 #define TLV_NORTEL_PRIVATE1 176
124 #define TLV_NORTEL_PRIVATE2 177
125 #define TLV_RESTART_SIGNALING 211
126 #define TLV_MT_IS_REACH 222
127 #define TLV_MT_SUPPORTED 229
128 #define TLV_IP6ADDR 232
129 #define TLV_MT_IP_REACH 235
130 #define TLV_IP6_REACH 236
131 #define TLV_MT_IP6_REACH 237
132 #define TLV_PTP_ADJ 240
134 static struct tok isis_tlv_values
[] = {
135 { TLV_AREA_ADDR
, "Area address(es)"},
136 { TLV_IS_REACH
, "IS Reachability"},
137 { TLV_ESNEIGH
, "ES Neighbor(s)"},
138 { TLV_PART_DIS
, "Partition DIS"},
139 { TLV_PREFIX_NEIGH
, "Prefix Neighbors"},
140 { TLV_ISNEIGH
, "IS Neighbor(s)"},
141 { TLV_ISNEIGH_VARLEN
, "IS Neighbor(s) (variable length)"},
142 { TLV_PADDING
, "Padding"},
143 { TLV_LSP
, "LSP entries"},
144 { TLV_AUTH
, "Authentication"},
145 { TLV_CHECKSUM
, "Checksum"},
146 { TLV_LSP_BUFFERSIZE
, "LSP Buffersize"},
147 { TLV_EXT_IS_REACH
, "Extended IS Reachability"},
148 { TLV_IS_ALIAS_ID
, "IS Alias ID"},
149 { TLV_DECNET_PHASE4
, "DECnet Phase IV"},
150 { TLV_LUCENT_PRIVATE
, "Lucent Proprietary"},
151 { TLV_IP_REACH
, "IPv4 Internal reachability"},
152 { TLV_PROTOCOLS
, "Protocols supported"},
153 { TLV_IP_REACH_EXT
, "IPv4 External reachability"},
154 { TLV_IDRP_INFO
, "Inter-Domain Information Type"},
155 { TLV_IPADDR
, "IPv4 Interface address(es)"},
156 { TLV_IPAUTH
, "IPv4 authentication (deprecated)"},
157 { TLV_TE_ROUTER_ID
, "Traffic Engineering Router ID"},
158 { TLV_EXT_IP_REACH
, "Extended IPv4 reachability"},
159 { TLV_HOSTNAME
, "Hostname"},
160 { TLV_SHARED_RISK_GROUP
, "Shared Risk Link Group"},
161 { TLV_NORTEL_PRIVATE1
, "Nortel Proprietary"},
162 { TLV_NORTEL_PRIVATE2
, "Nortel Proprietary"},
163 { TLV_RESTART_SIGNALING
, "Restart Signaling"},
164 { TLV_MT_IS_REACH
, "Multi Topology IS Reachability"},
165 { TLV_MT_SUPPORTED
, "Multi Topology"},
166 { TLV_IP6ADDR
, "IPv6 Interface address(es)"},
167 { TLV_MT_IP_REACH
, "Multi-Topology IPv4 reachability"},
168 { TLV_IP6_REACH
, "IPv6 reachability"},
169 { TLV_MT_IP6_REACH
, "Multi-Topology IP6 reachability"},
170 { TLV_PTP_ADJ
, "Point-to-point Adjacency State"},
174 #define SUBTLV_EXT_IS_REACH_ADMIN_GROUP 3
175 #define SUBTLV_EXT_IS_REACH_LINK_LOCAL_ID 4
176 #define SUBTLV_EXT_IS_REACH_LINK_REMOTE_ID 5
177 #define SUBTLV_EXT_IS_REACH_IPV4_INTF_ADDR 6
178 #define SUBTLV_EXT_IS_REACH_IPV4_NEIGHBOR_ADDR 8
179 #define SUBTLV_EXT_IS_REACH_MAX_LINK_BW 9
180 #define SUBTLV_EXT_IS_REACH_RESERVABLE_BW 10
181 #define SUBTLV_EXT_IS_REACH_UNRESERVED_BW 11
182 #define SUBTLV_EXT_IS_REACH_TE_METRIC 18
183 #define SUBTLV_EXT_IS_REACH_LINK_PROTECTION_TYPE 20
184 #define SUBTLV_EXT_IS_REACH_INTF_SW_CAP_DESCR 21
186 #define SUBTLV_IP_REACH_ADMIN_TAG32 1
187 #define SUBTLV_IP_REACH_ADMIN_TAG64 2
189 #define SUBTLV_AUTH_SIMPLE 1
190 #define SUBTLV_AUTH_MD5 54
191 #define SUBTLV_AUTH_MD5_LEN 16
192 #define SUBTLV_AUTH_PRIVATE 255
194 static struct tok isis_subtlv_auth_values
[] = {
195 { SUBTLV_AUTH_SIMPLE
, "simple text password"},
196 { SUBTLV_AUTH_MD5
, "HMAC-MD5 password"},
197 { SUBTLV_AUTH_PRIVATE
, "Routing Domain private password"},
201 #define SUBTLV_IDRP_RES 0
202 #define SUBTLV_IDRP_LOCAL 1
203 #define SUBTLV_IDRP_ASN 2
205 static struct tok isis_subtlv_idrp_values
[] = {
206 { SUBTLV_IDRP_RES
, "Reserved"},
207 { SUBTLV_IDRP_LOCAL
, "Routing-Domain Specific"},
208 { SUBTLV_IDRP_ASN
, "AS Number Tag"},
212 #define ISIS_8BIT_MASK(x) ((x)&0xff)
214 #define ISIS_MASK_LSP_OL_BIT(x) ((x)&0x4)
215 #define ISIS_MASK_LSP_ISTYPE_BITS(x) ((x)&0x3)
216 #define ISIS_MASK_LSP_PARTITION_BIT(x) ((x)&0x80)
217 #define ISIS_MASK_LSP_ATT_BITS(x) ((x)&0x78)
218 #define ISIS_MASK_LSP_ATT_ERROR_BIT(x) ((x)&0x40)
219 #define ISIS_MASK_LSP_ATT_EXPENSE_BIT(x) ((x)&0x20)
220 #define ISIS_MASK_LSP_ATT_DELAY_BIT(x) ((x)&0x10)
221 #define ISIS_MASK_LSP_ATT_DEFAULT_BIT(x) ((x)&0x8)
223 #define ISIS_MASK_MTID(x) ((x)&0xfff)
224 #define ISIS_MASK_MTSUB(x) ((x)&0x8000)
225 #define ISIS_MASK_MTATT(x) ((x)&0x4000)
227 #define ISIS_MASK_TLV_EXT_IP_UPDOWN(x) ((x)&0x80)
228 #define ISIS_MASK_TLV_EXT_IP_SUBTLV(x) ((x)&0x40)
230 #define ISIS_MASK_TLV_IP6_UPDOWN(x) ((x)&0x80)
231 #define ISIS_MASK_TLV_IP6_IE(x) ((x)&0x40)
232 #define ISIS_MASK_TLV_IP6_SUBTLV(x) ((x)&0x20)
234 #define ISIS_MASK_TLV_RESTART_RR(x) ((x)&0x1)
235 #define ISIS_MASK_TLV_RESTART_RA(x) ((x)&0x2)
237 #define ISIS_LSP_TLV_METRIC_SUPPORTED(x) ((x)&0x80)
238 #define ISIS_LSP_TLV_METRIC_IE(x) ((x)&0x40)
239 #define ISIS_LSP_TLV_METRIC_UPDOWN(x) ((x)&0x80)
240 #define ISIS_LSP_TLV_METRIC_VALUE(x) ((x)&0x3f)
242 #define ISIS_MASK_TLV_SHARED_RISK_GROUP(x) ((x)&0x1)
244 static const char *isis_gmpls_link_prot_values
[] = {
255 static struct tok isis_gmpls_sw_cap_values
[] = {
256 { 1, "Packet-Switch Capable-1"},
257 { 2, "Packet-Switch Capable-2"},
258 { 3, "Packet-Switch Capable-3"},
259 { 4, "Packet-Switch Capable-4"},
260 { 51, "Layer-2 Switch Capable"},
261 { 100, "Time-Division-Multiplex"},
262 { 150, "Lambda-Switch Capable"},
263 { 200, "Fiber-Switch Capable"},
267 static struct tok isis_gmpls_lsp_enc_values
[] = {
269 { 2, "Ethernet V2/DIX"},
272 { 5, "SDH ITU-T G.707"},
273 { 6, "SONET ANSI T1.105"},
274 { 7, "Digital Wrapper"},
275 { 8, "Lambda (photonic)"},
277 { 10, "Ethernet 802.3"},
278 { 11, "FiberChannel"},
282 static struct tok isis_mt_values
[] = {
283 { 0, "IPv4 unicast"},
284 { 1, "In-Band Management"},
285 { 2, "IPv6 unicast"},
287 { 4095, "Development, Experimental or Proprietary"},
291 static struct tok isis_iih_circuit_type_values
[] = {
292 { 1, "Level 1 only"},
293 { 2, "Level 2 only"},
294 { 3, "Level 1, Level 2"},
298 #define ISIS_LSP_TYPE_UNUSED0 0
299 #define ISIS_LSP_TYPE_LEVEL_1 1
300 #define ISIS_LSP_TYPE_UNUSED2 2
301 #define ISIS_LSP_TYPE_LEVEL_2 3
303 static struct tok isis_lsp_istype_values
[] = {
304 { ISIS_LSP_TYPE_UNUSED0
, "Unused 0x0 (invalid)"},
305 { ISIS_LSP_TYPE_LEVEL_1
, "L1 IS"},
306 { ISIS_LSP_TYPE_UNUSED2
, "Unused 0x2 (invalid)"},
307 { ISIS_LSP_TYPE_LEVEL_2
, "L1L2 IS"},
311 static struct tok isis_nlpid_values
[] = {
312 { NLPID_CLNS
, "CLNS"},
314 { NLPID_IP6
, "IPv6"},
319 * Katz's point to point adjacency TLV uses codes to tell us the state of
320 * the remote adjacency. Enumerate them.
323 #define ISIS_PTP_ADJ_UP 0
324 #define ISIS_PTP_ADJ_INIT 1
325 #define ISIS_PTP_ADJ_DOWN 2
328 static struct tok isis_ptp_adjancey_values
[] = {
329 { ISIS_PTP_ADJ_UP
, "Up" },
330 { ISIS_PTP_ADJ_INIT
, "Initializing" },
331 { ISIS_PTP_ADJ_DOWN
, "Down" },
335 struct isis_tlv_ptp_adj
{
336 u_char adjacency_state
;
337 u_char extd_local_circuit_id
[4];
338 u_char neighbor_sysid
[SYSTEM_ID_LEN
];
339 u_char neighbor_extd_local_circuit_id
[4];
342 static int osi_cksum(const u_char
*, u_int
);
343 static void esis_print(const u_char
*, u_int
);
344 static int isis_print(const u_char
*, u_int
);
346 struct isis_metric_block
{
347 u_char metric_default
;
349 u_char metric_expense
;
353 struct isis_tlv_is_reach
{
354 struct isis_metric_block isis_metric_block
;
355 u_char neighbor_nodeid
[NODE_ID_LEN
];
358 struct isis_tlv_es_reach
{
359 struct isis_metric_block isis_metric_block
;
360 u_char neighbor_sysid
[SYSTEM_ID_LEN
];
363 struct isis_tlv_ip_reach
{
364 struct isis_metric_block isis_metric_block
;
369 static struct tok isis_is_reach_virtual_values
[] = {
370 { 0, "IsNotVirtual"},
375 struct isis_common_header
{
378 u_char version
; /* Protocol version? */
380 u_char pdu_type
; /* 3 MSbs are reserved */
381 u_char pdu_version
; /* Packet format version? */
386 struct isis_iih_lan_header
{
388 u_char source_id
[SYSTEM_ID_LEN
];
389 u_char holding_time
[2];
392 u_char lan_id
[NODE_ID_LEN
];
395 struct isis_iih_ptp_header
{
397 u_char source_id
[SYSTEM_ID_LEN
];
398 u_char holding_time
[2];
403 struct isis_lsp_header
{
405 u_char remaining_lifetime
[2];
406 u_char lsp_id
[LSP_ID_LEN
];
407 u_char sequence_number
[4];
412 struct isis_csnp_header
{
414 u_char source_id
[NODE_ID_LEN
];
415 u_char start_lsp_id
[LSP_ID_LEN
];
416 u_char end_lsp_id
[LSP_ID_LEN
];
419 struct isis_psnp_header
{
421 u_char source_id
[NODE_ID_LEN
];
424 struct isis_tlv_lsp
{
425 u_char remaining_lifetime
[2];
426 u_char lsp_id
[LSP_ID_LEN
];
427 u_char sequence_number
[4];
432 /* allocate space for the following string
433 * xx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx
434 * 32 bytes plus one termination byte */
436 print_nsap(register const u_char
*cp
, register int length
)
439 static char nsap
[33];
448 for (i
= 0; i
< length
; i
++) {
451 pos
+=sprintf(pos
, "%02x", *cp
++);
452 if (((i
& 1) == 0) && (i
+ 1 < length
)) {
453 pos
+=sprintf(pos
, ".");
460 #define ISIS_COMMON_HEADER_SIZE (sizeof(struct isis_common_header))
461 #define ISIS_IIH_LAN_HEADER_SIZE (sizeof(struct isis_iih_lan_header))
462 #define ISIS_IIH_PTP_HEADER_SIZE (sizeof(struct isis_iih_ptp_header))
463 #define ISIS_LSP_HEADER_SIZE (sizeof(struct isis_lsp_header))
464 #define ISIS_CSNP_HEADER_SIZE (sizeof(struct isis_csnp_header))
465 #define ISIS_PSNP_HEADER_SIZE (sizeof(struct isis_psnp_header))
467 void isoclns_print(const u_char
*p
, u_int length
, u_int caplen
,
468 const u_char
*esrc
, const u_char
*edst
)
471 const struct isis_common_header
*header
;
473 header
= (const struct isis_common_header
*)p
;
474 pdu_type
= header
->pdu_type
& PDU_TYPE_MASK
;
477 printf("[|iso-clns] ");
478 if (!eflag
&& esrc
!= NULL
&& edst
!= NULL
)
480 etheraddr_string(esrc
),
481 etheraddr_string(edst
));
488 (void)printf("CLNS(%d)", length
);
489 if (!eflag
&& esrc
!= NULL
&& edst
!= NULL
)
490 (void)printf(", %s > %s",
491 etheraddr_string(esrc
),
492 etheraddr_string(edst
));
496 (void)printf("ESIS(%u)", length
);
497 if (!eflag
&& esrc
!= NULL
&& edst
!= NULL
)
498 (void)printf(", %s > %s",
499 etheraddr_string(esrc
),
500 etheraddr_string(edst
));
501 esis_print(p
, length
);
505 (void)printf("ISIS(%u)", length
);
506 if (!eflag
&& esrc
!= NULL
&& edst
!= NULL
)
507 (void)printf(", %s > %s",
508 etheraddr_string(esrc
),
509 etheraddr_string(edst
));
510 if (!isis_print(p
, length
))
511 default_print_unaligned(p
, caplen
);
515 (void)printf("ISO NULLNS(%d)", length
);
516 if (!eflag
&& esrc
!= NULL
&& edst
!= NULL
)
517 (void)printf(", %s > %s",
518 etheraddr_string(esrc
),
519 etheraddr_string(edst
));
523 (void)printf("CLNS %02x(%d)", p
[0], length
);
524 if (!eflag
&& esrc
!= NULL
&& edst
!= NULL
)
525 (void)printf(", %s > %s",
526 etheraddr_string(esrc
),
527 etheraddr_string(edst
));
529 default_print_unaligned(p
, caplen
);
534 #define ESIS_REDIRECT 6
547 esis_print(const u_char
*p
, u_int length
)
551 const struct esis_hdr
*eh
;
557 printf(" no header at all!");
561 eh
= (const struct esis_hdr
*) &p
[2];
567 printf(" LI(%d) > PDU size (%d)!", li
, length
);
570 if (li
< sizeof(struct esis_hdr
) + 2) {
574 printf(" too short for esis header %d:", li
);
575 while (--length
!= 0)
576 printf("%02X", *p
++);
580 switch (eh
->type
& 0x1f) {
595 printf(" type %d", eh
->type
& 0x1f);
598 if (vflag
&& osi_cksum(p
, li
)) {
599 printf(" bad cksum (got 0x%02x%02x)",
600 eh
->cksum
[1], eh
->cksum
[0]);
601 default_print(p
, length
);
604 if (eh
->version
!= 1) {
605 printf(" unsupported version %d", eh
->version
);
608 p
+= sizeof(*eh
) + 2;
609 li
-= sizeof(*eh
) + 2; /* protoid * li */
611 switch (eh
->type
& 0x1f) {
612 case ESIS_REDIRECT
: {
613 const u_char
*dst
, *snpa
, *is
;
615 dst
= p
; p
+= *p
+ 1;
618 printf("\n\t\t %s", isonsap_string(dst
));
619 snpa
= p
; p
+= *p
+ 1;
628 printf(" > %s", etheraddr_string(&snpa
[1]));
630 printf(" > %s", isonsap_string(is
));
650 printf("\n\tNET: %s", print_nsap(is
+1,*is
));
656 (void)printf(" len=%d", length
);
657 if (length
&& p
< snapend
) {
658 length
= snapend
- p
;
659 default_print(p
, length
);
664 while (p
< ep
&& li
) {
671 printf(" bad opts/li");
678 printf(" opt (%d) too long", op
);
686 if (op
== 198 && opli
== 2) {
687 printf(" tmo=%d", q
[0] * 256 + q
[1]);
690 printf (" %d:<", op
);
692 printf("%02x", *q
++);
697 /* allocate space for the following string
699 * 14 bytes plus one termination byte */
701 isis_print_sysid(const u_char
*cp
, int sysid_len
)
704 static char sysid
[15];
707 for (i
= 1; i
<= sysid_len
; i
++) {
710 pos
+=sprintf(pos
, "%02x", *cp
++);
712 pos
+=sprintf(pos
, ".");
720 /* allocate space for the following string
722 * 17 bytes plus one termination byte */
724 isis_print_nodeid(const u_char
*cp
)
727 static char nodeid
[18];
730 for (i
= 1; i
<= 7; i
++) {
733 pos
+=sprintf(pos
, "%02x", *cp
++);
735 pos
+=sprintf(pos
, ".");
742 /* allocate space for the following string
743 * xxxx.xxxx.xxxx.yy-zz
744 * 20 bytes plus one termination byte */
746 isis_print_lspid(const u_char
*cp
)
749 static char lspid
[21];
752 for (i
= 1; i
<= 7; i
++) {
753 pos
+=sprintf(pos
, "%02x", *cp
++);
755 pos
+=sprintf(pos
, ".");
757 pos
+=sprintf(pos
, "-%02x", *cp
);
761 /* print the 4-byte metric block which is common found in the old-style TLVs */
764 isis_print_metric_block (const struct isis_metric_block
*isis_metric_block
)
766 printf(", Default Metric: %d, %s",
767 ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block
->metric_default
),
768 ISIS_LSP_TLV_METRIC_IE(isis_metric_block
->metric_default
) ? "External" : "Internal");
769 if (!ISIS_LSP_TLV_METRIC_SUPPORTED(isis_metric_block
->metric_delay
))
770 printf("\n\t\t Delay Metric: %d, %s",
771 ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block
->metric_delay
),
772 ISIS_LSP_TLV_METRIC_IE(isis_metric_block
->metric_delay
) ? "External" : "Internal");
773 if (!ISIS_LSP_TLV_METRIC_SUPPORTED(isis_metric_block
->metric_expense
))
774 printf("\n\t\t Expense Metric: %d, %s",
775 ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block
->metric_expense
),
776 ISIS_LSP_TLV_METRIC_IE(isis_metric_block
->metric_expense
) ? "External" : "Internal");
777 if (!ISIS_LSP_TLV_METRIC_SUPPORTED(isis_metric_block
->metric_error
))
778 printf("\n\t\t Error Metric: %d, %s",
779 ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block
->metric_error
),
780 ISIS_LSP_TLV_METRIC_IE(isis_metric_block
->metric_error
) ? "External" : "Internal");
782 return(1); /* everything is ok */
786 isis_print_tlv_ip_reach (const u_char
*cp
, int length
)
788 u_int bitmasks
[33] = {
790 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000,
791 0xf8000000, 0xfc000000, 0xfe000000, 0xff000000,
792 0xff800000, 0xffc00000, 0xffe00000, 0xfff00000,
793 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000,
794 0xffff8000, 0xffffc000, 0xffffe000, 0xfffff000,
795 0xfffff800, 0xfffffc00, 0xfffffe00, 0xffffff00,
796 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0,
797 0xfffffff8, 0xfffffffc, 0xfffffffe, 0xffffffff
801 const struct isis_tlv_ip_reach
*tlv_ip_reach
;
803 tlv_ip_reach
= (const struct isis_tlv_ip_reach
*)cp
;
806 if (length
< sizeof(*tlv_ip_reach
)) {
807 printf("short IPv4 reachability (%d vs %lu)", length
,
808 (unsigned long)sizeof(*tlv_ip_reach
));
812 if (!TTEST(*tlv_ip_reach
))
815 mask
= EXTRACT_32BITS(tlv_ip_reach
->mask
);
818 /* lets see if we can transform the mask into a prefixlen */
819 while (prefix_len
<= 33) {
820 if (bitmasks
[prefix_len
++] == mask
) {
827 * 34 indicates no match -> must be a discontiguous netmask
828 * lets dump the mask, otherwise print the prefix_len
830 if (prefix_len
== 34)
831 printf("\n\t\tIPv4 prefix: %s mask %s",
832 ipaddr_string((tlv_ip_reach
->prefix
)),
833 ipaddr_string((tlv_ip_reach
->mask
)));
835 printf("\n\t\tIPv4 prefix: %s/%u",
836 ipaddr_string((tlv_ip_reach
->prefix
)),
839 printf("\n\t\t Default Metric: %02d, %s, Distribution: %s",
840 ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach
->isis_metric_block
.metric_default
),
841 ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach
->isis_metric_block
.metric_default
) ? "External" : "Internal",
842 ISIS_LSP_TLV_METRIC_UPDOWN(tlv_ip_reach
->isis_metric_block
.metric_default
) ? "down" : "up");
844 if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach
->isis_metric_block
.metric_delay
))
845 printf("\n\t\t Delay Metric: %02d, %s",
846 ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach
->isis_metric_block
.metric_delay
),
847 ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach
->isis_metric_block
.metric_delay
) ? "External" : "Internal");
849 if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach
->isis_metric_block
.metric_expense
))
850 printf("\n\t\t Expense Metric: %02d, %s",
851 ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach
->isis_metric_block
.metric_expense
),
852 ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach
->isis_metric_block
.metric_expense
) ? "External" : "Internal");
854 if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach
->isis_metric_block
.metric_error
))
855 printf("\n\t\t Error Metric: %02d, %s",
856 ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach
->isis_metric_block
.metric_error
),
857 ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach
->isis_metric_block
.metric_error
) ? "External" : "Internal");
859 length
-= sizeof(struct isis_tlv_ip_reach
);
866 * this is the common IP-REACH subTLV decoder it is called
867 * from various EXTD-IP REACH TLVs (135,235,236,237)
871 isis_print_ip_reach_subtlv (const u_char
*tptr
,int subt
,int subl
,const char *lf
) {
874 case SUBTLV_IP_REACH_ADMIN_TAG32
:
875 if (!TTEST2(*tptr
,4))
877 printf("%s32-Bit Administrative tag: 0x%08x",
879 EXTRACT_32BITS(tptr
));
881 case SUBTLV_IP_REACH_ADMIN_TAG64
:
882 if (!TTEST2(*tptr
,8))
884 printf("%s64-Bit Administrative tag: 0x%08x%08x",
886 EXTRACT_32BITS(tptr
),
887 EXTRACT_32BITS(tptr
+4));
890 printf("%sunknown subTLV, type %d, length %d",
894 if(!print_unknown_data(tptr
,"\n\t\t ",
902 printf("%spacket exceeded snapshot",lf
);
907 * this is the common IS-REACH subTLV decoder it is called
908 * from various EXTD-IS REACH TLVs (22,24,222)
912 isis_print_is_reach_subtlv (const u_char
*tptr
,int subt
,int subl
,const char *lf
) {
915 float bw
; /* copy buffer for several subTLVs */
918 case SUBTLV_EXT_IS_REACH_ADMIN_GROUP
:
919 if (!TTEST2(*tptr
,4))
921 printf("%sAdministrative groups: 0x%08x",
923 EXTRACT_32BITS(tptr
));
925 case SUBTLV_EXT_IS_REACH_LINK_LOCAL_ID
:
926 if (!TTEST2(*tptr
,4))
928 printf("%sLink Local Identifier: 0x%08x",
930 EXTRACT_32BITS(tptr
));
932 case SUBTLV_EXT_IS_REACH_LINK_REMOTE_ID
:
933 if (!TTEST2(*tptr
,4))
935 printf("%sLink Remote Identifier: 0x%08x",
937 EXTRACT_32BITS(tptr
));
939 case SUBTLV_EXT_IS_REACH_MAX_LINK_BW
:
940 if (!TTEST2(*tptr
,4))
942 j
= EXTRACT_32BITS(tptr
);
944 printf("%sMaximum link bandwidth : %.3f Mbps",
948 case SUBTLV_EXT_IS_REACH_RESERVABLE_BW
:
949 if (!TTEST2(*tptr
,4))
951 j
= EXTRACT_32BITS(tptr
);
953 printf("%sReservable link bandwidth: %.3f Mbps",
957 case SUBTLV_EXT_IS_REACH_UNRESERVED_BW
:
958 printf("%sUnreserved bandwidth:",lf
);
959 for (i
= 0; i
< 8; i
++) {
960 if (!TTEST2(*(tptr
+i
*4),4))
962 j
= EXTRACT_32BITS(tptr
);
964 printf("%s priority level %d: %.3f Mbps",
970 case SUBTLV_EXT_IS_REACH_TE_METRIC
:
971 if (!TTEST2(*tptr
,3))
973 printf("%sTraffic Engineering Metric: %d",
975 EXTRACT_24BITS(tptr
));
977 case SUBTLV_EXT_IS_REACH_IPV4_INTF_ADDR
:
978 if (!TTEST2(*tptr
,4))
980 printf("%sIPv4 interface address: %s",
982 ipaddr_string(tptr
));
984 case SUBTLV_EXT_IS_REACH_IPV4_NEIGHBOR_ADDR
:
985 if (!TTEST2(*tptr
,4))
987 printf("%sIPv4 neighbor address: %s",
989 ipaddr_string(tptr
));
991 case SUBTLV_EXT_IS_REACH_LINK_PROTECTION_TYPE
:
992 if (!TTEST2(*tptr
,2))
995 j
= (ISIS_8BIT_MASK(*tptr
)); /* fetch the typecode and make sure
996 that no high-order LSBs are set */
997 printf("%sLink Protection Type: %s",
1000 /* scan through the bits until the typecode is zero */
1002 printf("%s", isis_gmpls_link_prot_values
[i
]);
1004 if (j
) /*any other bit set ?*/
1008 printf(", Priority %u", *(tptr
+1));
1010 case SUBTLV_EXT_IS_REACH_INTF_SW_CAP_DESCR
:
1011 printf("%sInterface Switching Capability",lf
);
1013 if (!TTEST2(*tptr
,1))
1015 printf("%s Interface Switching Capability:%s",
1017 tok2str(isis_gmpls_sw_cap_values
, "Unknown", *(tptr
)));
1019 if (!TTEST2(*(tptr
+1),1))
1021 printf(", LSP Encoding: %s",
1022 tok2str(isis_gmpls_lsp_enc_values
, "Unknown", *(tptr
+1)));
1024 if (!TTEST2(*(tptr
+2),2)) /* skip 2 res. bytes */
1027 printf("%s Max LSP Bandwidth:",lf
);
1028 for (i
= 0; i
< 8; i
++) {
1029 if (!TTEST2(*(tptr
+(i
*4)+4),4))
1031 j
= EXTRACT_32BITS(tptr
);
1032 memcpy (&bw
, &j
, 4);
1033 printf("%s priority level %d: %.3f Mbps",
1039 /* there is some optional stuff left to decode but this is as of yet
1040 not specified so just lets hexdump what is left */
1042 if(!print_unknown_data(tptr
,"\n\t\t ",
1052 printf("%sReserved for cisco specific extensions, type %d, length %d",
1058 printf("%sReserved for future expansion, type %d, length %d",
1064 printf("%sunknown subTLV, type %d, length %d",
1068 if(!print_unknown_data(tptr
,"\n\t\t ",
1076 printf("%spacket exceeded snapshot",lf
);
1083 * Decode IS-IS packets. Return 0 on error.
1086 static int isis_print (const u_char
*p
, u_int length
)
1088 const struct isis_common_header
*header
;
1090 const struct isis_iih_lan_header
*header_iih_lan
;
1091 const struct isis_iih_ptp_header
*header_iih_ptp
;
1092 const struct isis_lsp_header
*header_lsp
;
1093 const struct isis_csnp_header
*header_csnp
;
1094 const struct isis_psnp_header
*header_psnp
;
1096 const struct isis_tlv_lsp
*tlv_lsp
;
1097 const struct isis_tlv_ptp_adj
*tlv_ptp_adj
;
1098 const struct isis_tlv_is_reach
*tlv_is_reach
;
1099 const struct isis_tlv_es_reach
*tlv_es_reach
;
1101 u_char pdu_type
, max_area
, id_length
, type
, len
, tmp
, alen
, lan_alen
, prefix_len
, subl
, subt
, tslen
;
1102 const u_char
*optr
, *pptr
, *tptr
;
1103 u_short packet_len
,pdu_len
,time_remain
;
1104 u_int i
,j
,bit_length
,byte_length
,metric
,ra
,rr
;
1105 u_char prefix
[4]; /* copy buffer for ipv4 prefixes */
1107 u_char prefix6
[16]; /* copy buffer for ipv6 prefixes */
1110 optr
= p
; /* initialize the _o_riginal pointer to the packet start -
1111 need it for parsing the checksum TLV */
1112 header
= (const struct isis_common_header
*)p
;
1114 pptr
= p
+(ISIS_COMMON_HEADER_SIZE
);
1115 header_iih_lan
= (const struct isis_iih_lan_header
*)pptr
;
1116 header_iih_ptp
= (const struct isis_iih_ptp_header
*)pptr
;
1117 header_lsp
= (const struct isis_lsp_header
*)pptr
;
1118 header_csnp
= (const struct isis_csnp_header
*)pptr
;
1119 header_psnp
= (const struct isis_psnp_header
*)pptr
;
1122 * Sanity checking of the header.
1124 if (header
->nlpid
!= NLPID_ISIS
) {
1125 printf(", coding error!");
1129 if (header
->version
!= ISIS_VERSION
) {
1130 printf(", version %d packet not supported", header
->version
);
1134 if ((header
->id_length
!= SYSTEM_ID_LEN
) && (header
->id_length
!= 0)) {
1135 printf(", system ID length of %d is not supported",
1140 if (header
->pdu_version
!= ISIS_VERSION
) {
1141 printf(", version %d packet not supported", header
->pdu_version
);
1145 max_area
= header
->max_area
;
1148 max_area
= 3; /* silly shit */
1151 printf(", bad packet -- 255 areas");
1157 id_length
= header
->id_length
;
1160 id_length
= 6; /* silly shit again */
1162 case 1: /* 1-8 are valid sys-ID lenghts */
1172 id_length
= 0; /* entirely useless */
1175 printf(", bad packet -- illegal sys-ID length (%u)", id_length
);
1180 printf("\n\thlen: %u, v: %u, pdu-v: %u, sys-id-len: %u (%u), max-area: %u (%u)",
1183 header
->pdu_version
,
1189 pdu_type
=header
->pdu_type
;
1191 /* first lets see if we know the PDU name*/
1192 printf(", pdu-type: %s",
1193 tok2str(isis_pdu_values
,
1201 if (header
->fixed_len
!= (ISIS_COMMON_HEADER_SIZE
+ISIS_IIH_LAN_HEADER_SIZE
)) {
1202 printf(", bogus fixed header length %u should be %lu",
1203 header
->fixed_len
, (unsigned long)ISIS_IIH_LAN_HEADER_SIZE
);
1207 pdu_len
=EXTRACT_16BITS(header_iih_lan
->pdu_len
);
1208 if (packet_len
>pdu_len
) {
1209 packet_len
=pdu_len
; /* do TLV decoding as long as it makes sense */
1213 TCHECK(*header_iih_lan
);
1214 printf("\n\t source-id: %s, holding time: %u, %s",
1215 isis_print_sysid(header_iih_lan
->source_id
,SYSTEM_ID_LEN
),
1216 EXTRACT_16BITS(header_iih_lan
->holding_time
),
1217 tok2str(isis_iih_circuit_type_values
,
1218 "unknown circuit type 0x%02x",
1219 header_iih_lan
->circuit_type
));
1221 printf("\n\t lan-id: %s, Priority: %u, PDU length: %u",
1222 isis_print_nodeid(header_iih_lan
->lan_id
),
1223 (header_iih_lan
->priority
) & PRIORITY_MASK
,
1226 packet_len
-= (ISIS_COMMON_HEADER_SIZE
+ISIS_IIH_LAN_HEADER_SIZE
);
1227 pptr
= p
+ (ISIS_COMMON_HEADER_SIZE
+ISIS_IIH_LAN_HEADER_SIZE
);
1231 if (header
->fixed_len
!= (ISIS_COMMON_HEADER_SIZE
+ISIS_IIH_PTP_HEADER_SIZE
)) {
1232 printf(", bogus fixed header length %u should be %lu",
1233 header
->fixed_len
, (unsigned long)ISIS_IIH_PTP_HEADER_SIZE
);
1237 pdu_len
=EXTRACT_16BITS(header_iih_ptp
->pdu_len
);
1238 if (packet_len
>pdu_len
) {
1239 packet_len
=pdu_len
; /* do TLV decoding as long as it makes sense */
1243 TCHECK(*header_iih_ptp
);
1244 printf("\n\t source-id: %s, holding time: %us, circuit-id: 0x%02x, %s, PDU length: %u",
1245 isis_print_sysid(header_iih_ptp
->source_id
,SYSTEM_ID_LEN
),
1246 EXTRACT_16BITS(header_iih_ptp
->holding_time
),
1247 header_iih_ptp
->circuit_id
,
1248 tok2str(isis_iih_circuit_type_values
,
1249 "unknown circuit type 0x%02x",
1250 header_iih_ptp
->circuit_type
),
1253 packet_len
-= (ISIS_COMMON_HEADER_SIZE
+ISIS_IIH_PTP_HEADER_SIZE
);
1254 pptr
= p
+ (ISIS_COMMON_HEADER_SIZE
+ISIS_IIH_PTP_HEADER_SIZE
);
1259 if (header
->fixed_len
!= (ISIS_COMMON_HEADER_SIZE
+ISIS_LSP_HEADER_SIZE
)) {
1260 printf(", bogus fixed header length %u should be %lu",
1261 header
->fixed_len
, (unsigned long)ISIS_LSP_HEADER_SIZE
);
1265 pdu_len
=EXTRACT_16BITS(header_lsp
->pdu_len
);
1266 if (packet_len
>pdu_len
) {
1267 packet_len
=pdu_len
; /* do TLV decoding as long as it makes sense */
1271 TCHECK(*header_lsp
);
1272 printf("\n\t lsp-id: %s, seq: 0x%08x, lifetime: %5us",
1273 isis_print_lspid(header_lsp
->lsp_id
),
1274 EXTRACT_32BITS(header_lsp
->sequence_number
),
1275 EXTRACT_16BITS(header_lsp
->remaining_lifetime
));
1276 /* verify the checksum -
1277 * checking starts at the lsp-id field
1278 * which is 12 bytes after the packet start*/
1279 printf("\n\t chksum: 0x%04x (%s), PDU length: %u",
1280 EXTRACT_16BITS(header_lsp
->checksum
),
1281 (osi_cksum(optr
+12, length
-12)) ? "incorrect" : "correct",
1284 printf(", %s", ISIS_MASK_LSP_OL_BIT(header_lsp
->typeblock
) ? "Overload bit set, " : "");
1286 if (ISIS_MASK_LSP_ATT_BITS(header_lsp
->typeblock
)) {
1287 printf("%s", ISIS_MASK_LSP_ATT_DEFAULT_BIT(header_lsp
->typeblock
) ? "default " : "");
1288 printf("%s", ISIS_MASK_LSP_ATT_DELAY_BIT(header_lsp
->typeblock
) ? "delay " : "");
1289 printf("%s", ISIS_MASK_LSP_ATT_EXPENSE_BIT(header_lsp
->typeblock
) ? "expense " : "");
1290 printf("%s", ISIS_MASK_LSP_ATT_ERROR_BIT(header_lsp
->typeblock
) ? "error " : "");
1291 printf("ATT bit set, ");
1293 printf("%s", ISIS_MASK_LSP_PARTITION_BIT(header_lsp
->typeblock
) ? "P bit set, " : "");
1294 printf("%s", tok2str(isis_lsp_istype_values
,"Unknown(0x%x)",ISIS_MASK_LSP_ISTYPE_BITS(header_lsp
->typeblock
)));
1296 packet_len
-= (ISIS_COMMON_HEADER_SIZE
+ISIS_LSP_HEADER_SIZE
);
1297 pptr
= p
+ (ISIS_COMMON_HEADER_SIZE
+ISIS_LSP_HEADER_SIZE
);
1302 if (header
->fixed_len
!= (ISIS_COMMON_HEADER_SIZE
+ISIS_CSNP_HEADER_SIZE
)) {
1303 printf(", bogus fixed header length %u should be %lu",
1304 header
->fixed_len
, (unsigned long)ISIS_CSNP_HEADER_SIZE
);
1308 pdu_len
=EXTRACT_16BITS(header_csnp
->pdu_len
);
1309 if (packet_len
>pdu_len
) {
1310 packet_len
=pdu_len
; /* do TLV decoding as long as it makes sense */
1314 TCHECK(*header_csnp
);
1315 printf("\n\t source-id: %s, PDU length: %u",
1316 isis_print_nodeid(header_csnp
->source_id
),
1318 printf("\n\t start lsp-id: %s",
1319 isis_print_lspid(header_csnp
->start_lsp_id
));
1320 printf("\n\t end lsp-id: %s",
1321 isis_print_lspid(header_csnp
->end_lsp_id
));
1323 packet_len
-= (ISIS_COMMON_HEADER_SIZE
+ISIS_CSNP_HEADER_SIZE
);
1324 pptr
= p
+ (ISIS_COMMON_HEADER_SIZE
+ISIS_CSNP_HEADER_SIZE
);
1329 if (header
->fixed_len
!= (ISIS_COMMON_HEADER_SIZE
+ISIS_PSNP_HEADER_SIZE
)) {
1330 printf("- bogus fixed header length %u should be %lu",
1331 header
->fixed_len
, (unsigned long)ISIS_PSNP_HEADER_SIZE
);
1335 pdu_len
=EXTRACT_16BITS(header_psnp
->pdu_len
);
1336 if (packet_len
>pdu_len
) {
1337 packet_len
=pdu_len
; /* do TLV decoding as long as it makes sense */
1341 TCHECK(*header_psnp
);
1342 printf("\n\t source-id: %s",
1343 isis_print_nodeid(header_psnp
->source_id
));
1345 packet_len
-= (ISIS_COMMON_HEADER_SIZE
+ISIS_PSNP_HEADER_SIZE
);
1346 pptr
= p
+ (ISIS_COMMON_HEADER_SIZE
+ISIS_PSNP_HEADER_SIZE
);
1350 if(!print_unknown_data(pptr
,"\n\t ",length
))
1356 * Now print the TLV's.
1359 while (packet_len
>= 2) {
1360 if (pptr
== snapend
) {
1364 if (!TTEST2(*pptr
, 2)) {
1365 printf("\n\t\t packet exceeded snapshot (%ld) bytes",
1366 (long)(pptr
-snapend
));
1371 tmp
=len
; /* copy temporary len & pointer to packet data */
1374 if (len
> packet_len
) {
1378 /* first lets see if we know the TLVs name*/
1379 printf("\n\t %s TLV #%u, length: %u",
1380 tok2str(isis_tlv_values
,
1386 /* now check if we have a decoder otherwise do a hexdump at the end*/
1389 if (!TTEST2(*tptr
, 1))
1392 while (tmp
&& alen
< tmp
) {
1393 printf("\n\t\tArea address (%u): %s",
1395 print_nsap(tptr
, alen
));
1398 if (tmp
==0) /* if this is the last area address do not attemt a boundary check */
1400 if (!TTEST2(*tptr
, 1))
1406 while (tmp
>= ETHER_ADDR_LEN
) {
1407 if (!TTEST2(*tptr
, ETHER_ADDR_LEN
))
1409 printf("\n\t\tIS Neighbor: %s",isis_print_sysid(tptr
,ETHER_ADDR_LEN
));
1410 tmp
-= ETHER_ADDR_LEN
;
1411 tptr
+= ETHER_ADDR_LEN
;
1415 case TLV_ISNEIGH_VARLEN
:
1416 if (!TTEST2(*tptr
, 1))
1418 lan_alen
= *tptr
++; /* LAN adress length */
1420 printf("\n\t\tLAN address length %u bytes ",lan_alen
);
1421 while (tmp
>= lan_alen
) {
1422 if (!TTEST2(*tptr
, lan_alen
))
1424 printf("\n\t\tIS Neighbor: %s",isis_print_sysid(tptr
,lan_alen
));
1433 case TLV_MT_IS_REACH
:
1435 if (!TTEST2(*tptr
, 2))
1438 tok2str(isis_mt_values
,
1439 "Reserved for IETF Consensus",
1440 ISIS_MASK_MTID(EXTRACT_16BITS(tptr
))));
1442 printf(" Topology (0x%03x)",
1443 ISIS_MASK_MTID(EXTRACT_16BITS(tptr
)));
1445 if (!TTEST2(*tptr
, NODE_ID_LEN
))
1447 printf("\n\t\t IS Neighbor: %s", isis_print_nodeid(tptr
));
1448 tptr
+=(NODE_ID_LEN
);
1449 if (!TTEST2(*tptr
, 3))
1451 printf(", Metric: %d",EXTRACT_24BITS(tptr
));
1453 if (!TTEST2(*tptr
, 1))
1456 printf(", %ssub-TLVs present",tslen
? "" : "no ");
1458 printf(" (%u)",tslen
);
1460 if (!TTEST2(*tptr
,2))
1464 if(!isis_print_is_reach_subtlv(tptr
,subt
,subl
,"\n\t\t "))
1471 tmp
-=(SYSTEM_ID_LEN
+7);
1475 case TLV_EXT_IS_REACH
:
1477 if (!TTEST2(*tptr
, NODE_ID_LEN
))
1479 printf("\n\t\tIS Neighbor: %s", isis_print_nodeid(tptr
));
1480 tptr
+=(NODE_ID_LEN
);
1482 if (!TTEST2(*tptr
, 3))
1484 printf(", Metric: %d",EXTRACT_24BITS(tptr
));
1487 if (!TTEST2(*tptr
, 1))
1489 tslen
=*(tptr
++); /* read out subTLV length */
1490 printf(", %ssub-TLVs present",tslen
? "" : "no ");
1492 printf(" (%u)",tslen
);
1494 if (!TTEST2(*tptr
,2))
1498 if(!isis_print_is_reach_subtlv(tptr
,subt
,subl
,"\n\t\t "))
1505 tmp
-=(SYSTEM_ID_LEN
+5);
1509 if (!TTEST2(*tptr
,1)) /* check if there is one byte left to read out the virtual flag */
1512 tok2str(isis_is_reach_virtual_values
,
1513 "bogus virtual flag 0x%02x",
1515 tlv_is_reach
= (const struct isis_tlv_is_reach
*)tptr
;
1516 while (tmp
>= sizeof(struct isis_tlv_is_reach
)) {
1517 if (!TTEST(*tlv_is_reach
))
1519 printf("\n\t\tIS Neighbor: %s", isis_print_nodeid(tlv_is_reach
->neighbor_nodeid
));
1520 isis_print_metric_block(&tlv_is_reach
->isis_metric_block
);
1521 tmp
-= sizeof(struct isis_tlv_is_reach
);
1527 tlv_es_reach
= (const struct isis_tlv_es_reach
*)tptr
;
1528 while (tmp
>= sizeof(struct isis_tlv_es_reach
)) {
1529 if (!TTEST(*tlv_es_reach
))
1531 printf("\n\t\tES Neighbor: %s",
1532 isis_print_sysid(tlv_es_reach
->neighbor_sysid
,SYSTEM_ID_LEN
));
1533 isis_print_metric_block(&tlv_es_reach
->isis_metric_block
);
1534 tmp
-= sizeof(struct isis_tlv_es_reach
);
1539 /* those two TLVs share the same format */
1541 case TLV_IP_REACH_EXT
:
1542 if (!isis_print_tlv_ip_reach(pptr
, len
))
1546 case TLV_MT_IP_REACH
:
1548 if (!TTEST2(*tptr
, 2))
1552 tok2str(isis_mt_values
,
1553 "Reserved for IETF Consensus",
1554 ISIS_MASK_MTID(EXTRACT_16BITS(tptr
))));
1556 printf(" Topology (0x%03x)",
1557 ISIS_MASK_MTID(EXTRACT_16BITS(tptr
)));
1560 memset (prefix
, 0, 4);
1561 if (!TTEST2(*tptr
, 4))
1563 metric
= EXTRACT_32BITS(tptr
);
1566 if (!TTEST2(*tptr
, 1)) /* fetch status byte */
1569 bit_length
= (*(tptr
)++&0x3f);
1570 byte_length
= (bit_length
+ 7) / 8; /* prefix has variable length encoding */
1572 if (!TTEST2(*tptr
, byte_length
))
1574 memcpy(prefix
,tptr
,byte_length
);
1576 printf("\n\t\tIPv4 prefix: %s/%d",
1577 ipaddr_string(prefix
),
1580 printf("\n\t\t Metric: %u, Distribution: %s",
1582 ISIS_MASK_TLV_EXT_IP_UPDOWN(j
) ? "down" : "up");
1584 printf(", %ssub-TLVs present",
1585 ISIS_MASK_TLV_EXT_IP_SUBTLV(j
) ? "" : "no ");
1587 if (ISIS_MASK_TLV_EXT_IP_SUBTLV(j
)) {
1588 /* assume that one prefix can hold more
1589 than one subTLV - therefore the first byte must reflect
1590 the aggregate bytecount of the subTLVs for this prefix
1592 if (!TTEST2(*tptr
, 1))
1596 printf(" (%u)",tslen
); /* print out subTLV length */
1599 if (!TTEST2(*tptr
,2))
1603 if(!isis_print_ip_reach_subtlv(tptr
,subt
,subl
,"\n\t\t "))
1610 tmp
-=(7+byte_length
);
1614 case TLV_EXT_IP_REACH
:
1616 memset (prefix
, 0, 4);
1617 if (!TTEST2(*tptr
, 4))
1619 metric
= EXTRACT_32BITS(tptr
);
1622 if (!TTEST2(*tptr
, 1)) /* fetch status byte */
1625 bit_length
= (*(tptr
)++&0x3f);
1626 byte_length
= (bit_length
+ 7) / 8; /* prefix has variable length encoding */
1628 if (!TTEST2(*tptr
, byte_length
))
1630 memcpy(prefix
,tptr
,byte_length
);
1632 printf("\n\t\tIPv4 prefix: %s/%d",
1633 ipaddr_string(prefix
),
1636 printf("\n\t\t Metric: %u, Distribution: %s",
1638 ISIS_MASK_TLV_EXT_IP_UPDOWN(j
) ? "down" : "up");
1640 printf(", %ssub-TLVs present",
1641 ISIS_MASK_TLV_EXT_IP_SUBTLV(j
) ? "" : "no ");
1643 if (ISIS_MASK_TLV_EXT_IP_SUBTLV(j
)) {
1644 /* assume that one prefix can hold more
1645 than one subTLV - therefore the first byte must reflect
1646 the aggregate bytecount of the subTLVs for this prefix
1648 if (!TTEST2(*tptr
, 1))
1652 printf(" (%u)",tslen
); /* print out subTLV length */
1655 if (!TTEST2(*tptr
,2))
1659 if(!isis_print_ip_reach_subtlv(tptr
,subt
,subl
,"\n\t\t "))
1666 tmp
-=(5+byte_length
);
1674 if (!TTEST2(*tptr
, 4))
1676 metric
= EXTRACT_32BITS(tptr
);
1679 if (!TTEST2(*tptr
, 2))
1682 bit_length
= (*(tptr
)++);
1683 byte_length
= (bit_length
+ 7) / 8;
1684 if (!TTEST2(*tptr
, byte_length
))
1687 memset(prefix6
, 0, 16);
1688 memcpy(prefix6
,tptr
,byte_length
);
1690 printf("\n\t\tIPv6 prefix: %s/%u",
1691 ip6addr_string(prefix6
),
1694 printf("\n\t\t Metric: %u, %s, Distribution: %s, %ssub-TLVs present",
1696 ISIS_MASK_TLV_IP6_IE(j
) ? "External" : "Internal",
1697 ISIS_MASK_TLV_IP6_UPDOWN(j
) ? "down" : "up",
1698 ISIS_MASK_TLV_IP6_SUBTLV(j
) ? "" : "no ");
1700 if (ISIS_MASK_TLV_IP6_SUBTLV(j
)) {
1701 /* assume that one prefix can hold more
1702 than one subTLV - therefore the first byte must reflect
1703 the aggregate bytecount of the subTLVs for this prefix
1705 if (!TTEST2(*tptr
, 1))
1709 printf(" (%u)",tslen
); /* print out subTLV length */
1712 if (!TTEST2(*tptr
,2))
1716 if(!isis_print_ip_reach_subtlv(tptr
,subt
,subl
,"\n\t\t "))
1723 tmp
-=(6+byte_length
);
1732 if (!TTEST2(*tptr
, 16))
1735 printf("\n\t\tIPv6 interface address: %s",
1736 ip6addr_string(tptr
));
1744 if (!TTEST2(*tptr
, 1))
1747 printf("\n\t\t%s: ",
1748 tok2str(isis_subtlv_auth_values
,
1749 "unknown Authentication type 0x%02x",
1753 case SUBTLV_AUTH_SIMPLE
:
1754 for(i
=1;i
<len
;i
++) {
1755 if (!TTEST2(*(tptr
+i
), 1))
1757 printf("%c",*(tptr
+i
));
1760 case SUBTLV_AUTH_MD5
:
1761 for(i
=1;i
<len
;i
++) {
1762 if (!TTEST2(*(tptr
+i
), 1))
1764 printf("%02x",*(tptr
+i
));
1766 if (len
!= SUBTLV_AUTH_MD5_LEN
+1)
1767 printf(", (malformed subTLV) ");
1769 case SUBTLV_AUTH_PRIVATE
:
1771 if(!print_unknown_data(tptr
+1,"\n\t\t ",len
-1))
1778 tlv_ptp_adj
= (const struct isis_tlv_ptp_adj
*)tptr
;
1780 if (!TTEST2(*tptr
, 1))
1782 printf("\n\t\tAdjacency State: %s",
1783 tok2str(isis_ptp_adjancey_values
, "0x%02x", *tptr
));
1786 if(tmp
>sizeof(tlv_ptp_adj
->extd_local_circuit_id
)) {
1787 if (!TTEST2(tlv_ptp_adj
->extd_local_circuit_id
,
1788 sizeof(tlv_ptp_adj
->extd_local_circuit_id
)))
1790 printf("\n\t\tExtended Local circuit ID: 0x%08x",
1791 EXTRACT_32BITS(tlv_ptp_adj
->extd_local_circuit_id
));
1792 tmp
-=sizeof(tlv_ptp_adj
->extd_local_circuit_id
);
1794 if(tmp
>=SYSTEM_ID_LEN
) {
1795 if (!TTEST2(tlv_ptp_adj
->neighbor_sysid
, SYSTEM_ID_LEN
))
1797 printf("\n\t\tNeighbor SystemID: %s",
1798 isis_print_sysid(tlv_ptp_adj
->neighbor_sysid
,SYSTEM_ID_LEN
));
1801 if(tmp
>=sizeof(tlv_ptp_adj
->neighbor_extd_local_circuit_id
)) {
1802 if (!TTEST2(tlv_ptp_adj
->neighbor_extd_local_circuit_id
,
1803 sizeof(tlv_ptp_adj
->neighbor_extd_local_circuit_id
)))
1805 printf("\n\t\tNeighbor Extended Local circuit ID: 0x%08x",
1806 EXTRACT_32BITS(tlv_ptp_adj
->neighbor_extd_local_circuit_id
));
1811 printf("\n\t\tNLPID(s): ");
1813 if (!TTEST2(*(tptr
), 1))
1816 tok2str(isis_nlpid_values
,
1819 if (tmp
>1) /* further NPLIDs ? - put comma */
1825 case TLV_TE_ROUTER_ID
:
1826 if (!TTEST2(*pptr
, 4))
1828 printf("\n\t\tTraffic Engineering Router ID: %s", ipaddr_string(pptr
));
1833 if (!TTEST2(*tptr
, 4))
1835 printf("\n\t\tIPv4 interface address: %s", ipaddr_string(tptr
));
1842 printf("\n\t\tHostname: ");
1844 if (!TTEST2(*tptr
, 1))
1846 printf("%c",*tptr
++);
1851 case TLV_SHARED_RISK_GROUP
:
1852 if (!TTEST2(*tptr
, NODE_ID_LEN
))
1854 printf("\n\t\tIS Neighbor: %s", isis_print_nodeid(tptr
));
1855 tptr
+=(NODE_ID_LEN
);
1858 if (!TTEST2(*tptr
, 1))
1860 printf(", %s", ISIS_MASK_TLV_SHARED_RISK_GROUP(*tptr
++) ? "numbered" : "unnumbered");
1863 if (!TTEST2(*tptr
,4))
1865 printf("\n\t\tIPv4 interface address: %s", ipaddr_string(tptr
));
1869 if (!TTEST2(*tptr
,4))
1871 printf("\n\t\tIPv4 neighbor address: %s", ipaddr_string(tptr
));
1876 if (!TTEST2(*tptr
, 4))
1878 printf("\n\t\tLink-ID: 0x%08x", EXTRACT_32BITS(tptr
));
1885 tlv_lsp
= (const struct isis_tlv_lsp
*)tptr
;
1887 printf("\n\t\tlsp-id: %s",
1888 isis_print_nodeid(tlv_lsp
->lsp_id
));
1889 if (!TTEST((tlv_lsp
->lsp_id
)[NODE_ID_LEN
]))
1891 printf("-%02x",(tlv_lsp
->lsp_id
)[NODE_ID_LEN
]);
1892 if (!TTEST2(tlv_lsp
->sequence_number
, 4))
1894 printf(", seq: 0x%08x",EXTRACT_32BITS(tlv_lsp
->sequence_number
));
1895 if (!TTEST2(tlv_lsp
->remaining_lifetime
, 2))
1897 printf(", lifetime: %5ds",EXTRACT_16BITS(tlv_lsp
->remaining_lifetime
));
1898 if (!TTEST2(tlv_lsp
->checksum
, 2))
1900 printf(", chksum: 0x%04x",EXTRACT_16BITS(tlv_lsp
->checksum
));
1901 tmp
-=sizeof(struct isis_tlv_lsp
);
1907 if (!TTEST2(*tptr
, 2))
1909 printf("\n\t\tchecksum: 0x%04x (%s)",
1910 EXTRACT_16BITS(tptr
),
1911 (osi_cksum(optr
, length
)) ? "incorrect" : "correct");
1914 case TLV_MT_SUPPORTED
:
1916 /* length can only be a multiple of 2, otherwise there is
1917 something broken -> so decode down until length is 1 */
1919 if (!TTEST2(*tptr
, 2))
1922 tok2str(isis_mt_values
,
1923 "Reserved for IETF Consensus",
1924 ISIS_MASK_MTID(EXTRACT_16BITS(tptr
))));
1926 printf(" Topology (0x%03x)%s%s",
1927 ISIS_MASK_MTID(EXTRACT_16BITS(tptr
)),
1928 ISIS_MASK_MTSUB(EXTRACT_16BITS(tptr
)) ? "" : ", no sub-TLVs present",
1929 ISIS_MASK_MTATT(EXTRACT_16BITS(tptr
)) ? ", ATT bit set" : "" );
1931 printf("\n\t\tmalformed MT-ID");
1939 case TLV_RESTART_SIGNALING
:
1940 if (!TTEST2(*tptr
, 3))
1942 rr
= ISIS_MASK_TLV_RESTART_RR(*tptr
);
1943 ra
= ISIS_MASK_TLV_RESTART_RA(*tptr
);
1945 time_remain
= EXTRACT_16BITS(tptr
);
1946 printf("\n\t\tRestart Request bit %s, Restart Acknowledgement bit %s\n\t\tRemaining holding time: %us",
1947 rr
? "set" : "clear", ra
? "set" : "clear", time_remain
);
1951 if (!TTEST2(*tptr
, 1))
1953 printf("\n\t\tInter-Domain Information Type: %s",
1954 tok2str(isis_subtlv_idrp_values
,
1958 case SUBTLV_IDRP_ASN
:
1959 if (!TTEST2(*tptr
, 2)) /* fetch AS number */
1961 printf("AS Number: %u",EXTRACT_16BITS(tptr
));
1963 case SUBTLV_IDRP_LOCAL
:
1964 case SUBTLV_IDRP_RES
:
1966 if(!print_unknown_data(tptr
,"\n\t\t",len
-1))
1972 case TLV_LSP_BUFFERSIZE
:
1973 if (!TTEST2(*tptr
, 2))
1975 printf("LSP Buffersize: %u",EXTRACT_16BITS(tptr
));
1979 while (tmp
>= SYSTEM_ID_LEN
) {
1980 if (!TTEST2(*tptr
, SYSTEM_ID_LEN
))
1982 printf("%s",isis_print_sysid(tptr
,SYSTEM_ID_LEN
));
1983 tptr
+=SYSTEM_ID_LEN
;
1988 case TLV_PREFIX_NEIGH
:
1989 if (!TTEST2(*tptr
, sizeof(struct isis_metric_block
)))
1991 printf("Metric Block");
1992 isis_print_metric_block((const struct isis_metric_block
*)tptr
);
1993 tptr
+=sizeof(struct isis_metric_block
);
1994 tmp
-=sizeof(struct isis_metric_block
);
1997 if (!TTEST2(*tptr
, 1))
1999 prefix_len
=*tptr
++; /* read out prefix length in semioctets*/
2001 if (!TTEST2(*tptr
, prefix_len
/2))
2003 printf("\n\t\tAddress: %s/%u",
2004 print_nsap(tptr
,prefix_len
/2),
2012 * FIXME those are the defined TLVs that lack a decoder
2013 * you are welcome to contribute code ;-)
2016 case TLV_IS_ALIAS_ID
:
2017 case TLV_DECNET_PHASE4
:
2018 case TLV_LUCENT_PRIVATE
:
2020 case TLV_NORTEL_PRIVATE1
:
2021 case TLV_NORTEL_PRIVATE2
:
2022 case TLV_MT_IP6_REACH
:
2025 if(!print_unknown_data(pptr
,"\n\t\t",len
))
2034 if (packet_len
!= 0) {
2035 printf("\n\t\t %d straggler bytes", packet_len
);
2040 fputs("[|isis]", stdout
);
2044 printf("\n\t\t packet exceeded snapshot");
2049 * Verify the checksum. See 8473-1, Appendix C, section C.4.
2053 osi_cksum(const u_char
*tptr
, u_int len
)
2055 int32_t c0
= 0, c1
= 0;
2057 while ((int)--len
>= 0) {