12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994, 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-icmp.c,v 1.81.2.6 2007/09/13 17:40:18 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 Project#include "ip.h" 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "udp.h" 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ipproto.h" 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "mpls.h" 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Interface Control Message Protocol Definitions. 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Per RFC 792, September 1981. 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Structure of an icmp header. 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct icmp { 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t icmp_type; /* type of message, see below */ 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t icmp_code; /* type sub code */ 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t icmp_cksum; /* ones complement cksum of struct */ 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union { 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t ih_pptr; /* ICMP_PARAMPROB */ 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in_addr ih_gwaddr; /* ICMP_REDIRECT */ 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct ih_idseq { 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t icd_id; 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t icd_seq; 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } ih_idseq; 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t ih_void; 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } icmp_hun; 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define icmp_pptr icmp_hun.ih_pptr 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define icmp_gwaddr icmp_hun.ih_gwaddr 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define icmp_id icmp_hun.ih_idseq.icd_id 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define icmp_seq icmp_hun.ih_idseq.icd_seq 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define icmp_void icmp_hun.ih_void 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union { 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct id_ts { 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t its_otime; 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t its_rtime; 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t its_ttime; 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } id_ts; 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct id_ip { 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct ip idi_ip; 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* options and then 64 bits of data */ 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } id_ip; 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t id_mask; 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t id_data[1]; 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } icmp_dun; 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define icmp_otime icmp_dun.id_ts.its_otime 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define icmp_rtime icmp_dun.id_ts.its_rtime 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define icmp_ttime icmp_dun.id_ts.its_ttime 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define icmp_ip icmp_dun.id_ip.idi_ip 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define icmp_mask icmp_dun.id_mask 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define icmp_data icmp_dun.id_data 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_MPLS_EXT_EXTRACT_VERSION(x) (((x)&0xf0)>>4) 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_MPLS_EXT_VERSION 2 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lower bounds on packet lengths for various types. 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * For the error advice packets must first insure that the 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * packet is large enought to contain the returned ip header. 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Only then can we do the check to see if 64 bits of packet 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * data have been returned, since we need to check the returned 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ip header length. 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_MINLEN 8 /* abs minimum */ 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_EXTD_MINLEN (156 - sizeof (struct ip)) /* draft-bonica-internet-icmp-08 */ 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_TSLEN (8 + 3 * sizeof (u_int32_t)) /* timestamp */ 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_MASKLEN 12 /* address mask */ 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */ 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_ADVLEN(p) (8 + (IP_HL(&(p)->icmp_ip) << 2) + 8) 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* N.B.: must separately check that ip_hl >= 5 */ 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Definition of type and code field values. 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_ECHOREPLY 0 /* echo reply */ 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH 3 /* dest unreachable, codes: */ 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_NET 0 /* bad net */ 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_HOST 1 /* bad host */ 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */ 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_PORT 3 /* bad port */ 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */ 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */ 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */ 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */ 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */ 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */ 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */ 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */ 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_REDIRECT 5 /* shorter route, codes: */ 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_REDIRECT_NET 0 /* for network */ 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_REDIRECT_HOST 1 /* for host */ 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */ 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */ 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_ECHO 8 /* echo service */ 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_ROUTERADVERT 9 /* router advertisement */ 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_ROUTERSOLICIT 10 /* router solicitation */ 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_TIMXCEED 11 /* time exceeded, code: */ 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */ 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */ 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_PARAMPROB 12 /* ip header bad */ 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */ 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_TSTAMP 13 /* timestamp request */ 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_TSTAMPREPLY 14 /* timestamp reply */ 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_IREQ 15 /* information request */ 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_IREQREPLY 16 /* information reply */ 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_MASKREQ 17 /* address mask request */ 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_MASKREPLY 18 /* address mask reply */ 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_MAXTYPE 18 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_INFOTYPE(type) \ 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \ 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \ 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \ 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \ 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY) 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_MPLS_EXT_TYPE(type) \ 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((type) == ICMP_UNREACH || \ 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (type) == ICMP_TIMXCEED || \ 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (type) == ICMP_PARAMPROB) 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* rfc1700 */ 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef ICMP_UNREACH_NET_UNKNOWN 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_NET_UNKNOWN 6 /* destination net unknown */ 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef ICMP_UNREACH_HOST_UNKNOWN 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_HOST_UNKNOWN 7 /* destination host unknown */ 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef ICMP_UNREACH_ISOLATED 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_ISOLATED 8 /* source host isolated */ 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef ICMP_UNREACH_NET_PROHIB 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_NET_PROHIB 9 /* admin prohibited net */ 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef ICMP_UNREACH_HOST_PROHIB 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_HOST_PROHIB 10 /* admin prohibited host */ 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef ICMP_UNREACH_TOSNET 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_TOSNET 11 /* tos prohibited net */ 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef ICMP_UNREACH_TOSHOST 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_TOSHOST 12 /* tos prohibited host */ 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* rfc1716 */ 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef ICMP_UNREACH_FILTER_PROHIB 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_FILTER_PROHIB 13 /* admin prohibited filter */ 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef ICMP_UNREACH_HOST_PRECEDENCE 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_HOST_PRECEDENCE 14 /* host precedence violation */ 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef ICMP_UNREACH_PRECEDENCE_CUTOFF 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* precedence cutoff */ 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Most of the icmp types */ 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok icmp2str[] = { 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_ECHOREPLY, "echo reply" }, 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_SOURCEQUENCH, "source quench" }, 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_ECHO, "echo request" }, 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_ROUTERSOLICIT, "router solicitation" }, 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_TSTAMP, "time stamp request" }, 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_TSTAMPREPLY, "time stamp reply" }, 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_IREQ, "information request" }, 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_IREQREPLY, "information reply" }, 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_MASKREQ, "address mask request" }, 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Formats for most of the ICMP_UNREACH codes */ 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok unreach2str[] = { 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_UNREACH_NET, "net %s unreachable" }, 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_UNREACH_HOST, "host %s unreachable" }, 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_UNREACH_SRCFAIL, 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "%s unreachable - source route failed" }, 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_UNREACH_NET_UNKNOWN, "net %s unreachable - unknown" }, 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_UNREACH_HOST_UNKNOWN, "host %s unreachable - unknown" }, 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_UNREACH_ISOLATED, 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "%s unreachable - source host isolated" }, 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_UNREACH_NET_PROHIB, 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "net %s unreachable - admin prohibited" }, 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_UNREACH_HOST_PROHIB, 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "host %s unreachable - admin prohibited" }, 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_UNREACH_TOSNET, 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "net %s unreachable - tos prohibited" }, 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_UNREACH_TOSHOST, 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "host %s unreachable - tos prohibited" }, 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_UNREACH_FILTER_PROHIB, 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "host %s unreachable - admin prohibited filter" }, 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_UNREACH_HOST_PRECEDENCE, 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "host %s unreachable - host precedence violation" }, 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_UNREACH_PRECEDENCE_CUTOFF, 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "host %s unreachable - precedence cutoff" }, 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Formats for the ICMP_REDIRECT codes */ 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok type2str[] = { 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_REDIRECT_NET, "redirect %s to net %s" }, 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_REDIRECT_HOST, "redirect %s to host %s" }, 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_REDIRECT_TOSNET, "redirect-tos %s to net %s" }, 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ICMP_REDIRECT_TOSHOST, "redirect-tos %s to host %s" }, 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* rfc1191 */ 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct mtu_discovery { 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t unused; 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t nexthopmtu; 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* rfc1256 */ 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct ih_rdiscovery { 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t ird_addrnum; 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t ird_addrsiz; 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t ird_lifetime; 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct id_rdiscovery { 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t ird_addr; 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t ird_pref; 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * draft-bonica-internet-icmp-08 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The Destination Unreachable, Time Exceeded 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * and Parameter Problem messages are slighly changed as per 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the above draft. A new Length field gets added to give 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the caller an idea about the length of the piggypacked 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IP packet before the MPLS extension header starts. 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The Length field represents length of the padded "original datagram" 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * field measured in 32-bit words. 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0 1 2 3 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The 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 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Type | Code | Checksum | 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | unused | Length | unused | 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Internet Header + leading octets of original datagram | 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | // | 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct icmp_ext_t { 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t icmp_type; 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t icmp_code; 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t icmp_checksum[2]; 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t icmp_reserved; 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t icmp_length; 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t icmp_reserved2[2]; 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t icmp_ext_legacy_header[128]; /* extension header starts 128 bytes after ICMP header */ 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t icmp_ext_version_res[2]; 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t icmp_ext_checksum[2]; 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t icmp_ext_data[1]; 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct icmp_mpls_ext_object_header_t { 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t length[2]; 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t class_num; 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t ctype; 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok icmp_mpls_ext_obj_values[] = { 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 1, "MPLS Stack Entry" }, 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 2, "Extended Payload" }, 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* prototypes */ 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char *icmp_tstamp_print(u_int); 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* print the milliseconds since midnight UTC */ 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecticmp_tstamp_print(u_int tstamp) { 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int msec,sec,min,hrs; 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static char buf[64]; 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msec = tstamp % 1000; 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sec = tstamp / 1000; 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project min = sec / 60; sec -= min * 60; 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hrs = min / 60; min -= hrs * 60; 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, sizeof(buf), "%02u:%02u:%02u.%03u",hrs,min,sec,msec); 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return buf; 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecticmp_print(const u_char *bp, u_int plen, const u_char *bp2, int fragmented) 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char *cp; 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct icmp *dp; 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct icmp_ext_t *ext_dp; 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct ip *ip; 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *str, *fmt; 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct ip *oip; 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct udphdr *ouh; 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int8_t *obj_tptr; 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t raw_label; 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *snapend_save; 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct icmp_mpls_ext_object_header_t *icmp_mpls_ext_object_header; 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int hlen, dport, mtu, obj_tlen, obj_class_num, obj_ctype; 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf[MAXHOSTNAMELEN + 100]; 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dp = (struct icmp *)bp; 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ext_dp = (struct icmp_ext_t *)bp; 3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip = (struct ip *)bp2; 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project str = buf; 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(dp->icmp_code); 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (dp->icmp_type) { 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_ECHO: 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_ECHOREPLY: 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(dp->icmp_seq); 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), "echo %s, id %u, seq %u", 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dp->icmp_type == ICMP_ECHO ? 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "request" : "reply", 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&dp->icmp_id), 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&dp->icmp_seq)); 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_UNREACH: 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(dp->icmp_ip.ip_dst); 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (dp->icmp_code) { 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_UNREACH_PROTOCOL: 3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(dp->icmp_ip.ip_p); 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "%s protocol %d unreachable", 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&dp->icmp_ip.ip_dst), 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dp->icmp_ip.ip_p); 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_UNREACH_PORT: 3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(dp->icmp_ip.ip_p); 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project oip = &dp->icmp_ip; 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hlen = IP_HL(oip) * 4; 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ouh = (struct udphdr *)(((u_char *)oip) + hlen); 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(ouh->uh_dport); 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dport = EXTRACT_16BITS(&ouh->uh_dport); 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (oip->ip_p) { 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPPROTO_TCP: 3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), 3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "%s tcp port %s unreachable", 3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&oip->ip_dst), 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcpport_string(dport)); 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPPROTO_UDP: 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), 3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "%s udp port %s unreachable", 3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&oip->ip_dst), 4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project udpport_string(dport)); 4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), 4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "%s protocol %d port %d unreachable", 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&oip->ip_dst), 4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project oip->ip_p, dport); 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_UNREACH_NEEDFRAG: 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct mtu_discovery *mp; 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mp = (struct mtu_discovery *)&dp->icmp_void; 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mtu = EXTRACT_16BITS(&mp->nexthopmtu); 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (mtu) { 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), 4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "%s unreachable - need to frag (mtu %d)", 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&dp->icmp_ip.ip_dst), mtu); 4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "%s unreachable - need to frag", 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&dp->icmp_ip.ip_dst)); 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fmt = tok2str(unreach2str, "#%d %%s unreachable", 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dp->icmp_code); 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), fmt, 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&dp->icmp_ip.ip_dst)); 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_REDIRECT: 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(dp->icmp_ip.ip_dst); 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fmt = tok2str(type2str, "redirect-#%d %%s to net %%s", 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dp->icmp_code); 4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), fmt, 4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&dp->icmp_ip.ip_dst), 4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&dp->icmp_gwaddr)); 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_ROUTERADVERT: 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct ih_rdiscovery *ihp; 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct id_rdiscovery *idp; 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int lifetime, num, size; 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), "router advertisement"); 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = buf + strlen(buf); 4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ihp = (struct ih_rdiscovery *)&dp->icmp_void; 4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ihp); 4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)strncpy(cp, " lifetime ", sizeof(buf) - (cp - buf)); 4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = buf + strlen(buf); 4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lifetime = EXTRACT_16BITS(&ihp->ird_lifetime); 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (lifetime < 60) { 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(cp, sizeof(buf) - (cp - buf), "%u", 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lifetime); 4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (lifetime < 60 * 60) { 4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(cp, sizeof(buf) - (cp - buf), "%u:%02u", 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lifetime / 60, lifetime % 60); 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(cp, sizeof(buf) - (cp - buf), 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "%u:%02u:%02u", 4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lifetime / 3600, 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (lifetime % 3600) / 60, 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lifetime % 60); 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = buf + strlen(buf); 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project num = ihp->ird_addrnum; 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(cp, sizeof(buf) - (cp - buf), " %d:", num); 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = buf + strlen(buf); 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project size = ihp->ird_addrsiz; 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (size != 2) { 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(cp, sizeof(buf) - (cp - buf), 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project " [size %d]", size); 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project idp = (struct id_rdiscovery *)&dp->icmp_data; 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (num-- > 0) { 4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*idp); 4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(cp, sizeof(buf) - (cp - buf), " {%s %u}", 4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&idp->ird_addr), 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&idp->ird_pref)); 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = buf + strlen(buf); 4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ++idp; 4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_TIMXCEED: 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(dp->icmp_ip.ip_dst); 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (dp->icmp_code) { 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_TIMXCEED_INTRANS: 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project str = "time exceeded in-transit"; 5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_TIMXCEED_REASS: 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project str = "ip reassembly time exceeded"; 5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), "time exceeded-#%d", 5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dp->icmp_code); 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_PARAMPROB: 5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dp->icmp_code) 5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), 5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "parameter problem - code %d", dp->icmp_code); 5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(dp->icmp_pptr); 5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), 5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "parameter problem - octet %d", dp->icmp_pptr); 5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_MASKREPLY: 5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(dp->icmp_mask); 5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), "address mask is 0x%08x", 5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&dp->icmp_mask)); 5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_TSTAMP: 5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(dp->icmp_seq); 5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), 5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "time stamp query id %u seq %u", 5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&dp->icmp_id), 5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&dp->icmp_seq)); 5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ICMP_TSTAMPREPLY: 5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(dp->icmp_ttime); 5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), 5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "time stamp reply id %u seq %u: org %s", 5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&dp->icmp_id), 5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&dp->icmp_seq), 5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project icmp_tstamp_print(EXTRACT_32BITS(&dp->icmp_otime))); 5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf+strlen(buf),sizeof(buf)-strlen(buf),", recv %s", 5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project icmp_tstamp_print(EXTRACT_32BITS(&dp->icmp_rtime))); 5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf+strlen(buf),sizeof(buf)-strlen(buf),", xmit %s", 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project icmp_tstamp_print(EXTRACT_32BITS(&dp->icmp_ttime))); 5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project str = tok2str(icmp2str, "type-#%d", dp->icmp_type); 5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("ICMP %s, length %u", str, plen); 5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag && !fragmented) { /* don't attempt checksumming if this is a frag */ 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t sum, icmp_sum; 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (TTEST2(*bp, plen)) { 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sum = in_cksum((u_short*)dp, plen, 0); 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sum != 0) { 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project icmp_sum = EXTRACT_16BITS(&dp->icmp_cksum); 5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" (wrong icmp cksum %x (->%x)!)", 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project icmp_sum, 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project in_cksum_shouldbe(icmp_sum, sum)); 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * print the remnants of the IP packet. 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * save the snaplength as this may get overidden in the IP printer. 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag >= 1 && !ICMP_INFOTYPE(dp->icmp_type)) { 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += 8; 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("\n\t"); 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip = (struct ip *)bp; 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snaplen = snapend - bp; 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snapend_save = snapend; 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip_print(gndo, bp, EXTRACT_16BITS(&ip->ip_len)); 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snapend = snapend_save; 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Attempt to decode the MPLS extensions only for some ICMP types. 5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag >= 1 && plen > ICMP_EXTD_MINLEN && ICMP_MPLS_EXT_TYPE(dp->icmp_type)) { 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ext_dp); 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Check first if the mpls extension header shows a non-zero length. 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If the length field is not set then silently verify the checksum 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to check if an extension header is present. This is expedient, 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * however not all implementations set the length field proper. 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!ext_dp->icmp_length && 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project in_cksum((const u_short *)&ext_dp->icmp_ext_version_res, 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen - ICMP_EXTD_MINLEN, 0)) { 6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\tMPLS extension v%u", 6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ICMP_MPLS_EXT_EXTRACT_VERSION(*(ext_dp->icmp_ext_version_res))); 6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Sanity checking of the header. 6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ICMP_MPLS_EXT_EXTRACT_VERSION(*(ext_dp->icmp_ext_version_res)) != 6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ICMP_MPLS_EXT_VERSION) { 6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" packet not supported"); 6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hlen = plen - ICMP_EXTD_MINLEN; 6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", checksum 0x%04x (%scorrect), length %u", 6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(ext_dp->icmp_ext_checksum), 6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project in_cksum((const u_short *)&ext_dp->icmp_ext_version_res, 6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plen - ICMP_EXTD_MINLEN, 0) ? "in" : "", 6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hlen); 6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hlen -= 4; /* subtract common header size */ 6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project obj_tptr = (u_int8_t *)ext_dp->icmp_ext_data; 6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (hlen > sizeof(struct icmp_mpls_ext_object_header_t)) { 6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project icmp_mpls_ext_object_header = (struct icmp_mpls_ext_object_header_t *)obj_tptr; 6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*icmp_mpls_ext_object_header); 6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project obj_tlen = EXTRACT_16BITS(icmp_mpls_ext_object_header->length); 6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project obj_class_num = icmp_mpls_ext_object_header->class_num; 6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project obj_ctype = icmp_mpls_ext_object_header->ctype; 6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project obj_tptr += sizeof(struct icmp_mpls_ext_object_header_t); 6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t %s Object (%u), Class-Type: %u, length %u", 6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(icmp_mpls_ext_obj_values,"unknown",obj_class_num), 6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project obj_class_num, 6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project obj_ctype, 6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project obj_tlen); 6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hlen-=sizeof(struct icmp_mpls_ext_object_header_t); /* length field includes tlv header */ 6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* infinite loop protection */ 6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((obj_class_num == 0) || 6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (obj_tlen < sizeof(struct icmp_mpls_ext_object_header_t))) { 6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project obj_tlen-=sizeof(struct icmp_mpls_ext_object_header_t); 6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (obj_class_num) { 6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 1: 6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(obj_ctype) { 6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 1: 6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*obj_tptr, 4); 6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project raw_label = EXTRACT_32BITS(obj_tptr); 6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t label %u, exp %u", MPLS_LABEL(raw_label), MPLS_EXP(raw_label)); 6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (MPLS_STACK(raw_label)) 6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", [S]"); 6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", ttl %u", MPLS_TTL(raw_label)); 6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(obj_tptr, "\n\t ", obj_tlen); 6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FIXME those are the defined objects that lack a decoder 6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * you are welcome to contribute code ;-) 6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 2: 6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(obj_tptr, "\n\t ", obj_tlen); 6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (hlen < obj_tlen) 6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hlen -= obj_tlen; 6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project obj_tptr += obj_tlen; 6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("[|icmp]", stdout); 6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 689