12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1995, 1996
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
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/print-pim.c,v 1.45.2.4 2006/02/13 01:32:34 hannes Exp $ (LBL)";
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_HELLO         0
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_REGISTER      1
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_REGISTER_STOP 2
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_JOIN_PRUNE    3
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_BOOTSTRAP     4
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_ASSERT        5
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_GRAFT         6
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_GRAFT_ACK     7
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_CANDIDATE_RP  8
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_PRUNE_REFRESH 9
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok pimv2_type_values[] = {
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_HELLO,         "Hello" },
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_REGISTER,      "Register" },
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_REGISTER_STOP, "Register Stop" },
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_JOIN_PRUNE,    "Join / Prune" },
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_BOOTSTRAP,     "Bootstrap" },
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_ASSERT,        "Assert" },
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_GRAFT,         "Graft" },
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_GRAFT_ACK,     "Graft Acknowledgement" },
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_CANDIDATE_RP,  "Candidate RP Advertisement" },
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_PRUNE_REFRESH, "Prune Refresh" },
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_HOLDTIME             1
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_LANPRUNEDELAY        2
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_DR_PRIORITY_OLD     18
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_DR_PRIORITY         19
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_GENID               20
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_REFRESH_CAP         21
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_BIDIR_CAP           22
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_ADDRESS_LIST        24
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD 65001
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok pimv2_hello_option_values[] = {
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_HOLDTIME,         "Hold Time" },
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_LANPRUNEDELAY,    "LAN Prune Delay" },
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_DR_PRIORITY_OLD,  "DR Priority (Old)" },
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_DR_PRIORITY,      "DR Priority" },
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_GENID,            "Generation ID" },
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_REFRESH_CAP,      "State Refresh Capability" },
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_BIDIR_CAP,        "Bi-Directional Capability" },
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_ADDRESS_LIST,     "Address List" },
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD, "Address List (Old)" },
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_REGISTER_FLAG_LEN      4
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_REGISTER_FLAG_BORDER 0x80000000
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_REGISTER_FLAG_NULL   0x40000000
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok pimv2_register_flag_values[] = {
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_REGISTER_FLAG_BORDER, "Border" },
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_REGISTER_FLAG_NULL, "Null" },
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * XXX: We consider a case where IPv6 is not ready yet for portability,
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * but PIM dependent defintions should be independent of IPv6...
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct pim {
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t pim_typever;
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* upper 4bit: PIM version number; 2 for PIMv2 */
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* lower 4bit: the PIM message type, currently they are:
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Hello, Register, Register-Stop, Join/Prune,
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Bootstrap, Assert, Graft (PIM-DM only),
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Graft-Ack (PIM-DM only), C-RP-Adv
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIM_VER(x)	(((x) & 0xf0) >> 4)
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIM_TYPE(x)	((x) & 0x0f)
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_char  pim_rsv;	/* Reserved */
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_short	pim_cksum;	/* IP style check sum */
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h>
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h"
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void pimv2_print(register const u_char *bp, register u_int len);
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpimv1_join_prune_print(register const u_char *bp, register u_int len)
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int maddrlen, addrlen, ngroups, njoin, nprune;
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int njp;
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* If it's a single group and a single source, use 1-line output. */
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (TTEST2(bp[0], 30) && bp[11] == 1 &&
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ((njoin = EXTRACT_16BITS(&bp[20])) + EXTRACT_16BITS(&bp[22])) == 1) {
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int hold;
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" RPF %s ", ipaddr_string(bp));
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hold = EXTRACT_16BITS(&bp[6]);
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (hold != 180) {
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("Hold ");
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			relts_print(hold);
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("%s (%s/%d, %s", njoin ? "Join" : "Prune",
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ipaddr_string(&bp[26]), bp[25] & 0x3f,
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ipaddr_string(&bp[12]));
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (EXTRACT_32BITS(&bp[16]) != 0xffffffff)
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("/%s", ipaddr_string(&bp[16]));
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(") %s%s %s",
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (bp[24] & 0x01) ? "Sparse" : "Dense",
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (bp[25] & 0x80) ? " WC" : "",
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (bp[25] & 0x40) ? "RP" : "SPT");
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(bp[0], sizeof(struct in_addr));
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag > 1)
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("\n");
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf(" Upstream Nbr: %s", ipaddr_string(bp));
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(bp[6], 2);
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag > 1)
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("\n");
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf(" Hold time: ");
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	relts_print(EXTRACT_16BITS(&bp[6]));
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag < 2)
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += 8;
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	len -= 8;
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(bp[0], 4);
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	maddrlen = bp[1];
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	addrlen = bp[2];
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ngroups = bp[3];
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += 4;
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	len -= 4;
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (ngroups--) {
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * XXX - does the address have length "addrlen" and the
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * mask length "maddrlen"?
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], sizeof(struct in_addr));
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("\n\tGroup: %s", ipaddr_string(bp));
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[4], sizeof(struct in_addr));
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (EXTRACT_32BITS(&bp[4]) != 0xffffffff)
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("/%s", ipaddr_string(&bp[4]));
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[8], 4);
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		njoin = EXTRACT_16BITS(&bp[8]);
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nprune = EXTRACT_16BITS(&bp[10]);
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" joined: %d pruned: %d", njoin, nprune);
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 12;
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len -= 12;
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (njp = 0; njp < (njoin + nprune); njp++) {
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			const char *type;
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (njp < njoin)
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				type = "Join ";
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				type = "Prune";
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 6);
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("\n\t%s %s%s%s%s/%d", type,
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    (bp[0] & 0x01) ? "Sparse " : "Dense ",
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    (bp[1] & 0x80) ? "WC " : "",
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    (bp[1] & 0x40) ? "RP " : "SPT ",
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ipaddr_string(&bp[2]), bp[1] & 0x3f);
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 6;
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len -= 6;
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf("[|pim]");
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpimv1_print(register const u_char *bp, register u_int len)
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_char *ep;
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_char type;
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep = (const u_char *)snapend;
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (bp >= ep)
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(bp[1]);
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	type = bp[1];
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (type) {
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0:
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Query");
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (TTEST(bp[8])) {
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			switch (bp[8] >> 4) {
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case 0:
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(" Dense-mode");
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case 1:
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(" Sparse-mode");
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case 2:
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(" Sparse-Dense-mode");
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default:
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(" mode-%d", bp[8] >> 4);
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[10],2);
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" (Hold-time ");
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			relts_print(EXTRACT_16BITS(&bp[10]));
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(")");
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1:
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Register");
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[8], 20);			/* ip header */
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" for %s > %s", ipaddr_string(&bp[20]),
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(&bp[24]));
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 2:
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Register-Stop");
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[12], sizeof(struct in_addr));
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" for %s > %s", ipaddr_string(&bp[8]),
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(&bp[12]));
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 3:
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Join/Prune");
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag)
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pimv1_join_prune_print(&bp[8], len - 8);
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4:
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" RP-reachable");
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[22], 2);
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" group %s",
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ipaddr_string(&bp[8]));
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (EXTRACT_32BITS(&bp[12]) != 0xffffffff)
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("/%s", ipaddr_string(&bp[12]));
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" RP %s hold ", ipaddr_string(&bp[16]));
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			relts_print(EXTRACT_16BITS(&bp[22]));
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 5:
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Assert");
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[16], sizeof(struct in_addr));
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" for %s > %s", ipaddr_string(&bp[16]),
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(&bp[8]));
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (EXTRACT_32BITS(&bp[12]) != 0xffffffff)
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("/%s", ipaddr_string(&bp[12]));
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[24], 4);
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" %s pref %d metric %d",
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (bp[20] & 0x80) ? "RP-tree" : "SPT",
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		EXTRACT_32BITS(&bp[20]) & 0x7fffffff,
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		EXTRACT_32BITS(&bp[24]));
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 6:
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Graft");
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag)
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pimv1_join_prune_print(&bp[8], len - 8);
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 7:
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Graft-ACK");
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag)
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pimv1_join_prune_print(&bp[8], len - 8);
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 8:
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Mode");
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" [type %d]", type);
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((bp[4] >> 4) != 1)
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" [v%d]", bp[4] >> 4);
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf("[|pim]");
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * auto-RP is a cisco protocol, documented at
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ftp://ftpeng.cisco.com/ipmulticast/specs/pim-autorp-spec01.txt
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This implements version 1+, dated Sept 9, 1998.
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcisco_autorp_print(register const u_char *bp, register u_int len)
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int type;
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int numrps;
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int hold;
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(bp[0]);
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf(" auto-rp ");
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	type = bp[0];
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (type) {
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x11:
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("candidate-advert");
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x12:
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("mapping");
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("type-0x%02x", type);
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(bp[1]);
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	numrps = bp[1];
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(bp[2], 2);
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf(" Hold ");
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hold = EXTRACT_16BITS(&bp[2]);
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (hold)
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		relts_print(EXTRACT_16BITS(&bp[2]));
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("FOREVER");
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Next 4 bytes are reserved. */
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += 8; len -= 8;
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*XXX skip unless -v? */
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Rest of packet:
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * numrps entries of the form:
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * 32 bits: RP
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * 6 bits: reserved
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * 2 bits: PIM version supported, bit 0 is "supports v1", 1 is "v2".
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * 8 bits: # of entries for this RP
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * each entry: 7 bits: reserved, 1 bit: negative,
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 *	       8 bits: mask 32 bits: source
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * lather, rinse, repeat.
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (numrps--) {
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int nentries;
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		char s;
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], 4);
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" RP %s", ipaddr_string(bp));
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(bp[4]);
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (bp[4] & 0x3) {
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 0: printf(" PIMv?");
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 1:	printf(" PIMv1");
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 2:	printf(" PIMv2");
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 3:	printf(" PIMv1+2");
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[4] & 0xfc)
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" [rsvd=0x%02x]", bp[4] & 0xfc);
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(bp[5]);
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nentries = bp[5];
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 6; len -= 6;
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s = ' ';
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (; nentries; nentries--) {
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 6);
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("%c%s%s/%d", s, bp[0] & 1 ? "!" : "",
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    ipaddr_string(&bp[2]), bp[1]);
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (bp[0] & 0xfe)
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("[rsvd=0x%02x]", bp[0] & 0xfe);
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s = ',';
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 6; len -= 6;
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf("[|autorp]");
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpim_print(register const u_char *bp, register u_int len)
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_char *ep;
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register struct pim *pim = (struct pim *)bp;
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep = (const u_char *)snapend;
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (bp >= ep)
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef notyet			/* currently we see only version and type */
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(pim->pim_rsv);
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (PIM_VER(pim->pim_typever)) {
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 2:
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (!vflag) {
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("PIMv%u, %s, length %u",
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       PIM_VER(pim->pim_typever),
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(pimv2_type_values,"Unknown Type",PIM_TYPE(pim->pim_typever)),
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       len);
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return;
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            } else {
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("PIMv%u, length %u\n\t%s",
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       PIM_VER(pim->pim_typever),
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       len,
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(pimv2_type_values,"Unknown Type",PIM_TYPE(pim->pim_typever)));
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                pimv2_print(bp, len);
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("PIMv%u, length %u",
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       PIM_VER(pim->pim_typever),
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       len);
4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * PIMv2 uses encoded address representations.
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The last PIM-SM I-D before RFC2117 was published specified the
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * following representation for unicast addresses.  However, RFC2117
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * specified no encoding for unicast addresses with the unicast
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * address length specified in the header.  Therefore, we have to
4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * guess which encoding is being used (Cisco's PIMv2 implementation
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * uses the non-RFC encoding).  RFC2117 turns a previously "Reserved"
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * field into a 'unicast-address-length-in-bytes' field.  We guess
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * that it's the draft encoding if this reserved field is zero.
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * RFC2362 goes back to the encoded format, and calls the addr length
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * field "reserved" again.
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The first byte is the address family, from:
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    0    Reserved
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    1    IP (IP version 4)
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    2    IP6 (IP version 6)
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    3    NSAP
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    4    HDLC (8-bit multidrop)
4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    5    BBN 1822
4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    6    802 (includes all 802 media plus Ethernet "canonical format")
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    7    E.163
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    8    E.164 (SMDS, Frame Relay, ATM)
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    9    F.69 (Telex)
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *   10    X.121 (X.25, Frame Relay)
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *   11    IPX
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *   12    Appletalk
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *   13    Decnet IV
4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *   14    Banyan Vines
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *   15    E.164 with NSAP format subaddress
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * In addition, the second byte is an "Encoding".  0 is the default
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * encoding for the address family, and no other encodings are currently
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * specified.
4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int pimv2_addr_len;
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectenum pimv2_addrtype {
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pimv2_unicast, pimv2_group, pimv2_source
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*  0                   1                   2                   3
5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Addr Family   | Encoding Type |     Unicast Address           |
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+++++++
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  0                   1                   2                   3
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Addr Family   | Encoding Type |   Reserved    |  Mask Len     |
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                Group multicast Address                        |
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  0                   1                   2                   3
5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Addr Family   | Encoding Type | Rsrvd   |S|W|R|  Mask Len     |
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                        Source Address                         |
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpimv2_addr_print(const u_char *bp, enum pimv2_addrtype at, int silent)
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int af;
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int len, hdrlen;
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(bp[0]);
5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (pimv2_addr_len == 0) {
5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(bp[1]);
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (bp[0]) {
5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 1:
5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			af = AF_INET;
5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = sizeof(struct in_addr);
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 2:
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			af = AF_INET6;
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = sizeof(struct in6_addr);
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return -1;
5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[1] != 0)
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return -1;
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hdrlen = 2;
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (pimv2_addr_len) {
5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case sizeof(struct in_addr):
5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			af = AF_INET;
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case sizeof(struct in6_addr):
5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			af = AF_INET6;
5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return -1;
5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len = pimv2_addr_len;
5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hdrlen = 0;
5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += hdrlen;
5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (at) {
5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case pimv2_unicast:
5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], len);
5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (af == AF_INET) {
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!silent)
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("%s", ipaddr_string(bp));
5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else if (af == AF_INET6) {
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!silent)
5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("%s", ip6addr_string(bp));
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return hdrlen + len;
5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case pimv2_group:
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case pimv2_source:
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], len + 2);
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (af == AF_INET) {
5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!silent) {
5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("%s", ipaddr_string(bp + 2));
5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (bp[1] != 32)
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("/%u", bp[1]);
5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else if (af == AF_INET6) {
5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!silent) {
5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("%s", ip6addr_string(bp + 2));
5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (bp[1] != 128)
5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("/%u", bp[1]);
5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[0] && !silent) {
5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (at == pimv2_group) {
6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("(0x%02x)", bp[0]);
6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			} else {
6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("(%s%s%s",
6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					bp[0] & 0x04 ? "S" : "",
6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					bp[0] & 0x02 ? "W" : "",
6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					bp[0] & 0x01 ? "R" : "");
6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (bp[0] & 0xf8) {
6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void) printf("+0x%02x", bp[0] & 0xf8);
6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(")");
6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return hdrlen + 2 + len;
6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return -1;
6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return -1;
6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpimv2_print(register const u_char *bp, register u_int len)
6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_char *ep;
6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register struct pim *pim = (struct pim *)bp;
6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int advance;
6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep = (const u_char *)snapend;
6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (bp >= ep)
6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ep > bp + len)
6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ep = bp + len;
6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(pim->pim_rsv);
6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pimv2_addr_len = pim->pim_rsv;
6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (pimv2_addr_len != 0)
6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(", RFC2117-encoding");
6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf(", cksum 0x%04x ", EXTRACT_16BITS(&pim->pim_cksum));
6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (EXTRACT_16BITS(&pim->pim_cksum) == 0) {
6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("(unverified)");
6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        } else {
6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("(%scorrect)",
6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       TTEST2(bp[0], len) &&
6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       in_cksum((const u_short*)bp, len, 0) ? "in" : "" );
6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (PIM_TYPE(pim->pim_typever)) {
6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_HELLO:
6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    {
6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int16_t otype, olen;
6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4;
6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		while (bp < ep) {
6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4);
6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			otype = EXTRACT_16BITS(&bp[0]);
6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			olen = EXTRACT_16BITS(&bp[2]);
6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4 + olen);
6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        printf("\n\t  %s Option (%u), length %u, Value: ",
6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               tok2str( pimv2_hello_option_values,"Unknown",otype),
6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               otype,
6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               olen);
6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 4;
6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			switch (otype) {
6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PIMV2_HELLO_OPTION_HOLDTIME:
6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                relts_print(EXTRACT_16BITS(bp));
6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                break;
6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PIMV2_HELLO_OPTION_LANPRUNEDELAY:
6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (olen != 4) {
6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("ERROR: Option Lenght != 4 Bytes (%u)", olen);
6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				} else {
6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					char t_bit;
6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					u_int16_t lan_delay, override_interval;
6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					lan_delay = EXTRACT_16BITS(bp);
6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					override_interval = EXTRACT_16BITS(bp+2);
6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					t_bit = (lan_delay & 0x8000)? 1 : 0;
6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					lan_delay &= ~0x8000;
6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("\n\t    T-bit=%d, LAN delay %dms, Override interval %dms",
6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					t_bit, lan_delay, override_interval);
6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PIMV2_HELLO_OPTION_DR_PRIORITY_OLD:
6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PIMV2_HELLO_OPTION_DR_PRIORITY:
6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                switch (olen) {
6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                case 0:
6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    printf("Bi-Directional Capability (Old)");
6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    break;
6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                case 4:
6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    printf("%u", EXTRACT_32BITS(bp));
6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    break;
6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                default:
6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    printf("ERROR: Option Lenght != 4 Bytes (%u)", olen);
6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    break;
6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                }
6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                break;
6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PIMV2_HELLO_OPTION_GENID:
6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                (void)printf("0x%08x", EXTRACT_32BITS(bp));
7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PIMV2_HELLO_OPTION_REFRESH_CAP:
7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                (void)printf("v%d", *bp);
7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (*(bp+1) != 0) {
7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    (void)printf(", interval ");
7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    relts_print(*(bp+1));
7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (EXTRACT_16BITS(bp+2) != 0) {
7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    (void)printf(" ?0x%04x?", EXTRACT_16BITS(bp+2));
7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case  PIMV2_HELLO_OPTION_BIDIR_CAP:
7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        case PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD:
7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        case PIMV2_HELLO_OPTION_ADDRESS_LIST:
7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (vflag > 1) {
7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					const u_char *ptr = bp;
7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					while (ptr < (bp+olen)) {
7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						int advance;
7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						printf("\n\t    ");
7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						advance = pimv2_addr_print(ptr, pimv2_unicast, 0);
7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						if (advance < 0) {
7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project							printf("...");
7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project							break;
7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						}
7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						ptr += advance;
7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					}
7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default:
7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                if (vflag <= 1)
7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    print_unknown_data(bp,"\n\t    ",olen);
7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                break;
7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        /* do we want to see an additionally hexdump ? */
7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        if (vflag> 1)
7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            print_unknown_data(bp,"\n\t    ",olen);
7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += olen;
7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_REGISTER:
7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{
7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		struct ip *ip;
7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (!TTEST2(*(bp+4), PIMV2_REGISTER_FLAG_LEN))
7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        goto trunc;
7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf(", Flags [ %s ]\n\t",
7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(pimv2_register_flag_values,
7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               "none",
7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               EXTRACT_32BITS(bp+4)));
7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 8; len -= 8;
7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* encapsulated multicast packet */
7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip = (struct ip *)bp;
7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (IP_V(ip)) {
7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                case 0: /* Null header */
7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("IP-Null-header %s > %s",
7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                     ipaddr_string(&ip->ip_src),
7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                     ipaddr_string(&ip->ip_dst));
7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 4:	/* IPv4 */
7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ip_print(gndo, bp, len);
7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 6:	/* IPv6 */
7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ip6_print(bp, len);
7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                default:
7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        (void)printf("IP ver %d", IP_V(ip));
7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        break;
7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_REGISTER_STOP:
7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4; len -= 4;
7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep)
7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" group=");
7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) {
7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance; len -= advance;
7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep)
7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" source=");
7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance; len -= advance;
8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_JOIN_PRUNE:
8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_GRAFT:
8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_GRAFT_ACK:
8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /*
8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         * 0                   1                   2                   3
8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |PIM Ver| Type  | Addr length   |           Checksum            |
8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |             Unicast-Upstream Neighbor Address                 |
8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |  Reserved     | Num groups    |          Holdtime             |
8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |            Encoded-Multicast Group Address-1                  |
8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |   Number of Joined  Sources   |   Number of Pruned Sources    |
8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |               Encoded-Joined Source Address-1                 |
8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                             .                                 |
8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                             .                                 |
8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |               Encoded-Joined Source Address-n                 |
8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |               Encoded-Pruned Source Address-1                 |
8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                             .                                 |
8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                             .                                 |
8332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |               Encoded-Pruned Source Address-n                 |
8352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                           .                                   |
8372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                           .                                   |
8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                Encoded-Multicast Group Address-n              |
8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         */
8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    {
8442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int8_t ngroup;
8452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int16_t holdtime;
8462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int16_t njoin;
8472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int16_t nprune;
8482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int i, j;
8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4; len -= 4;
8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (PIM_TYPE(pim->pim_typever) != 7) {	/*not for Graft-ACK*/
8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (bp >= ep)
8532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(", upstream-neighbor: ");
8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...");
8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
8582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += advance; len -= advance;
8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp + 4 > ep)
8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ngroup = bp[1];
8642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		holdtime = EXTRACT_16BITS(&bp[2]);
8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("\n\t  %u group(s)", ngroup);
8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (PIM_TYPE(pim->pim_typever) != 7) {	/*not for Graft-ACK*/
8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(", holdtime: ");
8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (holdtime == 0xffff)
8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("infinite");
8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				relts_print(holdtime);
8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4; len -= 4;
8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; i < ngroup; i++) {
8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (bp >= ep)
8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto jp_done;
8772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("\n\t    group #%u: ", i+1);
8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) {
8792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...)");
8802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto jp_done;
8812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += advance; len -= advance;
8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (bp + 4 > ep) {
8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...)");
8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto jp_done;
8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			njoin = EXTRACT_16BITS(&bp[0]);
8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			nprune = EXTRACT_16BITS(&bp[2]);
8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(", joined sources: %u, pruned sources: %u", njoin,nprune);
8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 4; len -= 4;
8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (j = 0; j < njoin; j++) {
8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("\n\t      joined source #%u: ",j+1);
8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if ((advance = pimv2_addr_print(bp, pimv2_source, 0)) < 0) {
8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("...)");
8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto jp_done;
8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
8972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += advance; len -= advance;
8982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
8992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (j = 0; j < nprune; j++) {
9002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("\n\t      pruned source #%u: ",j+1);
9012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if ((advance = pimv2_addr_print(bp, pimv2_source, 0)) < 0) {
9022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("...)");
9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto jp_done;
9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += advance; len -= advance;
9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	jp_done:
9092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
9102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_BOOTSTRAP:
9132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{
9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int i, j, frpcnt;
9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4;
9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Fragment Tag, Hash Mask len, and BSR-priority */
9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp + sizeof(u_int16_t) >= ep) break;
9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" tag=%x", EXTRACT_16BITS(bp));
9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += sizeof(u_int16_t);
9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep) break;
9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" hashmlen=%d", bp[0]);
9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp + 1 >= ep) break;
9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" BSRprio=%d", bp[1]);
9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 2;
9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Encoded-Unicast-BSR-Address */
9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep) break;
9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" BSR=");
9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance;
9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; bp < ep; i++) {
9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* Encoded-Group Address */
9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" (group%d: ", i);
9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if ((advance = pimv2_addr_print(bp, pimv2_group, 0))
9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    < 0) {
9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...)");
9422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto bs_done;
9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += advance;
9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* RP-Count, Frag RP-Cnt, and rsvd */
9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (bp >= ep) {
9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...)");
9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto bs_done;
9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" RPcnt=%d", bp[0]);
9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (bp + 1 >= ep) {
9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...)");
9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto bs_done;
9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" FRPcnt=%d", frpcnt = bp[1]);
9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 4;
9582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (j = 0; j < frpcnt && bp < ep; j++) {
9602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/* each RP info */
9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(" RP%d=", j);
9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if ((advance = pimv2_addr_print(bp,
9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project								pimv2_unicast,
9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project								0)) < 0) {
9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("...)");
9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto bs_done;
9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += advance;
9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (bp + 1 >= ep) {
9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("...)");
9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto bs_done;
9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(",holdtime=");
9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				relts_print(EXTRACT_16BITS(bp));
9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (bp + 2 >= ep) {
9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("...)");
9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto bs_done;
9792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
9802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(",prio=%d", bp[2]);
9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += 4;
9822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(")");
9842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	   bs_done:
9862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
9872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_ASSERT:
9892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4; len -= 4;
9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep)
9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" group=");
9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) {
9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance; len -= advance;
9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep)
9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" src=");
10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance; len -= advance;
10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp + 8 > ep)
10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[0] & 0x80)
10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" RPT");
10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" pref=%u", EXTRACT_32BITS(&bp[0]) & 0x7fffffff);
10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" metric=%u", EXTRACT_32BITS(&bp[4]));
10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_CANDIDATE_RP:
10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{
10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int i, pfxcnt;
10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4;
10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Prefix-Cnt, Priority, and Holdtime */
10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep) break;
10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" prefix-cnt=%d", bp[0]);
10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pfxcnt = bp[0];
10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp + 1 >= ep) break;
10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" prio=%d", bp[1]);
10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp + 3 >= ep) break;
10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" holdtime=");
10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		relts_print(EXTRACT_16BITS(&bp[2]));
10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4;
10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Encoded-Unicast-RP-Address */
10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep) break;
10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" RP=");
10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance;
10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Encoded-Group Addresses */
10402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; i < pfxcnt && bp < ep; i++) {
10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" Group%d=", i);
10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if ((advance = pimv2_addr_print(bp, pimv2_group, 0))
10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    < 0) {
10442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...");
10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += advance;
10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_PRUNE_REFRESH:
10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" src=");
10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance;
10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" grp=");
10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) {
10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance;
10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" forwarder=");
10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance;
10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], 2);
10722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" TUNR ");
10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		relts_print(EXTRACT_16BITS(bp));
10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 default:
10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" [type %d]", PIM_TYPE(pim->pim_typever));
10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf("[|pim]");
10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Local Variables:
10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-style: whitesmith
10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-basic-offset: 8
10922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * End:
10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1094