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_ =
2453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    "@(#) $Header: /tcpdump/master/tcpdump/print-pim.c,v 1.49 2006-02-13 01:31:35 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>
3253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
3353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <stdio.h>
3453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <stdlib.h>
3553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
3753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "addrtoname.h"
3853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "extract.h"
3953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
4053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "ip.h"
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_HELLO         0
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_REGISTER      1
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_REGISTER_STOP 2
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_JOIN_PRUNE    3
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_BOOTSTRAP     4
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_ASSERT        5
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_GRAFT         6
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_GRAFT_ACK     7
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_CANDIDATE_RP  8
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_TYPE_PRUNE_REFRESH 9
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok pimv2_type_values[] = {
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_HELLO,         "Hello" },
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_REGISTER,      "Register" },
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_REGISTER_STOP, "Register Stop" },
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_JOIN_PRUNE,    "Join / Prune" },
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_BOOTSTRAP,     "Bootstrap" },
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_ASSERT,        "Assert" },
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_GRAFT,         "Graft" },
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_GRAFT_ACK,     "Graft Acknowledgement" },
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_CANDIDATE_RP,  "Candidate RP Advertisement" },
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_TYPE_PRUNE_REFRESH, "Prune Refresh" },
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_HOLDTIME             1
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_LANPRUNEDELAY        2
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_DR_PRIORITY_OLD     18
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_DR_PRIORITY         19
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_GENID               20
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_REFRESH_CAP         21
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_BIDIR_CAP           22
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_ADDRESS_LIST        24
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD 65001
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok pimv2_hello_option_values[] = {
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_HOLDTIME,         "Hold Time" },
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_LANPRUNEDELAY,    "LAN Prune Delay" },
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_DR_PRIORITY_OLD,  "DR Priority (Old)" },
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_DR_PRIORITY,      "DR Priority" },
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_GENID,            "Generation ID" },
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_REFRESH_CAP,      "State Refresh Capability" },
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_BIDIR_CAP,        "Bi-Directional Capability" },
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_ADDRESS_LIST,     "Address List" },
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD, "Address List (Old)" },
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_REGISTER_FLAG_LEN      4
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_REGISTER_FLAG_BORDER 0x80000000
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIMV2_REGISTER_FLAG_NULL   0x40000000
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok pimv2_register_flag_values[] = {
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_REGISTER_FLAG_BORDER, "Border" },
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { PIMV2_REGISTER_FLAG_NULL, "Null" },
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * XXX: We consider a case where IPv6 is not ready yet for portability,
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * but PIM dependent defintions should be independent of IPv6...
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct pim {
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t pim_typever;
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* upper 4bit: PIM version number; 2 for PIMv2 */
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* lower 4bit: the PIM message type, currently they are:
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Hello, Register, Register-Stop, Join/Prune,
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Bootstrap, Assert, Graft (PIM-DM only),
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Graft-Ack (PIM-DM only), C-RP-Adv
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIM_VER(x)	(((x) & 0xf0) >> 4)
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PIM_TYPE(x)	((x) & 0x0f)
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_char  pim_rsv;	/* Reserved */
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_short	pim_cksum;	/* IP style check sum */
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void pimv2_print(register const u_char *bp, register u_int len, u_int cksum);
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpimv1_join_prune_print(register const u_char *bp, register u_int len)
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int ngroups, njoin, nprune;
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int njp;
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* If it's a single group and a single source, use 1-line output. */
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (TTEST2(bp[0], 30) && bp[11] == 1 &&
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ((njoin = EXTRACT_16BITS(&bp[20])) + EXTRACT_16BITS(&bp[22])) == 1) {
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int hold;
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" RPF %s ", ipaddr_string(bp));
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hold = EXTRACT_16BITS(&bp[6]);
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (hold != 180) {
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("Hold ");
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			relts_print(hold);
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("%s (%s/%d, %s", njoin ? "Join" : "Prune",
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ipaddr_string(&bp[26]), bp[25] & 0x3f,
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ipaddr_string(&bp[12]));
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (EXTRACT_32BITS(&bp[16]) != 0xffffffff)
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("/%s", ipaddr_string(&bp[16]));
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(") %s%s %s",
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (bp[24] & 0x01) ? "Sparse" : "Dense",
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (bp[25] & 0x80) ? " WC" : "",
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (bp[25] & 0x40) ? "RP" : "SPT");
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(bp[0], sizeof(struct in_addr));
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag > 1)
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("\n");
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf(" Upstream Nbr: %s", ipaddr_string(bp));
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(bp[6], 2);
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag > 1)
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("\n");
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf(" Hold time: ");
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	relts_print(EXTRACT_16BITS(&bp[6]));
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag < 2)
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += 8;
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	len -= 8;
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(bp[0], 4);
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ngroups = bp[3];
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += 4;
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	len -= 4;
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (ngroups--) {
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * XXX - does the address have length "addrlen" and the
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * mask length "maddrlen"?
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], sizeof(struct in_addr));
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("\n\tGroup: %s", ipaddr_string(bp));
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[4], sizeof(struct in_addr));
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (EXTRACT_32BITS(&bp[4]) != 0xffffffff)
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("/%s", ipaddr_string(&bp[4]));
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[8], 4);
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		njoin = EXTRACT_16BITS(&bp[8]);
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nprune = EXTRACT_16BITS(&bp[10]);
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" joined: %d pruned: %d", njoin, nprune);
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 12;
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len -= 12;
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (njp = 0; njp < (njoin + nprune); njp++) {
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			const char *type;
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (njp < njoin)
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				type = "Join ";
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				type = "Prune";
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 6);
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("\n\t%s %s%s%s%s/%d", type,
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    (bp[0] & 0x01) ? "Sparse " : "Dense ",
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    (bp[1] & 0x80) ? "WC " : "",
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    (bp[1] & 0x40) ? "RP " : "SPT ",
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ipaddr_string(&bp[2]), bp[1] & 0x3f);
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 6;
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len -= 6;
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf("[|pim]");
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpimv1_print(register const u_char *bp, register u_int len)
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_char *ep;
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_char type;
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep = (const u_char *)snapend;
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (bp >= ep)
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(bp[1]);
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	type = bp[1];
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (type) {
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0:
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Query");
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (TTEST(bp[8])) {
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			switch (bp[8] >> 4) {
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case 0:
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(" Dense-mode");
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case 1:
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(" Sparse-mode");
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case 2:
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(" Sparse-Dense-mode");
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default:
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(" mode-%d", bp[8] >> 4);
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[10],2);
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" (Hold-time ");
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			relts_print(EXTRACT_16BITS(&bp[10]));
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(")");
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1:
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Register");
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[8], 20);			/* ip header */
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" for %s > %s", ipaddr_string(&bp[20]),
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(&bp[24]));
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 2:
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Register-Stop");
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[12], sizeof(struct in_addr));
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" for %s > %s", ipaddr_string(&bp[8]),
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(&bp[12]));
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 3:
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Join/Prune");
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag)
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pimv1_join_prune_print(&bp[8], len - 8);
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4:
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" RP-reachable");
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[22], 2);
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" group %s",
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ipaddr_string(&bp[8]));
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (EXTRACT_32BITS(&bp[12]) != 0xffffffff)
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("/%s", ipaddr_string(&bp[12]));
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" RP %s hold ", ipaddr_string(&bp[16]));
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			relts_print(EXTRACT_16BITS(&bp[22]));
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 5:
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Assert");
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[16], sizeof(struct in_addr));
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" for %s > %s", ipaddr_string(&bp[16]),
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ipaddr_string(&bp[8]));
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (EXTRACT_32BITS(&bp[12]) != 0xffffffff)
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("/%s", ipaddr_string(&bp[12]));
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[24], 4);
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" %s pref %d metric %d",
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (bp[20] & 0x80) ? "RP-tree" : "SPT",
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		EXTRACT_32BITS(&bp[20]) & 0x7fffffff,
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		EXTRACT_32BITS(&bp[24]));
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 6:
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Graft");
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag)
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pimv1_join_prune_print(&bp[8], len - 8);
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 7:
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Graft-ACK");
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag)
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pimv1_join_prune_print(&bp[8], len - 8);
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 8:
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" Mode");
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" [type %d]", type);
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((bp[4] >> 4) != 1)
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" [v%d]", bp[4] >> 4);
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf("[|pim]");
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * auto-RP is a cisco protocol, documented at
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ftp://ftpeng.cisco.com/ipmulticast/specs/pim-autorp-spec01.txt
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This implements version 1+, dated Sept 9, 1998.
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcisco_autorp_print(register const u_char *bp, register u_int len)
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int type;
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int numrps;
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int hold;
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(bp[0]);
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf(" auto-rp ");
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	type = bp[0];
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (type) {
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x11:
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("candidate-advert");
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x12:
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("mapping");
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("type-0x%02x", type);
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(bp[1]);
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	numrps = bp[1];
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(bp[2], 2);
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf(" Hold ");
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hold = EXTRACT_16BITS(&bp[2]);
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (hold)
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		relts_print(EXTRACT_16BITS(&bp[2]));
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("FOREVER");
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Next 4 bytes are reserved. */
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += 8; len -= 8;
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*XXX skip unless -v? */
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Rest of packet:
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * numrps entries of the form:
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * 32 bits: RP
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * 6 bits: reserved
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * 2 bits: PIM version supported, bit 0 is "supports v1", 1 is "v2".
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * 8 bits: # of entries for this RP
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * each entry: 7 bits: reserved, 1 bit: negative,
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 *	       8 bits: mask 32 bits: source
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * lather, rinse, repeat.
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (numrps--) {
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int nentries;
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		char s;
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], 4);
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" RP %s", ipaddr_string(bp));
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(bp[4]);
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (bp[4] & 0x3) {
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 0: printf(" PIMv?");
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 1:	printf(" PIMv1");
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 2:	printf(" PIMv2");
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 3:	printf(" PIMv1+2");
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[4] & 0xfc)
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" [rsvd=0x%02x]", bp[4] & 0xfc);
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(bp[5]);
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nentries = bp[5];
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 6; len -= 6;
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s = ' ';
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (; nentries; nentries--) {
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 6);
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("%c%s%s/%d", s, bp[0] & 1 ? "!" : "",
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    ipaddr_string(&bp[2]), bp[1]);
39853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (bp[0] & 0x02) {
39953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			    (void)printf(" bidir");
40053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			}
40153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (bp[0] & 0xfc) {
40253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			    (void)printf("[rsvd=0x%02x]", bp[0] & 0xfc);
40353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			}
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
41653f17a9db278d33517d9888dd77848f554522a38JP Abgrallpim_print(register const u_char *bp, register u_int len, u_int cksum)
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)));
44153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                pimv2_print(bp, len, cksum);
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
62153f17a9db278d33517d9888dd77848f554522a38JP Abgrallpimv2_print(register const u_char *bp, register u_int len, u_int cksum)
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 {
64153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("(%scorrect)", TTEST2(bp[0], len) && cksum ? "in" : "" );
6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (PIM_TYPE(pim->pim_typever)) {
6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_HELLO:
6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    {
6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int16_t otype, olen;
6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4;
6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		while (bp < ep) {
6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4);
6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			otype = EXTRACT_16BITS(&bp[0]);
6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			olen = EXTRACT_16BITS(&bp[2]);
6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4 + olen);
6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        printf("\n\t  %s Option (%u), length %u, Value: ",
6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               tok2str( pimv2_hello_option_values,"Unknown",otype),
6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               otype,
6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               olen);
6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 4;
6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			switch (otype) {
6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PIMV2_HELLO_OPTION_HOLDTIME:
6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                relts_print(EXTRACT_16BITS(bp));
6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                break;
6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PIMV2_HELLO_OPTION_LANPRUNEDELAY:
6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (olen != 4) {
66853f17a9db278d33517d9888dd77848f554522a38JP Abgrall					(void)printf("ERROR: Option Length != 4 Bytes (%u)", olen);
6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				} else {
6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					char t_bit;
6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					u_int16_t lan_delay, override_interval;
6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					lan_delay = EXTRACT_16BITS(bp);
6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					override_interval = EXTRACT_16BITS(bp+2);
6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					t_bit = (lan_delay & 0x8000)? 1 : 0;
6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					lan_delay &= ~0x8000;
6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("\n\t    T-bit=%d, LAN delay %dms, Override interval %dms",
6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					t_bit, lan_delay, override_interval);
6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PIMV2_HELLO_OPTION_DR_PRIORITY_OLD:
6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PIMV2_HELLO_OPTION_DR_PRIORITY:
6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                switch (olen) {
6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                case 0:
6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    printf("Bi-Directional Capability (Old)");
6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    break;
6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                case 4:
6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    printf("%u", EXTRACT_32BITS(bp));
6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    break;
6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                default:
69153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                    printf("ERROR: Option Length != 4 Bytes (%u)", olen);
6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    break;
6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                }
6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                break;
6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PIMV2_HELLO_OPTION_GENID:
6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                (void)printf("0x%08x", EXTRACT_32BITS(bp));
6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PIMV2_HELLO_OPTION_REFRESH_CAP:
7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                (void)printf("v%d", *bp);
7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (*(bp+1) != 0) {
7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    (void)printf(", interval ");
7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    relts_print(*(bp+1));
7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (EXTRACT_16BITS(bp+2) != 0) {
7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    (void)printf(" ?0x%04x?", EXTRACT_16BITS(bp+2));
7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case  PIMV2_HELLO_OPTION_BIDIR_CAP:
7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        case PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD:
7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        case PIMV2_HELLO_OPTION_ADDRESS_LIST:
7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (vflag > 1) {
7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					const u_char *ptr = bp;
7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					while (ptr < (bp+olen)) {
7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						int advance;
7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						printf("\n\t    ");
7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						advance = pimv2_addr_print(ptr, pimv2_unicast, 0);
7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						if (advance < 0) {
7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project							printf("...");
7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project							break;
7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						}
7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						ptr += advance;
7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					}
7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default:
7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                if (vflag <= 1)
7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    print_unknown_data(bp,"\n\t    ",olen);
7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                break;
7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        /* do we want to see an additionally hexdump ? */
7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        if (vflag> 1)
7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            print_unknown_data(bp,"\n\t    ",olen);
7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += olen;
7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_REGISTER:
7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{
7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		struct ip *ip;
7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (!TTEST2(*(bp+4), PIMV2_REGISTER_FLAG_LEN))
7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        goto trunc;
7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf(", Flags [ %s ]\n\t",
7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(pimv2_register_flag_values,
7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               "none",
7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               EXTRACT_32BITS(bp+4)));
7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 8; len -= 8;
7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* encapsulated multicast packet */
7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip = (struct ip *)bp;
7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (IP_V(ip)) {
7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                case 0: /* Null header */
7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("IP-Null-header %s > %s",
7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                     ipaddr_string(&ip->ip_src),
7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                     ipaddr_string(&ip->ip_dst));
7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 4:	/* IPv4 */
7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ip_print(gndo, bp, len);
7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 6:	/* IPv6 */
77153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ip6_print(gndo, bp, len);
7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                default:
7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        (void)printf("IP ver %d", IP_V(ip));
7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        break;
7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_REGISTER_STOP:
7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4; len -= 4;
7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep)
7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" group=");
7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) {
7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance; len -= advance;
7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep)
7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" source=");
7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance; len -= advance;
7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_JOIN_PRUNE:
8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_GRAFT:
8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_GRAFT_ACK:
8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /*
8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         * 0                   1                   2                   3
8082949f58a438f6fd85f66a8b7ed4708042cde4b37The 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
8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |PIM Ver| Type  | Addr length   |           Checksum            |
8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |             Unicast-Upstream Neighbor Address                 |
8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |  Reserved     | Num groups    |          Holdtime             |
8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |            Encoded-Multicast Group Address-1                  |
8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |   Number of Joined  Sources   |   Number of Pruned Sources    |
8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |               Encoded-Joined Source Address-1                 |
8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                             .                                 |
8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                             .                                 |
8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |               Encoded-Joined Source Address-n                 |
8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |               Encoded-Pruned Source Address-1                 |
8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                             .                                 |
8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                             .                                 |
8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |               Encoded-Pruned Source Address-n                 |
8332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                           .                                   |
8352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                           .                                   |
8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  |                Encoded-Multicast Group Address-n              |
8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         */
8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    {
8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int8_t ngroup;
8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int16_t holdtime;
8442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int16_t njoin;
8452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int16_t nprune;
8462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int i, j;
8472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4; len -= 4;
8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (PIM_TYPE(pim->pim_typever) != 7) {	/*not for Graft-ACK*/
8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (bp >= ep)
8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(", upstream-neighbor: ");
8532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...");
8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += advance; len -= advance;
8582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp + 4 > ep)
8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ngroup = bp[1];
8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		holdtime = EXTRACT_16BITS(&bp[2]);
8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("\n\t  %u group(s)", ngroup);
8642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (PIM_TYPE(pim->pim_typever) != 7) {	/*not for Graft-ACK*/
8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(", holdtime: ");
8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (holdtime == 0xffff)
8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("infinite");
8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				relts_print(holdtime);
8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4; len -= 4;
8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; i < ngroup; i++) {
8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (bp >= ep)
8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto jp_done;
8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("\n\t    group #%u: ", i+1);
8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) {
8772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...)");
8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto jp_done;
8792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
8802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += advance; len -= advance;
8812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (bp + 4 > ep) {
8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...)");
8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto jp_done;
8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			njoin = EXTRACT_16BITS(&bp[0]);
8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			nprune = EXTRACT_16BITS(&bp[2]);
8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(", joined sources: %u, pruned sources: %u", njoin,nprune);
8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 4; len -= 4;
8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (j = 0; j < njoin; j++) {
8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("\n\t      joined source #%u: ",j+1);
8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if ((advance = pimv2_addr_print(bp, pimv2_source, 0)) < 0) {
8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("...)");
8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto jp_done;
8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += advance; len -= advance;
8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
8972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (j = 0; j < nprune; j++) {
8982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("\n\t      pruned source #%u: ",j+1);
8992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if ((advance = pimv2_addr_print(bp, pimv2_source, 0)) < 0) {
9002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("...)");
9012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto jp_done;
9022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += advance; len -= advance;
9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	jp_done:
9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
9082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
9092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_BOOTSTRAP:
9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{
9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int i, j, frpcnt;
9132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4;
9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Fragment Tag, Hash Mask len, and BSR-priority */
9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp + sizeof(u_int16_t) >= ep) break;
9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" tag=%x", EXTRACT_16BITS(bp));
9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += sizeof(u_int16_t);
9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep) break;
9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" hashmlen=%d", bp[0]);
9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp + 1 >= ep) break;
9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" BSRprio=%d", bp[1]);
9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 2;
9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Encoded-Unicast-BSR-Address */
9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep) break;
9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" BSR=");
9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance;
9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; bp < ep; i++) {
9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* Encoded-Group Address */
9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" (group%d: ", i);
9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if ((advance = pimv2_addr_print(bp, pimv2_group, 0))
9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    < 0) {
9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...)");
9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto bs_done;
9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += advance;
9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* RP-Count, Frag RP-Cnt, and rsvd */
9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (bp >= ep) {
9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...)");
9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto bs_done;
9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" RPcnt=%d", bp[0]);
9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (bp + 1 >= ep) {
9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...)");
9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto bs_done;
9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" FRPcnt=%d", frpcnt = bp[1]);
9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 4;
9562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (j = 0; j < frpcnt && bp < ep; j++) {
9582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/* each RP info */
9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(" RP%d=", j);
9602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if ((advance = pimv2_addr_print(bp,
9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project								pimv2_unicast,
9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project								0)) < 0) {
9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("...)");
9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto bs_done;
9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += advance;
9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (bp + 1 >= ep) {
9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("...)");
9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto bs_done;
9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(",holdtime=");
9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				relts_print(EXTRACT_16BITS(bp));
9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (bp + 2 >= ep) {
9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(void)printf("...)");
9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto bs_done;
9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf(",prio=%d", bp[2]);
9792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += 4;
9802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(")");
9822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	   bs_done:
9842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_ASSERT:
9872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4; len -= 4;
9882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep)
9892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" group=");
9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) {
9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance; len -= advance;
9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep)
9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" src=");
9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance; len -= advance;
10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp + 8 > ep)
10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[0] & 0x80)
10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" RPT");
10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" pref=%u", EXTRACT_32BITS(&bp[0]) & 0x7fffffff);
10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" metric=%u", EXTRACT_32BITS(&bp[4]));
10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_CANDIDATE_RP:
10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{
10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int i, pfxcnt;
10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4;
10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Prefix-Cnt, Priority, and Holdtime */
10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep) break;
10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" prefix-cnt=%d", bp[0]);
10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pfxcnt = bp[0];
10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp + 1 >= ep) break;
10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" prio=%d", bp[1]);
10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp + 3 >= ep) break;
10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" holdtime=");
10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		relts_print(EXTRACT_16BITS(&bp[2]));
10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4;
10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Encoded-Unicast-RP-Address */
10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp >= ep) break;
10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" RP=");
10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance;
10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Encoded-Group Addresses */
10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; i < pfxcnt && bp < ep; i++) {
10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf(" Group%d=", i);
10402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if ((advance = pimv2_addr_print(bp, pimv2_group, 0))
10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    < 0) {
10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("...");
10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
10442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += advance;
10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case PIMV2_TYPE_PRUNE_REFRESH:
10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" src=");
10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance;
10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" grp=");
10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) {
10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance;
10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" forwarder=");
10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("...");
10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance;
10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], 2);
10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" TUNR ");
10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		relts_print(EXTRACT_16BITS(bp));
10722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 default:
10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" [type %d]", PIM_TYPE(pim->pim_typever));
10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf("[|pim]");
10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Local Variables:
10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-style: whitesmith
10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-basic-offset: 8
10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * End:
10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1092