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