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