1#ifndef __NETINET_IP_ICMP_H
2#define __NETINET_IP_ICMP_H    1
3
4
5#include <asm/types.h>
6#include <linux/icmp.h>
7
8#ifdef __USE_BSD
9/*
10 * Copyright (c) 1982, 1986, 1993
11 *	The Regents of the University of California.  All rights reserved.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 *    notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 *    notice, this list of conditions and the following disclaimer in the
20 *    documentation and/or other materials provided with the distribution.
21 * 3. All advertising materials mentioning features or use of this software
22 *    must display the following acknowledgement:
23 *	This product includes software developed by the University of
24 *	California, Berkeley and its contributors.
25 * 4. Neither the name of the University nor the names of its contributors
26 *    may be used to endorse or promote products derived from this software
27 *    without specific prior written permission.
28 *
29 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 * SUCH DAMAGE.
40 *
41 *	@(#)ip_icmp.h	8.1 (Berkeley) 6/10/93
42 */
43
44#include <netinet/in.h>
45#include <netinet/ip.h>
46
47/*
48 * Internal of an ICMP Router Advertisement
49 */
50struct icmp_ra_addr
51{
52  u_int32_t ira_addr;
53  u_int32_t ira_preference;
54};
55
56struct icmp
57{
58  u_int8_t  icmp_type;	/* type of message, see below */
59  u_int8_t  icmp_code;	/* type sub code */
60  u_int16_t icmp_cksum;	/* ones complement checksum of struct */
61  union
62  {
63    u_char ih_pptr;		/* ICMP_PARAMPROB */
64    struct in_addr ih_gwaddr;	/* gateway address */
65    struct ih_idseq		/* echo datagram */
66    {
67      u_int16_t icd_id;
68      u_int16_t icd_seq;
69    } ih_idseq;
70    u_int32_t ih_void;
71
72    /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
73    struct ih_pmtu
74    {
75      u_int16_t ipm_void;
76      u_int16_t ipm_nextmtu;
77    } ih_pmtu;
78
79    struct ih_rtradv
80    {
81      u_int8_t irt_num_addrs;
82      u_int8_t irt_wpa;
83      u_int16_t irt_lifetime;
84    } ih_rtradv;
85  } icmp_hun;
86#define	icmp_pptr	icmp_hun.ih_pptr
87#define	icmp_gwaddr	icmp_hun.ih_gwaddr
88#define	icmp_id		icmp_hun.ih_idseq.icd_id
89#define	icmp_seq	icmp_hun.ih_idseq.icd_seq
90#define	icmp_void	icmp_hun.ih_void
91#define	icmp_pmvoid	icmp_hun.ih_pmtu.ipm_void
92#define	icmp_nextmtu	icmp_hun.ih_pmtu.ipm_nextmtu
93#define	icmp_num_addrs	icmp_hun.ih_rtradv.irt_num_addrs
94#define	icmp_wpa	icmp_hun.ih_rtradv.irt_wpa
95#define	icmp_lifetime	icmp_hun.ih_rtradv.irt_lifetime
96  union
97  {
98    struct
99    {
100      u_int32_t its_otime;
101      u_int32_t its_rtime;
102      u_int32_t its_ttime;
103    } id_ts;
104    struct
105    {
106      struct ip idi_ip;
107      /* options and then 64 bits of data */
108    } id_ip;
109    struct icmp_ra_addr id_radv;
110    u_int32_t   id_mask;
111    u_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_radv	icmp_dun.id_radv
118#define	icmp_mask	icmp_dun.id_mask
119#define	icmp_data	icmp_dun.id_data
120};
121
122/*
123 * Lower bounds on packet lengths for various types.
124 * For the error advice packets must first insure that the
125 * packet is large enough to contain the returned ip header.
126 * Only then can we do the check to see if 64 bits of packet
127 * data have been returned, since we need to check the returned
128 * ip header length.
129 */
130#define	ICMP_MINLEN	8				/* abs minimum */
131#define	ICMP_TSLEN	(8 + 3 * sizeof (n_time))	/* timestamp */
132#define	ICMP_MASKLEN	12				/* address mask */
133#define	ICMP_ADVLENMIN	(8 + sizeof (struct ip) + 8)	/* min */
134#ifndef _IP_VHL
135#define	ICMP_ADVLEN(p)	(8 + ((p)->icmp_ip.ip_hl << 2) + 8)
136	/* N.B.: must separately check that ip_hl >= 5 */
137#else
138#define	ICMP_ADVLEN(p)	(8 + (IP_VHL_HL((p)->icmp_ip.ip_vhl) << 2) + 8)
139	/* N.B.: must separately check that header length >= 5 */
140#endif
141
142/* Definition of type and code fields. */
143/* defined above: ICMP_ECHOREPLY, ICMP_REDIRECT, ICMP_ECHO */
144#define	ICMP_UNREACH		3		/* dest unreachable, codes: */
145#define	ICMP_SOURCEQUENCH	4		/* packet lost, slow down */
146#define	ICMP_ROUTERADVERT	9		/* router advertisement */
147#define	ICMP_ROUTERSOLICIT	10		/* router solicitation */
148#define	ICMP_TIMXCEED		11		/* time exceeded, code: */
149#define	ICMP_PARAMPROB		12		/* ip header bad */
150#define	ICMP_TSTAMP		13		/* timestamp request */
151#define	ICMP_TSTAMPREPLY	14		/* timestamp reply */
152#define	ICMP_IREQ		15		/* information request */
153#define	ICMP_IREQREPLY		16		/* information reply */
154#define	ICMP_MASKREQ		17		/* address mask request */
155#define	ICMP_MASKREPLY		18		/* address mask reply */
156
157#define	ICMP_MAXTYPE		18
158
159/* UNREACH codes */
160#define	ICMP_UNREACH_NET	        0	/* bad net */
161#define	ICMP_UNREACH_HOST	        1	/* bad host */
162#define	ICMP_UNREACH_PROTOCOL	        2	/* bad protocol */
163#define	ICMP_UNREACH_PORT	        3	/* bad port */
164#define	ICMP_UNREACH_NEEDFRAG	        4	/* IP_DF caused drop */
165#define	ICMP_UNREACH_SRCFAIL	        5	/* src route failed */
166#define	ICMP_UNREACH_NET_UNKNOWN        6	/* unknown net */
167#define	ICMP_UNREACH_HOST_UNKNOWN       7	/* unknown host */
168#define	ICMP_UNREACH_ISOLATED	        8	/* src host isolated */
169#define	ICMP_UNREACH_NET_PROHIB	        9	/* net denied */
170#define	ICMP_UNREACH_HOST_PROHIB        10	/* host denied */
171#define	ICMP_UNREACH_TOSNET	        11	/* bad tos for net */
172#define	ICMP_UNREACH_TOSHOST	        12	/* bad tos for host */
173#define	ICMP_UNREACH_FILTER_PROHIB      13	/* admin prohib */
174#define	ICMP_UNREACH_HOST_PRECEDENCE    14	/* host prec vio. */
175#define	ICMP_UNREACH_PRECEDENCE_CUTOFF  15	/* prec cutoff */
176
177/* REDIRECT codes */
178#define	ICMP_REDIRECT_NET	0		/* for network */
179#define	ICMP_REDIRECT_HOST	1		/* for host */
180#define	ICMP_REDIRECT_TOSNET	2		/* for tos and net */
181#define	ICMP_REDIRECT_TOSHOST	3		/* for tos and host */
182
183/* TIMEXCEED codes */
184#define	ICMP_TIMXCEED_INTRANS	0		/* ttl==0 in transit */
185#define	ICMP_TIMXCEED_REASS	1		/* ttl==0 in reass */
186
187/* PARAMPROB code */
188#define	ICMP_PARAMPROB_OPTABSENT 1		/* req. opt. absent */
189
190#define	ICMP_INFOTYPE(type) \
191	((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \
192	(type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \
193	(type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
194	(type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \
195	(type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
196
197#endif /* __USE_BSD */
198
199#endif /* netinet/ip_icmp.h */
200