12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1992, 1993, 1994, 1995, 1996
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2)
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement:
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California,
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission.
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Original code by Matt Thomas, Digital Equipment Corporation
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Extensively modified by Hannes Gredler (hannes@juniper.net) for more
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * complete IS-IS & CLNP support.
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/print-isoclns.c,v 1.133.2.25 2007/03/02 09:20:27 hannes Exp $ (LBL)";
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ethertype.h"
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ether.h"
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "nlpid.h"
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "gmpls.h"
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "oui.h"
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IPV4            1       /* AFI value */
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IPV6            2       /* AFI value */
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IS-IS is defined in ISO 10589.  Look there for protocol definitions.
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SYSTEM_ID_LEN	ETHER_ADDR_LEN
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NODE_ID_LEN     SYSTEM_ID_LEN+1
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LSP_ID_LEN      SYSTEM_ID_LEN+2
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_VERSION	1
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ESIS_VERSION	1
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_VERSION	1
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PDU_TYPE_MASK      0x1F
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ESIS_PDU_TYPE_MASK      0x1F
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_PDU_TYPE_MASK      0x1F
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_FLAG_MASK          0xE0
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_LAN_PRIORITY_MASK  0x7F
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PDU_L1_LAN_IIH	15
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PDU_L2_LAN_IIH	16
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PDU_PTP_IIH	17
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PDU_L1_LSP       	18
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PDU_L2_LSP       	20
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PDU_L1_CSNP  	24
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PDU_L2_CSNP  	25
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PDU_L1_PSNP        26
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PDU_L2_PSNP        27
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok isis_pdu_values[] = {
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_PDU_L1_LAN_IIH,       "L1 Lan IIH"},
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_PDU_L2_LAN_IIH,       "L2 Lan IIH"},
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_PDU_PTP_IIH,          "p2p IIH"},
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_PDU_L1_LSP,           "L1 LSP"},
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_PDU_L2_LSP,           "L2 LSP"},
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_PDU_L1_CSNP,          "L1 CSNP"},
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_PDU_L2_CSNP,          "L2 CSNP"},
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_PDU_L1_PSNP,          "L1 PSNP"},
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_PDU_L2_PSNP,          "L2 PSNP"},
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * A TLV is a tuple of a type, length and a value and is normally used for
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * encoding information in all sorts of places.  This is an enumeration of
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the well known types.
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * list taken from rfc3359 plus some memory from veterans ;-)
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_AREA_ADDR           1   /* iso10589 */
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_IS_REACH            2   /* iso10589 */
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_ESNEIGH             3   /* iso10589 */
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_PART_DIS            4   /* iso10589 */
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_PREFIX_NEIGH        5   /* iso10589 */
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_ISNEIGH             6   /* iso10589 */
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_ISNEIGH_VARLEN      7   /* iso10589 */
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_PADDING             8   /* iso10589 */
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_LSP                 9   /* iso10589 */
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_AUTH                10  /* iso10589, rfc3567 */
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_CHECKSUM            12  /* rfc3358 */
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_CHECKSUM_MINLEN 2
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_LSP_BUFFERSIZE      14  /* iso10589 rev2 */
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_LSP_BUFFERSIZE_MINLEN 2
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_EXT_IS_REACH        22  /* draft-ietf-isis-traffic-05 */
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_IS_ALIAS_ID         24  /* draft-ietf-isis-ext-lsp-frags-02 */
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_DECNET_PHASE4       42
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_LUCENT_PRIVATE      66
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_INT_IP_REACH        128 /* rfc1195, rfc2966 */
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_PROTOCOLS           129 /* rfc1195 */
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_EXT_IP_REACH        130 /* rfc1195, rfc2966 */
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_IDRP_INFO           131 /* rfc1195 */
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_IDRP_INFO_MINLEN      1
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_IPADDR              132 /* rfc1195 */
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_IPAUTH              133 /* rfc1195 */
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_TE_ROUTER_ID        134 /* draft-ietf-isis-traffic-05 */
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_EXTD_IP_REACH       135 /* draft-ietf-isis-traffic-05 */
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_HOSTNAME            137 /* rfc2763 */
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_SHARED_RISK_GROUP   138 /* draft-ietf-isis-gmpls-extensions */
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_NORTEL_PRIVATE1     176
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_NORTEL_PRIVATE2     177
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_RESTART_SIGNALING   211 /* rfc3847 */
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_RESTART_SIGNALING_FLAGLEN 1
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN 2
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_MT_IS_REACH         222 /* draft-ietf-isis-wg-multi-topology-05 */
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_MT_SUPPORTED        229 /* draft-ietf-isis-wg-multi-topology-05 */
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_MT_SUPPORTED_MINLEN 2
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_IP6ADDR             232 /* draft-ietf-isis-ipv6-02 */
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_MT_IP_REACH         235 /* draft-ietf-isis-wg-multi-topology-05 */
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_IP6_REACH           236 /* draft-ietf-isis-ipv6-02 */
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_MT_IP6_REACH        237 /* draft-ietf-isis-wg-multi-topology-05 */
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_PTP_ADJ             240 /* rfc3373 */
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_IIH_SEQNR           241 /* draft-shen-isis-iih-sequence-00 */
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_IIH_SEQNR_MINLEN 4
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_VENDOR_PRIVATE      250 /* draft-ietf-isis-experimental-tlv-01 */
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_TLV_VENDOR_PRIVATE_MINLEN 3
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok isis_tlv_values[] = {
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_AREA_ADDR,	   "Area address(es)"},
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_IS_REACH,           "IS Reachability"},
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_ESNEIGH,            "ES Neighbor(s)"},
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_PART_DIS,           "Partition DIS"},
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_PREFIX_NEIGH,       "Prefix Neighbors"},
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_ISNEIGH,            "IS Neighbor(s)"},
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_ISNEIGH_VARLEN,     "IS Neighbor(s) (variable length)"},
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_PADDING,            "Padding"},
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_LSP,                "LSP entries"},
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_AUTH,               "Authentication"},
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_CHECKSUM,           "Checksum"},
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_LSP_BUFFERSIZE,     "LSP Buffersize"},
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_EXT_IS_REACH,       "Extended IS Reachability"},
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_IS_ALIAS_ID,        "IS Alias ID"},
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_DECNET_PHASE4,      "DECnet Phase IV"},
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_LUCENT_PRIVATE,     "Lucent Proprietary"},
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_INT_IP_REACH,       "IPv4 Internal Reachability"},
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_PROTOCOLS,          "Protocols supported"},
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_EXT_IP_REACH,       "IPv4 External Reachability"},
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_IDRP_INFO,          "Inter-Domain Information Type"},
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_IPADDR,             "IPv4 Interface address(es)"},
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_IPAUTH,             "IPv4 authentication (deprecated)"},
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_TE_ROUTER_ID,       "Traffic Engineering Router ID"},
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_EXTD_IP_REACH,      "Extended IPv4 Reachability"},
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_SHARED_RISK_GROUP,  "Shared Risk Link Group"},
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_NORTEL_PRIVATE1,    "Nortel Proprietary"},
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_NORTEL_PRIVATE2,    "Nortel Proprietary"},
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_HOSTNAME,           "Hostname"},
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_RESTART_SIGNALING,  "Restart Signaling"},
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_MT_IS_REACH,        "Multi Topology IS Reachability"},
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_MT_SUPPORTED,       "Multi Topology"},
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_IP6ADDR,            "IPv6 Interface address(es)"},
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_MT_IP_REACH,        "Multi-Topology IPv4 Reachability"},
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_IP6_REACH,          "IPv6 reachability"},
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_MT_IP6_REACH,       "Multi-Topology IP6 Reachability"},
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_PTP_ADJ,            "Point-to-point Adjacency State"},
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_IIH_SEQNR,          "Hello PDU Sequence Number"},
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_TLV_VENDOR_PRIVATE,     "Vendor Private"},
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ESIS_OPTION_PROTOCOLS        129
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ESIS_OPTION_QOS_MAINTENANCE  195 /* iso9542 */
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ESIS_OPTION_SECURITY         197 /* iso9542 */
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ESIS_OPTION_ES_CONF_TIME     198 /* iso9542 */
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ESIS_OPTION_PRIORITY         205 /* iso9542 */
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ESIS_OPTION_ADDRESS_MASK     225 /* iso9542 */
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ESIS_OPTION_SNPA_MASK        226 /* iso9542 */
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok esis_option_values[] = {
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ESIS_OPTION_PROTOCOLS,       "Protocols supported"},
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ESIS_OPTION_QOS_MAINTENANCE, "QoS Maintenance" },
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ESIS_OPTION_SECURITY,        "Security" },
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ESIS_OPTION_ES_CONF_TIME,    "ES Configuration Time" },
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ESIS_OPTION_PRIORITY,        "Priority" },
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ESIS_OPTION_ADDRESS_MASK,    "Addressk Mask" },
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ESIS_OPTION_SNPA_MASK,       "SNPA Mask" },
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_OPTION_DISCARD_REASON   193
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_OPTION_QOS_MAINTENANCE  195 /* iso8473 */
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_OPTION_SECURITY         197 /* iso8473 */
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_OPTION_SOURCE_ROUTING   200 /* iso8473 */
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_OPTION_ROUTE_RECORDING  203 /* iso8473 */
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_OPTION_PADDING          204 /* iso8473 */
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_OPTION_PRIORITY         205 /* iso8473 */
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_option_values[] = {
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_OPTION_DISCARD_REASON,  "Discard Reason"},
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_OPTION_PRIORITY,        "Priority"},
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_OPTION_QOS_MAINTENANCE, "QoS Maintenance"},
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_OPTION_SECURITY, "Security"},
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_OPTION_SOURCE_ROUTING, "Source Routing"},
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_OPTION_ROUTE_RECORDING, "Route Recording"},
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_OPTION_PADDING, "Padding"},
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_option_rfd_class_values[] = {
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x0, "General"},
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x8, "Address"},
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x9, "Source Routeing"},
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0xa, "Lifetime"},
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0xb, "PDU Discarded"},
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0xc, "Reassembly"},
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_option_rfd_general_values[] = {
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x0, "Reason not specified"},
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x1, "Protocol procedure error"},
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x2, "Incorrect checksum"},
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x3, "PDU discarded due to congestion"},
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x4, "Header syntax error (cannot be parsed)"},
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x5, "Segmentation needed but not permitted"},
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x6, "Incomplete PDU received"},
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x7, "Duplicate option"},
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_option_rfd_address_values[] = {
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x0, "Destination address unreachable"},
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x1, "Destination address unknown"},
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_option_rfd_source_routeing_values[] = {
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x0, "Unspecified source routeing error"},
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x1, "Syntax error in source routeing field"},
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x2, "Unknown address in source routeing field"},
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x3, "Path not acceptable"},
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_option_rfd_lifetime_values[] = {
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x0, "Lifetime expired while data unit in transit"},
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x1, "Lifetime expired during reassembly"},
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_option_rfd_pdu_discard_values[] = {
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x0, "Unsupported option not specified"},
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x1, "Unsupported protocol version"},
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x2, "Unsupported security option"},
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x3, "Unsupported source routeing option"},
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x4, "Unsupported recording of route option"},
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_option_rfd_reassembly_values[] = {
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x0, "Reassembly interference"},
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* array of 16 error-classes */
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok *clnp_option_rfd_error_class[] = {
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    clnp_option_rfd_general_values,
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    clnp_option_rfd_address_values,
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    clnp_option_rfd_source_routeing_values,
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    clnp_option_rfd_lifetime_values,
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    clnp_option_rfd_pdu_discard_values,
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    clnp_option_rfd_reassembly_values,
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_OPTION_OPTION_QOS_MASK 0x3f
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_OPTION_SCOPE_MASK      0xc0
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_OPTION_SCOPE_SA_SPEC   0x40
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_OPTION_SCOPE_DA_SPEC   0x80
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_OPTION_SCOPE_GLOBAL    0xc0
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_option_scope_values[] = {
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_OPTION_SCOPE_SA_SPEC, "Source Address Specific"},
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_OPTION_SCOPE_DA_SPEC, "Destination Address Specific"},
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_OPTION_SCOPE_GLOBAL, "Globally unique"},
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_option_sr_rr_values[] = {
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x0, "partial"},
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x1, "complete"},
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_option_sr_rr_string_values[] = {
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_OPTION_SOURCE_ROUTING, "source routing"},
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_OPTION_ROUTE_RECORDING, "recording of route in progress"},
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_option_qos_global_values[] = {
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x20, "reserved"},
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x10, "sequencing vs. delay"},
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x08, "congested"},
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x04, "delay vs. cost"},
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x02, "error vs. delay"},
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x01, "error vs. cost"},
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXT_IS_REACH_ADMIN_GROUP           3 /* draft-ietf-isis-traffic-05 */
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXT_IS_REACH_LINK_LOCAL_REMOTE_ID  4 /* draft-ietf-isis-gmpls-extensions */
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXT_IS_REACH_LINK_REMOTE_ID        5 /* draft-ietf-isis-traffic-05 */
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXT_IS_REACH_IPV4_INTF_ADDR        6 /* draft-ietf-isis-traffic-05 */
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXT_IS_REACH_IPV4_NEIGHBOR_ADDR    8 /* draft-ietf-isis-traffic-05 */
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXT_IS_REACH_MAX_LINK_BW           9 /* draft-ietf-isis-traffic-05 */
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXT_IS_REACH_RESERVABLE_BW        10 /* draft-ietf-isis-traffic-05 */
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXT_IS_REACH_UNRESERVED_BW        11 /* rfc4124 */
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS_OLD   12 /* draft-ietf-tewg-diff-te-proto-06 */
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXT_IS_REACH_TE_METRIC            18 /* draft-ietf-isis-traffic-05 */
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXT_IS_REACH_LINK_PROTECTION_TYPE 20 /* draft-ietf-isis-gmpls-extensions */
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXT_IS_REACH_INTF_SW_CAP_DESCR    21 /* draft-ietf-isis-gmpls-extensions */
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS       22 /* rfc4124 */
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok isis_ext_is_reach_subtlv_values[] = {
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXT_IS_REACH_ADMIN_GROUP,            "Administrative groups" },
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXT_IS_REACH_LINK_LOCAL_REMOTE_ID,   "Link Local/Remote Identifier" },
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXT_IS_REACH_LINK_REMOTE_ID,         "Link Remote Identifier" },
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXT_IS_REACH_IPV4_INTF_ADDR,         "IPv4 interface address" },
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXT_IS_REACH_IPV4_NEIGHBOR_ADDR,     "IPv4 neighbor address" },
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXT_IS_REACH_MAX_LINK_BW,            "Maximum link bandwidth" },
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXT_IS_REACH_RESERVABLE_BW,          "Reservable link bandwidth" },
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXT_IS_REACH_UNRESERVED_BW,          "Unreserved bandwidth" },
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXT_IS_REACH_TE_METRIC,              "Traffic Engineering Metric" },
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXT_IS_REACH_LINK_PROTECTION_TYPE,   "Link Protection Type" },
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXT_IS_REACH_INTF_SW_CAP_DESCR,      "Interface Switching Capability" },
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS_OLD,     "Bandwidth Constraints (old)" },
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS,         "Bandwidth Constraints" },
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 250,                                             "Reserved for cisco specific extensions" },
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 251,                                             "Reserved for cisco specific extensions" },
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 252,                                             "Reserved for cisco specific extensions" },
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 253,                                             "Reserved for cisco specific extensions" },
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 254,                                             "Reserved for cisco specific extensions" },
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 255,                                             "Reserved for future expansion" },
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG32          1 /* draft-ietf-isis-admin-tags-01 */
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG64          2 /* draft-ietf-isis-admin-tags-01 */
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_EXTD_IP_REACH_MGMT_PREFIX_COLOR  117 /* draft-ietf-isis-wg-multi-topology-05 */
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok isis_ext_ip_reach_subtlv_values[] = {
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG32,           "32-Bit Administrative tag" },
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG64,           "64-Bit Administrative tag" },
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_EXTD_IP_REACH_MGMT_PREFIX_COLOR,     "Management Prefix Color" },
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_AUTH_SIMPLE        1
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_AUTH_MD5          54
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_AUTH_MD5_LEN      16
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_AUTH_PRIVATE     255
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok isis_subtlv_auth_values[] = {
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_AUTH_SIMPLE,	"simple text password"},
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_AUTH_MD5,	"HMAC-MD5 password"},
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_AUTH_PRIVATE,	"Routing Domain private password"},
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_IDRP_RES           0
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_IDRP_LOCAL         1
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_SUBTLV_IDRP_ASN           2
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok isis_subtlv_idrp_values[] = {
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_IDRP_RES,         "Reserved"},
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_IDRP_LOCAL,       "Routing-Domain Specific"},
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_SUBTLV_IDRP_ASN,         "AS Number Tag"},
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_SEGMENT_PART  0x80
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_MORE_SEGMENTS 0x40
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CLNP_REQUEST_ER    0x20
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_flag_values[] = {
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_SEGMENT_PART, "Segmentation permitted"},
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_MORE_SEGMENTS, "more Segments"},
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_REQUEST_ER, "request Error Report"},
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_LSP_OL_BIT(x)            ((x)&0x4)
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_LSP_ISTYPE_BITS(x)       ((x)&0x3)
4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_LSP_PARTITION_BIT(x)     ((x)&0x80)
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_LSP_ATT_BITS(x)          ((x)&0x78)
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_LSP_ATT_ERROR_BIT(x)     ((x)&0x40)
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_LSP_ATT_EXPENSE_BIT(x)   ((x)&0x20)
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_LSP_ATT_DELAY_BIT(x)     ((x)&0x10)
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_LSP_ATT_DEFAULT_BIT(x)   ((x)&0x8)
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_MTID(x)                  ((x)&0x0fff)
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_MTFLAGS(x)               ((x)&0xf000)
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok isis_mt_flag_values[] = {
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x4000,                  "sub-TLVs present"},
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x8000,                  "ATT bit set"},
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_TLV_EXTD_IP_UPDOWN(x)     ((x)&0x80)
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_TLV_EXTD_IP_SUBTLV(x)     ((x)&0x40)
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_TLV_EXTD_IP6_IE(x)        ((x)&0x40)
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_TLV_EXTD_IP6_SUBTLV(x)    ((x)&0x20)
4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_LSP_TLV_METRIC_SUPPORTED(x)   ((x)&0x80)
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_LSP_TLV_METRIC_IE(x)          ((x)&0x40)
4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_LSP_TLV_METRIC_UPDOWN(x)      ((x)&0x80)
4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_LSP_TLV_METRIC_VALUE(x)	   ((x)&0x3f)
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_MASK_TLV_SHARED_RISK_GROUP(x) ((x)&0x1)
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok isis_mt_values[] = {
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0,    "IPv4 unicast"},
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 1,    "In-Band Management"},
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 2,    "IPv6 unicast"},
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 3,    "Multicast"},
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 4095, "Development, Experimental or Proprietary"},
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok isis_iih_circuit_type_values[] = {
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 1,    "Level 1 only"},
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 2,    "Level 2 only"},
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 3,    "Level 1, Level 2"},
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_LSP_TYPE_UNUSED0   0
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_LSP_TYPE_LEVEL_1   1
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_LSP_TYPE_UNUSED2   2
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_LSP_TYPE_LEVEL_2   3
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok isis_lsp_istype_values[] = {
4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_LSP_TYPE_UNUSED0,	"Unused 0x0 (invalid)"},
4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_LSP_TYPE_LEVEL_1,	"L1 IS"},
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_LSP_TYPE_UNUSED2,	"Unused 0x2 (invalid)"},
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_LSP_TYPE_LEVEL_2,	"L2 IS"},
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Katz's point to point adjacency TLV uses codes to tell us the state of
4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the remote adjacency.  Enumerate them.
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PTP_ADJ_UP   0
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PTP_ADJ_INIT 1
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PTP_ADJ_DOWN 2
4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok isis_ptp_adjancey_values[] = {
4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_PTP_ADJ_UP,    "Up" },
4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_PTP_ADJ_INIT,  "Initializing" },
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ISIS_PTP_ADJ_DOWN,  "Down" },
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct isis_tlv_ptp_adj {
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t adjacency_state;
5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t extd_local_circuit_id[4];
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t neighbor_sysid[SYSTEM_ID_LEN];
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t neighbor_extd_local_circuit_id[4];
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int osi_cksum(const u_int8_t *, u_int);
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int clnp_print(const u_int8_t *, u_int);
5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void esis_print(const u_int8_t *, u_int);
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int isis_print(const u_int8_t *, u_int);
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct isis_metric_block {
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t metric_default;
5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t metric_delay;
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t metric_expense;
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t metric_error;
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct isis_tlv_is_reach {
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    struct isis_metric_block isis_metric_block;
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t neighbor_nodeid[NODE_ID_LEN];
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct isis_tlv_es_reach {
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    struct isis_metric_block isis_metric_block;
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t neighbor_sysid[SYSTEM_ID_LEN];
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct isis_tlv_ip_reach {
5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    struct isis_metric_block isis_metric_block;
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t prefix[4];
5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t mask[4];
5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok isis_is_reach_virtual_values[] = {
5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0,    "IsNotVirtual"},
5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 1,    "IsVirtual"},
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok isis_restart_flag_values[] = {
5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x1,  "Restart Request"},
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x2,  "Restart Acknowledgement"},
5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x4,  "Suppress adjacency advertisement"},
5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct isis_common_header {
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t nlpid;
5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t fixed_len;
5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t version;			/* Protocol version */
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t id_length;
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t pdu_type;		        /* 3 MSbits are reserved */
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t pdu_version;		/* Packet format version */
5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t reserved;
5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t max_area;
5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct isis_iih_lan_header {
5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t circuit_type;
5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t source_id[SYSTEM_ID_LEN];
5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t holding_time[2];
5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t pdu_len[2];
5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t priority;
5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t lan_id[NODE_ID_LEN];
5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct isis_iih_ptp_header {
5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t circuit_type;
5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t source_id[SYSTEM_ID_LEN];
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t holding_time[2];
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t pdu_len[2];
5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t circuit_id;
5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct isis_lsp_header {
5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t pdu_len[2];
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t remaining_lifetime[2];
5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t lsp_id[LSP_ID_LEN];
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t sequence_number[4];
5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t checksum[2];
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t typeblock;
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct isis_csnp_header {
5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t pdu_len[2];
5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t source_id[NODE_ID_LEN];
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t start_lsp_id[LSP_ID_LEN];
5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t end_lsp_id[LSP_ID_LEN];
5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct isis_psnp_header {
5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t pdu_len[2];
5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t source_id[NODE_ID_LEN];
5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct isis_tlv_lsp {
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t remaining_lifetime[2];
5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t lsp_id[LSP_ID_LEN];
5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t sequence_number[4];
5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t checksum[2];
6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_COMMON_HEADER_SIZE (sizeof(struct isis_common_header))
6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_IIH_LAN_HEADER_SIZE (sizeof(struct isis_iih_lan_header))
6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_IIH_PTP_HEADER_SIZE (sizeof(struct isis_iih_ptp_header))
6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_LSP_HEADER_SIZE (sizeof(struct isis_lsp_header))
6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_CSNP_HEADER_SIZE (sizeof(struct isis_csnp_header))
6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISIS_PSNP_HEADER_SIZE (sizeof(struct isis_psnp_header))
6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid isoclns_print(const u_int8_t *p, u_int length, u_int caplen)
6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct isis_common_header *header;
6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	header = (const struct isis_common_header *)p;
6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (caplen <= 1) { /* enough bytes on the wire ? */
6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("|OSI");
6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return;
6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (eflag)
6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("OSI NLPID %s (0x%02x): ",
6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(nlpid_values,"Unknown",*p),
6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   *p);
6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (*p) {
6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NLPID_CLNP:
6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!clnp_print(p, length))
6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        print_unknown_data(p,"\n\t",caplen);
6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NLPID_ESIS:
6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		esis_print(p, length);
6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NLPID_ISIS:
6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!isis_print(p, length))
6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        print_unknown_data(p,"\n\t",caplen);
6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NLPID_NULLNS:
6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("%slength: %u",
6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		             eflag ? "" : ", ",
6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                             length);
6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case NLPID_Q933:
6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                q933_print(p+1, length-1);
6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case NLPID_IP:
6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip_print(gndo, p+1, length-1);
6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case NLPID_IP6:
6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                ip6_print(p+1, length-1);
6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case NLPID_PPP:
6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                ppp_print(p+1, length-1);
6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (!eflag)
6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("OSI NLPID 0x%02x unknown",*p);
6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("%slength: %u",
6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		             eflag ? "" : ", ",
6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                             length);
6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (caplen > 1)
6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        print_unknown_data(p,"\n\t",caplen);
6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	CLNP_PDU_ER	 1
6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	CLNP_PDU_DT	28
6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	CLNP_PDU_MD	29
6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	CLNP_PDU_ERQ	30
6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	CLNP_PDU_ERP	31
6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok clnp_pdu_values[] = {
6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_PDU_ER,  "Error Report"},
6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_PDU_MD,  "MD"},
6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_PDU_DT,  "Data"},
6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_PDU_ERQ, "Echo Request"},
6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { CLNP_PDU_ERP, "Echo Response"},
6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct clnp_header_t {
6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t nlpid;
6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t length_indicator;
6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t version;
6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t lifetime; /* units of 500ms */
6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t type;
6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t segment_length[2];
6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t cksum[2];
7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct clnp_segment_header_t {
7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t data_unit_id[2];
7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t segment_offset[2];
7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t total_length[2];
7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * clnp_print
7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Decode CLNP packets.  Return 0 on error.
7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int clnp_print (const u_int8_t *pptr, u_int length)
7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_int8_t *optr,*source_address,*dest_address;
7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        u_int li,tlen,nsap_offset,source_address_length,dest_address_length, clnp_pdu_type, clnp_flags;
7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct clnp_header_t *clnp_header;
7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct clnp_segment_header_t *clnp_segment_header;
7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        u_int8_t rfd_error_major,rfd_error_minor;
7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	clnp_header = (const struct clnp_header_t *) pptr;
7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        TCHECK(*clnp_header);
7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        li = clnp_header->length_indicator;
7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        optr = pptr;
7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (!eflag)
7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("CLNP");
7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /*
7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         * Sanity checking of the header.
7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         */
7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (clnp_header->version != CLNP_VERSION) {
7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("version %d packet not supported", clnp_header->version);
7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return (0);
7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* FIXME further header sanity checking */
7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        clnp_pdu_type = clnp_header->type & CLNP_PDU_TYPE_MASK;
7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        clnp_flags = clnp_header->type & CLNP_FLAG_MASK;
7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        pptr += sizeof(struct clnp_header_t);
7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        li -= sizeof(struct clnp_header_t);
7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        dest_address_length = *pptr;
7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        dest_address = pptr + 1;
7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        pptr += (1 + dest_address_length);
7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        li -= (1 + dest_address_length);
7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        source_address_length = *pptr;
7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        source_address = pptr +1;
7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        pptr += (1 + source_address_length);
7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        li -= (1 + source_address_length);
7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (vflag < 1) {
7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("%s%s > %s, %s, length %u",
7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   eflag ? "" : ", ",
7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   isonsap_string(source_address, source_address_length),
7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   isonsap_string(dest_address, dest_address_length),
7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(clnp_pdu_values,"unknown (%u)",clnp_pdu_type),
7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   length);
7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return (1);
7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("%slength %u",eflag ? "" : ", ",length);
7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("\n\t%s PDU, hlen: %u, v: %u, lifetime: %u.%us, Segment PDU length: %u, checksum: 0x%04x ",
7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tok2str(clnp_pdu_values, "unknown (%u)",clnp_pdu_type),
7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               clnp_header->length_indicator,
7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               clnp_header->version,
7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               clnp_header->lifetime/2,
7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               (clnp_header->lifetime%2)*5,
7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               EXTRACT_16BITS(clnp_header->segment_length),
7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               EXTRACT_16BITS(clnp_header->cksum));
7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* do not attempt to verify the checksum if it is zero */
7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (EXTRACT_16BITS(clnp_header->cksum) == 0)
7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("(unverified)");
7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            else printf("(%s)", osi_cksum(optr, clnp_header->length_indicator) ? "incorrect" : "correct");
7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("\n\tFlags [%s]",
7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               bittok2str(clnp_flag_values,"none",clnp_flags));
7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("\n\tsource address (length %u): %s\n\tdest   address (length %u): %s",
7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               source_address_length,
7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               isonsap_string(source_address, source_address_length),
7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               dest_address_length,
7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               isonsap_string(dest_address,dest_address_length));
7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (clnp_flags & CLNP_SEGMENT_PART) {
7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            	clnp_segment_header = (const struct clnp_segment_header_t *) pptr;
7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                TCHECK(*clnp_segment_header);
7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("\n\tData Unit ID: 0x%04x, Segment Offset: %u, Total PDU Length: %u",
7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       EXTRACT_16BITS(clnp_segment_header->data_unit_id),
7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       EXTRACT_16BITS(clnp_segment_header->segment_offset),
7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       EXTRACT_16BITS(clnp_segment_header->total_length));
7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                pptr+=sizeof(const struct clnp_segment_header_t);
7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                li-=sizeof(const struct clnp_segment_header_t);
8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* now walk the options */
8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        while (li >= 2) {
8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            u_int op, opli;
8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            const u_int8_t *tptr;
8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            TCHECK2(*pptr, 2);
8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (li < 2) {
8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf(", bad opts/li");
8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return (0);
8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            op = *pptr++;
8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            opli = *pptr++;
8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            li -= 2;
8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            TCHECK2(*pptr, opli);
8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (opli > li) {
8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf(", opt (%d) too long", op);
8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return (0);
8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            li -= opli;
8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr = pptr;
8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tlen = opli;
8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t  %s Option #%u, length %u, value: ",
8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(clnp_option_values,"Unknown",op),
8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   op,
8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   opli);
8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            switch (op) {
8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case CLNP_OPTION_ROUTE_RECORDING: /* those two options share the format */
8332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case CLNP_OPTION_SOURCE_ROUTING:
8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("%s %s",
8352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           tok2str(clnp_option_sr_rr_values,"Unknown",*tptr),
8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           tok2str(clnp_option_sr_rr_string_values,"Unknown Option %u",op));
8372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    nsap_offset=*(tptr+1);
8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    if (nsap_offset == 0) {
8392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            printf(" Bad NSAP offset (0)");
8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            break;
8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    }
8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    nsap_offset-=1; /* offset to nsap list */
8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    if (nsap_offset > tlen) {
8442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            printf(" Bad NSAP offset (past end of option)");
8452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            break;
8462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    }
8472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    tptr+=nsap_offset;
8482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    tlen-=nsap_offset;
8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    while (tlen > 0) {
8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            source_address_length=*tptr;
8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            if (tlen < source_address_length+1) {
8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    printf("\n\t    NSAP address goes past end of option");
8532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    break;
8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            }
8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            if (source_address_length > 0) {
8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    source_address=(tptr+1);
8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    TCHECK2(*source_address, source_address_length);
8582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    printf("\n\t    NSAP address (length %u): %s",
8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                           source_address_length,
8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                           isonsap_string(source_address, source_address_length));
8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            }
8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            tlen-=source_address_length+1;
8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    }
8642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case CLNP_OPTION_PRIORITY:
8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("0x%1x", *tptr&0x0f);
8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case CLNP_OPTION_QOS_MAINTENANCE:
8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("\n\t    Format Code: %s",
8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           tok2str(clnp_option_scope_values,"Reserved",*tptr&CLNP_OPTION_SCOPE_MASK));
8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    if ((*tptr&CLNP_OPTION_SCOPE_MASK) == CLNP_OPTION_SCOPE_GLOBAL)
8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            printf("\n\t    QoS Flags [%s]",
8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                   bittok2str(clnp_option_qos_global_values,
8772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                              "none",
8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                              *tptr&CLNP_OPTION_OPTION_QOS_MASK));
8792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
8802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case CLNP_OPTION_SECURITY:
8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("\n\t    Format Code: %s, Security-Level %u",
8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           tok2str(clnp_option_scope_values,"Reserved",*tptr&CLNP_OPTION_SCOPE_MASK),
8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           *(tptr+1));
8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case CLNP_OPTION_DISCARD_REASON:
8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                rfd_error_major = (*tptr&0xf0) >> 4;
8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                rfd_error_minor = *tptr&0x0f;
8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("\n\t    Class: %s Error (0x%01x), %s (0x%01x)",
8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(clnp_option_rfd_class_values,"Unknown",rfd_error_major),
8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       rfd_error_major,
8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(clnp_option_rfd_error_class[rfd_error_major],"Unknown",rfd_error_minor),
8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       rfd_error_minor);
8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case CLNP_OPTION_PADDING:
8982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("padding data");
8992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
9002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /*
9022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 * FIXME those are the defined Options that lack a decoder
9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 * you are welcome to contribute code ;-)
9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 */
9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            default:
9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data(tptr,"\n\t  ",opli);
9082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
9092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
9102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (vflag > 1)
9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data(pptr,"\n\t  ",opli);
9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            pptr += opli;
9132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        switch (clnp_pdu_type) {
9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case    CLNP_PDU_ER: /* fall through */
9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case 	CLNP_PDU_ERP:
9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            TCHECK(*pptr);
9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (*(pptr) == NLPID_CLNP) {
9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("\n\t-----original packet-----\n\t");
9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /* FIXME recursion protection */
9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                clnp_print(pptr, length-clnp_header->length_indicator);
9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case 	CLNP_PDU_DT:
9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case 	CLNP_PDU_MD:
9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case 	CLNP_PDU_ERQ:
9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        default:
9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* dump the PDU specific data */
9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (length-(pptr-optr) > 0) {
9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("\n\t  undecoded non-header data, length %u",length-clnp_header->length_indicator);
9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data(pptr,"\n\t  ",length-(pptr-optr));
9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return (1);
9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trunc:
9422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    fputs("[|clnp]", stdout);
9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return (1);
9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	ESIS_PDU_REDIRECT	6
9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	ESIS_PDU_ESH	        2
9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	ESIS_PDU_ISH	        4
9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok esis_pdu_values[] = {
9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ESIS_PDU_REDIRECT, "redirect"},
9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ESIS_PDU_ESH,      "ESH"},
9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { ESIS_PDU_ISH,      "ISH"},
9562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
9582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct esis_header_t {
9602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t nlpid;
9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t length_indicator;
9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t version;
9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t reserved;
9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t type;
9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t holdtime[2];
9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t cksum[2];
9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectesis_print(const u_int8_t *pptr, u_int length)
9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_int8_t *optr;
9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int li,esis_pdu_type,source_address_length, source_address_number;
9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct esis_header_t *esis_header;
9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (!eflag)
9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("ES-IS");
9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length <= 2) {
9802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (qflag)
9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("bad pkt!");
9822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("no header at all!");
9842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	esis_header = (const struct esis_header_t *) pptr;
9882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        TCHECK(*esis_header);
9892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        li = esis_header->length_indicator;
9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        optr = pptr;
9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /*
9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         * Sanity checking of the header.
9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         */
9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (esis_header->nlpid != NLPID_ESIS) {
9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf(" nlpid 0x%02x packet not supported", esis_header->nlpid);
9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return;
9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (esis_header->version != ESIS_VERSION) {
10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf(" version %d packet not supported", esis_header->version);
10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return;
10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (li > length) {
10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf(" length indicator(%d) > PDU size (%d)!", li, length);
10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return;
10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (li < sizeof(struct esis_header_t) + 2) {
10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf(" length indicator < min PDU size %d:", li);
10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            while (--length != 0)
10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("%02X", *pptr++);
10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return;
10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        esis_pdu_type = esis_header->type & ESIS_PDU_TYPE_MASK;
10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (vflag < 1) {
10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("%s%s, length %u",
10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   eflag ? "" : ", ",
10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(esis_pdu_values,"unknown type (%u)",esis_pdu_type),
10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   length);
10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return;
10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        } else
10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("%slength %u\n\t%s (%u)",
10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   eflag ? "" : ", ",
10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   length,
10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(esis_pdu_values,"unknown type: %u", esis_pdu_type),
10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   esis_pdu_type);
10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf(", v: %u%s", esis_header->version, esis_header->version == ESIS_VERSION ? "" : "unsupported" );
10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf(", checksum: 0x%04x ", EXTRACT_16BITS(esis_header->cksum));
10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* do not attempt to verify the checksum if it is zero */
10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (EXTRACT_16BITS(esis_header->cksum) == 0)
10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("(unverified)");
10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        else
10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("(%s)", osi_cksum(pptr, li) ? "incorrect" : "correct");
10402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf(", holding time: %us, length indicator: %u",EXTRACT_16BITS(esis_header->holdtime),li);
10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (vflag > 1)
10442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            print_unknown_data(optr,"\n\t",sizeof(struct esis_header_t));
10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pptr += sizeof(struct esis_header_t);
10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	li -= sizeof(struct esis_header_t);
10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (esis_pdu_type) {
10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ESIS_PDU_REDIRECT: {
10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const u_int8_t *dst, *snpa, *neta;
10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int dstl, snpal, netal;
10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(*pptr);
10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (li < 1) {
10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(", bad redirect/li");
10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dstl = *pptr;
10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pptr++;
10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		li--;
10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(*pptr, dstl);
10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (li < dstl) {
10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(", bad redirect/li");
10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dst = pptr;
10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pptr += dstl;
10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                li -= dstl;
10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t  %s", isonsap_string(dst,dstl));
10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(*pptr);
10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (li < 1) {
10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(", bad redirect/li");
10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		snpal = *pptr;
10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pptr++;
10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		li--;
10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(*pptr, snpal);
10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (li < snpal) {
10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(", bad redirect/li");
10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		snpa = pptr;
10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pptr += snpal;
10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                li -= snpal;
10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(*pptr);
10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (li < 1) {
10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(", bad redirect/li");
10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
10922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		netal = *pptr;
10942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pptr++;
10952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(*pptr, netal);
10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (li < netal) {
10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(", bad redirect/li");
10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
11002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		neta = pptr;
11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pptr += netal;
11022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                li -= netal;
11032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (netal == 0)
11052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("\n\t  %s", etheraddr_string(snpa));
11062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
11072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("\n\t  %s", isonsap_string(neta,netal));
11082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ESIS_PDU_ESH:
11122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            TCHECK(*pptr);
11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (li < 1) {
11142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf(", bad esh/li");
11152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return;
11162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
11172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            source_address_number = *pptr;
11182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            pptr++;
11192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            li--;
11202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t  Number of Source Addresses: %u", source_address_number);
11222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            while (source_address_number > 0) {
11242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                TCHECK(*pptr);
11252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            	if (li < 1) {
11262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf(", bad esh/li");
11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            	    return;
11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            	}
11292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                source_address_length = *pptr;
11302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                pptr++;
11312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            	li--;
11322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                TCHECK2(*pptr, source_address_length);
11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            	if (li < source_address_length) {
11352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf(", bad esh/li");
11362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            	    return;
11372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            	}
11382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("\n\t  NET (length: %u): %s",
11392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       source_address_length,
11402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       isonsap_string(pptr,source_address_length));
11412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                pptr += source_address_length;
11422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                li -= source_address_length;
11432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                source_address_number--;
11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ESIS_PDU_ISH: {
11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            TCHECK(*pptr);
11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (li < 1) {
11512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf(", bad ish/li");
11522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return;
11532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
11542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            source_address_length = *pptr;
11552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            pptr++;
11562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            li--;
11572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            TCHECK2(*pptr, source_address_length);
11582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (li < source_address_length) {
11592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf(", bad ish/li");
11602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return;
11612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
11622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t  NET (length: %u): %s", source_address_length, isonsap_string(pptr, source_address_length));
11632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            pptr += source_address_length;
11642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            li -= source_address_length;
11652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
11662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
11692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (vflag <= 1) {
11702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    if (pptr < snapend)
11712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            print_unknown_data(pptr,"\n\t  ",snapend-pptr);
11722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
11732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return;
11742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* now walk the options */
11772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        while (li >= 2) {
11782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            u_int op, opli;
11792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            const u_int8_t *tptr;
11802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            TCHECK2(*pptr, 2);
11822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (li < 2) {
11832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf(", bad opts/li");
11842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return;
11852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
11862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            op = *pptr++;
11872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            opli = *pptr++;
11882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            li -= 2;
11892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (opli > li) {
11902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf(", opt (%d) too long", op);
11912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return;
11922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
11932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            li -= opli;
11942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr = pptr;
11952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t  %s Option #%u, length %u, value: ",
11972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(esis_option_values,"Unknown",op),
11982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   op,
11992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   opli);
12002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            switch (op) {
12022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case ESIS_OPTION_ES_CONF_TIME:
12042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                TCHECK2(*pptr, 2);
12052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("%us", EXTRACT_16BITS(tptr));
12062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
12072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case ESIS_OPTION_PROTOCOLS:
12092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                while (opli>0) {
12102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    TCHECK(*pptr);
12112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("%s (0x%02x)",
12122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           tok2str(nlpid_values,
12132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                   "unknown",
12142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                   *tptr),
12152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           *tptr);
12162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    if (opli>1) /* further NPLIDs ? - put comma */
12172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        printf(", ");
12182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    tptr++;
12192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    opli--;
12202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                }
12212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
12222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /*
12242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 * FIXME those are the defined Options that lack a decoder
12252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 * you are welcome to contribute code ;-)
12262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 */
12272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case ESIS_OPTION_QOS_MAINTENANCE:
12292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case ESIS_OPTION_SECURITY:
12302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case ESIS_OPTION_PRIORITY:
12312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case ESIS_OPTION_ADDRESS_MASK:
12322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case ESIS_OPTION_SNPA_MASK:
12332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            default:
12352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data(tptr,"\n\t  ",opli);
12362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
12372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
12382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (vflag > 1)
12392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data(pptr,"\n\t  ",opli);
12402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            pptr += opli;
12412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
12422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
12432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
12442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* shared routine for printing system, node and lsp-ids */
12472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic char *
12482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisis_print_id(const u_int8_t *cp, int id_len)
12492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int i;
12512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    static char id[sizeof("xxxx.xxxx.xxxx.yy-zz")];
12522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char *pos = id;
12532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    for (i = 1; i <= SYSTEM_ID_LEN; i++) {
12552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        snprintf(pos, sizeof(id) - (pos - id), "%02x", *cp++);
12562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pos += strlen(pos);
12572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i == 2 || i == 4)
12582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    *pos++ = '.';
12592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
12602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (id_len >= NODE_ID_LEN) {
12612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        snprintf(pos, sizeof(id) - (pos - id), ".%02x", *cp++);
12622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pos += strlen(pos);
12632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
12642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (id_len == LSP_ID_LEN)
12652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        snprintf(pos, sizeof(id) - (pos - id), "-%02x", *cp);
12662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return (id);
12672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* print the 4-byte metric block which is common found in the old-style TLVs */
12702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
12712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisis_print_metric_block (const struct isis_metric_block *isis_metric_block)
12722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf(", Default Metric: %d, %s",
12742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block->metric_default),
12752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           ISIS_LSP_TLV_METRIC_IE(isis_metric_block->metric_default) ? "External" : "Internal");
12762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!ISIS_LSP_TLV_METRIC_SUPPORTED(isis_metric_block->metric_delay))
12772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("\n\t\t  Delay Metric: %d, %s",
12782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block->metric_delay),
12792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ISIS_LSP_TLV_METRIC_IE(isis_metric_block->metric_delay) ? "External" : "Internal");
12802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!ISIS_LSP_TLV_METRIC_SUPPORTED(isis_metric_block->metric_expense))
12812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("\n\t\t  Expense Metric: %d, %s",
12822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block->metric_expense),
12832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ISIS_LSP_TLV_METRIC_IE(isis_metric_block->metric_expense) ? "External" : "Internal");
12842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!ISIS_LSP_TLV_METRIC_SUPPORTED(isis_metric_block->metric_error))
12852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("\n\t\t  Error Metric: %d, %s",
12862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ISIS_LSP_TLV_METRIC_VALUE(isis_metric_block->metric_error),
12872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ISIS_LSP_TLV_METRIC_IE(isis_metric_block->metric_error) ? "External" : "Internal");
12882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return(1); /* everything is ok */
12902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
12932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisis_print_tlv_ip_reach (const u_int8_t *cp, const char *ident, int length)
12942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int prefix_len;
12962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct isis_tlv_ip_reach *tlv_ip_reach;
12972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	tlv_ip_reach = (const struct isis_tlv_ip_reach *)cp;
12992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (length > 0) {
13012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((size_t)length < sizeof(*tlv_ip_reach)) {
13022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("short IPv4 Reachability (%d vs %lu)",
13032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               length,
13042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               (unsigned long)sizeof(*tlv_ip_reach));
13052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return (0);
13062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
13072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST(*tlv_ip_reach))
13092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    return (0);
13102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		prefix_len = mask2plen(EXTRACT_32BITS(tlv_ip_reach->mask));
13122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (prefix_len == -1)
13142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%sIPv4 prefix: %s mask %s",
13152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               ident,
13162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       ipaddr_string((tlv_ip_reach->prefix)),
13172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       ipaddr_string((tlv_ip_reach->mask)));
13182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
13192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%sIPv4 prefix: %15s/%u",
13202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               ident,
13212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       ipaddr_string((tlv_ip_reach->prefix)),
13222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       prefix_len);
13232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(", Distribution: %s, Metric: %u, %s",
13252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       ISIS_LSP_TLV_METRIC_UPDOWN(tlv_ip_reach->isis_metric_block.metric_default) ? "down" : "up",
13262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->isis_metric_block.metric_default),
13272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->isis_metric_block.metric_default) ? "External" : "Internal");
13282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach->isis_metric_block.metric_delay))
13302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("%s  Delay Metric: %u, %s",
13312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           ident,
13322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->isis_metric_block.metric_delay),
13332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->isis_metric_block.metric_delay) ? "External" : "Internal");
13342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach->isis_metric_block.metric_expense))
13362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("%s  Expense Metric: %u, %s",
13372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           ident,
13382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->isis_metric_block.metric_expense),
13392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->isis_metric_block.metric_expense) ? "External" : "Internal");
13402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!ISIS_LSP_TLV_METRIC_SUPPORTED(tlv_ip_reach->isis_metric_block.metric_error))
13422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("%s  Error Metric: %u, %s",
13432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           ident,
13442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           ISIS_LSP_TLV_METRIC_VALUE(tlv_ip_reach->isis_metric_block.metric_error),
13452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           ISIS_LSP_TLV_METRIC_IE(tlv_ip_reach->isis_metric_block.metric_error) ? "External" : "Internal");
13462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		length -= sizeof(struct isis_tlv_ip_reach);
13482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tlv_ip_reach++;
13492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (1);
13512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
13542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this is the common IP-REACH subTLV decoder it is called
13552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * from various EXTD-IP REACH TLVs (135,235,236,237)
13562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
13572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
13592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisis_print_ip_reach_subtlv (const u_int8_t *tptr,int subt,int subl,const char *ident) {
13602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* first lets see if we know the subTLVs name*/
13622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s%s subTLV #%u, length: %u",
13632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       ident,
13642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tok2str(isis_ext_ip_reach_subtlv_values,
13652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       "unknown",
13662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       subt),
13672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               subt,
13682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               subl);
13692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!TTEST2(*tptr,subl))
13712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    goto trunctlv;
13722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    switch(subt) {
13742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case ISIS_SUBTLV_EXTD_IP_REACH_MGMT_PREFIX_COLOR: /* fall through */
13752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG32:
13762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        while (subl >= 4) {
13772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", 0x%08x (=%u)",
13782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   EXTRACT_32BITS(tptr),
13792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   EXTRACT_32BITS(tptr));
13802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    tptr+=4;
13812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    subl-=4;
13822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
13842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG64:
13852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        while (subl >= 8) {
13862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", 0x%08x%08x",
13872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   EXTRACT_32BITS(tptr),
13882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   EXTRACT_32BITS(tptr+4));
13892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    tptr+=8;
13902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    subl-=8;
13912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
13932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    default:
13942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if(!print_unknown_data(tptr,"\n\t\t    ",
13952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       subl))
13962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  return(0);
13972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
13982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
13992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return(1);
14002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunctlv:
14022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("%spacket exceeded snapshot",ident);
14032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return(0);
14042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
14052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
14072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this is the common IS-REACH subTLV decoder it is called
14082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * from isis_print_ext_is_reach()
14092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
14102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
14122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisis_print_is_reach_subtlv (const u_int8_t *tptr,u_int subt,u_int subl,const char *ident) {
14132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        u_int te_class,priority_level;
14152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        union { /* int to float conversion buffer for several subTLVs */
14162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            float f;
14172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            u_int32_t i;
14182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        } bw;
14192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* first lets see if we know the subTLVs name*/
14212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s%s subTLV #%u, length: %u",
14222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       ident,
14232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tok2str(isis_ext_is_reach_subtlv_values,
14242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       "unknown",
14252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       subt),
14262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               subt,
14272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               subl);
14282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!TTEST2(*tptr,subl))
14302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    goto trunctlv;
14312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        switch(subt) {
14332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_SUBTLV_EXT_IS_REACH_ADMIN_GROUP:
14342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_SUBTLV_EXT_IS_REACH_LINK_LOCAL_REMOTE_ID:
14352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_SUBTLV_EXT_IS_REACH_LINK_REMOTE_ID:
14362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (subl >= 4) {
14372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      printf(", 0x%08x", EXTRACT_32BITS(tptr));
14382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      if (subl == 8) /* draft-ietf-isis-gmpls-extensions */
14392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        printf(", 0x%08x", EXTRACT_32BITS(tptr+4));
14402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
14412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
14422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_SUBTLV_EXT_IS_REACH_IPV4_INTF_ADDR:
14432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_SUBTLV_EXT_IS_REACH_IPV4_NEIGHBOR_ADDR:
14442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (subl >= sizeof(struct in_addr))
14452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              printf(", %s", ipaddr_string(tptr));
14462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
14472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_SUBTLV_EXT_IS_REACH_MAX_LINK_BW :
14482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_SUBTLV_EXT_IS_REACH_RESERVABLE_BW:
14492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (subl >= 4) {
14502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              bw.i = EXTRACT_32BITS(tptr);
14512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              printf(", %.3f Mbps", bw.f*8/1000000 );
14522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
14532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
14542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_SUBTLV_EXT_IS_REACH_UNRESERVED_BW :
14552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (subl >= 32) {
14562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              for (te_class = 0; te_class < 8; te_class++) {
14572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                bw.i = EXTRACT_32BITS(tptr);
14582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("%s  TE-Class %u: %.3f Mbps",
14592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       ident,
14602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       te_class,
14612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       bw.f*8/1000000 );
14622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tptr+=4;
14632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      }
14642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
14652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
14662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS: /* fall through */
14672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS_OLD:
14682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("%sBandwidth Constraints Model ID: %s (%u)",
14692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   ident,
14702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(diffserv_te_bc_values, "unknown", *tptr),
14712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   *tptr);
14722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr++;
14732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* decode BCs until the subTLV ends */
14742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            for (te_class = 0; te_class < (subl-1)/4; te_class++) {
14752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                bw.i = EXTRACT_32BITS(tptr);
14762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("%s  Bandwidth constraint CT%u: %.3f Mbps",
14772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       ident,
14782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       te_class,
14792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       bw.f*8/1000000 );
14802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tptr+=4;
14812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
14822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
14832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_SUBTLV_EXT_IS_REACH_TE_METRIC:
14842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (subl >= 3)
14852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              printf(", %u", EXTRACT_24BITS(tptr));
14862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
14872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_SUBTLV_EXT_IS_REACH_LINK_PROTECTION_TYPE:
14882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (subl >= 2) {
14892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              printf(", %s, Priority %u",
14902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   bittok2str(gmpls_link_prot_values, "none", *tptr),
14912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   *(tptr+1));
14922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
14932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
14942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_SUBTLV_EXT_IS_REACH_INTF_SW_CAP_DESCR:
14952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (subl >= 36) {
14962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              printf("%s  Interface Switching Capability:%s",
14972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   ident,
14982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(gmpls_switch_cap_values, "Unknown", *(tptr)));
14992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              printf(", LSP Encoding: %s",
15002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(gmpls_encoding_values, "Unknown", *(tptr+1)));
15012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      tptr+=4;
15022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              printf("%s  Max LSP Bandwidth:",ident);
15032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              for (priority_level = 0; priority_level < 8; priority_level++) {
15042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                bw.i = EXTRACT_32BITS(tptr);
15052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("%s    priority level %d: %.3f Mbps",
15062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       ident,
15072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       priority_level,
15082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       bw.f*8/1000000 );
15092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tptr+=4;
15102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              }
15112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              subl-=36;
15122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              /* there is some optional stuff left to decode but this is as of yet
15132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 not specified so just lets hexdump what is left */
15142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              if(subl>0){
15152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if(!print_unknown_data(tptr,"\n\t\t    ",
15162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				       subl))
15172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    return(0);
15182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project              }
15192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
15202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
15212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        default:
15222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if(!print_unknown_data(tptr,"\n\t\t    ",
15232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				   subl))
15242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return(0);
15252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
15262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
15272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return(1);
15282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunctlv:
15302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("%spacket exceeded snapshot",ident);
15312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return(0);
15322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
15332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
15362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this is the common IS-REACH decoder it is called
15372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * from various EXTD-IS REACH style TLVs (22,24,222)
15382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
15392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
15412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisis_print_ext_is_reach (const u_int8_t *tptr,const char *ident, int tlv_type) {
15422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char ident_buffer[20];
15442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int subtlv_type,subtlv_len,subtlv_sum_len;
15452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int proc_bytes = 0; /* how many bytes did we process ? */
15462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!TTEST2(*tptr, NODE_ID_LEN))
15482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return(0);
15492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("%sIS Neighbor: %s", ident, isis_print_id(tptr, NODE_ID_LEN));
15512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tptr+=(NODE_ID_LEN);
15522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (tlv_type != ISIS_TLV_IS_ALIAS_ID) { /* the Alias TLV Metric field is implicit 0 */
15542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (!TTEST2(*tptr, 3))    /* and is therefore skipped */
15552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return(0);
15562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(", Metric: %d",EXTRACT_24BITS(tptr));
15572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	tptr+=3;
15582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
15592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!TTEST2(*tptr, 1))
15612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return(0);
15622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    subtlv_sum_len=*(tptr++); /* read out subTLV length */
15632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    proc_bytes=NODE_ID_LEN+3+1;
15642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf(", %ssub-TLVs present",subtlv_sum_len ? "" : "no ");
15652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (subtlv_sum_len) {
15662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf(" (%u)",subtlv_sum_len);
15672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        while (subtlv_sum_len>0) {
15682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (!TTEST2(*tptr,2))
15692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return(0);
15702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            subtlv_type=*(tptr++);
15712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            subtlv_len=*(tptr++);
15722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* prepend the ident string */
15732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            snprintf(ident_buffer, sizeof(ident_buffer), "%s  ",ident);
15742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if(!isis_print_is_reach_subtlv(tptr,subtlv_type,subtlv_len,ident_buffer))
15752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return(0);
15762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr+=subtlv_len;
15772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            subtlv_sum_len-=(subtlv_len+2);
15782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            proc_bytes+=(subtlv_len+2);
15792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
15802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
15812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return(proc_bytes);
15822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
15832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
15852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this is the common Multi Topology ID decoder
15862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * it is called from various MT-TLVs (222,229,235,237)
15872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
15882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
15902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisis_print_mtid (const u_int8_t *tptr,const char *ident) {
15912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!TTEST2(*tptr, 2))
15932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return(0);
15942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("%s%s",
15962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           ident,
15972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           tok2str(isis_mt_values,
15982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   "Reserved for IETF Consensus",
15992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   ISIS_MASK_MTID(EXTRACT_16BITS(tptr))));
16002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf(" Topology (0x%03x), Flags: [%s]",
16022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           ISIS_MASK_MTID(EXTRACT_16BITS(tptr)),
16032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           bittok2str(isis_mt_flag_values, "none",ISIS_MASK_MTFLAGS(EXTRACT_16BITS(tptr))));
16042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return(2);
16062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
16072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
16092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this is the common extended IP reach decoder
16102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * it is called from TLVs (135,235,236,237)
16112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * we process the TLV and optional subTLVs and return
16122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the amount of processed bytes
16132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
16142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
16162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisis_print_extd_ip_reach (const u_int8_t *tptr, const char *ident, u_int16_t afi) {
16172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char ident_buffer[20];
16192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
16202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t prefix[sizeof(struct in6_addr)]; /* shared copy buffer for IPv4 and IPv6 prefixes */
16212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
16222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t prefix[sizeof(struct in_addr)]; /* shared copy buffer for IPv4 prefixes */
16232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
16242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int metric, status_byte, bit_length, byte_length, sublen, processed, subtlvtype, subtlvlen;
16252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!TTEST2(*tptr, 4))
16272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return (0);
16282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    metric = EXTRACT_32BITS(tptr);
16292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    processed=4;
16302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tptr+=4;
16312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (afi == IPV4) {
16332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (!TTEST2(*tptr, 1)) /* fetch status byte */
16342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return (0);
16352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        status_byte=*(tptr++);
16362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        bit_length = status_byte&0x3f;
16372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (bit_length > 32) {
16382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("%sIPv4 prefix: bad bit length %u",
16392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   ident,
16402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   bit_length);
16412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return (0);
16422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
16432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        processed++;
16442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
16452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } else if (afi == IPV6) {
16462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (!TTEST2(*tptr, 1)) /* fetch status & prefix_len byte */
16472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return (0);
16482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        status_byte=*(tptr++);
16492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        bit_length=*(tptr++);
16502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (bit_length > 128) {
16512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("%sIPv6 prefix: bad bit length %u",
16522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   ident,
16532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   bit_length);
16542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return (0);
16552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
16562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        processed+=2;
16572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
16582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } else
16592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return (0); /* somebody is fooling us */
16602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    byte_length = (bit_length + 7) / 8; /* prefix has variable length encoding */
16622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!TTEST2(*tptr, byte_length))
16642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return (0);
16652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    memset(prefix, 0, sizeof prefix);   /* clear the copy buffer */
16662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    memcpy(prefix,tptr,byte_length);    /* copy as much as is stored in the TLV */
16672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tptr+=byte_length;
16682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    processed+=byte_length;
16692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (afi == IPV4)
16712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("%sIPv4 prefix: %15s/%u",
16722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ident,
16732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ipaddr_string(prefix),
16742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               bit_length);
16752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
16762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (afi == IPV6)
16772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("%sIPv6 prefix: %s/%u",
16782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ident,
16792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ip6addr_string(prefix),
16802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               bit_length);
16812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
16822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf(", Distribution: %s, Metric: %u",
16842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           ISIS_MASK_TLV_EXTD_IP_UPDOWN(status_byte) ? "down" : "up",
16852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           metric);
16862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (afi == IPV4 && ISIS_MASK_TLV_EXTD_IP_SUBTLV(status_byte))
16882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf(", sub-TLVs present");
16892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
16902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (afi == IPV6)
16912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf(", %s%s",
16922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ISIS_MASK_TLV_EXTD_IP6_IE(status_byte) ? "External" : "Internal",
16932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ISIS_MASK_TLV_EXTD_IP6_SUBTLV(status_byte) ? ", sub-TLVs present" : "");
16942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
16952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if ((ISIS_MASK_TLV_EXTD_IP_SUBTLV(status_byte)  && afi == IPV4) ||
16972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        (ISIS_MASK_TLV_EXTD_IP6_SUBTLV(status_byte) && afi == IPV6)) {
16982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* assume that one prefix can hold more
16992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           than one subTLV - therefore the first byte must reflect
17002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           the aggregate bytecount of the subTLVs for this prefix
17012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        */
17022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (!TTEST2(*tptr, 1))
17032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return (0);
17042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        sublen=*(tptr++);
17052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        processed+=sublen+1;
17062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf(" (%u)",sublen);   /* print out subTLV length */
17072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        while (sublen>0) {
17092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (!TTEST2(*tptr,2))
17102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return (0);
17112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            subtlvtype=*(tptr++);
17122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            subtlvlen=*(tptr++);
17132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* prepend the ident string */
17142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            snprintf(ident_buffer, sizeof(ident_buffer), "%s  ",ident);
17152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if(!isis_print_ip_reach_subtlv(tptr,subtlvtype,subtlvlen,ident_buffer))
17162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return(0);
17172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr+=subtlvlen;
17182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            sublen-=(subtlvlen+2);
17192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
17202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
17212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return (processed);
17222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
17232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
17252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * isis_print
17262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Decode IS-IS packets.  Return 0 on error.
17272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
17282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int isis_print (const u_int8_t *p, u_int length)
17302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
17312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct isis_common_header *isis_header;
17322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct isis_iih_lan_header *header_iih_lan;
17342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct isis_iih_ptp_header *header_iih_ptp;
17352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct isis_lsp_header *header_lsp;
17362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct isis_csnp_header *header_csnp;
17372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct isis_psnp_header *header_psnp;
17382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct isis_tlv_lsp *tlv_lsp;
17402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct isis_tlv_ptp_adj *tlv_ptp_adj;
17412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct isis_tlv_is_reach *tlv_is_reach;
17422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct isis_tlv_es_reach *tlv_es_reach;
17432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t pdu_type, max_area, id_length, tlv_type, tlv_len, tmp, alen, lan_alen, prefix_len;
17452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t ext_is_len, ext_ip_len, mt_len;
17462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_int8_t *optr, *pptr, *tptr;
17472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_short packet_len,pdu_len;
17482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int i,vendor_id;
17492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    packet_len=length;
17512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    optr = p; /* initialize the _o_riginal pointer to the packet start -
17522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 need it for parsing the checksum TLV */
17532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    isis_header = (const struct isis_common_header *)p;
17542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK(*isis_header);
17552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    pptr = p+(ISIS_COMMON_HEADER_SIZE);
17562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    header_iih_lan = (const struct isis_iih_lan_header *)pptr;
17572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    header_iih_ptp = (const struct isis_iih_ptp_header *)pptr;
17582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    header_lsp = (const struct isis_lsp_header *)pptr;
17592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    header_csnp = (const struct isis_csnp_header *)pptr;
17602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    header_psnp = (const struct isis_psnp_header *)pptr;
17612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!eflag)
17632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("IS-IS");
17642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /*
17662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     * Sanity checking of the header.
17672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     */
17682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (isis_header->version != ISIS_VERSION) {
17702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("version %d packet not supported", isis_header->version);
17712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
17722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
17732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if ((isis_header->id_length != SYSTEM_ID_LEN) && (isis_header->id_length != 0)) {
17752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("system ID length of %d is not supported",
17762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       isis_header->id_length);
17772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
17782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
17792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (isis_header->pdu_version != ISIS_VERSION) {
17812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("version %d packet not supported", isis_header->pdu_version);
17822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
17832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
17842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    max_area = isis_header->max_area;
17862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    switch(max_area) {
17872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 0:
17882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	max_area = 3;	 /* silly shit */
17892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
17902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 255:
17912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("bad packet -- 255 areas");
17922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
17932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    default:
17942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
17952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
17962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    id_length = isis_header->id_length;
17982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    switch(id_length) {
17992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 0:
18002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        id_length = 6;	 /* silly shit again */
18012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
18022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 1:              /* 1-8 are valid sys-ID lenghts */
18032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 2:
18042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 3:
18052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 4:
18062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 5:
18072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 6:
18082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 7:
18092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 8:
18102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        break;
18112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 255:
18122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        id_length = 0;   /* entirely useless */
18132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
18142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    default:
18152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        break;
18162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
18172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* toss any non 6-byte sys-ID len PDUs */
18192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (id_length != 6 ) {
18202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("bad packet -- illegal sys-ID length (%u)", id_length);
18212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
18222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
18232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    pdu_type=isis_header->pdu_type;
18252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* in non-verbose mode print the basic PDU Type plus PDU specific brief information*/
18272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (vflag < 1) {
18282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("%s%s",
18292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               eflag ? "" : ", ",
18302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tok2str(isis_pdu_values,"unknown PDU-Type %u",pdu_type));
18312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (pdu_type) {
18332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_PDU_L1_LAN_IIH:
18352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_PDU_L2_LAN_IIH:
18362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", src-id %s",
18372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   isis_print_id(header_iih_lan->source_id,SYSTEM_ID_LEN));
18382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", lan-id %s, prio %u",
18392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   isis_print_id(header_iih_lan->lan_id,NODE_ID_LEN),
18402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   header_iih_lan->priority);
18412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
18422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_PDU_PTP_IIH:
18432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", src-id %s", isis_print_id(header_iih_ptp->source_id,SYSTEM_ID_LEN));
18442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
18452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_PDU_L1_LSP:
18462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_PDU_L2_LSP:
18472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", lsp-id %s, seq 0x%08x, lifetime %5us",
18482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   isis_print_id(header_lsp->lsp_id, LSP_ID_LEN),
18492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   EXTRACT_32BITS(header_lsp->sequence_number),
18502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   EXTRACT_16BITS(header_lsp->remaining_lifetime));
18512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
18522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_PDU_L1_CSNP:
18532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_PDU_L2_CSNP:
18542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", src-id %s", isis_print_id(header_csnp->source_id,NODE_ID_LEN));
18552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
18562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_PDU_L1_PSNP:
18572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_PDU_L2_PSNP:
18582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", src-id %s", isis_print_id(header_psnp->source_id,NODE_ID_LEN));
18592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
18602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
18622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(", length %u", length);
18632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return(1);
18652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
18662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* ok they seem to want to know everything - lets fully decode it */
18682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("%slength %u", eflag ? "" : ", ",length);
18692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("\n\t%s, hlen: %u, v: %u, pdu-v: %u, sys-id-len: %u (%u), max-area: %u (%u)",
18712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           tok2str(isis_pdu_values,
18722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   "unknown, type %u",
18732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   pdu_type),
18742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           isis_header->fixed_len,
18752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           isis_header->version,
18762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           isis_header->pdu_version,
18772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	   id_length,
18782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	   isis_header->id_length,
18792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           max_area,
18802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           isis_header->max_area);
18812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (vflag > 1) {
18832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if(!print_unknown_data(optr,"\n\t",8)) /* provide the _o_riginal pointer */
18842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return(0);                         /* for optionally debugging the common header */
18852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
18862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    switch (pdu_type) {
18882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case ISIS_PDU_L1_LAN_IIH:
18902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case ISIS_PDU_L2_LAN_IIH:
18912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (isis_header->fixed_len != (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_LAN_HEADER_SIZE)) {
18922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", bogus fixed header length %u should be %lu",
18932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   isis_header->fixed_len, (unsigned long)ISIS_IIH_LAN_HEADER_SIZE);
18942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return (0);
18952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
18962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pdu_len=EXTRACT_16BITS(header_iih_lan->pdu_len);
18982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (packet_len>pdu_len) {
18992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            packet_len=pdu_len; /* do TLV decoding as long as it makes sense */
19002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            length=pdu_len;
19012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
19022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*header_iih_lan);
19042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t  source-id: %s,  holding time: %us, Flags: [%s]",
19052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               isis_print_id(header_iih_lan->source_id,SYSTEM_ID_LEN),
19062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               EXTRACT_16BITS(header_iih_lan->holding_time),
19072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tok2str(isis_iih_circuit_type_values,
19082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       "unknown circuit type 0x%02x",
19092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       header_iih_lan->circuit_type));
19102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t  lan-id:    %s, Priority: %u, PDU length: %u",
19122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               isis_print_id(header_iih_lan->lan_id, NODE_ID_LEN),
19132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               (header_iih_lan->priority) & ISIS_LAN_PRIORITY_MASK,
19142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               pdu_len);
19152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (vflag > 1) {
19172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if(!print_unknown_data(pptr,"\n\t  ",ISIS_IIH_LAN_HEADER_SIZE))
19182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return(0);
19192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
19202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	packet_len -= (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_LAN_HEADER_SIZE);
19222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pptr = p + (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_LAN_HEADER_SIZE);
19232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
19242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case ISIS_PDU_PTP_IIH:
19262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (isis_header->fixed_len != (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_PTP_HEADER_SIZE)) {
19272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", bogus fixed header length %u should be %lu",
19282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   isis_header->fixed_len, (unsigned long)ISIS_IIH_PTP_HEADER_SIZE);
19292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return (0);
19302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
19312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pdu_len=EXTRACT_16BITS(header_iih_ptp->pdu_len);
19332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (packet_len>pdu_len) {
19342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            packet_len=pdu_len; /* do TLV decoding as long as it makes sense */
19352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            length=pdu_len;
19362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
19372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*header_iih_ptp);
19392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t  source-id: %s, holding time: %us, Flags: [%s]",
19402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               isis_print_id(header_iih_ptp->source_id,SYSTEM_ID_LEN),
19412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               EXTRACT_16BITS(header_iih_ptp->holding_time),
19422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tok2str(isis_iih_circuit_type_values,
19432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       "unknown circuit type 0x%02x",
19442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       header_iih_ptp->circuit_type));
19452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t  circuit-id: 0x%02x, PDU length: %u",
19472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               header_iih_ptp->circuit_id,
19482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               pdu_len);
19492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (vflag > 1) {
19512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if(!print_unknown_data(pptr,"\n\t  ",ISIS_IIH_PTP_HEADER_SIZE))
19522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return(0);
19532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
19542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	packet_len -= (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_PTP_HEADER_SIZE);
19562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pptr = p + (ISIS_COMMON_HEADER_SIZE+ISIS_IIH_PTP_HEADER_SIZE);
19572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
19582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case ISIS_PDU_L1_LSP:
19602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case ISIS_PDU_L2_LSP:
19612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (isis_header->fixed_len != (ISIS_COMMON_HEADER_SIZE+ISIS_LSP_HEADER_SIZE)) {
19622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", bogus fixed header length %u should be %lu",
19632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   isis_header->fixed_len, (unsigned long)ISIS_LSP_HEADER_SIZE);
19642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return (0);
19652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
19662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pdu_len=EXTRACT_16BITS(header_lsp->pdu_len);
19682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (packet_len>pdu_len) {
19692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            packet_len=pdu_len; /* do TLV decoding as long as it makes sense */
19702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            length=pdu_len;
19712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
19722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*header_lsp);
19742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t  lsp-id: %s, seq: 0x%08x, lifetime: %5us\n\t  chksum: 0x%04x",
19752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               isis_print_id(header_lsp->lsp_id, LSP_ID_LEN),
19762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               EXTRACT_32BITS(header_lsp->sequence_number),
19772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               EXTRACT_16BITS(header_lsp->remaining_lifetime),
19782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               EXTRACT_16BITS(header_lsp->checksum));
19792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* if this is a purge do not attempt to verify the checksum */
19812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if ( EXTRACT_16BITS(header_lsp->remaining_lifetime) == 0 &&
19822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project             EXTRACT_16BITS(header_lsp->checksum) == 0)
19832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf(" (purged)");
19842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        else
19852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* verify the checksum -
19862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project             * checking starts at the lsp-id field at byte position [12]
19872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project             * hence the length needs to be reduced by 12 bytes */
19882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf(" (%s)", (osi_cksum((u_int8_t *)header_lsp->lsp_id, length-12)) ? "incorrect" : "correct");
19892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(", PDU length: %u, Flags: [ %s",
19912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               pdu_len,
19922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ISIS_MASK_LSP_OL_BIT(header_lsp->typeblock) ? "Overload bit set, " : "");
19932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ISIS_MASK_LSP_ATT_BITS(header_lsp->typeblock)) {
19952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("%s", ISIS_MASK_LSP_ATT_DEFAULT_BIT(header_lsp->typeblock) ? "default " : "");
19962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("%s", ISIS_MASK_LSP_ATT_DELAY_BIT(header_lsp->typeblock) ? "delay " : "");
19972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("%s", ISIS_MASK_LSP_ATT_EXPENSE_BIT(header_lsp->typeblock) ? "expense " : "");
19982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("%s", ISIS_MASK_LSP_ATT_ERROR_BIT(header_lsp->typeblock) ? "error " : "");
19992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("ATT bit set, ");
20002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
20012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s", ISIS_MASK_LSP_PARTITION_BIT(header_lsp->typeblock) ? "P bit set, " : "");
20022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s ]", tok2str(isis_lsp_istype_values,"Unknown(0x%x)",ISIS_MASK_LSP_ISTYPE_BITS(header_lsp->typeblock)));
20032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (vflag > 1) {
20052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if(!print_unknown_data(pptr,"\n\t  ",ISIS_LSP_HEADER_SIZE))
20062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return(0);
20072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
20082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	packet_len -= (ISIS_COMMON_HEADER_SIZE+ISIS_LSP_HEADER_SIZE);
20102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pptr = p + (ISIS_COMMON_HEADER_SIZE+ISIS_LSP_HEADER_SIZE);
20112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
20122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case ISIS_PDU_L1_CSNP:
20142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case ISIS_PDU_L2_CSNP:
20152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (isis_header->fixed_len != (ISIS_COMMON_HEADER_SIZE+ISIS_CSNP_HEADER_SIZE)) {
20162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", bogus fixed header length %u should be %lu",
20172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   isis_header->fixed_len, (unsigned long)ISIS_CSNP_HEADER_SIZE);
20182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return (0);
20192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
20202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pdu_len=EXTRACT_16BITS(header_csnp->pdu_len);
20222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (packet_len>pdu_len) {
20232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            packet_len=pdu_len; /* do TLV decoding as long as it makes sense */
20242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            length=pdu_len;
20252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
20262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*header_csnp);
20282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t  source-id:    %s, PDU length: %u",
20292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               isis_print_id(header_csnp->source_id, NODE_ID_LEN),
20302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               pdu_len);
20312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t  start lsp-id: %s",
20322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               isis_print_id(header_csnp->start_lsp_id, LSP_ID_LEN));
20332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t  end lsp-id:   %s",
20342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               isis_print_id(header_csnp->end_lsp_id, LSP_ID_LEN));
20352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (vflag > 1) {
20372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if(!print_unknown_data(pptr,"\n\t  ",ISIS_CSNP_HEADER_SIZE))
20382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return(0);
20392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
20402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	packet_len -= (ISIS_COMMON_HEADER_SIZE+ISIS_CSNP_HEADER_SIZE);
20422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pptr = p + (ISIS_COMMON_HEADER_SIZE+ISIS_CSNP_HEADER_SIZE);
20432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        break;
20442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case ISIS_PDU_L1_PSNP:
20462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case ISIS_PDU_L2_PSNP:
20472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (isis_header->fixed_len != (ISIS_COMMON_HEADER_SIZE+ISIS_PSNP_HEADER_SIZE)) {
20482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("- bogus fixed header length %u should be %lu",
20492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   isis_header->fixed_len, (unsigned long)ISIS_PSNP_HEADER_SIZE);
20502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return (0);
20512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
20522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pdu_len=EXTRACT_16BITS(header_psnp->pdu_len);
20542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (packet_len>pdu_len) {
20552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            packet_len=pdu_len; /* do TLV decoding as long as it makes sense */
20562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            length=pdu_len;
20572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
20582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*header_psnp);
20602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t  source-id:    %s, PDU length: %u",
20612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               isis_print_id(header_psnp->source_id, NODE_ID_LEN),
20622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               pdu_len);
20632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (vflag > 1) {
20652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if(!print_unknown_data(pptr,"\n\t  ",ISIS_PSNP_HEADER_SIZE))
20662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return(0);
20672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
20682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	packet_len -= (ISIS_COMMON_HEADER_SIZE+ISIS_PSNP_HEADER_SIZE);
20702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pptr = p + (ISIS_COMMON_HEADER_SIZE+ISIS_PSNP_HEADER_SIZE);
20712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
20722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    default:
20742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if(!print_unknown_data(pptr,"\n\t  ",length))
20752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return(0);
20762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
20772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
20782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /*
20802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     * Now print the TLV's.
20812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     */
20822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    while (packet_len >= 2) {
20842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (pptr == snapend) {
20852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return (1);
20862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
20872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!TTEST2(*pptr, 2)) {
20892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("\n\t\t packet exceeded snapshot (%ld) bytes",
20902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   (long)(pptr-snapend));
20912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return (1);
20922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
20932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	tlv_type = *pptr++;
20942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	tlv_len = *pptr++;
20952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        tmp =tlv_len; /* copy temporary len & pointer to packet data */
20962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        tptr = pptr;
20972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	packet_len -= 2;
20982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (tlv_len > packet_len) {
20992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
21002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
21012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* first lets see if we know the TLVs name*/
21032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t    %s TLV #%u, length: %u",
21042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tok2str(isis_tlv_values,
21052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       "unknown",
21062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tlv_type),
21072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tlv_type,
21082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tlv_len);
21092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (tlv_len == 0) /* something is malformed */
21112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    continue;
21122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* now check if we have a decoder otherwise do a hexdump at the end*/
21142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (tlv_type) {
21152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_AREA_ADDR:
21162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!TTEST2(*tptr, 1))
21172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunctlv;
21182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    alen = *tptr++;
21192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while (tmp && alen < tmp) {
21202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t      Area address (length: %u): %s",
21212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       alen,
21222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       isonsap_string(tptr,alen));
21232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tptr += alen;
21242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp -= alen + 1;
21252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (tmp==0) /* if this is the last area address do not attemt a boundary check */
21262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
21272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST2(*tptr, 1))
21282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
21292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		alen = *tptr++;
21302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
21312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
21322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_ISNEIGH:
21332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while (tmp >= ETHER_ADDR_LEN) {
21342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (!TTEST2(*tptr, ETHER_ADDR_LEN))
21352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
21362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("\n\t      SNPA: %s",isis_print_id(tptr,ETHER_ADDR_LEN));
21372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tmp -= ETHER_ADDR_LEN;
21382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr += ETHER_ADDR_LEN;
21392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
21402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
21412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_ISNEIGH_VARLEN:
21432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (!TTEST2(*tptr, 1) || tmp < 3) /* min. TLV length */
21442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunctlv;
21452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    lan_alen = *tptr++; /* LAN address length */
21462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (lan_alen == 0) {
21472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("\n\t      LAN address length 0 bytes (invalid)");
21482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
21492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
21502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tmp --;
21512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t      LAN address length %u bytes ",lan_alen);
21522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while (tmp >= lan_alen) {
21532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (!TTEST2(*tptr, lan_alen))
21542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
21552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("\n\t\tIS Neighbor: %s",isis_print_id(tptr,lan_alen));
21562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tmp -= lan_alen;
21572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr +=lan_alen;
21582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
21592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
21602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_PADDING:
21622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
21632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_MT_IS_REACH:
21652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            while (tmp >= 2+NODE_ID_LEN+3+1) {
21662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                mt_len = isis_print_mtid(tptr, "\n\t      ");
21672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (mt_len == 0) /* did something go wrong ? */
21682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
21692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr+=mt_len;
21702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tmp-=mt_len;
21712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                ext_is_len = isis_print_ext_is_reach(tptr,"\n\t      ",tlv_type);
21732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (ext_is_len == 0) /* did something go wrong ? */
21742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
21752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tmp-=ext_is_len;
21772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr+=ext_is_len;
21782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
21792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
21802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_IS_ALIAS_ID:
21822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while (tmp >= NODE_ID_LEN+1) { /* is it worth attempting a decode ? */
21832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        ext_is_len = isis_print_ext_is_reach(tptr,"\n\t      ",tlv_type);
21842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ext_is_len == 0) /* did something go wrong ? */
21852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	            goto trunctlv;
21862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp-=ext_is_len;
21872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tptr+=ext_is_len;
21882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
21892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
21902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_EXT_IS_REACH:
21922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            while (tmp >= NODE_ID_LEN+3+1) { /* is it worth attempting a decode ? */
21932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                ext_is_len = isis_print_ext_is_reach(tptr,"\n\t      ",tlv_type);
21942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (ext_is_len == 0) /* did something go wrong ? */
21952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
21962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tmp-=ext_is_len;
21972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr+=ext_is_len;
21982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
21992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
22002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_IS_REACH:
22012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!TTEST2(*tptr,1))  /* check if there is one byte left to read out the virtual flag */
22022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
22032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t      %s",
22042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(isis_is_reach_virtual_values,
22052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           "bogus virtual flag 0x%02x",
22062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           *tptr++));
22072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    tlv_is_reach = (const struct isis_tlv_is_reach *)tptr;
22082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            while (tmp >= sizeof(struct isis_tlv_is_reach)) {
22092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST(*tlv_is_reach))
22102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
22112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t      IS Neighbor: %s",
22122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       isis_print_id(tlv_is_reach->neighbor_nodeid, NODE_ID_LEN));
22132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                isis_print_metric_block(&tlv_is_reach->isis_metric_block);
22142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp -= sizeof(struct isis_tlv_is_reach);
22152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tlv_is_reach++;
22162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
22172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
22182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_ESNEIGH:
22202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    tlv_es_reach = (const struct isis_tlv_es_reach *)tptr;
22212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            while (tmp >= sizeof(struct isis_tlv_es_reach)) {
22222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST(*tlv_es_reach))
22232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
22242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t      ES Neighbor: %s",
22252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       isis_print_id(tlv_es_reach->neighbor_sysid,SYSTEM_ID_LEN));
22262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                isis_print_metric_block(&tlv_es_reach->isis_metric_block);
22272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp -= sizeof(struct isis_tlv_es_reach);
22282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tlv_es_reach++;
22292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
22302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
22312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* those two TLVs share the same format */
22332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_INT_IP_REACH:
22342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_EXT_IP_REACH:
22352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!isis_print_tlv_ip_reach(pptr, "\n\t      ", tlv_len))
22362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
22372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
22382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_EXTD_IP_REACH:
22402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while (tmp>0) {
22412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                ext_ip_len = isis_print_extd_ip_reach(tptr, "\n\t      ", IPV4);
22422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (ext_ip_len == 0) /* did something go wrong ? */
22432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
22442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr+=ext_ip_len;
22452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp-=ext_ip_len;
22462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
22472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
22482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_MT_IP_REACH:
22502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            mt_len = isis_print_mtid(tptr, "\n\t      ");
22512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (mt_len == 0) { /* did something go wrong ? */
22522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
22532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
22542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr+=mt_len;
22552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tmp-=mt_len;
22562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            while (tmp>0) {
22582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                ext_ip_len = isis_print_extd_ip_reach(tptr, "\n\t      ", IPV4);
22592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (ext_ip_len == 0) /* did something go wrong ? */
22602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
22612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr+=ext_ip_len;
22622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp-=ext_ip_len;
22632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
22642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
22652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
22672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_IP6_REACH:
22682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while (tmp>0) {
22692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                ext_ip_len = isis_print_extd_ip_reach(tptr, "\n\t      ", IPV6);
22702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (ext_ip_len == 0) /* did something go wrong ? */
22712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
22722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr+=ext_ip_len;
22732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp-=ext_ip_len;
22742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
22752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
22762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_MT_IP6_REACH:
22782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            mt_len = isis_print_mtid(tptr, "\n\t      ");
22792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (mt_len == 0) { /* did something go wrong ? */
22802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
22812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
22822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr+=mt_len;
22832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tmp-=mt_len;
22842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while (tmp>0) {
22862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                ext_ip_len = isis_print_extd_ip_reach(tptr, "\n\t      ", IPV6);
22872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (ext_ip_len == 0) /* did something go wrong ? */
22882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
22892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr+=ext_ip_len;
22902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp-=ext_ip_len;
22912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
22922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
22932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_IP6ADDR:
22952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while (tmp>=sizeof(struct in6_addr)) {
22962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST2(*tptr, sizeof(struct in6_addr)))
22972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
22982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("\n\t      IPv6 interface address: %s",
23002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       ip6addr_string(tptr));
23012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tptr += sizeof(struct in6_addr);
23032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp -= sizeof(struct in6_addr);
23042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
23052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
23062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
23072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_AUTH:
23082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!TTEST2(*tptr, 1))
23092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunctlv;
23102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t      %s: ",
23122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(isis_subtlv_auth_values,
23132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           "unknown Authentication type 0x%02x",
23142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           *tptr));
23152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    switch (*tptr) {
23172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    case ISIS_SUBTLV_AUTH_SIMPLE:
23182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for(i=1;i<tlv_len;i++) {
23192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    if (!TTEST2(*(tptr+i), 1))
23202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunctlv;
23212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    printf("%c",*(tptr+i));
23222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
23232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
23242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    case ISIS_SUBTLV_AUTH_MD5:
23252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for(i=1;i<tlv_len;i++) {
23262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    if (!TTEST2(*(tptr+i), 1))
23272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunctlv;
23282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    printf("%02x",*(tptr+i));
23292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
23302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (tlv_len != ISIS_SUBTLV_AUTH_MD5_LEN+1)
23312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf(", (malformed subTLV) ");
23322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
23332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    case ISIS_SUBTLV_AUTH_PRIVATE:
23342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    default:
23352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if(!print_unknown_data(tptr+1,"\n\t\t  ",tlv_len-1))
23362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    return(0);
23372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
23382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
23392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
23402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_PTP_ADJ:
23422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    tlv_ptp_adj = (const struct isis_tlv_ptp_adj *)tptr;
23432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if(tmp>=1) {
23442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST2(*tptr, 1))
23452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
23462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t      Adjacency State: %s (%u)",
23472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       tok2str(isis_ptp_adjancey_values, "unknown", *tptr),
23482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        *tptr);
23492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp--;
23502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
23512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if(tmp>sizeof(tlv_ptp_adj->extd_local_circuit_id)) {
23522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST2(tlv_ptp_adj->extd_local_circuit_id,
23532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            sizeof(tlv_ptp_adj->extd_local_circuit_id)))
23542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
23552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t      Extended Local circuit-ID: 0x%08x",
23562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(tlv_ptp_adj->extd_local_circuit_id));
23572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp-=sizeof(tlv_ptp_adj->extd_local_circuit_id);
23582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
23592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if(tmp>=SYSTEM_ID_LEN) {
23602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST2(tlv_ptp_adj->neighbor_sysid, SYSTEM_ID_LEN))
23612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
23622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t      Neighbor System-ID: %s",
23632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       isis_print_id(tlv_ptp_adj->neighbor_sysid,SYSTEM_ID_LEN));
23642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp-=SYSTEM_ID_LEN;
23652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
23662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if(tmp>=sizeof(tlv_ptp_adj->neighbor_extd_local_circuit_id)) {
23672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST2(tlv_ptp_adj->neighbor_extd_local_circuit_id,
23682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            sizeof(tlv_ptp_adj->neighbor_extd_local_circuit_id)))
23692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
23702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t      Neighbor Extended Local circuit-ID: 0x%08x",
23712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(tlv_ptp_adj->neighbor_extd_local_circuit_id));
23722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
23732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
23742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_PROTOCOLS:
23762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("\n\t      NLPID(s): ");
23772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while (tmp>0) {
23782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST2(*(tptr), 1))
23792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
23802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%s (0x%02x)",
23812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(nlpid_values,
23822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               "unknown",
23832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               *tptr),
23842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       *tptr);
23852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (tmp>1) /* further NPLIDs ? - put comma */
23862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    printf(", ");
23872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr++;
23882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tmp--;
23892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
23902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
23912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_TE_ROUTER_ID:
23932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!TTEST2(*pptr, sizeof(struct in_addr)))
23942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunctlv;
23952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("\n\t      Traffic Engineering Router ID: %s", ipaddr_string(pptr));
23962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
23972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_IPADDR:
23992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while (tmp>=sizeof(struct in_addr)) {
24002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST2(*tptr, sizeof(struct in_addr)))
24012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
24022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t      IPv4 interface address: %s", ipaddr_string(tptr));
24032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tptr += sizeof(struct in_addr);
24042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp -= sizeof(struct in_addr);
24052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
24062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
24072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_HOSTNAME:
24092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("\n\t      Hostname: ");
24102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while (tmp>0) {
24112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST2(*tptr, 1))
24122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
24132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%c",*tptr++);
24142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tmp--;
24152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
24162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
24172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_SHARED_RISK_GROUP:
24192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (tmp < NODE_ID_LEN)
24202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        break;
24212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!TTEST2(*tptr, NODE_ID_LEN))
24222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
24232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("\n\t      IS Neighbor: %s", isis_print_id(tptr, NODE_ID_LEN));
24242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    tptr+=(NODE_ID_LEN);
24252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    tmp-=(NODE_ID_LEN);
24262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (tmp < 1)
24282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        break;
24292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!TTEST2(*tptr, 1))
24302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
24312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", Flags: [%s]", ISIS_MASK_TLV_SHARED_RISK_GROUP(*tptr++) ? "numbered" : "unnumbered");
24322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    tmp--;
24332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (tmp < sizeof(struct in_addr))
24352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        break;
24362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!TTEST2(*tptr,sizeof(struct in_addr)))
24372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
24382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("\n\t      IPv4 interface address: %s", ipaddr_string(tptr));
24392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    tptr+=sizeof(struct in_addr);
24402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    tmp-=sizeof(struct in_addr);
24412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (tmp < sizeof(struct in_addr))
24432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        break;
24442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!TTEST2(*tptr,sizeof(struct in_addr)))
24452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
24462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("\n\t      IPv4 neighbor address: %s", ipaddr_string(tptr));
24472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    tptr+=sizeof(struct in_addr);
24482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    tmp-=sizeof(struct in_addr);
24492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while (tmp>=4) {
24512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (!TTEST2(*tptr, 4))
24522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
24532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("\n\t      Link-ID: 0x%08x", EXTRACT_32BITS(tptr));
24542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr+=4;
24552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tmp-=4;
24562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
24572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
24582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_LSP:
24602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    tlv_lsp = (const struct isis_tlv_lsp *)tptr;
24612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while(tmp>=sizeof(struct isis_tlv_lsp)) {
24622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST((tlv_lsp->lsp_id)[LSP_ID_LEN-1]))
24632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
24642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t      lsp-id: %s",
24652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       isis_print_id(tlv_lsp->lsp_id, LSP_ID_LEN));
24662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST2(tlv_lsp->sequence_number, 4))
24672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
24682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(", seq: 0x%08x",EXTRACT_32BITS(tlv_lsp->sequence_number));
24692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST2(tlv_lsp->remaining_lifetime, 2))
24702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
24712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(", lifetime: %5ds",EXTRACT_16BITS(tlv_lsp->remaining_lifetime));
24722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!TTEST2(tlv_lsp->checksum, 2))
24732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto trunctlv;
24742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(", chksum: 0x%04x",EXTRACT_16BITS(tlv_lsp->checksum));
24752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tmp-=sizeof(struct isis_tlv_lsp);
24762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tlv_lsp++;
24772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
24782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
24792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_CHECKSUM:
24812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (tmp < ISIS_TLV_CHECKSUM_MINLEN)
24822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        break;
24832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!TTEST2(*tptr, ISIS_TLV_CHECKSUM_MINLEN))
24842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunctlv;
24852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("\n\t      checksum: 0x%04x ", EXTRACT_16BITS(tptr));
24862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* do not attempt to verify the checksum if it is zero
24872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project             * most likely a HMAC-MD5 TLV is also present and
24882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project             * to avoid conflicts the checksum TLV is zeroed.
24892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project             * see rfc3358 for details
24902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project             */
24912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (EXTRACT_16BITS(tptr) == 0)
24922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("(unverified)");
24932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            else printf("(%s)", osi_cksum(optr, length) ? "incorrect" : "correct");
24942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
24952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_MT_SUPPORTED:
24972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (tmp < ISIS_TLV_MT_SUPPORTED_MINLEN)
24982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
24992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while (tmp>1) {
25002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* length can only be a multiple of 2, otherwise there is
25012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   something broken -> so decode down until length is 1 */
25022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (tmp!=1) {
25032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    mt_len = isis_print_mtid(tptr, "\n\t      ");
25042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    if (mt_len == 0) /* did something go wrong ? */
25052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        goto trunctlv;
25062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    tptr+=mt_len;
25072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    tmp-=mt_len;
25082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
25092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    printf("\n\t      malformed MT-ID");
25102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    break;
25112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
25122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
25132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
25142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case ISIS_TLV_RESTART_SIGNALING:
25162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* first attempt to decode the flags */
25172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (tmp < ISIS_TLV_RESTART_SIGNALING_FLAGLEN)
25182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
25192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (!TTEST2(*tptr, ISIS_TLV_RESTART_SIGNALING_FLAGLEN))
25202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
25212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t      Flags [%s]",
25222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   bittok2str(isis_restart_flag_values, "none", *tptr));
25232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr+=ISIS_TLV_RESTART_SIGNALING_FLAGLEN;
25242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tmp-=ISIS_TLV_RESTART_SIGNALING_FLAGLEN;
25252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* is there anything other than the flags field? */
25272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (tmp == 0)
25282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
25292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (tmp < ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN)
25312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
25322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (!TTEST2(*tptr, ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN))
25332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
25342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf(", Remaining holding time %us", EXTRACT_16BITS(tptr));
25362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr+=ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN;
25372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tmp-=ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN;
25382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* is there an additional sysid field present ?*/
25402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (tmp == SYSTEM_ID_LEN) {
25412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    if (!TTEST2(*tptr, SYSTEM_ID_LEN))
25422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            goto trunctlv;
25432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf(", for %s",isis_print_id(tptr,SYSTEM_ID_LEN));
25442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
25452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
25462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_IDRP_INFO:
25482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (tmp < ISIS_TLV_IDRP_INFO_MINLEN)
25492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        break;
25502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (!TTEST2(*tptr, ISIS_TLV_IDRP_INFO_MINLEN))
25512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
25522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t      Inter-Domain Information Type: %s",
25532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(isis_subtlv_idrp_values,
25542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           "Unknown (0x%02x)",
25552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           *tptr));
25562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            switch (*tptr++) {
25572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case ISIS_SUBTLV_IDRP_ASN:
25582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (!TTEST2(*tptr, 2)) /* fetch AS number */
25592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
25602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("AS Number: %u",EXTRACT_16BITS(tptr));
25612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
25622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case ISIS_SUBTLV_IDRP_LOCAL:
25632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case ISIS_SUBTLV_IDRP_RES:
25642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            default:
25652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if(!print_unknown_data(tptr,"\n\t      ",tlv_len-1))
25662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    return(0);
25672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
25682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
25692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
25702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_LSP_BUFFERSIZE:
25722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (tmp < ISIS_TLV_LSP_BUFFERSIZE_MINLEN)
25732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        break;
25742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (!TTEST2(*tptr, ISIS_TLV_LSP_BUFFERSIZE_MINLEN))
25752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
25762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t      LSP Buffersize: %u",EXTRACT_16BITS(tptr));
25772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
25782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_PART_DIS:
25802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            while (tmp >= SYSTEM_ID_LEN) {
25812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (!TTEST2(*tptr, SYSTEM_ID_LEN))
25822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
25832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("\n\t      %s",isis_print_id(tptr,SYSTEM_ID_LEN));
25842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr+=SYSTEM_ID_LEN;
25852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tmp-=SYSTEM_ID_LEN;
25862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
25872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
25882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_PREFIX_NEIGH:
25902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (tmp < sizeof(struct isis_metric_block))
25912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        break;
25922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (!TTEST2(*tptr, sizeof(struct isis_metric_block)))
25932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
25942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t      Metric Block");
25952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            isis_print_metric_block((const struct isis_metric_block *)tptr);
25962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr+=sizeof(struct isis_metric_block);
25972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tmp-=sizeof(struct isis_metric_block);
25982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            while(tmp>0) {
26002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (!TTEST2(*tptr, 1))
26012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
26022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                prefix_len=*tptr++; /* read out prefix length in semioctets*/
26032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (prefix_len < 2) {
26042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("\n\t\tAddress: prefix length %u < 2", prefix_len);
26052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
26062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                }
26072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tmp--;
26082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (tmp < prefix_len/2)
26092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
26102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (!TTEST2(*tptr, prefix_len/2))
26112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    goto trunctlv;
26122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("\n\t\tAddress: %s/%u",
26132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       isonsap_string(tptr,prefix_len/2),
26142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       prefix_len*4);
26152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr+=prefix_len/2;
26162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tmp-=prefix_len/2;
26172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
26182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
26192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_IIH_SEQNR:
26212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (tmp < ISIS_TLV_IIH_SEQNR_MINLEN)
26222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        break;
26232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (!TTEST2(*tptr, ISIS_TLV_IIH_SEQNR_MINLEN)) /* check if four bytes are on the wire */
26242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
26252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t      Sequence number: %u", EXTRACT_32BITS(tptr) );
26262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
26272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_VENDOR_PRIVATE:
26292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (tmp < ISIS_TLV_VENDOR_PRIVATE_MINLEN)
26302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        break;
26312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (!TTEST2(*tptr, ISIS_TLV_VENDOR_PRIVATE_MINLEN)) /* check if enough byte for a full oui */
26322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                goto trunctlv;
26332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            vendor_id = EXTRACT_24BITS(tptr);
26342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t      Vendor: %s (%u)",
26352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(oui_values,"Unknown",vendor_id),
26362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   vendor_id);
26372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr+=3;
26382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tmp-=3;
26392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (tmp > 0) /* hexdump the rest */
26402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if(!print_unknown_data(tptr,"\n\t\t",tmp))
26412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    return(0);
26422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
26432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /*
26442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project             * FIXME those are the defined TLVs that lack a decoder
26452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project             * you are welcome to contribute code ;-)
26462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project             */
26472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_DECNET_PHASE4:
26492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_LUCENT_PRIVATE:
26502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_IPAUTH:
26512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_NORTEL_PRIVATE1:
26522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ISIS_TLV_NORTEL_PRIVATE2:
26532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
26552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (vflag <= 1) {
26562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if(!print_unknown_data(pptr,"\n\t\t",tlv_len))
26572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    return(0);
26582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
26592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
26602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
26612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* do we want to see an additionally hexdump ? */
26622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (vflag> 1) {
26632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if(!print_unknown_data(pptr,"\n\t      ",tlv_len))
26642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        return(0);
26652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
26662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pptr += tlv_len;
26682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	packet_len -= tlv_len;
26692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
26702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (packet_len != 0) {
26722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t      %u straggler bytes", packet_len);
26732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
26742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return (1);
26752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trunc:
26772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    fputs("[|isis]", stdout);
26782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return (1);
26792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trunctlv:
26812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("\n\t\t packet exceeded snapshot");
26822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return(1);
26832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
26842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
26862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Verify the checksum.  See 8473-1, Appendix C, section C.4.
26872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
26882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
26902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectosi_cksum(const u_int8_t *tptr, u_int len)
26912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
26922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int32_t c0 = 0, c1 = 0;
26932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while ((int)--len >= 0) {
26952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		c0 += *tptr++;
26962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		c0 %= 255;
26972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		c1 += c0;
26982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		c1 %= 255;
26992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
27002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (c0 | c1);
27012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
27022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
27052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Local Variables:
27062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-style: whitesmith
27072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-basic-offset: 8
27082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * End:
27092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
2710