12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997 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 * OSPF support contributed by Jeffrey Honig (jch@mitchell.cit.cornell.edu) 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 2653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "@(#) $Header: /tcpdump/master/tcpdump/print-ospf.c,v 1.66 2007-10-08 07:53:21 hannes Exp $ (LBL)"; 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "gmpls.h" 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ospf.h" 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h" 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf_option_values[] = { 4753f17a9db278d33517d9888dd77848f554522a38JP Abgrall { OSPF_OPTION_T, "MultiTopology" }, /* draft-ietf-ospf-mt-09 */ 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_OPTION_E, "External" }, 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_OPTION_MC, "Multicast" }, 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_OPTION_NP, "NSSA" }, 5153f17a9db278d33517d9888dd77848f554522a38JP Abgrall { OSPF_OPTION_L, "LLS" }, 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_OPTION_DC, "Demand Circuit" }, 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_OPTION_O, "Opaque" }, 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_OPTION_DN, "Up/Down" }, 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf_authtype_values[] = { 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_AUTH_NONE, "none" }, 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_AUTH_SIMPLE, "simple" }, 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_AUTH_MD5, "MD5" }, 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf_rla_flag_values[] = { 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { RLA_FLAG_B, "ABR" }, 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { RLA_FLAG_E, "ASBR" }, 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { RLA_FLAG_W1, "Virtual" }, 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { RLA_FLAG_W2, "W2" }, 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok type2str[] = { 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_TYPE_UMD, "UMD" }, 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_TYPE_HELLO, "Hello" }, 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_TYPE_DD, "Database Description" }, 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_TYPE_LS_REQ, "LS-Request" }, 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_TYPE_LS_UPDATE, "LS-Update" }, 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_TYPE_LS_ACK, "LS-Ack" }, 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lsa_values[] = { 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_TYPE_ROUTER, "Router" }, 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_TYPE_NETWORK, "Network" }, 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_TYPE_SUM_IP, "Summary" }, 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_TYPE_SUM_ABR, "ASBR Summary" }, 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_TYPE_ASE, "External" }, 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_TYPE_GROUP, "Multicast Group" }, 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_TYPE_NSSA, "NSSA" }, 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_TYPE_OPAQUE_LL, "Link Local Opaque" }, 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_TYPE_OPAQUE_AL, "Area Local Opaque" }, 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_TYPE_OPAQUE_DW, "Domain Wide Opaque" }, 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf_dd_flag_values[] = { 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_DB_INIT, "Init" }, 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_DB_MORE, "More" }, 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OSPF_DB_MASTER, "Master" }, 10153f17a9db278d33517d9888dd77848f554522a38JP Abgrall { OSPF_DB_RESYNC, "OOBResync" }, 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lsa_opaque_values[] = { 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TYPE_TE, "Traffic Engineering" }, 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TYPE_GRACE, "Graceful restart" }, 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TYPE_RI, "Router Information" }, 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lsa_opaque_te_tlv_values[] = { 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_TLV_ROUTER, "Router Address" }, 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_TLV_LINK, "Link" }, 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lsa_opaque_te_link_tlv_subtlv_values[] = { 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE, "Link Type" }, 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_LINK_ID, "Link ID" }, 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_LOCAL_IP, "Local Interface IP address" }, 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_REMOTE_IP, "Remote Interface IP address" }, 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_TE_METRIC, "Traffic Engineering Metric" }, 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_MAX_BW, "Maximum Bandwidth" }, 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_MAX_RES_BW, "Maximum Reservable Bandwidth" }, 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_UNRES_BW, "Unreserved Bandwidth" }, 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_ADMIN_GROUP, "Administrative Group" }, 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_LINK_LOCAL_REMOTE_ID, "Link Local/Remote Identifier" }, 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_LINK_PROTECTION_TYPE, "Link Protection Type" }, 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_INTF_SW_CAP_DESCR, "Interface Switching Capability" }, 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_SHARED_RISK_GROUP, "Shared Risk Link Group" }, 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_BW_CONSTRAINTS, "Bandwidth Constraints" }, 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lsa_opaque_grace_tlv_values[] = { 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_GRACE_TLV_PERIOD, "Grace Period" }, 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_GRACE_TLV_REASON, "Graceful restart Reason" }, 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_GRACE_TLV_INT_ADDRESS, "IPv4 interface address" }, 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lsa_opaque_grace_tlv_reason_values[] = { 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_GRACE_TLV_REASON_UNKNOWN, "Unknown" }, 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_GRACE_TLV_REASON_SW_RESTART, "Software Restart" }, 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_GRACE_TLV_REASON_SW_UPGRADE, "Software Reload/Upgrade" }, 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_GRACE_TLV_REASON_CP_SWITCH, "Control Processor Switch" }, 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lsa_opaque_te_tlv_link_type_sub_tlv_values[] = { 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE_PTP, "Point-to-point" }, 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE_MA, "Multi-Access" }, 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lsa_opaque_ri_tlv_values[] = { 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { LS_OPAQUE_RI_TLV_CAP, "Router Capabilities" }, 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lsa_opaque_ri_tlv_cap_values[] = { 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 1, "Reserved" }, 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 2, "Reserved" }, 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 4, "Reserved" }, 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 8, "Reserved" }, 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 16, "graceful restart capable" }, 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 32, "graceful restart helper" }, 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 64, "Stub router support" }, 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 128, "Traffic engineering" }, 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 256, "p2p over LAN" }, 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 512, "path computation server" }, 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf_lls_tlv_values[] = { 17753f17a9db278d33517d9888dd77848f554522a38JP Abgrall { OSPF_LLS_EO, "Extended Options" }, 17853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { OSPF_LLS_MD5, "MD5 Authentication" }, 17953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0, NULL } 18053f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 18153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 18253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf_lls_eo_options[] = { 18353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { OSPF_LLS_EO_LR, "LSDB resync" }, 18453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { OSPF_LLS_EO_RS, "Restart" }, 18553f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0, NULL } 18653f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic char tstr[] = " [|ospf2]"; 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int ospf_print_lshdr(const struct lsa_hdr *); 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *ospf_print_lsa(const struct lsa *); 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int ospf_decode_v2(const struct ospfhdr *, const u_char *); 19353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int ospf_decode_lls(const struct ospfhdr *, register u_int); 19453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 19553f17a9db278d33517d9888dd77848f554522a38JP Abgrallint 19653f17a9db278d33517d9888dd77848f554522a38JP Abgrallospf_print_grace_lsa (const u_int8_t *tptr, u_int ls_length) { 19753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 19853f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int tlv_type, tlv_length; 19953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 20053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 20153f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (ls_length > 0) { 20253f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*tptr, 4); 20353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ls_length < 4) { 20453f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Remaining LS length %u < 4", ls_length); 20553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 20653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 20753f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_type = EXTRACT_16BITS(tptr); 20853f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_length = EXTRACT_16BITS(tptr+2); 20953f17a9db278d33517d9888dd77848f554522a38JP Abgrall tptr+=4; 21053f17a9db278d33517d9888dd77848f554522a38JP Abgrall ls_length-=4; 21153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 21253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t %s TLV (%u), length %u, value: ", 21353f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(lsa_opaque_grace_tlv_values,"unknown",tlv_type), 21453f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_type, 21553f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_length); 21653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 21753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tlv_length > ls_length) { 21853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Bogus length %u > %u", tlv_length, 21953f17a9db278d33517d9888dd77848f554522a38JP Abgrall ls_length); 22053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 22153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 22253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 22353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Infinite loop protection. */ 22453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tlv_type == 0 || tlv_length ==0) { 22553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 22653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 22753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 22853f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*tptr, tlv_length); 22953f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch(tlv_type) { 23053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 23153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_GRACE_TLV_PERIOD: 23253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tlv_length != 4) { 23353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Bogus length %u != 4", tlv_length); 23453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 23553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 23653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%us",EXTRACT_32BITS(tptr)); 23753f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 23853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 23953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_GRACE_TLV_REASON: 24053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tlv_length != 1) { 24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Bogus length %u != 1", tlv_length); 24253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 24353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 24453f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%s (%u)", 24553f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(lsa_opaque_grace_tlv_reason_values, "Unknown", *tptr), 24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall *tptr); 24753f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 24853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 24953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_GRACE_TLV_INT_ADDRESS: 25053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tlv_length != 4) { 25153f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Bogus length %u != 4", tlv_length); 25253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 25353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 25453f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%s", ipaddr_string(tptr)); 25553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 25653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 25753f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 25853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (vflag <= 1) { 25953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if(!print_unknown_data(tptr,"\n\t ",tlv_length)) 26053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 26153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 26253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 26353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 26453f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 26553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* in OSPF everything has to be 32-bit aligned, including TLVs */ 26653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tlv_length%4 != 0) 26753f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_length+=4-(tlv_length%4); 26853f17a9db278d33517d9888dd77848f554522a38JP Abgrall ls_length-=tlv_length; 26953f17a9db278d33517d9888dd77848f554522a38JP Abgrall tptr+=tlv_length; 27053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 27153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 27253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 27353f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc: 27453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 27553f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 27653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 27753f17a9db278d33517d9888dd77848f554522a38JP Abgrallint 27853f17a9db278d33517d9888dd77848f554522a38JP Abgrallospf_print_te_lsa (const u_int8_t *tptr, u_int ls_length) { 27953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 28053f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int tlv_type, tlv_length, subtlv_type, subtlv_length; 28153f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int priority_level, te_class, count_srlg; 28253f17a9db278d33517d9888dd77848f554522a38JP Abgrall union { /* int to float conversion buffer for several subTLVs */ 28353f17a9db278d33517d9888dd77848f554522a38JP Abgrall float f; 28453f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int32_t i; 28553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } bw; 28653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 28753f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (ls_length != 0) { 28853f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*tptr, 4); 28953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ls_length < 4) { 29053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Remaining LS length %u < 4", ls_length); 29153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 29253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 29353f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_type = EXTRACT_16BITS(tptr); 29453f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_length = EXTRACT_16BITS(tptr+2); 29553f17a9db278d33517d9888dd77848f554522a38JP Abgrall tptr+=4; 29653f17a9db278d33517d9888dd77848f554522a38JP Abgrall ls_length-=4; 29753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 29853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t %s TLV (%u), length: %u", 29953f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(lsa_opaque_te_tlv_values,"unknown",tlv_type), 30053f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_type, 30153f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_length); 30253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 30353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tlv_length > ls_length) { 30453f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Bogus length %u > %u", tlv_length, 30553f17a9db278d33517d9888dd77848f554522a38JP Abgrall ls_length); 30653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 30753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 30853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 30953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Infinite loop protection. */ 31053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tlv_type == 0 || tlv_length ==0) { 31153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 31253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 31353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 31453f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch(tlv_type) { 31553f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_TLV_LINK: 31653f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (tlv_length >= sizeof(subtlv_type) + sizeof(subtlv_length)) { 31753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tlv_length < 4) { 31853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Remaining TLV length %u < 4", 31953f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_length); 32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 32153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 32253f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*tptr, 4); 32353f17a9db278d33517d9888dd77848f554522a38JP Abgrall subtlv_type = EXTRACT_16BITS(tptr); 32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall subtlv_length = EXTRACT_16BITS(tptr+2); 32553f17a9db278d33517d9888dd77848f554522a38JP Abgrall tptr+=4; 32653f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_length-=4; 32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 32853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t %s subTLV (%u), length: %u", 32953f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(lsa_opaque_te_link_tlv_subtlv_values,"unknown",subtlv_type), 33053f17a9db278d33517d9888dd77848f554522a38JP Abgrall subtlv_type, 33153f17a9db278d33517d9888dd77848f554522a38JP Abgrall subtlv_length); 33253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 33353f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*tptr, subtlv_length); 33453f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch(subtlv_type) { 33553f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_ADMIN_GROUP: 33653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", 0x%08x", EXTRACT_32BITS(tptr)); 33753f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 33853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_LINK_ID: 33953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_LINK_LOCAL_REMOTE_ID: 34053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", %s (0x%08x)", 34153f17a9db278d33517d9888dd77848f554522a38JP Abgrall ipaddr_string(tptr), 34253f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_32BITS(tptr)); 34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (subtlv_length == 8) /* rfc4203 */ 34453f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", %s (0x%08x)", 34553f17a9db278d33517d9888dd77848f554522a38JP Abgrall ipaddr_string(tptr+4), 34653f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_32BITS(tptr+4)); 34753f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 34853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_LOCAL_IP: 34953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_REMOTE_IP: 35053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", %s", ipaddr_string(tptr)); 35153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 35253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_MAX_BW: 35353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_MAX_RES_BW: 35453f17a9db278d33517d9888dd77848f554522a38JP Abgrall bw.i = EXTRACT_32BITS(tptr); 35553f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", %.3f Mbps", bw.f*8/1000000 ); 35653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 35753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_UNRES_BW: 35853f17a9db278d33517d9888dd77848f554522a38JP Abgrall for (te_class = 0; te_class < 8; te_class++) { 35953f17a9db278d33517d9888dd77848f554522a38JP Abgrall bw.i = EXTRACT_32BITS(tptr+te_class*4); 36053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t\tTE-Class %u: %.3f Mbps", 36153f17a9db278d33517d9888dd77848f554522a38JP Abgrall te_class, 36253f17a9db278d33517d9888dd77848f554522a38JP Abgrall bw.f*8/1000000 ); 36353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 36453f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 36553f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_BW_CONSTRAINTS: 36653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t\tBandwidth Constraints Model ID: %s (%u)", 36753f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(diffserv_te_bc_values, "unknown", *tptr), 36853f17a9db278d33517d9888dd77848f554522a38JP Abgrall *tptr); 36953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* decode BCs until the subTLV ends */ 37053f17a9db278d33517d9888dd77848f554522a38JP Abgrall for (te_class = 0; te_class < (subtlv_length-4)/4; te_class++) { 37153f17a9db278d33517d9888dd77848f554522a38JP Abgrall bw.i = EXTRACT_32BITS(tptr+4+te_class*4); 37253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t\t Bandwidth constraint CT%u: %.3f Mbps", 37353f17a9db278d33517d9888dd77848f554522a38JP Abgrall te_class, 37453f17a9db278d33517d9888dd77848f554522a38JP Abgrall bw.f*8/1000000 ); 37553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 37653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 37753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_TE_METRIC: 37853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", Metric %u", EXTRACT_32BITS(tptr)); 37953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 38053f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_LINK_PROTECTION_TYPE: 38153f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", %s, Priority %u", 38253f17a9db278d33517d9888dd77848f554522a38JP Abgrall bittok2str(gmpls_link_prot_values, "none", *tptr), 38353f17a9db278d33517d9888dd77848f554522a38JP Abgrall *(tptr+1)); 38453f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 38553f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_INTF_SW_CAP_DESCR: 38653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t\tInterface Switching Capability: %s", 38753f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(gmpls_switch_cap_values, "Unknown", *(tptr))); 38853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t\tLSP Encoding: %s\n\t\tMax LSP Bandwidth:", 38953f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(gmpls_encoding_values, "Unknown", *(tptr+1))); 39053f17a9db278d33517d9888dd77848f554522a38JP Abgrall for (priority_level = 0; priority_level < 8; priority_level++) { 39153f17a9db278d33517d9888dd77848f554522a38JP Abgrall bw.i = EXTRACT_32BITS(tptr+4+(priority_level*4)); 39253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t\t priority level %d: %.3f Mbps", 39353f17a9db278d33517d9888dd77848f554522a38JP Abgrall priority_level, 39453f17a9db278d33517d9888dd77848f554522a38JP Abgrall bw.f*8/1000000 ); 39553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 39653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 39753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE: 39853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", %s (%u)", 39953f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(lsa_opaque_te_tlv_link_type_sub_tlv_values,"unknown",*tptr), 40053f17a9db278d33517d9888dd77848f554522a38JP Abgrall *tptr); 40153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 40253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 40353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_LINK_SUBTLV_SHARED_RISK_GROUP: 40453f17a9db278d33517d9888dd77848f554522a38JP Abgrall count_srlg = subtlv_length / 4; 40553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (count_srlg != 0) 40653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t\t Shared risk group: "); 40753f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (count_srlg > 0) { 40853f17a9db278d33517d9888dd77848f554522a38JP Abgrall bw.i = EXTRACT_32BITS(tptr); 40953f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%d",bw.i); 41053f17a9db278d33517d9888dd77848f554522a38JP Abgrall tptr+=4; 41153f17a9db278d33517d9888dd77848f554522a38JP Abgrall count_srlg--; 41253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (count_srlg > 0) 41353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", "); 41453f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 41553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 41653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 41753f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 41853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (vflag <= 1) { 41953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if(!print_unknown_data(tptr,"\n\t\t",subtlv_length)) 42053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 42153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 42253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 42353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 42453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* in OSPF everything has to be 32-bit aligned, including subTLVs */ 42553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (subtlv_length%4 != 0) 42653f17a9db278d33517d9888dd77848f554522a38JP Abgrall subtlv_length+=4-(subtlv_length%4); 42753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 42853f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_length-=subtlv_length; 42953f17a9db278d33517d9888dd77848f554522a38JP Abgrall tptr+=subtlv_length; 43053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 43153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 43253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 43353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 43453f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TE_TLV_ROUTER: 43553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tlv_length < 4) { 43653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t TLV length %u < 4", tlv_length); 43753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 43853f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 43953f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*tptr, 4); 44053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", %s", ipaddr_string(tptr)); 44153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 44253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 44353f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 44453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (vflag <= 1) { 44553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if(!print_unknown_data(tptr,"\n\t ",tlv_length)) 44653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 44753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 44853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 44953f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 45053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* in OSPF everything has to be 32-bit aligned, including TLVs */ 45153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tlv_length%4 != 0) 45253f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv_length+=4-(tlv_length%4); 45353f17a9db278d33517d9888dd77848f554522a38JP Abgrall ls_length-=tlv_length; 45453f17a9db278d33517d9888dd77848f554522a38JP Abgrall tptr+=tlv_length; 45553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 45653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 45753f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc: 45853f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 45953f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 46053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf_print_lshdr(register const struct lsa_hdr *lshp) 4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int ls_length; 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(lshp->ls_length); 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ls_length = EXTRACT_16BITS(&lshp->ls_length); 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ls_length < sizeof(struct lsa_hdr)) { 47053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Bogus length %u < header (%lu)", ls_length, 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (unsigned long)sizeof(struct lsa_hdr)); 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(-1); 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(lshp->ls_seq); /* XXX - ls_length check checked this */ 47653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Advertising Router %s, seq 0x%08x, age %us, length %u", 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&lshp->ls_router), 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&lshp->ls_seq), 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&lshp->ls_age), 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ls_length-(u_int)sizeof(struct lsa_hdr)); 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(lshp->ls_type); /* XXX - ls_length check checked this */ 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (lshp->ls_type) { 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* the LSA header for opaque LSAs was slightly changed */ 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_OPAQUE_LL: 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_OPAQUE_AL: 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_OPAQUE_DW: 48853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t %s LSA (%d), Opaque-Type %s LSA (%u), Opaque-ID %u", 4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(lsa_values,"unknown",lshp->ls_type), 4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lshp->ls_type, 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(lsa_opaque_values, 4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "unknown", 4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(&lshp->un_lsa_id.opaque_field.opaque_type)), 4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(&lshp->un_lsa_id.opaque_field.opaque_type), 4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_24BITS(&lshp->un_lsa_id.opaque_field.opaque_id) 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ); 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* all other LSA types use regular style LSA headers */ 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s LSA (%d), LSA-ID: %s", 5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(lsa_values,"unknown",lshp->ls_type), 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lshp->ls_type, 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&lshp->un_lsa_id.lsa_id)); 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(lshp->ls_options); /* XXX - ls_length check checked this */ 5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Options: [%s]", bittok2str(ospf_option_values,"none",lshp->ls_options)); 5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (ls_length); 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (-1); 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 51853f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* draft-ietf-ospf-mt-09 */ 51953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf_topology_values[] = { 52053f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0, "default " }, 52153f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 1, "multicast " }, 52253f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 2, "management " }, 52353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0, NULL } 52453f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 52553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 52653f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* 52753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Print all the per-topology metrics. 52853f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 52953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void 53053f17a9db278d33517d9888dd77848f554522a38JP Abgrallospf_print_tos_metrics(const union un_tos *tos) 53153f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 53253f17a9db278d33517d9888dd77848f554522a38JP Abgrall int metric_count; 53353f17a9db278d33517d9888dd77848f554522a38JP Abgrall int toscount; 53453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 53553f17a9db278d33517d9888dd77848f554522a38JP Abgrall toscount = tos->link.link_tos_count+1; 53653f17a9db278d33517d9888dd77848f554522a38JP Abgrall metric_count = 0; 53753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 53853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 53953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * All but the first metric contain a valid topology id. 54053f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 54153f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (toscount) { 54253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t\ttopology %s(%u), metric %u", 54353f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(ospf_topology_values, "", 54453f17a9db278d33517d9888dd77848f554522a38JP Abgrall metric_count ? tos->metrics.tos_type : 0), 54553f17a9db278d33517d9888dd77848f554522a38JP Abgrall metric_count ? tos->metrics.tos_type : 0, 54653f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_16BITS(&tos->metrics.tos_metric)); 54753f17a9db278d33517d9888dd77848f554522a38JP Abgrall metric_count++; 54853f17a9db278d33517d9888dd77848f554522a38JP Abgrall tos++; 54953f17a9db278d33517d9888dd77848f554522a38JP Abgrall toscount--; 55053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 55153f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 55253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print a single link state advertisement. If truncated or if LSA length 5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * field is less than the length of the LSA header, return NULl, else 5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * return pointer to data past end of LSA. 5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int8_t * 5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf_print_lsa(register const struct lsa *lsap) 5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_int8_t *ls_end; 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct rlalink *rlp; 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct in_addr *ap; 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct aslametric *almp; 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct mcla *mcp; 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_int32_t *lp; 56753f17a9db278d33517d9888dd77848f554522a38JP Abgrall register int j, tlv_type, tlv_length, topology; 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int ls_length; 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int8_t *tptr; 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr = (u_int8_t *)lsap->lsa_un.un_unknown; /* squelch compiler warnings */ 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ls_length = ospf_print_lshdr(&lsap->ls_hdr); 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ls_length == -1) 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ls_end = (u_int8_t *)lsap + ls_length; 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ls_length -= sizeof(struct lsa_hdr); 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (lsap->ls_hdr.ls_type) { 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_ROUTER: 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(lsap->lsa_un.un_rla.rla_flags); 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Router LSA Options: [%s]", bittok2str(ospf_rla_flag_values,"none",lsap->lsa_un.un_rla.rla_flags)); 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(lsap->lsa_un.un_rla.rla_count); 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project j = EXTRACT_16BITS(&lsap->lsa_un.un_rla.rla_count); 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(lsap->lsa_un.un_rla.rla_link); 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rlp = lsap->lsa_un.un_rla.rla_link; 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (j--) { 5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*rlp); 59053f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (rlp->un_tos.link.link_type) { 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case RLA_TYPE_VIRTUAL: 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Virtual Link: Neighbor Router-ID: %s, Interface Address: %s", 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&rlp->link_id), 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&rlp->link_data)); 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case RLA_TYPE_ROUTER: 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Neighbor Router-ID: %s, Interface Address: %s", 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&rlp->link_id), 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&rlp->link_data)); 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case RLA_TYPE_TRANSIT: 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Neighbor Network-ID: %s, Interface Address: %s", 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&rlp->link_id), 6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&rlp->link_data)); 6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case RLA_TYPE_STUB: 6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Stub Network: %s, Mask: %s", 6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&rlp->link_id), 6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&rlp->link_data)); 6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Unknown Router Link Type (%u)", 61853f17a9db278d33517d9888dd77848f554522a38JP Abgrall rlp->un_tos.link.link_type); 6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (ls_end); 6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 62153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 62253f17a9db278d33517d9888dd77848f554522a38JP Abgrall ospf_print_tos_metrics(&rlp->un_tos); 62353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rlp = (struct rlalink *)((u_char *)(rlp + 1) + 62553f17a9db278d33517d9888dd77848f554522a38JP Abgrall ((rlp->un_tos.link.link_tos_count) * sizeof(union un_tos))); 6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_NETWORK: 6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(lsap->lsa_un.un_nla.nla_mask); 6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Mask %s\n\t Connected Routers:", 6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&lsap->lsa_un.un_nla.nla_mask)); 6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ap = lsap->lsa_un.un_nla.nla_router; 6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while ((u_char *)ap < ls_end) { 6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ap); 6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", ipaddr_string(ap)); 6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ++ap; 6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_SUM_IP: 6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(lsap->lsa_un.un_nla.nla_mask); 6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Mask %s", 6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&lsap->lsa_un.un_sla.sla_mask)); 6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(lsap->lsa_un.un_sla.sla_tosmetric); 6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lp = lsap->lsa_un.un_sla.sla_tosmetric; 6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while ((u_char *)lp < ls_end) { 6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t ul; 6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*lp); 6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ul = EXTRACT_32BITS(lp); 65253f17a9db278d33517d9888dd77848f554522a38JP Abgrall topology = (ul & SLA_MASK_TOS) >> SLA_SHIFT_TOS; 65353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t\ttopology %s(%u) metric %d", 65453f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(ospf_topology_values, "", topology), 65553f17a9db278d33517d9888dd77848f554522a38JP Abgrall topology, 65653f17a9db278d33517d9888dd77848f554522a38JP Abgrall ul & SLA_MASK_METRIC); 6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ++lp; 6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_SUM_ABR: 6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(lsap->lsa_un.un_sla.sla_tosmetric); 6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lp = lsap->lsa_un.un_sla.sla_tosmetric; 6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while ((u_char *)lp < ls_end) { 6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t ul; 6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*lp); 6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ul = EXTRACT_32BITS(lp); 66953f17a9db278d33517d9888dd77848f554522a38JP Abgrall topology = (ul & SLA_MASK_TOS) >> SLA_SHIFT_TOS; 67053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t\ttopology %s(%u) metric %d", 67153f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(ospf_topology_values, "", topology), 67253f17a9db278d33517d9888dd77848f554522a38JP Abgrall topology, 67353f17a9db278d33517d9888dd77848f554522a38JP Abgrall ul & SLA_MASK_METRIC); 6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ++lp; 6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_ASE: 6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_NSSA: /* fall through - those LSAs share the same format */ 6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(lsap->lsa_un.un_nla.nla_mask); 6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Mask %s", 6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&lsap->lsa_un.un_asla.asla_mask)); 6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(lsap->lsa_un.un_sla.sla_tosmetric); 6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project almp = lsap->lsa_un.un_asla.asla_metric; 6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while ((u_char *)almp < ls_end) { 6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t ul; 6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(almp->asla_tosmetric); 6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ul = EXTRACT_32BITS(&almp->asla_tosmetric); 69153f17a9db278d33517d9888dd77848f554522a38JP Abgrall topology = ((ul & ASLA_MASK_TOS) >> ASLA_SHIFT_TOS); 69253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t\ttopology %s(%u), type %d, metric", 69353f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(ospf_topology_values, "", topology), 69453f17a9db278d33517d9888dd77848f554522a38JP Abgrall topology, 69553f17a9db278d33517d9888dd77848f554522a38JP Abgrall (ul & ASLA_FLAG_EXTERNAL) ? 2 : 1); 6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((ul & ASLA_MASK_METRIC)==0xffffff) 6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" infinite"); 6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %d", (ul & ASLA_MASK_METRIC)); 7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(almp->asla_forward); 7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (almp->asla_forward.s_addr) { 7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", forward %s", 7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&almp->asla_forward)); 7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(almp->asla_tag); 7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (almp->asla_tag.s_addr) { 7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", tag %s", 7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&almp->asla_tag)); 7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ++almp; 7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_GROUP: 7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Multicast extensions as of 23 July 1991 */ 7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mcp = lsap->lsa_un.un_mcla; 7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while ((u_char *)mcp < ls_end) { 7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(mcp->mcla_vid); 7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (EXTRACT_32BITS(&mcp->mcla_vtype)) { 7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case MCLA_VERTEX_ROUTER: 7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Router Router-ID %s", 7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&mcp->mcla_vid)); 7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case MCLA_VERTEX_NETWORK: 7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Network Designated Router %s", 7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&mcp->mcla_vid)); 7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t unknown VertexType (%u)", 7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&mcp->mcla_vtype)); 7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ++mcp; 7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_OPAQUE_LL: /* fall through */ 7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_OPAQUE_AL: 7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_OPAQUE_DW: 7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (*(&lsap->ls_hdr.un_lsa_id.opaque_field.opaque_type)) { 7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_OPAQUE_TYPE_RI: 7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr = (u_int8_t *)(&lsap->lsa_un.un_ri_tlv.type); 7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (ls_length != 0) { 7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*tptr, 4); 7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ls_length < 4) { 7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Remaining LS length %u < 4", ls_length); 7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(ls_end); 7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_type = EXTRACT_16BITS(tptr); 7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_length = EXTRACT_16BITS(tptr+2); 7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=4; 7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ls_length-=4; 7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s TLV (%u), length: %u, value: ", 7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(lsa_opaque_ri_tlv_values,"unknown",tlv_type), 7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_type, 7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_length); 7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tlv_length > ls_length) { 7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Bogus length %u > %u", tlv_length, 7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ls_length); 7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(ls_end); 7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*tptr, tlv_length); 7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(tlv_type) { 7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_OPAQUE_RI_TLV_CAP: 7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tlv_length != 4) { 7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Bogus length %u != 4", tlv_length); 7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(ls_end); 7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Capabilities: %s", 7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bittok2str(lsa_opaque_ri_tlv_cap_values, "Unknown", EXTRACT_32BITS(tptr))); 7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag <= 1) { 7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(!print_unknown_data(tptr,"\n\t ",tlv_length)) 7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(ls_end); 7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=tlv_length; 79053f17a9db278d33517d9888dd77848f554522a38JP Abgrall ls_length-=tlv_length; 7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 79453f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TYPE_GRACE: 79553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ospf_print_grace_lsa((u_int8_t *)(&lsap->lsa_un.un_grace_tlv.type), 79653f17a9db278d33517d9888dd77848f554522a38JP Abgrall ls_length) == -1) { 79753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return(ls_end); 7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 80153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case LS_OPAQUE_TYPE_TE: 80253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ospf_print_te_lsa((u_int8_t *)(&lsap->lsa_un.un_te_lsa_tlv.type), 80353f17a9db278d33517d9888dd77848f554522a38JP Abgrall ls_length) == -1) { 80453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return(ls_end); 80553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 80653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 80853f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 80953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (vflag <= 1) { 81053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if(!print_unknown_data((u_int8_t *)lsap->lsa_un.un_unknown, 81153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "\n\t ", ls_length)) 8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(ls_end); 81353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 81553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* do we want to see an additionally hexdump ? */ 8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag> 1) 8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(!print_unknown_data((u_int8_t *)lsap->lsa_un.un_unknown, 8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "\n\t ", ls_length)) { 8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(ls_end); 8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (ls_end); 8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (NULL); 8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 83153f17a9db278d33517d9888dd77848f554522a38JP Abgrallospf_decode_lls(register const struct ospfhdr *op, 83253f17a9db278d33517d9888dd77848f554522a38JP Abgrall register u_int length) 83353f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 83453f17a9db278d33517d9888dd77848f554522a38JP Abgrall register const u_char *dptr; 83553f17a9db278d33517d9888dd77848f554522a38JP Abgrall register const u_char *dataend; 83653f17a9db278d33517d9888dd77848f554522a38JP Abgrall register u_int length2; 83753f17a9db278d33517d9888dd77848f554522a38JP Abgrall register u_int16_t lls_type, lls_len; 83853f17a9db278d33517d9888dd77848f554522a38JP Abgrall register u_int32_t lls_flags; 83953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 84053f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (op->ospf_type) { 84153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 84253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case OSPF_TYPE_HELLO: 84353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!(op->ospf_hello.hello_options & OSPF_OPTION_L)) 84453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (0); 84553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 84653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 84753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case OSPF_TYPE_DD: 84853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!(op->ospf_db.db_options & OSPF_OPTION_L)) 84953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (0); 85053f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 85153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 85253f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 85353f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (0); 85453f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 85553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 85653f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* dig deeper if LLS data is available; see RFC4813 */ 85753f17a9db278d33517d9888dd77848f554522a38JP Abgrall length2 = EXTRACT_16BITS(&op->ospf_len); 85853f17a9db278d33517d9888dd77848f554522a38JP Abgrall dptr = (u_char *)op + length2; 85953f17a9db278d33517d9888dd77848f554522a38JP Abgrall dataend = (u_char *)op + length; 86053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 86153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (EXTRACT_16BITS(&op->ospf_authtype) == OSPF_AUTH_MD5) { 86253f17a9db278d33517d9888dd77848f554522a38JP Abgrall dptr = dptr + op->ospf_authdata[3]; 86353f17a9db278d33517d9888dd77848f554522a38JP Abgrall length2 += op->ospf_authdata[3]; 86453f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 86553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length2 >= length) { 86653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t[LLS truncated]"); 86753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (1); 86853f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 86953f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*dptr, 2); 87053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t LLS: checksum: 0x%04x", (u_int)EXTRACT_16BITS(dptr)); 87153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 87253f17a9db278d33517d9888dd77848f554522a38JP Abgrall dptr += 2; 87353f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*dptr, 2); 87453f17a9db278d33517d9888dd77848f554522a38JP Abgrall length2 = EXTRACT_16BITS(dptr); 87553f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", length: %u", length2); 87653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 87753f17a9db278d33517d9888dd77848f554522a38JP Abgrall dptr += 2; 87853f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK(*dptr); 87953f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (dptr < dataend) { 88053f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*dptr, 2); 88153f17a9db278d33517d9888dd77848f554522a38JP Abgrall lls_type = EXTRACT_16BITS(dptr); 88253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t %s (%u)", 88353f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(ospf_lls_tlv_values,"Unknown TLV",lls_type), 88453f17a9db278d33517d9888dd77848f554522a38JP Abgrall lls_type); 88553f17a9db278d33517d9888dd77848f554522a38JP Abgrall dptr += 2; 88653f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*dptr, 2); 88753f17a9db278d33517d9888dd77848f554522a38JP Abgrall lls_len = EXTRACT_16BITS(dptr); 88853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", length: %u", lls_len); 88953f17a9db278d33517d9888dd77848f554522a38JP Abgrall dptr += 2; 89053f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (lls_type) { 89153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 89253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case OSPF_LLS_EO: 89353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (lls_len != 4) { 89453f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" [should be 4]"); 89553f17a9db278d33517d9888dd77848f554522a38JP Abgrall lls_len = 4; 89653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 89753f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*dptr, 4); 89853f17a9db278d33517d9888dd77848f554522a38JP Abgrall lls_flags = EXTRACT_32BITS(dptr); 89953f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Options: 0x%08x [%s]", lls_flags, 90053f17a9db278d33517d9888dd77848f554522a38JP Abgrall bittok2str(ospf_lls_eo_options,"?",lls_flags)); 90153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 90253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 90353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 90453f17a9db278d33517d9888dd77848f554522a38JP Abgrall case OSPF_LLS_MD5: 90553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (lls_len != 20) { 90653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" [should be 20]"); 90753f17a9db278d33517d9888dd77848f554522a38JP Abgrall lls_len = 20; 90853f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 90953f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(*dptr, 4); 91053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Sequence number: 0x%08x", EXTRACT_32BITS(dptr)); 91153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 91253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 91353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 91453f17a9db278d33517d9888dd77848f554522a38JP Abgrall dptr += lls_len; 91553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 91653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 91753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (0); 91853f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc: 91953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (1); 92053f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 92153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 92253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int 9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf_decode_v2(register const struct ospfhdr *op, 9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_char *dataend) 9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct in_addr *ap; 9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct lsr *lsrp; 9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct lsa_hdr *lshp; 9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct lsa *lsap; 9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t lsa_count,lsa_count_max; 9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (op->ospf_type) { 9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OSPF_TYPE_UMD: 9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Rob Coltun's special monitoring packets; 9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * do nothing 9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OSPF_TYPE_HELLO: 94253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\tOptions [%s]", 9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bittok2str(ospf_option_values,"none",op->ospf_hello.hello_options)); 9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(op->ospf_hello.hello_deadint); 94653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Hello Timer %us, Dead Timer %us, Mask %s, Priority %u", 9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&op->ospf_hello.hello_helloint), 9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&op->ospf_hello.hello_deadint), 9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&op->ospf_hello.hello_mask), 9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project op->ospf_hello.hello_priority); 9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(op->ospf_hello.hello_dr); 9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (op->ospf_hello.hello_dr.s_addr != 0) 9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Designated Router %s", 9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&op->ospf_hello.hello_dr)); 9562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(op->ospf_hello.hello_bdr); 9582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (op->ospf_hello.hello_bdr.s_addr != 0) 9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", Backup Designated Router %s", 9602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&op->ospf_hello.hello_bdr)); 9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ap = op->ospf_hello.hello_neighbor; 9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((u_char *)ap < dataend) 9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Neighbor List:"); 9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while ((u_char *)ap < dataend) { 9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ap); 9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s", ipaddr_string(ap)); 9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ++ap; 9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; /* HELLO */ 9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OSPF_TYPE_DD: 9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(op->ospf_db.db_options); 97453f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\tOptions [%s]", 9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bittok2str(ospf_option_values,"none",op->ospf_db.db_options)); 9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(op->ospf_db.db_flags); 97753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", DD Flags [%s]", 9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bittok2str(ospf_dd_flag_values,"none",op->ospf_db.db_flags)); 97953f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK(op->ospf_db.db_ifmtu); 98053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (op->ospf_db.db_ifmtu) { 98153f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", MTU: %u", EXTRACT_16BITS(&op->ospf_db.db_ifmtu)); 98253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 98353f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK(op->ospf_db.db_seq); 98453f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", Sequence: 0x%08x", EXTRACT_32BITS(&op->ospf_db.db_seq)); 9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 98653f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Print all the LS adv's */ 98753f17a9db278d33517d9888dd77848f554522a38JP Abgrall lshp = op->ospf_db.db_lshdr; 98853f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (((u_char *)lshp < dataend) && ospf_print_lshdr(lshp) != -1) { 98953f17a9db278d33517d9888dd77848f554522a38JP Abgrall ++lshp; 99053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OSPF_TYPE_LS_REQ: 9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lsrp = op->ospf_lsr; 9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while ((u_char *)lsrp < dataend) { 9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*lsrp); 9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Advertising Router: %s, %s LSA (%u)", 9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&lsrp->ls_router), 10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(lsa_values,"unknown",EXTRACT_32BITS(lsrp->ls_type)), 10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&lsrp->ls_type)); 10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (EXTRACT_32BITS(lsrp->ls_type)) { 10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* the LSA header for opaque LSAs was slightly changed */ 10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_OPAQUE_LL: 10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_OPAQUE_AL: 10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case LS_TYPE_OPAQUE_DW: 10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", Opaque-Type: %s LSA (%u), Opaque-ID: %u", 10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(lsa_opaque_values, "unknown",lsrp->un_ls_stateid.opaque_field.opaque_type), 10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lsrp->un_ls_stateid.opaque_field.opaque_type, 10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_24BITS(&lsrp->un_ls_stateid.opaque_field.opaque_id)); 10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", LSA-ID: %s", 10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&lsrp->un_ls_stateid.ls_stateid)); 10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ++lsrp; 10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OSPF_TYPE_LS_UPDATE: 10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lsap = op->ospf_lsu.lsu_lsa; 10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(op->ospf_lsu.lsu_count); 10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lsa_count_max = EXTRACT_32BITS(&op->ospf_lsu.lsu_count); 102753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", %d LSA%s",lsa_count_max, PLURAL_SUFFIX(lsa_count_max)); 10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (lsa_count=1;lsa_count <= lsa_count_max;lsa_count++) { 10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t LSA #%u",lsa_count); 10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lsap = (const struct lsa *)ospf_print_lsa(lsap); 10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (lsap == NULL) 10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OSPF_TYPE_LS_ACK: 10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lshp = op->ospf_lsa.lsa_lshdr; 10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (ospf_print_lshdr(lshp) != -1) { 10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ++lshp; 10402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 10442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (0); 10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (1); 10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf_print(register const u_char *bp, register u_int length, 10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *bp2 _U_) 10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct ospfhdr *op; 10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_char *dataend; 10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const char *cp; 10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project op = (struct ospfhdr *)bp; 10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* XXX Before we do anything else, strip off the MD5 trailer */ 10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(op->ospf_authtype); 10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (EXTRACT_16BITS(&op->ospf_authtype) == OSPF_AUTH_MD5) { 10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= OSPF_AUTH_MD5_LEN; 10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snapend -= OSPF_AUTH_MD5_LEN; 10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* If the type is valid translate it, or just print the type */ 10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* value. If it's not valid, say so and return */ 10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(op->ospf_type); 10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = tok2str(type2str, "unknown LS-type", op->ospf_type); 107253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("OSPFv%u, %s, length %u", 10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project op->ospf_version, 10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp, 10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length); 10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (*cp == 'u') 10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 107953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if(!vflag) { /* non verbose - so lets bail out here */ 10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 108153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(op->ospf_len); 10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length != EXTRACT_16BITS(&op->ospf_len)) { 10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [len %d]", EXTRACT_16BITS(&op->ospf_len)); 10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 108753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 108853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length > EXTRACT_16BITS(&op->ospf_len)) { 108953f17a9db278d33517d9888dd77848f554522a38JP Abgrall dataend = bp + EXTRACT_16BITS(&op->ospf_len); 109053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 109153f17a9db278d33517d9888dd77848f554522a38JP Abgrall dataend = bp + length; 109253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(op->ospf_routerid); 109553f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\tRouter-ID %s", ipaddr_string(&op->ospf_routerid)); 10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(op->ospf_areaid); 10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (op->ospf_areaid.s_addr != 0) 10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", Area %s", ipaddr_string(&op->ospf_areaid)); 11002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", Backbone Area"); 11022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) { 11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Print authentication data (should we really do this?) */ 11052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(op->ospf_authdata[0], sizeof(op->ospf_authdata)); 11062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", Authentication Type: %s (%u)", 11082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(ospf_authtype_values,"unknown",EXTRACT_16BITS(&op->ospf_authtype)), 11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&op->ospf_authtype)); 11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (EXTRACT_16BITS(&op->ospf_authtype)) { 11122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OSPF_AUTH_NONE: 11142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OSPF_AUTH_SIMPLE: 11172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\tSimple text password: "); 111853f17a9db278d33517d9888dd77848f554522a38JP Abgrall safeputs((const char *)op->ospf_authdata, OSPF_AUTH_SIMPLE_LEN); 11192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OSPF_AUTH_MD5: 11222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\tKey-ID: %u, Auth-Length: %u, Crypto Sequence Number: 0x%08x", 11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *((op->ospf_authdata)+2), 11242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *((op->ospf_authdata)+3), 11252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS((op->ospf_authdata)+4)); 11262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 11292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 11302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Do rest according to version. */ 11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (op->ospf_version) { 11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 2: 11362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ospf version 2 */ 11372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ospf_decode_v2(op, dataend)) 11382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 113953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length > EXTRACT_16BITS(&op->ospf_len)) { 114053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ospf_decode_lls(op, length)) 114153f17a9db278d33517d9888dd77848f554522a38JP Abgrall goto trunc; 114253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 11432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" ospf [version %d]", op->ospf_version); 11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } /* end switch on version */ 11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 11512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 11522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(tstr, stdout); 11532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1154