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