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