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_ =
2453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    "@(#) $Header: /tcpdump/master/tcpdump/print-rip.c,v 1.59 2006-03-23 14:58:44 hannes Exp $ (LBL)";
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
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
4053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "af.h"
4153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct rip {
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t rip_cmd;		/* request/response */
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t rip_vers;		/* protocol version # */
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t unused[2];		/* unused */
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	RIPCMD_REQUEST		1	/* want info */
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	RIPCMD_RESPONSE		2	/* responding to request */
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	RIPCMD_TRACEON		3	/* turn tracing on */
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	RIPCMD_TRACEOFF		4	/* turn it off */
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	RIPCMD_POLL		5	/* want info from everybody */
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	RIPCMD_POLLENTRY	6	/* poll for entry */
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok rip_cmd_values[] = {
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { RIPCMD_REQUEST,	        "Request" },
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { RIPCMD_RESPONSE,	        "Response" },
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { RIPCMD_TRACEON,	        "Trace on" },
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { RIPCMD_TRACEOFF,	        "Trace off" },
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { RIPCMD_POLL,	        "Poll" },
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { RIPCMD_POLLENTRY,	        "Poll Entry" },
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define RIP_AUTHLEN  16
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define RIP_ROUTELEN 20
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * rfc 1723
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  0                   1                   2                   3 3
722949f58a438f6fd85f66a8b7ed4708042cde4b37The 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
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Command (1)   | Version (1)   |           unused              |
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +---------------+---------------+-------------------------------+
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Address Family Identifier (2) |        Route Tag (2)          |
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-------------------------------+-------------------------------+
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                         IP Address (4)                        |
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +---------------------------------------------------------------+
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                         Subnet Mask (4)                       |
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +---------------------------------------------------------------+
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                         Next Hop (4)                          |
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +---------------------------------------------------------------+
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                         Metric (4)                            |
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +---------------------------------------------------------------+
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct rip_netinfo {
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t rip_family;
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t rip_tag;
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t rip_dest;
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t rip_dest_mask;
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t rip_router;
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t rip_metric;		/* cost of route */
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectrip_entry_print_v1(register const struct rip_netinfo *ni)
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_short family;
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* RFC 1058 */
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	family = EXTRACT_16BITS(&ni->rip_family);
10553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (family != BSD_AFNUM_INET && family != 0) {
10653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t AFI %s, ", tok2str(bsd_af_values, "Unknown (%u)", family));
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data((u_int8_t *)&ni->rip_family,"\n\t  ",RIP_ROUTELEN);
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (EXTRACT_16BITS(&ni->rip_tag) ||
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    EXTRACT_32BITS(&ni->rip_dest_mask) ||
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    EXTRACT_32BITS(&ni->rip_router)) {
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* MBZ fields not zero */
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data((u_int8_t *)&ni->rip_family,"\n\t  ",RIP_ROUTELEN);
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
11653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
11753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (family == 0) {
11853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t  AFI 0, %s, metric: %u",
11953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ipaddr_string(&ni->rip_dest),
12053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			EXTRACT_32BITS(&ni->rip_metric));
12153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		return;
12253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} /* BSD_AFNUM_INET */
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t  %s, metric: %u",
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               ipaddr_string(&ni->rip_dest),
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&ni->rip_metric));
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic unsigned
12953f17a9db278d33517d9888dd77848f554522a38JP Abgrallrip_entry_print_v2(register const struct rip_netinfo *ni, const unsigned remaining)
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_short family;
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	family = EXTRACT_16BITS(&ni->rip_family);
13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (family == 0xFFFF) { /* variable-sized authentication structures */
13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int16_t auth_type = EXTRACT_16BITS(&ni->rip_tag);
13653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (auth_type == 2) {
13753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			register u_char *p = (u_char *)&ni->rip_dest;
13853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			u_int i = 0;
13953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf("\n\t  Simple Text Authentication data: ");
14053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			for (; i < RIP_AUTHLEN; p++, i++)
14153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				putchar (ND_ISPRINT(*p) ? *p : '.');
14253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		} else if (auth_type == 3) {
14353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf("\n\t  Auth header:");
14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" Packet Len %u,", EXTRACT_16BITS((u_int8_t *)ni + 4));
14553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" Key-ID %u,", *((u_int8_t *)ni + 6));
14653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" Auth Data Len %u,", *((u_int8_t *)ni + 7));
14753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" SeqNo %u,", EXTRACT_32BITS(&ni->rip_dest_mask));
14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" MBZ %u,", EXTRACT_32BITS(&ni->rip_router));
14953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" MBZ %u", EXTRACT_32BITS(&ni->rip_metric));
15053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		} else if (auth_type == 1) {
15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf("\n\t  Auth trailer:");
15253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			print_unknown_data((u_int8_t *)&ni->rip_dest,"\n\t  ",remaining);
15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			return remaining; /* AT spans till the packet end */
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                } else {
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("\n\t  Unknown (%u) Authentication data:",
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_16BITS(&ni->rip_tag));
15753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			print_unknown_data((u_int8_t *)&ni->rip_dest,"\n\t  ",remaining);
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
15953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else if (family != BSD_AFNUM_INET && family != 0) {
16053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t  AFI %s", tok2str(bsd_af_values, "Unknown (%u)", family));
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data((u_int8_t *)&ni->rip_tag,"\n\t  ",RIP_ROUTELEN-2);
16253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else { /* BSD_AFNUM_INET or AFI 0 */
16353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t  AFI %s, %15s/%-2d, tag 0x%04x, metric: %u, next-hop: ",
16453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       tok2str(bsd_af_values, "%u", family),
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       ipaddr_string(&ni->rip_dest),
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       mask2plen(EXTRACT_32BITS(&ni->rip_dest_mask)),
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       EXTRACT_16BITS(&ni->rip_tag),
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       EXTRACT_32BITS(&ni->rip_metric));
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (EXTRACT_32BITS(&ni->rip_router))
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%s", ipaddr_string(&ni->rip_router));
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                else
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("self");
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
17453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return sizeof (*ni);
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectrip_print(const u_char *dat, u_int length)
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct rip *rp;
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct rip_netinfo *ni;
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int i, j;
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend < dat) {
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|rip]");
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = snapend - dat;
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i > length)
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		i = length;
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i < sizeof(*rp)) {
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|rip]");
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i -= sizeof(*rp);
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rp = (struct rip *)dat;
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("%sRIPv%u",
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               (vflag >= 1) ? "\n\t" : "",
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               rp->rip_vers);
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (rp->rip_vers) {
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0:
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * RFC 1058.
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * XXX - RFC 1058 says
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * 0  Datagrams whose version number is zero are to be ignored.
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *    These are from a previous version of the protocol, whose
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *    packet format was machine-specific.
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * so perhaps we should just dump the packet, in hex.
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data((u_int8_t *)&rp->rip_cmd,"\n\t",length);
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /* dump version and lets see if we know the commands name*/
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf(", %s, length: %u",
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(rip_cmd_values,
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               "unknown command (%u)",
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               rp->rip_cmd),
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       length);
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (vflag < 1)
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    return;
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (rp->rip_cmd) {
23053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case RIPCMD_REQUEST:
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case RIPCMD_RESPONSE:
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			j = length / sizeof(*ni);
23353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        printf(", routes: %u%s", j, rp->rip_vers == 2 ? " or less" : "");
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ni = (struct rip_netinfo *)(rp + 1);
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (; i >= sizeof(*ni); ++ni) {
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (rp->rip_vers == 1)
23753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				{
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					rip_entry_print_v1(ni);
23953f17a9db278d33517d9888dd77848f554522a38JP Abgrall					i -= sizeof(*ni);
24053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				}
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				else if (rp->rip_vers == 2)
24253f17a9db278d33517d9888dd77848f554522a38JP Abgrall					i -= rip_entry_print_v2(ni, i);
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                else
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                    break;
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (i)
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("[|rip]");
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case RIPCMD_TRACEOFF:
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case RIPCMD_POLL:
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case RIPCMD_POLLENTRY:
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case RIPCMD_TRACEON:
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    /* fall through */
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        default:
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    if (vflag <= 1) {
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        if(!print_unknown_data((u_int8_t *)rp,"\n\t",length))
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            return;
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    }
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                }
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /* do we want to see an additionally hexdump ? */
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (vflag> 1) {
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    if(!print_unknown_data((u_int8_t *)rp,"\n\t",length))
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        return;
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                }
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
273