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