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