print-rip.c revision 2949f58a438f6fd85f66a8b7ed4708042cde4b37
12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1989, 1990, 1991, 1993, 1994, 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-rip.c,v 1.57 2003/11/16 09:36:34 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
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"			/* must come after interface.h */
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct rip {
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t rip_cmd;		/* request/response */
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t rip_vers;		/* protocol version # */
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t unused[2];		/* unused */
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	RIPCMD_REQUEST		1	/* want info */
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	RIPCMD_RESPONSE		2	/* responding to request */
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	RIPCMD_TRACEON		3	/* turn tracing on */
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	RIPCMD_TRACEOFF		4	/* turn it off */
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	RIPCMD_POLL		5	/* want info from everybody */
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	RIPCMD_POLLENTRY	6	/* poll for entry */
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok rip_cmd_values[] = {
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { RIPCMD_REQUEST,	        "Request" },
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { RIPCMD_RESPONSE,	        "Response" },
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { RIPCMD_TRACEON,	        "Trace on" },
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { RIPCMD_TRACEOFF,	        "Trace off" },
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { RIPCMD_POLL,	        "Poll" },
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { RIPCMD_POLLENTRY,	        "Poll Entry" },
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define RIP_AUTHLEN  16
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define RIP_ROUTELEN 20
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * rfc 1723
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  0                   1                   2                   3 3
702949f58a438f6fd85f66a8b7ed4708042cde4b37The 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
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Command (1)   | Version (1)   |           unused              |
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +---------------+---------------+-------------------------------+
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Address Family Identifier (2) |        Route Tag (2)          |
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-------------------------------+-------------------------------+
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                         IP Address (4)                        |
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +---------------------------------------------------------------+
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                         Subnet Mask (4)                       |
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +---------------------------------------------------------------+
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                         Next Hop (4)                          |
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +---------------------------------------------------------------+
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                         Metric (4)                            |
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +---------------------------------------------------------------+
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct rip_netinfo {
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t rip_family;
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t rip_tag;
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t rip_dest;
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t rip_dest_mask;
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t rip_router;
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t rip_metric;		/* cost of route */
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectrip_entry_print_v1(register const struct rip_netinfo *ni)
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_short family;
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* RFC 1058 */
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	family = EXTRACT_16BITS(&ni->rip_family);
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (family != AF_INET) {
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t AFI: %u:", family);
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data((u_int8_t *)&ni->rip_family,"\n\t  ",RIP_ROUTELEN);
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (EXTRACT_16BITS(&ni->rip_tag) ||
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    EXTRACT_32BITS(&ni->rip_dest_mask) ||
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    EXTRACT_32BITS(&ni->rip_router)) {
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* MBZ fields not zero */
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data((u_int8_t *)&ni->rip_family,"\n\t  ",RIP_ROUTELEN);
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} /* AF_INET */
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t  %s, metric: %u",
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ipaddr_string(&ni->rip_dest),
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&ni->rip_metric));
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectrip_entry_print_v2(register const struct rip_netinfo *ni)
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_char *p;
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_short family;
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_char buf[RIP_AUTHLEN];
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	family = EXTRACT_16BITS(&ni->rip_family);
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (family == 0xFFFF) { /* 16 bytes authentication ? */
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (EXTRACT_16BITS(&ni->rip_tag) == 2) { /* simple text authentication ? */
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			memcpy(buf, &ni->rip_dest, sizeof(buf));
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			buf[sizeof(buf)-1] = '\0';
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (p = buf; *p; p++) {
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (!isprint(*p))
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					break;
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        printf("\n\t  Simple Text Authentication data: %s", buf);
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                } else {
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("\n\t  Unknown (%u) Authentication data:",
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_16BITS(&ni->rip_tag));
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        print_unknown_data((u_int8_t *)&ni->rip_dest,"\n\t  ",RIP_AUTHLEN);
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else if (family != AF_INET) {
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t  AFI: %u", family);
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data((u_int8_t *)&ni->rip_tag,"\n\t  ",RIP_ROUTELEN-2);
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else { /* AF_INET */
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\t  AFI: IPv4: %15s/%-2d, tag 0x%04x, metric: %u, next-hop: ",
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       ipaddr_string(&ni->rip_dest),
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       mask2plen(EXTRACT_32BITS(&ni->rip_dest_mask)),
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       EXTRACT_16BITS(&ni->rip_tag),
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       EXTRACT_32BITS(&ni->rip_metric));
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (EXTRACT_32BITS(&ni->rip_router))
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%s", ipaddr_string(&ni->rip_router));
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                else
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("self");
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectrip_print(const u_char *dat, u_int length)
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct rip *rp;
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct rip_netinfo *ni;
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int i, j;
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int trunc;
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend < dat) {
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|rip]");
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = snapend - dat;
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i > length)
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		i = length;
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i < sizeof(*rp)) {
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|rip]");
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i -= sizeof(*rp);
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rp = (struct rip *)dat;
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("%sRIPv%u",
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               (vflag >= 1) ? "\n\t" : "",
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               rp->rip_vers);
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (rp->rip_vers) {
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0:
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * RFC 1058.
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * XXX - RFC 1058 says
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * 0  Datagrams whose version number is zero are to be ignored.
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *    These are from a previous version of the protocol, whose
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *    packet format was machine-specific.
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * so perhaps we should just dump the packet, in hex.
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data((u_int8_t *)&rp->rip_cmd,"\n\t",length);
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /* dump version and lets see if we know the commands name*/
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf(", %s, length: %u",
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(rip_cmd_values,
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               "unknown command (%u)",
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               rp->rip_cmd),
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       length);
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (vflag < 1)
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    return;
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (rp->rip_cmd) {
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case RIPCMD_RESPONSE:
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			j = length / sizeof(*ni);
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        printf(", routes: %u",j);
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			trunc = (i / sizeof(*ni)) != j;
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ni = (struct rip_netinfo *)(rp + 1);
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (; i >= sizeof(*ni); ++ni) {
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (rp->rip_vers == 1)
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					rip_entry_print_v1(ni);
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				else if (rp->rip_vers == 2)
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					rip_entry_print_v2(ni);
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                else
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    break;
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				i -= sizeof(*ni);
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (trunc)
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("[|rip]");
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case RIPCMD_REQUEST:
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case RIPCMD_TRACEOFF:
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case RIPCMD_POLL:
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case RIPCMD_POLLENTRY:
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case RIPCMD_TRACEON:
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    /* fall through */
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        default:
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    if (vflag <= 1) {
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        if(!print_unknown_data((u_int8_t *)rp,"\n\t",length))
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            return;
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    }
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                }
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /* do we want to see an additionally hexdump ? */
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (vflag> 1) {
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    if(!print_unknown_data((u_int8_t *)rp,"\n\t",length))
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        return;
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                }
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
255