print-ospf6.c revision 53f17a9db278d33517d9888dd77848f554522a38
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-ospf6.c,v 1.15 2006-09-13 06:31:11 guy 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#include <string.h>
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "ospf.h"
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ospf6.h"
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf6_option_values[] = {
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OSPF6_OPTION_V6,	"V6" },
4753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ OSPF6_OPTION_E,	"External" },
4853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ OSPF6_OPTION_MC,	"Multicast" },
4953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ OSPF6_OPTION_N,	"NSSA" },
5053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ OSPF6_OPTION_R,	"Router" },
5153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ OSPF6_OPTION_DC,	"Demand Circuit" },
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,			NULL }
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf6_rla_flag_values[] = {
5653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ RLA_FLAG_B,		"ABR" },
5753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ RLA_FLAG_E,		"External" },
5853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ RLA_FLAG_V,		"Virtual-Link Endpoint" },
5953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ RLA_FLAG_W,		"Wildcard Receiver" },
6053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { RLA_FLAG_N,           "NSSA Translator" },
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,			NULL }
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf6_asla_flag_values[] = {
6553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ ASLA_FLAG_EXTERNAL,	"External Type 2" },
6653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ ASLA_FLAG_FWDADDR,	"Fforwarding" },
6753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ ASLA_FLAG_ROUTETAG,	"Tag" },
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,			NULL }
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf6_type_values[] = {
7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ OSPF_TYPE_HELLO,	"Hello" },
7353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ OSPF_TYPE_DD,		"Database Description" },
7453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ OSPF_TYPE_LS_REQ,	"LS-Request" },
7553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ OSPF_TYPE_LS_UPDATE,	"LS-Update" },
7653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ OSPF_TYPE_LS_ACK,	"LS-Ack" },
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,			NULL }
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf6_lsa_values[] = {
8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ LS_TYPE_ROUTER,       "Router" },
8253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ LS_TYPE_NETWORK,      "Network" },
8353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ LS_TYPE_INTER_AP,     "Inter-Area Prefix" },
8453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ LS_TYPE_INTER_AR,     "Inter-Area Router" },
8553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ LS_TYPE_ASE,          "External" },
8653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ LS_TYPE_GROUP,        "Multicast Group" },
8753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ LS_TYPE_NSSA,         "NSSA" },
8853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ LS_TYPE_LINK,         "Link" },
8953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ LS_TYPE_INTRA_AP,     "Intra-Area Prefix" },
9053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { LS_TYPE_INTRA_ATE,    "Intra-Area TE" },
9153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { LS_TYPE_GRACE,        "Grace" },
9253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 0,			NULL }
9353f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf6_ls_scope_values[] = {
9653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ LS_SCOPE_LINKLOCAL,   "Link Local" },
9753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ LS_SCOPE_AREA,        "Area Local" },
9853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ LS_SCOPE_AS,          "Domain Wide" },
9953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 0,			NULL }
10053f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf6_dd_flag_values[] = {
10353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ OSPF6_DB_INIT,	"Init" },
10453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ OSPF6_DB_MORE,	"More" },
10553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ OSPF6_DB_MASTER,	"Master" },
10653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 0,			NULL }
10753f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ospf6_lsa_prefix_option_values[] = {
11053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { LSA_PREFIX_OPT_NU, "No Unicast" },
11153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { LSA_PREFIX_OPT_LA, "Local address" },
11253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { LSA_PREFIX_OPT_MC, "Multicast" },
11353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { LSA_PREFIX_OPT_P, "Propagate" },
11453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { LSA_PREFIX_OPT_DN, "Down" },
11553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 0, NULL }
11653f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic char tstr[] = " [|ospf3]";
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12053f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* Forwards */
12153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void ospf6_print_ls_type(u_int, const rtrid_t *);
12253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int ospf6_print_lshdr(const struct lsa6_hdr *);
12353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int ospf6_print_lsa(const struct lsa6 *);
12453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int ospf6_decode_v3(const struct ospf6hdr *, const u_char *);
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
12853f17a9db278d33517d9888dd77848f554522a38JP Abgrallospf6_print_ls_type(register u_int ls_type, register const rtrid_t *ls_stateid)
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    %s LSA (%d), %s Scope%s, LSA-ID %s",
13153f17a9db278d33517d9888dd77848f554522a38JP Abgrall               tok2str(ospf6_lsa_values, "Unknown", ls_type & LS_TYPE_MASK),
13253f17a9db278d33517d9888dd77848f554522a38JP Abgrall               ls_type & LS_TYPE_MASK,
13353f17a9db278d33517d9888dd77848f554522a38JP Abgrall               tok2str(ospf6_ls_scope_values, "Unknown", ls_type & LS_SCOPE_MASK),
13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall               ls_type &0x8000 ? ", transitive" : "", /* U-bit */
13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall               ipaddr_string(ls_stateid));
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
13953f17a9db278d33517d9888dd77848f554522a38JP Abgrallospf6_print_lshdr(register const struct lsa6_hdr *lshp)
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(lshp->ls_type);
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(lshp->ls_seq);
14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
14553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printf("\n\t  Advertising Router %s, seq 0x%08x, age %us, length %u",
14653f17a9db278d33517d9888dd77848f554522a38JP Abgrall               ipaddr_string(&lshp->ls_router),
14753f17a9db278d33517d9888dd77848f554522a38JP Abgrall               EXTRACT_32BITS(&lshp->ls_seq),
14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall               EXTRACT_16BITS(&lshp->ls_age),
14953f17a9db278d33517d9888dd77848f554522a38JP Abgrall               EXTRACT_16BITS(&lshp->ls_length)-(u_int)sizeof(struct lsa6_hdr));
15053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ospf6_print_ls_type(EXTRACT_16BITS(&lshp->ls_type), &lshp->ls_stateid);
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (1);
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
15953f17a9db278d33517d9888dd77848f554522a38JP Abgrallospf6_print_lsaprefix(const u_int8_t *tptr, u_int lsa_length)
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
16153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct lsa6_prefix *lsapp = (struct lsa6_prefix *)tptr;
16253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int wordlen;
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in6_addr prefix;
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (lsa_length < sizeof (*lsapp) - 4)
16653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		goto trunc;
16753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	lsa_length -= sizeof (*lsapp) - 4;
16853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	TCHECK2(*lsapp, sizeof (*lsapp) - 4);
16953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	wordlen = (lsapp->lsa_p_len + 31) / 32;
17053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (wordlen * 4 > sizeof(struct in6_addr)) {
17153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf(" bogus prefixlen /%d", lsapp->lsa_p_len);
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
17453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (lsa_length < wordlen * 4)
17553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		goto trunc;
17653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	lsa_length -= wordlen * 4;
17753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	TCHECK2(lsapp->lsa_p_prefix, wordlen * 4);
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	memset(&prefix, 0, sizeof(prefix));
17953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	memcpy(&prefix, lsapp->lsa_p_prefix, wordlen * 4);
18053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printf("\n\t\t%s/%d", ip6addr_string(&prefix),
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lsapp->lsa_p_len);
18253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (lsapp->lsa_p_opt) {
18353f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf(", Options [%s]",
18453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   bittok2str(ospf6_lsa_prefix_option_values,
18553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                              "none", lsapp->lsa_p_opt));
18653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
18753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf(", metric %u", EXTRACT_16BITS(&lsapp->lsa_p_metric));
18853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return sizeof(*lsapp) - 4 + wordlen * 4;
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return -1;
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print a single link state advertisement.  If truncated return 1, else 0.
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
19953f17a9db278d33517d9888dd77848f554522a38JP Abgrallospf6_print_lsa(register const struct lsa6 *lsap)
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
20153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	register const struct rlalink6 *rlp;
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct tos_metric *tosp;
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const rtrid_t *ap;
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct aslametric *almp;
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct mcla *mcp;
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct llsa *llsap;
21153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	register const struct lsa6_prefix *lsapp;
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_int32_t *lp;
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
21553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	register u_int prefixes;
21653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	register int bytelen;
21753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	register u_int length, lsa_length;
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t flags32;
21953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const u_int8_t *tptr;
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ospf6_print_lshdr(&lsap->ls_hdr))
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(lsap->ls_hdr.ls_length);
22453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        length = EXTRACT_16BITS(&lsap->ls_hdr.ls_length);
22553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
22653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/*
22753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * The LSA length includes the length of the header;
22853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * it must have a value that's at least that length.
22953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * If it does, find the length of what follows the
23053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * header.
23153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 */
23253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (length < sizeof(struct lsa6_hdr))
23353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	return (1);
23453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        lsa_length = length - sizeof(struct lsa6_hdr);
23553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tptr = (u_int8_t *)lsap+sizeof(struct lsa6_hdr);
23653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (EXTRACT_16BITS(&lsap->ls_hdr.ls_type)) {
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_ROUTER | LS_SCOPE_AREA:
23953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (lsa_length < sizeof (lsap->lsa_un.un_rla.rla_options))
24053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			return (1);
24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		lsa_length -= sizeof (lsap->lsa_un.un_rla.rla_options);
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_rla.rla_options);
24353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("\n\t      Options [%s]",
24453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       bittok2str(ospf6_option_values, "none",
24553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                  EXTRACT_32BITS(&lsap->lsa_un.un_rla.rla_options)));
24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf(", RLA-Flags [%s]",
24753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       bittok2str(ospf6_rla_flag_values, "none",
24853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                  lsap->lsa_un.un_rla.rla_flags));
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		rlp = lsap->lsa_un.un_rla.rla_link;
25153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		while (lsa_length != 0) {
25253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (lsa_length < sizeof (*rlp))
25353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				return (1);
25453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			lsa_length -= sizeof (*rlp);
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(*rlp);
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			switch (rlp->link_type) {
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case RLA_TYPE_VIRTUAL:
25953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf("\n\t      Virtual Link: Neighbor Router-ID %s"
26053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                       "\n\t      Neighbor Interface-ID %s, Interface %s",
26153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                       ipaddr_string(&rlp->link_nrtid),
26253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                       ipaddr_string(&rlp->link_nifid),
26353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                       ipaddr_string(&rlp->link_ifid));
26453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case RLA_TYPE_ROUTER:
26753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf("\n\t      Neighbor Router-ID %s"
26853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                       "\n\t      Neighbor Interface-ID %s, Interface %s",
26953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                       ipaddr_string(&rlp->link_nrtid),
27053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                       ipaddr_string(&rlp->link_nifid),
27153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                       ipaddr_string(&rlp->link_ifid));
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case RLA_TYPE_TRANSIT:
27553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf("\n\t      Neighbor Network-ID %s"
27653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                       "\n\t      Neighbor Interface-ID %s, Interface %s",
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    ipaddr_string(&rlp->link_nrtid),
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    ipaddr_string(&rlp->link_nifid),
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    ipaddr_string(&rlp->link_ifid));
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default:
28353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf("\n\t      Unknown Router Links Type 0x%02x",
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    rlp->link_type);
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return (0);
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
28753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(", metric %d", EXTRACT_16BITS(&rlp->link_metric));
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			rlp++;
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_NETWORK | LS_SCOPE_AREA:
29353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (lsa_length < sizeof (lsap->lsa_un.un_nla.nla_options))
29453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			return (1);
29553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		lsa_length -= sizeof (lsap->lsa_un.un_nla.nla_options);
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_nla.nla_options);
29753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("\n\t      Options [%s]",
29853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       bittok2str(ospf6_option_values, "none",
29953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                  EXTRACT_32BITS(&lsap->lsa_un.un_nla.nla_options)));
30053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
30153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t      Connected Routers:");
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ap = lsap->lsa_un.un_nla.nla_router;
30353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		while (lsa_length != 0) {
30453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (lsa_length < sizeof (*ap))
30553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				return (1);
30653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			lsa_length -= sizeof (*ap);
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(*ap);
30853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf("\n\t\t%s", ipaddr_string(ap));
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++ap;
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_INTER_AP | LS_SCOPE_AREA:
31453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (lsa_length < sizeof (lsap->lsa_un.un_inter_ap.inter_ap_metric))
31553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			return (1);
31653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		lsa_length -= sizeof (lsap->lsa_un.un_inter_ap.inter_ap_metric);
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_inter_ap.inter_ap_metric);
31853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf(", metric %u",
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&lsap->lsa_un.un_inter_ap.inter_ap_metric) & SLA_MASK_METRIC);
32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
32153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		tptr = (u_int8_t *)lsap->lsa_un.un_inter_ap.inter_ap_prefix;
32253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		while (lsa_length != 0) {
32353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			bytelen = ospf6_print_lsaprefix(tptr, lsa_length);
32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (bytelen < 0)
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
32653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			lsa_length -= bytelen;
32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			tptr += bytelen;
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
33053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
33153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case LS_TYPE_ASE | LS_SCOPE_AS:
33253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (lsa_length < sizeof (lsap->lsa_un.un_asla.asla_metric))
33353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			return (1);
33453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		lsa_length -= sizeof (lsap->lsa_un.un_asla.asla_metric);
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_asla.asla_metric);
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		flags32 = EXTRACT_32BITS(&lsap->lsa_un.un_asla.asla_metric);
33753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("\n\t     Flags [%s]",
33853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       bittok2str(ospf6_asla_flag_values, "none", flags32));
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" metric %u",
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&lsap->lsa_un.un_asla.asla_metric) &
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       ASLA_MASK_METRIC);
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		tptr = (u_int8_t *)lsap->lsa_un.un_asla.asla_prefix;
34453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		lsapp = (struct lsa6_prefix *)tptr;
34553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		bytelen = ospf6_print_lsaprefix(tptr, lsa_length);
34653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (bytelen < 0)
34753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto trunc;
34853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		lsa_length -= bytelen;
34953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		tptr += bytelen;
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
35153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if ((flags32 & ASLA_FLAG_FWDADDR) != 0) {
35253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			struct in6_addr *fwdaddr6;
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
35453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			fwdaddr6 = (struct in6_addr *)tptr;
35553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (lsa_length < sizeof (*fwdaddr6))
35653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				return (1);
35753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			lsa_length -= sizeof (*fwdaddr6);
35853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			TCHECK(*fwdaddr6);
35953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" forward %s",
36053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			       ip6addr_string(fwdaddr6));
36153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			tptr += sizeof(*fwdaddr6);
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
36453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if ((flags32 & ASLA_FLAG_ROUTETAG) != 0) {
36553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (lsa_length < sizeof (u_int32_t))
36653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				return (1);
36753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			lsa_length -= sizeof (u_int32_t);
36853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			TCHECK(*(u_int32_t *)tptr);
36953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" tag %s",
37053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			       ipaddr_string((u_int32_t *)tptr));
37153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			tptr += sizeof(u_int32_t);
37253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
37453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (lsapp->lsa_p_metric) {
37553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (lsa_length < sizeof (u_int32_t))
37653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				return (1);
37753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			lsa_length -= sizeof (u_int32_t);
37853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			TCHECK(*(u_int32_t *)tptr);
37953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" RefLSID: %s",
38053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			       ipaddr_string((u_int32_t *)tptr));
38153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			tptr += sizeof(u_int32_t);
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
38353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_LINK:
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Link LSA */
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		llsap = &lsap->lsa_un.un_llsa;
38853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (lsa_length < sizeof (llsap->llsa_priandopt))
38953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			return (1);
39053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		lsa_length -= sizeof (llsap->llsa_priandopt);
39153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		TCHECK(llsap->llsa_priandopt);
39253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("\n\t      Options [%s]",
39353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       bittok2str(ospf6_option_values, "none",
39453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                  EXTRACT_32BITS(&llsap->llsa_options)));
39553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
39653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (lsa_length < sizeof (llsap->llsa_lladdr) + sizeof (llsap->llsa_nprefix))
39753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			return (1);
39853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		lsa_length -= sizeof (llsap->llsa_lladdr) + sizeof (llsap->llsa_nprefix);
39953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                prefixes = EXTRACT_32BITS(&llsap->llsa_nprefix);
40053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t      Priority %d, Link-local address %s, Prefixes %d:",
40153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       llsap->llsa_priority,
40253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       ip6addr_string(&llsap->llsa_lladdr),
40353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       prefixes);
40453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
40553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		tptr = (u_int8_t *)llsap->llsa_prefix;
40653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		while (prefixes > 0) {
40753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			bytelen = ospf6_print_lsaprefix(tptr, lsa_length);
40853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (bytelen < 0)
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
41053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			prefixes--;
41153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			lsa_length -= bytelen;
41253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			tptr += bytelen;
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_INTRA_AP | LS_SCOPE_AREA:
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Intra-Area-Prefix LSA */
41853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (lsa_length < sizeof (lsap->lsa_un.un_intra_ap.intra_ap_rtid))
41953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			return (1);
42053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		lsa_length -= sizeof (lsap->lsa_un.un_intra_ap.intra_ap_rtid);
4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_intra_ap.intra_ap_rtid);
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ospf6_print_ls_type(
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_16BITS(&lsap->lsa_un.un_intra_ap.intra_ap_lstype),
42453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			&lsap->lsa_un.un_intra_ap.intra_ap_lsid);
42553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
42653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (lsa_length < sizeof (lsap->lsa_un.un_intra_ap.intra_ap_nprefix))
42753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			return (1);
42853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		lsa_length -= sizeof (lsap->lsa_un.un_intra_ap.intra_ap_nprefix);
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_intra_ap.intra_ap_nprefix);
43053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                prefixes = EXTRACT_16BITS(&lsap->lsa_un.un_intra_ap.intra_ap_nprefix);
43153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t      Prefixes %d:", prefixes);
43253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
43353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		tptr = (u_int8_t *)lsap->lsa_un.un_intra_ap.intra_ap_prefix;
43453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		while (prefixes > 0) {
43553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			bytelen = ospf6_print_lsaprefix(tptr, lsa_length);
43653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (bytelen < 0)
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
43853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			prefixes--;
43953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			lsa_length -= bytelen;
44053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			tptr += bytelen;
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
44453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LS_TYPE_GRACE | LS_SCOPE_LINKLOCAL:
44553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (ospf_print_grace_lsa(tptr, lsa_length) == -1) {
44653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    return 1;
44753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
44853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                break;
44953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
45053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LS_TYPE_INTRA_ATE | LS_SCOPE_LINKLOCAL:
45153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (ospf_print_te_lsa(tptr, lsa_length) == -1) {
45253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    return 1;
45353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
45453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                break;
45553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
45753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if(!print_unknown_data(tptr,
45853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                       "\n\t      ",
45953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                       lsa_length)) {
46053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    return (1);
46153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
46253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                break;
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (1);
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf6_decode_v3(register const struct ospf6hdr *op,
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    register const u_char *dataend)
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const rtrid_t *ap;
47553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	register const struct lsr6 *lsrp;
47653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	register const struct lsa6_hdr *lshp;
47753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	register const struct lsa6 *lsap;
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int i;
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (op->ospf6_type) {
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case OSPF_TYPE_HELLO:
48353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("\n\tOptions [%s]",
48453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       bittok2str(ospf6_option_values, "none",
48553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                  EXTRACT_32BITS(&op->ospf6_hello.hello_options)));
48653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
48753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                TCHECK(op->ospf6_hello.hello_deadint);
48853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("\n\t  Hello Timer %us, Dead Timer %us, Interface-ID %s, Priority %u",
48953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       EXTRACT_16BITS(&op->ospf6_hello.hello_helloint),
49053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       EXTRACT_16BITS(&op->ospf6_hello.hello_deadint),
49153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       ipaddr_string(&op->ospf6_hello.hello_ifid),
49253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       op->ospf6_hello.hello_priority);
49353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(op->ospf6_hello.hello_dr);
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (op->ospf6_hello.hello_dr != 0)
49653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf("\n\t  Designated Router %s",
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    ipaddr_string(&op->ospf6_hello.hello_dr));
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(op->ospf6_hello.hello_bdr);
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (op->ospf6_hello.hello_bdr != 0)
50053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(", Backup Designated Router %s",
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    ipaddr_string(&op->ospf6_hello.hello_bdr));
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
50353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf("\n\t  Neighbor List:");
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ap = op->ospf6_hello.hello_neighbor;
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			while ((u_char *)ap < dataend) {
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(*ap);
50753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf("\n\t    %s", ipaddr_string(ap));
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				++ap;
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;	/* HELLO */
5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
51353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case OSPF_TYPE_DD:
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(op->ospf6_db.db_options);
51553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("\n\tOptions [%s]",
51653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       bittok2str(ospf6_option_values, "none",
51753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                  EXTRACT_32BITS(&op->ospf6_db.db_options)));
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(op->ospf6_db.db_flags);
51953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf(", DD Flags [%s]",
52053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       bittok2str(ospf6_dd_flag_values,"none",op->ospf6_db.db_flags));
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
52253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		TCHECK(op->ospf6_db.db_seq);
52353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf(", MTU %u, DD-Sequence 0x%08x",
52453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       EXTRACT_16BITS(&op->ospf6_db.db_mtu),
52553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       EXTRACT_32BITS(&op->ospf6_db.db_seq));
52653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
52753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                /* Print all the LS adv's */
52853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                lshp = op->ospf6_db.db_lshdr;
52953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                while (!ospf6_print_lshdr(lshp)) {
53053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    ++lshp;
53153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
53453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case OSPF_TYPE_LS_REQ:
5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			lsrp = op->ospf6_lsr;
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			while ((u_char *)lsrp < dataend) {
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(*lsrp);
53953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                printf("\n\t  Advertising Router %s",
54053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                       ipaddr_string(&lsrp->ls_router));
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				ospf6_print_ls_type(EXTRACT_16BITS(&lsrp->ls_type),
54253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                    &lsrp->ls_stateid);
5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				++lsrp;
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
54853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case OSPF_TYPE_LS_UPDATE:
5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			lsap = op->ospf6_lsu.lsu_lsa;
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(op->ospf6_lsu.lsu_count);
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(&op->ospf6_lsu.lsu_count);
5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			while (i--) {
5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (ospf6_print_lsa(lsap))
5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto trunc;
55653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				lsap = (struct lsa6 *)((u_char *)lsap +
5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    EXTRACT_16BITS(&lsap->ls_hdr.ls_length));
5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
56353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case OSPF_TYPE_LS_ACK:
5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			lshp = op->ospf6_lsa.lsa_lshdr;
5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			while (!ospf6_print_lshdr(lshp)) {
5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				++lshp;
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (1);
5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf6_print(register const u_char *bp, register u_int length)
5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct ospf6hdr *op;
5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_char *dataend;
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const char *cp;
5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	op = (struct ospf6hdr *)bp;
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* If the type is valid translate it, or just print the type */
5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* value.  If it's not valid, say so and return */
5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(op->ospf6_type);
59353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	cp = tok2str(ospf6_type_values, "unknown LS-type", op->ospf6_type);
59453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printf("OSPFv%u, %s, length %d", op->ospf6_version, cp, length);
59553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (*cp == 'u') {
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
59753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
59853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
59953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if(!vflag) { /* non verbose - so lets bail out here */
60053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return;
60153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(op->ospf6_len);
6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length != EXTRACT_16BITS(&op->ospf6_len)) {
6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [len %d]", EXTRACT_16BITS(&op->ospf6_len));
6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dataend = bp + length;
6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Print the routerid if it is not the same as the source */
6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(op->ospf6_routerid);
61253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printf("\n\tRouter-ID %s", ipaddr_string(&op->ospf6_routerid));
6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(op->ospf6_areaid);
6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (op->ospf6_areaid != 0)
61653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf(", Area %s", ipaddr_string(&op->ospf6_areaid));
6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
61853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf(", Backbone Area");
6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(op->ospf6_instanceid);
6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (op->ospf6_instanceid)
62153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf(", Instance %u", op->ospf6_instanceid);
6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Do rest according to version.	 */
6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (op->ospf6_version) {
6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 3:
6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* ospf version 3 */
6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ospf6_decode_v3(op, dataend))
6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ospf [version %d]", op->ospf6_version);
6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}			/* end switch on version */
6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fputs(tstr, stdout);
6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
641