12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1995, 1996
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2)
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement:
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California,
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission.
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/print-dvmrp.c,v 1.27 2003/11/19 09:42:04 guy Exp $ (LBL)";
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h>
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * DVMRP message types and flag values shamelessly stolen from
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * mrouted/dvmrp.h.
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_PROBE		1	/* for finding neighbors */
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_REPORT		2	/* for reporting some or all routes */
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_ASK_NEIGHBORS	3	/* sent by mapper, asking for a list */
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					/* of this router's neighbors */
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_NEIGHBORS		4	/* response to such a request */
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_ASK_NEIGHBORS2	5	/* as above, want new format reply */
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_NEIGHBORS2	6
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_PRUNE		7	/* prune message */
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_GRAFT		8	/* graft message */
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_GRAFT_ACK		9	/* graft acknowledgement */
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 'flags' byte values in DVMRP_NEIGHBORS2 reply.
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_NF_TUNNEL		0x01	/* neighbors reached via tunnel */
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_NF_SRCRT		0x02	/* tunnel uses IP source routing */
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_NF_DOWN		0x10	/* kernel state of interface */
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_NF_DISABLED	0x20	/* administratively disabled */
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DVMRP_NF_QUERIER	0x40	/* I am the subnet's querier */
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int print_probe(const u_char *, const u_char *, u_int);
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int print_report(const u_char *, const u_char *, u_int);
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int print_neighbors(const u_char *, const u_char *, u_int);
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int print_neighbors2(const u_char *, const u_char *, u_int);
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int print_prune(const u_char *);
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int print_graft(const u_char *);
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int print_graft_ack(const u_char *);
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int32_t target_level;
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdvmrp_print(register const u_char *bp, register u_int len)
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_char *ep;
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_char type;
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep = (const u_char *)snapend;
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (bp >= ep)
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(bp[1]);
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	type = bp[1];
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Skip IGMP header */
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += 8;
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	len -= 8;
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (type) {
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DVMRP_PROBE:
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" Probe");
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (print_probe(bp, ep, len) < 0)
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DVMRP_REPORT:
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" Report");
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag > 1) {
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (print_report(bp, ep, len) < 0)
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DVMRP_ASK_NEIGHBORS:
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" Ask-neighbors(old)");
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DVMRP_NEIGHBORS:
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" Neighbors(old)");
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (print_neighbors(bp, ep, len) < 0)
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DVMRP_ASK_NEIGHBORS2:
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" Ask-neighbors2");
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DVMRP_NEIGHBORS2:
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" Neighbors2");
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * extract version and capabilities from IGMP group
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * address field
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp -= 4;
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], 4);
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		target_level = (bp[0] << 24) | (bp[1] << 16) |
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (bp[2] << 8) | bp[3];
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4;
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (print_neighbors2(bp, ep, len) < 0)
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DVMRP_PRUNE:
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" Prune");
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (print_prune(bp) < 0)
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DVMRP_GRAFT:
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" Graft");
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (print_graft(bp) < 0)
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DVMRP_GRAFT_ACK:
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" Graft-ACK");
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (print_graft_ack(bp) < 0)
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [type %d]", type);
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("[|dvmrp]");
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_report(register const u_char *bp, register const u_char *ep,
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    register u_int len)
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int32_t mask, origin;
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int metric, done;
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int i, width;
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (len > 0) {
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (len < 3) {
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" [|]");
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return (0);
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], 3);
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		mask = (u_int32_t)0xff << 24 | bp[0] << 16 | bp[1] << 8 | bp[2];
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		width = 1;
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[0])
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			width = 2;
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[1])
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			width = 3;
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[2])
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			width = 4;
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\tMask %s", intoa(htonl(mask)));
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 3;
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len -= 3;
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		do {
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (bp + width + 1 > ep) {
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" [|]");
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return (0);
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len < width + 1) {
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("\n\t  [Truncated Report]");
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return (0);
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			origin = 0;
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < width; ++i) {
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(*bp);
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				origin = origin << 8 | *bp++;
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for ( ; i < 4; ++i)
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				origin <<= 8;
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(*bp);
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			metric = *bp++;
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			done = metric & 0x80;
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			metric &= 0x7f;
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("\n\t  %s metric %d", intoa(htonl(origin)),
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				metric);
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len -= width + 1;
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} while (!done);
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (-1);
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_probe(register const u_char *bp, register const u_char *ep,
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    register u_int len)
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int32_t genid;
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(bp[0], 4);
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((len < 4) || ((bp + 4) > ep)) {
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* { (ctags) */
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|}");
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	genid = (bp[0] << 24) | (bp[1] << 16) | (bp[2] << 8) | bp[3];
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += 4;
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	len -= 4;
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag > 1)
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t");
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ");
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("genid %u", genid);
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag < 2)
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while ((len > 0) && (bp < ep)) {
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], 4);
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\tneighbor %s", ipaddr_string(bp));
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4; len -= 4;
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (-1);
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_neighbors(register const u_char *bp, register const u_char *ep,
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    register u_int len)
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *laddr;
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_char metric;
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_char thresh;
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int ncount;
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (len > 0 && bp < ep) {
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], 7);
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		laddr = bp;
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4;
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		metric = *bp++;
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		thresh = *bp++;
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ncount = *bp++;
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len -= 7;
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		while (--ncount >= 0) {
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4);
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" [%s ->", ipaddr_string(laddr));
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %s, (%d/%d)]",
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				   ipaddr_string(bp), metric, thresh);
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 4;
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len -= 4;
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (-1);
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_neighbors2(register const u_char *bp, register const u_char *ep,
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    register u_int len)
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *laddr;
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_char metric, thresh, flags;
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int ncount;
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" (v %d.%d):",
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       (int)target_level & 0xff,
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       (int)(target_level >> 8) & 0xff);
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (len > 0 && bp < ep) {
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], 8);
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		laddr = bp;
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += 4;
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		metric = *bp++;
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		thresh = *bp++;
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		flags = *bp++;
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ncount = *bp++;
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len -= 8;
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		while (--ncount >= 0 && (len >= 4) && (bp + 4) <= ep) {
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" [%s -> ", ipaddr_string(laddr));
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%s (%d/%d", ipaddr_string(bp),
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				     metric, thresh);
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (flags & DVMRP_NF_TUNNEL)
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("/tunnel");
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (flags & DVMRP_NF_SRCRT)
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("/srcrt");
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (flags & DVMRP_NF_QUERIER)
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("/querier");
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (flags & DVMRP_NF_DISABLED)
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("/disabled");
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (flags & DVMRP_NF_DOWN)
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("/down");
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(")]");
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 4;
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len -= 4;
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ncount != -1) {
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" [|]");
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return (0);
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (-1);
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_prune(register const u_char *bp)
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(bp[0], 12);
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" src %s grp %s", ipaddr_string(bp), ipaddr_string(bp + 4));
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += 8;
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf(" timer ");
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	relts_print(EXTRACT_32BITS(bp));
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (-1);
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_graft(register const u_char *bp)
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(bp[0], 8);
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" src %s grp %s", ipaddr_string(bp), ipaddr_string(bp + 4));
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (-1);
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_graft_ack(register const u_char *bp)
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(bp[0], 8);
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" src %s grp %s", ipaddr_string(bp), ipaddr_string(bp + 4));
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (-1);
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
370