print-ospf6.c revision 2949f58a438f6fd85f66a8b7ed4708042cde4b37
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_ =
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/print-ospf6.c,v 1.13 2003/11/16 09:36:31 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
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ospf6.h"
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct bits {
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t bit;
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *str;
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct bits ospf6_option_bits[] = {
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OSPF6_OPTION_V6,	"V6" },
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OSPF6_OPTION_E,	"E" },
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OSPF6_OPTION_MC,	"MC" },
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OSPF6_OPTION_N,	"N" },
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OSPF6_OPTION_R,	"R" },
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OSPF6_OPTION_DC,	"DC" },
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,			NULL }
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct bits ospf6_rla_flag_bits[] = {
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RLA_FLAG_B,		"B" },
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RLA_FLAG_E,		"E" },
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RLA_FLAG_V,		"V" },
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RLA_FLAG_W,		"W" },
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,			NULL }
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct bits ospf6_asla_flag_bits[] = {
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ASLA_FLAG_EXTERNAL,	"E" },
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ASLA_FLAG_FWDADDR,	"F" },
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ASLA_FLAG_ROUTETAG,	"T" },
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,			NULL }
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok type2str[] = {
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OSPF_TYPE_UMD,	"umd" },
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OSPF_TYPE_HELLO,	"hello" },
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OSPF_TYPE_DB,		"dd" },
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OSPF_TYPE_LSR,	"ls_req" },
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OSPF_TYPE_LSU,	"ls_upd" },
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OSPF_TYPE_LSA,	"ls_ack" },
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,			NULL }
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic char tstr[] = " [|ospf]";
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define inline __inline
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Forwards */
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline void ospf6_print_seqage(u_int32_t, time_t);
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline void ospf6_print_bits(const struct bits *, u_char);
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void ospf6_print_ls_type(u_int, const rtrid_t *,
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const rtrid_t *, const char *);
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int ospf6_print_lshdr(const struct lsa_hdr *);
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int ospf6_print_lsa(const struct lsa *);
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int ospf6_decode_v3(const struct ospf6hdr *, const u_char *);
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline void
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf6_print_seqage(register u_int32_t seq, register time_t us)
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register time_t sec = us % 60;
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register time_t mins = (us / 60) % 60;
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register time_t hour = us / 3600;
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" S %X age ", seq);
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (hour)
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%u:%02u:%02u",
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (u_int32_t) hour, (u_int32_t) mins, (u_int32_t) sec);
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else if (mins)
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%u:%02u", (u_int32_t) mins, (u_int32_t) sec);
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%u", (u_int32_t) sec);
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline void
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf6_print_bits(register const struct bits *bp, register u_char options)
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register char sep = ' ';
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	do {
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (options & bp->bit) {
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%c%s", sep, bp->str);
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sep = '/';
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} while ((++bp)->bit);
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf6_print_ls_type(register u_int ls_type,
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    register const rtrid_t *ls_stateid,
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    register const rtrid_t *ls_router, register const char *fmt)
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *scope;
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (ls_type & LS_SCOPE_MASK) {
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_SCOPE_LINKLOCAL:
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		scope = "linklocal-";
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_SCOPE_AREA:
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		scope = "area-";
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_SCOPE_AS:
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		scope = "AS-";
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		scope = "";
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (ls_type & LS_TYPE_MASK) {
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_ROUTER:
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %srtr %s", scope, ipaddr_string(ls_router));
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_NETWORK:
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %snet dr %s if %s", scope,
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_router),
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_stateid));
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_INTER_AP:
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %sinter-area-prefix %s abr %s", scope,
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_stateid),
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_router));
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_INTER_AR:
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %sinter-area-router %s rtr %s", scope,
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_router),
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_stateid));
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_ASE:
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %sase %s asbr %s", scope,
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_stateid),
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_router));
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_GROUP:
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %sgroup %s rtr %s", scope,
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_stateid),
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_router));
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_TYPE7:
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %stype7 %s rtr %s", scope,
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_stateid),
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_router));
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_LINK:
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %slink %s rtr %s", scope,
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_stateid),
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_router));
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_INTRA_AP:
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %sintra-area-prefix %s rtr %s", scope,
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_stateid),
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(ls_router));
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %s", scope);
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(fmt, ls_type);
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf6_print_lshdr(register const struct lsa_hdr *lshp)
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(lshp->ls_type);
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" {");						/* } (ctags) */
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(lshp->ls_seq);
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ospf6_print_seqage(EXTRACT_32BITS(&lshp->ls_seq), EXTRACT_16BITS(&lshp->ls_age));
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ospf6_print_ls_type(EXTRACT_16BITS(&lshp->ls_type), &lshp->ls_stateid,
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		&lshp->ls_router, "ls_type %d");
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (1);
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf6_print_lsaprefix(register const struct lsa_prefix *lsapp)
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int k;
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in6_addr prefix;
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*lsapp);
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	k = (lsapp->lsa_p_len + 31) / 32;
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (k * 4 > sizeof(struct in6_addr)) {
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("??prefixlen %d??", lsapp->lsa_p_len);
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	memset(&prefix, 0, sizeof(prefix));
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	memcpy(&prefix, lsapp->lsa_p_prefix, k * 4);
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" %s/%d", ip6addr_string(&prefix),
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lsapp->lsa_p_len);
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (lsapp->lsa_p_opt)
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("(opt=%x)", lsapp->lsa_p_opt);
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (lsapp->lsa_p_mbz)
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("(mbz=%x)", EXTRACT_16BITS(&lsapp->lsa_p_mbz)); /* XXX */
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return sizeof(*lsapp) - 4 + k * 4;
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return -1;
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print a single link state advertisement.  If truncated return 1, else 0.
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf6_print_lsa(register const struct lsa *lsap)
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_char *ls_end, *ls_opt;
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct rlalink *rlp;
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct tos_metric *tosp;
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const rtrid_t *ap;
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct aslametric *almp;
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct mcla *mcp;
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct llsa *llsap;
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct lsa_prefix *lsapp;
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_int32_t *lp;
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int j;
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int k;
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t flags32;
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ospf6_print_lshdr(&lsap->ls_hdr))
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(lsap->ls_hdr.ls_length);
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ls_end = (u_char *)lsap + EXTRACT_16BITS(&lsap->ls_hdr.ls_length);
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (EXTRACT_16BITS(&lsap->ls_hdr.ls_type)) {
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_ROUTER | LS_SCOPE_AREA:
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_rla.rla_flags);
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ospf6_print_bits(ospf6_rla_flag_bits,
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			lsap->lsa_un.un_rla.rla_flags);
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_rla.rla_options);
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ospf6_print_bits(ospf6_option_bits,
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&lsap->lsa_un.un_rla.rla_options));
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_rla.rla_link);
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		rlp = lsap->lsa_un.un_rla.rla_link;
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		while (rlp + sizeof(*rlp) <= (struct rlalink *)ls_end) {
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(*rlp);
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" {");				/* } (ctags) */
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			switch (rlp->link_type) {
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case RLA_TYPE_VIRTUAL:
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" virt");
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/* Fall through */
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case RLA_TYPE_ROUTER:
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" nbrid %s nbrif %s if %s",
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    ipaddr_string(&rlp->link_nrtid),
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    ipaddr_string(&rlp->link_nifid),
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    ipaddr_string(&rlp->link_ifid));
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case RLA_TYPE_TRANSIT:
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" dr %s drif %s if %s",
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    ipaddr_string(&rlp->link_nrtid),
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    ipaddr_string(&rlp->link_nifid),
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    ipaddr_string(&rlp->link_ifid));
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default:
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project								/* { (ctags) */
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" ??RouterLinksType 0x%02x?? }",
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    rlp->link_type);
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return (0);
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" metric %d", EXTRACT_16BITS(&rlp->link_metric));
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project								/* { (ctags) */
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" }");
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			rlp++;
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_NETWORK | LS_SCOPE_AREA:
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_nla.nla_options);
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ospf6_print_bits(ospf6_option_bits,
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&lsap->lsa_un.un_nla.nla_options));
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" rtrs");
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ap = lsap->lsa_un.un_nla.nla_router;
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		while ((u_char *)ap < ls_end) {
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(*ap);
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %s", ipaddr_string(ap));
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++ap;
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_INTER_AP | LS_SCOPE_AREA:
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_inter_ap.inter_ap_metric);
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" metric %u",
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&lsap->lsa_un.un_inter_ap.inter_ap_metric) & SLA_MASK_METRIC);
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lsapp = lsap->lsa_un.un_inter_ap.inter_ap_prefix;
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		while (lsapp + sizeof(lsapp) <= (struct lsa_prefix *)ls_end) {
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			k = ospf6_print_lsaprefix(lsapp);
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (k)
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			lsapp = (struct lsa_prefix *)(((u_char *)lsapp) + k);
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_SCOPE_AS | LS_TYPE_ASE:
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_asla.asla_metric);
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		flags32 = EXTRACT_32BITS(&lsap->lsa_un.un_asla.asla_metric);
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ospf6_print_bits(ospf6_asla_flag_bits, flags32);
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" metric %u",
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&lsap->lsa_un.un_asla.asla_metric) &
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       ASLA_MASK_METRIC);
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lsapp = lsap->lsa_un.un_asla.asla_prefix;
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		k = ospf6_print_lsaprefix(lsapp);
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (k < 0)
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((ls_opt = (u_char *)(((u_char *)lsapp) + k)) < ls_end) {
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			struct in6_addr *fwdaddr6;
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if ((flags32 & ASLA_FLAG_FWDADDR) != 0) {
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				fwdaddr6 = (struct in6_addr *)ls_opt;
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(*fwdaddr6);
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" forward %s",
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				       ip6addr_string(fwdaddr6));
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				ls_opt += sizeof(struct in6_addr);
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if ((flags32 & ASLA_FLAG_ROUTETAG) != 0) {
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(*(u_int32_t *)ls_opt);
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" tag %s",
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				       ipaddr_string((u_int32_t *)ls_opt));
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				ls_opt += sizeof(u_int32_t);
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (lsapp->lsa_p_mbz) {
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(*(u_int32_t *)ls_opt);
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" RefLSID: %s",
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				       ipaddr_string((u_int32_t *)ls_opt));
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				ls_opt += sizeof(u_int32_t);
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_SUM_ABR:
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_sla.sla_tosmetric);
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lp = lsap->lsa_un.un_sla.sla_tosmetric;
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		while ((u_char *)lp < ls_end) {
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			register u_int32_t ul;
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(*lp);
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ul = EXTRACT_32BITS(lp);
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" tos %d metric %d",
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    (ul & SLA_MASK_TOS) >> SLA_SHIFT_TOS,
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    ul & SLA_MASK_METRIC);
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++lp;
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_GROUP:
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Multicast extensions as of 23 July 1991 */
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		mcp = lsap->lsa_un.un_mcla;
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		while ((u_char *)mcp < ls_end) {
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(mcp->mcla_vid);
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			switch (EXTRACT_32BITS(&mcp->mcla_vtype)) {
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case MCLA_VERTEX_ROUTER:
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" rtr rtrid %s",
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    ipaddr_string(&mcp->mcla_vid));
4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case MCLA_VERTEX_NETWORK:
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" net dr %s",
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    ipaddr_string(&mcp->mcla_vid));
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default:
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" ??VertexType %u??",
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    EXTRACT_32BITS(&mcp->mcla_vtype));
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		++mcp;
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_LINK:
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Link LSA */
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		llsap = &lsap->lsa_un.un_llsa;
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(llsap->llsa_options);
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ospf6_print_bits(ospf6_option_bits, EXTRACT_32BITS(&llsap->llsa_options));
4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(llsap->llsa_nprefix);
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" pri %d lladdr %s npref %d", llsap->llsa_priority,
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ip6addr_string(&llsap->llsa_lladdr),
4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&llsap->llsa_nprefix));
4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lsapp = llsap->llsa_prefix;
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (j = 0; j < EXTRACT_32BITS(&llsap->llsa_nprefix); j++) {
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			k = ospf6_print_lsaprefix(lsapp);
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (k)
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			lsapp = (struct lsa_prefix *)(((u_char *)lsapp) + k);
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LS_TYPE_INTRA_AP | LS_SCOPE_AREA:
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Intra-Area-Prefix LSA */
4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_intra_ap.intra_ap_rtid);
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ospf6_print_ls_type(
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_16BITS(&lsap->lsa_un.un_intra_ap.intra_ap_lstype),
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			&lsap->lsa_un.un_intra_ap.intra_ap_lsid,
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			&lsap->lsa_un.un_intra_ap.intra_ap_rtid,
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			"LinkStateType %d");
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(lsap->lsa_un.un_intra_ap.intra_ap_nprefix);
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" npref %d",
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_16BITS(&lsap->lsa_un.un_intra_ap.intra_ap_nprefix));
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lsapp = lsap->lsa_un.un_intra_ap.intra_ap_prefix;
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (j = 0;
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     j < EXTRACT_16BITS(&lsap->lsa_un.un_intra_ap.intra_ap_nprefix);
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     j++) {
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			k = ospf6_print_lsaprefix(lsapp);
4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (k)
4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			lsapp = (struct lsa_prefix *)(((u_char *)lsapp) + k);
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ??LinkStateType 0x%04x??",
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_16BITS(&lsap->ls_hdr.ls_type));
4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project								/* { (ctags) */
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fputs(" }", stdout);
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fputs(" }", stdout);
4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (1);
4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf6_decode_v3(register const struct ospf6hdr *op,
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    register const u_char *dataend)
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const rtrid_t *ap;
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct lsr *lsrp;
5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct lsa_hdr *lshp;
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct lsa *lsap;
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register char sep;
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int i;
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (op->ospf6_type) {
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case OSPF_TYPE_UMD:
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Rob Coltun's special monitoring packets;
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * do nothing
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case OSPF_TYPE_HELLO:
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(op->ospf6_hello.hello_deadint);
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ospf6_print_bits(ospf6_option_bits,
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    EXTRACT_32BITS(&op->ospf6_hello.hello_options));
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" ifid %s pri %d int %d dead %u",
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    ipaddr_string(&op->ospf6_hello.hello_ifid),
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    op->ospf6_hello.hello_priority,
5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    EXTRACT_16BITS(&op->ospf6_hello.hello_helloint),
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    EXTRACT_16BITS(&op->ospf6_hello.hello_deadint));
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(op->ospf6_hello.hello_dr);
5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (op->ospf6_hello.hello_dr != 0)
5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" dr %s",
5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    ipaddr_string(&op->ospf6_hello.hello_dr));
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(op->ospf6_hello.hello_bdr);
5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (op->ospf6_hello.hello_bdr != 0)
5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" bdr %s",
5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    ipaddr_string(&op->ospf6_hello.hello_bdr));
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" nbrs");
5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ap = op->ospf6_hello.hello_neighbor;
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			while ((u_char *)ap < dataend) {
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(*ap);
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" %s", ipaddr_string(ap));
5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				++ap;
5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;	/* HELLO */
5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case OSPF_TYPE_DB:
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(op->ospf6_db.db_options);
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ospf6_print_bits(ospf6_option_bits,
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&op->ospf6_db.db_options));
5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sep = ' ';
5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(op->ospf6_db.db_flags);
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (op->ospf6_db.db_flags & OSPF6_DB_INIT) {
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%cI", sep);
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sep = '/';
5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (op->ospf6_db.db_flags & OSPF6_DB_MORE) {
5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%cM", sep);
5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sep = '/';
5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (op->ospf6_db.db_flags & OSPF6_DB_MASTER) {
5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%cMS", sep);
5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sep = '/';
5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(op->ospf6_db.db_seq);
5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" mtu %u S %X", EXTRACT_16BITS(&op->ospf6_db.db_mtu),
5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&op->ospf6_db.db_seq));
5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* Print all the LS adv's */
5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			lshp = op->ospf6_db.db_lshdr;
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			while (!ospf6_print_lshdr(lshp)) {
5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project							/* { (ctags) */
5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" }");
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				++lshp;
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case OSPF_TYPE_LSR:
5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			lsrp = op->ospf6_lsr;
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			while ((u_char *)lsrp < dataend) {
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(*lsrp);
5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" {");		/* } (ctags) */
5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				ospf6_print_ls_type(EXTRACT_16BITS(&lsrp->ls_type),
5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    &lsrp->ls_stateid,
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    &lsrp->ls_router,
5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    "LinkStateType %d");
5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project							/* { (ctags) */
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" }");
5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				++lsrp;
5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case OSPF_TYPE_LSU:
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			lsap = op->ospf6_lsu.lsu_lsa;
5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(op->ospf6_lsu.lsu_count);
5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(&op->ospf6_lsu.lsu_count);
6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			while (i--) {
6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (ospf6_print_lsa(lsap))
6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto trunc;
6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				lsap = (struct lsa *)((u_char *)lsap +
6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    EXTRACT_16BITS(&lsap->ls_hdr.ls_length));
6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case OSPF_TYPE_LSA:
6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			lshp = op->ospf6_lsa.lsa_lshdr;
6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			while (!ospf6_print_lshdr(lshp)) {
6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project							/* { (ctags) */
6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" }");
6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				++lshp;
6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("v3 type %d", op->ospf6_type);
6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (1);
6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectospf6_print(register const u_char *bp, register u_int length)
6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct ospf6hdr *op;
6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_char *dataend;
6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const char *cp;
6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	op = (struct ospf6hdr *)bp;
6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* If the type is valid translate it, or just print the type */
6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* value.  If it's not valid, say so and return */
6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(op->ospf6_type);
6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp = tok2str(type2str, "type%d", op->ospf6_type);
6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("OSPFv%d-%s %d:", op->ospf6_version, cp, length);
6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (*cp == 't')
6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(op->ospf6_len);
6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length != EXTRACT_16BITS(&op->ospf6_len)) {
6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [len %d]", EXTRACT_16BITS(&op->ospf6_len));
6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dataend = bp + length;
6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Print the routerid if it is not the same as the source */
6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(op->ospf6_routerid);
6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rtrid %s", ipaddr_string(&op->ospf6_routerid));
6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(op->ospf6_areaid);
6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (op->ospf6_areaid != 0)
6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" area %s", ipaddr_string(&op->ospf6_areaid));
6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" backbone");
6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(op->ospf6_instanceid);
6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (op->ospf6_instanceid)
6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" instance %u", op->ospf6_instanceid);
6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Do rest according to version.	 */
6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (op->ospf6_version) {
6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 3:
6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* ospf version 3 */
6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ospf6_decode_v3(op, dataend))
6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ospf [version %d]", op->ospf6_version);
6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}			/* end switch on version */
6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fputs(tstr, stdout);
6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
686