ip_icmp.h revision 1.17
1/* $OpenBSD: ip_icmp.h,v 1.17 2002/06/08 21:53:53 jasoni Exp $ */ 2/* $NetBSD: ip_icmp.h,v 1.10 1996/02/13 23:42:28 christos Exp $ */ 3 4/* 5 * Copyright (c) 1982, 1986, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by the University of 19 * California, Berkeley and its contributors. 20 * 4. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)ip_icmp.h 8.1 (Berkeley) 6/10/93 37 */ 38 39#ifndef _NETINET_IP_ICMP_H_ 40#define _NETINET_IP_ICMP_H_ 41 42/* 43 * Interface Control Message Protocol Definitions. 44 * Per RFC 792, September 1981. 45 * RFC 950, August 1985. (Address Mask Request / Reply) 46 * RFC 1256, September 1991. (Router Advertisement and Solicitation) 47 * RFC 1108, November 1991. (Param Problem, Missing Req. Option) 48 * RFC 1393, January 1993. (Traceroute) 49 * RFC 1475, June 1993. (Datagram Conversion Error) 50 * RFC 1812, June 1995. (adm prohib, host precedence, precedence cutoff) 51 * RFC 2002, October 1996. (Mobility changes to Router Advertisement) 52 */ 53 54/* 55 * ICMP Router Advertisement data 56 */ 57struct icmp_ra_addr { 58 n_long ira_addr; 59 n_long ira_preference; 60}; 61 62/* 63 * Structure of an icmp header. 64 */ 65struct icmp { 66 u_int8_t icmp_type; /* type of message, see below */ 67 u_int8_t icmp_code; /* type sub code */ 68 u_int16_t icmp_cksum; /* ones complement cksum of struct */ 69 union { 70 u_int8_t ih_pptr; /* ICMP_PARAMPROB */ 71 struct in_addr ih_gwaddr; /* ICMP_REDIRECT */ 72 struct ih_idseq { 73 n_short icd_id; 74 n_short icd_seq; 75 } ih_idseq; 76 int32_t ih_void; 77 78 /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */ 79 struct ih_pmtu { 80 n_short ipm_void; 81 n_short ipm_nextmtu; 82 } ih_pmtu; 83 84 struct ih_rtradv { 85 u_int8_t irt_num_addrs; 86 u_int8_t irt_wpa; 87 n_short irt_lifetime; 88 } ih_rtradv; 89 } icmp_hun; 90#define icmp_pptr icmp_hun.ih_pptr 91#define icmp_gwaddr icmp_hun.ih_gwaddr 92#define icmp_id icmp_hun.ih_idseq.icd_id 93#define icmp_seq icmp_hun.ih_idseq.icd_seq 94#define icmp_void icmp_hun.ih_void 95#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void 96#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu 97#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs 98#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa 99#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime 100 union { 101 struct id_ts { 102 n_time its_otime; 103 n_time its_rtime; 104 n_time its_ttime; 105 } id_ts; 106 struct id_ip { 107 struct ip idi_ip; 108 /* options and then 64 bits of data */ 109 } id_ip; 110 u_int32_t id_mask; 111 int8_t id_data[1]; 112 } icmp_dun; 113#define icmp_otime icmp_dun.id_ts.its_otime 114#define icmp_rtime icmp_dun.id_ts.its_rtime 115#define icmp_ttime icmp_dun.id_ts.its_ttime 116#define icmp_ip icmp_dun.id_ip.idi_ip 117#define icmp_mask icmp_dun.id_mask 118#define icmp_data icmp_dun.id_data 119}; 120 121/* 122 * For IPv6 transition related ICMP errors. 123 */ 124#define ICMP_V6ADVLENMIN (8 + sizeof(struct ip) + 40) 125#define ICMP_V6ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 40) 126 127/* 128 * Lower bounds on packet lengths for various types. 129 * For the error advice packets must first insure that the 130 * packet is large enought to contain the returned ip header. 131 * Only then can we do the check to see if 64 bits of packet 132 * data have been returned, since we need to check the returned 133 * ip header length. 134 */ 135#define ICMP_MINLEN 8 /* abs minimum */ 136#define ICMP_TSLEN (8 + 3 * sizeof (n_time)) /* timestamp */ 137#define ICMP_MASKLEN 12 /* address mask */ 138#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */ 139#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8) 140 /* N.B.: must separately check that ip_hl >= 5 */ 141 142/* 143 * Definition of type and code field values. 144 * http://www.iana.org/assignments/icmp-parameters 145 */ 146#define ICMP_ECHOREPLY 0 /* echo reply */ 147#define ICMP_UNREACH 3 /* dest unreachable, codes: */ 148#define ICMP_UNREACH_NET 0 /* bad net */ 149#define ICMP_UNREACH_HOST 1 /* bad host */ 150#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */ 151#define ICMP_UNREACH_PORT 3 /* bad port */ 152#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ 153#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ 154#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */ 155#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */ 156#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */ 157#define ICMP_UNREACH_NET_PROHIB 9 /* for crypto devs */ 158#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */ 159#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */ 160#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */ 161#define ICMP_UNREACH_FILTER_PROHIB 13 /* prohibited access */ 162#define ICMP_UNREACH_HOST_PRECEDENCE 14 /* precedence violat'n*/ 163#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* precedence cutoff */ 164#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */ 165#define ICMP_REDIRECT 5 /* shorter route, codes: */ 166#define ICMP_REDIRECT_NET 0 /* for network */ 167#define ICMP_REDIRECT_HOST 1 /* for host */ 168#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */ 169#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */ 170#define ICMP_ALTHOSTADDR 6 /* alternate host address */ 171#define ICMP_ECHO 8 /* echo service */ 172#define ICMP_ROUTERADVERT 9 /* router advertisement */ 173#define ICMP_ROUTERADVERT_NORMAL 0 /* normal advertisement */ 174#define ICMP_ROUTERADVERT_NOROUTE_COMMON 16 /* selective routing */ 175#define ICMP_ROUTERSOLICIT 10 /* router solicitation */ 176#define ICMP_TIMXCEED 11 /* time exceeded, code: */ 177#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */ 178#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */ 179#define ICMP_PARAMPROB 12 /* ip header bad */ 180#define ICMP_PARAMPROB_ERRATPTR 0 /* req. opt. absent */ 181#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */ 182#define ICMP_PARAMPROB_LENGTH 2 /* bad length */ 183#define ICMP_TSTAMP 13 /* timestamp request */ 184#define ICMP_TSTAMPREPLY 14 /* timestamp reply */ 185#define ICMP_IREQ 15 /* information request */ 186#define ICMP_IREQREPLY 16 /* information reply */ 187#define ICMP_MASKREQ 17 /* address mask request */ 188#define ICMP_MASKREPLY 18 /* address mask reply */ 189#define ICMP_TRACEROUTE 30 /* traceroute */ 190#define ICMP_DATACONVERR 31 /* data conversion error */ 191#define ICMP_MOBILE_REDIRECT 32 /* mobile host redirect */ 192#define ICMP_IPV6_WHEREAREYOU 33 /* IPv6 where-are-you */ 193#define ICMP_IPV6_IAMHERE 34 /* IPv6 i-am-here */ 194#define ICMP_MOBILE_REGREQUEST 35 /* mobile registration req */ 195#define ICMP_MOBILE_REGREPLY 36 /* mobile registration reply */ 196#define ICMP_SKIP 39 /* SKIP */ 197#define ICMP_PHOTURIS 40 /* Photuris */ 198#define ICMP_PHOTURIS_UNKNOWN_INDEX 1 /* unknown sec index */ 199#define ICMP_PHOTURIS_AUTH_FAILED 2 /* auth failed */ 200#define ICMP_PHOTURIS_DECRYPT_FAILED 3 /* decrypt failed */ 201 202#define ICMP_MAXTYPE 40 203 204#define ICMP_INFOTYPE(type) \ 205 ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \ 206 (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \ 207 (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \ 208 (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \ 209 (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY) 210 211#ifdef _KERNEL 212struct mbuf * 213 icmp_do_error(struct mbuf *, int, int, n_long, struct ifnet *); 214void icmp_error(struct mbuf *, int, int, n_long, struct ifnet *); 215void icmp_input(struct mbuf *, ...); 216void icmp_init(void); 217void icmp_reflect(struct mbuf *); 218void icmp_send(struct mbuf *, struct mbuf *); 219int icmp_sysctl(int *, u_int, void *, size_t *, void *, size_t); 220struct rtentry * 221 icmp_mtudisc_clone(struct sockaddr *); 222void icmp_mtudisc(struct icmp *); 223#endif /* _KERNEL */ 224#endif /* _NETINET_IP_ICMP_H_ */ 225