| 1 | /*	$NetBSD: ip_icmp.h,v 1.40 2018/09/14 05:09:51 maxv Exp $	*/ | 
| 2 |  | 
| 3 | /* | 
| 4 |  * Copyright (c) 1982, 1986, 1993 | 
| 5 |  *	The Regents of the University of California.  All rights reserved. | 
| 6 |  * | 
| 7 |  * Redistribution and use in source and binary forms, with or without | 
| 8 |  * modification, are permitted provided that the following conditions | 
| 9 |  * are met: | 
| 10 |  * 1. Redistributions of source code must retain the above copyright | 
| 11 |  *    notice, this list of conditions and the following disclaimer. | 
| 12 |  * 2. Redistributions in binary form must reproduce the above copyright | 
| 13 |  *    notice, this list of conditions and the following disclaimer in the | 
| 14 |  *    documentation and/or other materials provided with the distribution. | 
| 15 |  * 3. Neither the name of the University nor the names of its contributors | 
| 16 |  *    may be used to endorse or promote products derived from this software | 
| 17 |  *    without specific prior written permission. | 
| 18 |  * | 
| 19 |  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | 
| 20 |  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
| 21 |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
| 22 |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | 
| 23 |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
| 24 |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 
| 25 |  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
| 26 |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 
| 27 |  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 
| 28 |  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
| 29 |  * SUCH DAMAGE. | 
| 30 |  * | 
| 31 |  *	@(#)ip_icmp.h	8.1 (Berkeley) 6/10/93 | 
| 32 |  */ | 
| 33 |  | 
| 34 | #ifndef _NETINET_IP_ICMP_H_ | 
| 35 | #define _NETINET_IP_ICMP_H_ | 
| 36 |  | 
| 37 | /* | 
| 38 |  * Interface Control Message Protocol Definitions. | 
| 39 |  * Per RFC 792, September 1981. | 
| 40 |  */ | 
| 41 |  | 
| 42 | /* | 
| 43 |  * Internal of an ICMP Router Advertisement | 
| 44 |  */ | 
| 45 | struct icmp_ra_addr { | 
| 46 | 	uint32_t ira_addr; | 
| 47 | 	uint32_t ira_preference; | 
| 48 | } __packed; | 
| 49 |  | 
| 50 | /* | 
| 51 |  * Structure of an icmp header. | 
| 52 |  */ | 
| 53 | struct icmp { | 
| 54 | 	uint8_t  icmp_type;		/* type of message, see below */ | 
| 55 | 	uint8_t  icmp_code;		/* type sub code */ | 
| 56 | 	uint16_t icmp_cksum;		/* ones complement cksum of struct */ | 
| 57 |  | 
| 58 | 	union { | 
| 59 | 		int32_t ih_void; | 
| 60 |  | 
| 61 | 		/* Extended Header (RFC4884) */ | 
| 62 | 		struct ih_exthdr { | 
| 63 | 			uint8_t iex_void1; | 
| 64 | 			uint8_t iex_length; | 
| 65 | 			uint16_t iex_void2; | 
| 66 | 		} ih_exthdr __packed; | 
| 67 |  | 
| 68 | 		/* ICMP_PARAMPROB */ | 
| 69 | 		uint8_t ih_pptr; | 
| 70 |  | 
| 71 | 		/* ICMP_REDIRECT */ | 
| 72 | 		struct in_addr ih_gwaddr; | 
| 73 |  | 
| 74 | 		/* ICMP_ECHO and friends */ | 
| 75 | 		struct ih_idseq { | 
| 76 | 			uint16_t icd_id; | 
| 77 | 			uint16_t icd_seq; | 
| 78 | 		} ih_idseq __packed; | 
| 79 |  | 
| 80 | 		/* ICMP_UNREACH_NEEDFRAG (Path MTU Discovery, RFC1191) */ | 
| 81 | 		struct ih_pmtu { | 
| 82 | 			uint16_t ipm_void; | 
| 83 | 			uint16_t ipm_nextmtu; | 
| 84 | 		} ih_pmtu __packed; | 
| 85 |  | 
| 86 | 		/* ICMP_ROUTERADVERT */ | 
| 87 | 		struct ih_rtradv { | 
| 88 | 			uint8_t irt_num_addrs; | 
| 89 | 			uint8_t irt_wpa; | 
| 90 | 			uint16_t irt_lifetime; | 
| 91 | 		} ih_rtradv __packed; | 
| 92 | 	} icmp_hun /* XXX __packed ??? */; | 
| 93 |  | 
| 94 | #define icmp_pptr	icmp_hun.ih_pptr | 
| 95 | #define icmp_gwaddr	icmp_hun.ih_gwaddr | 
| 96 | #define icmp_id		icmp_hun.ih_idseq.icd_id | 
| 97 | #define icmp_seq	icmp_hun.ih_idseq.icd_seq | 
| 98 | #define icmp_void	icmp_hun.ih_void | 
| 99 | #define icmp_pmvoid	icmp_hun.ih_pmtu.ipm_void | 
| 100 | #define icmp_nextmtu	icmp_hun.ih_pmtu.ipm_nextmtu | 
| 101 | #define icmp_num_addrs	icmp_hun.ih_rtradv.irt_num_addrs | 
| 102 | #define icmp_wpa	icmp_hun.ih_rtradv.irt_wpa | 
| 103 | #define icmp_lifetime	icmp_hun.ih_rtradv.irt_lifetime | 
| 104 |  | 
| 105 | 	union { | 
| 106 | 		/* ICMP_TSTAMP and friends */ | 
| 107 | 		struct id_ts { | 
| 108 | 			uint32_t its_otime; | 
| 109 | 			uint32_t its_rtime; | 
| 110 | 			uint32_t its_ttime; | 
| 111 | 		} id_ts __packed; | 
| 112 |  | 
| 113 | 		struct id_ip { | 
| 114 | 			struct ip idi_ip; | 
| 115 | 			/* options and then 64 bits of data */ | 
| 116 | 		} id_ip /* XXX: __packed ??? */; | 
| 117 |  | 
| 118 | 		/* ICMP_ROUTERADVERT */ | 
| 119 | 		struct icmp_ra_addr id_radv; | 
| 120 |  | 
| 121 | 		/* ICMP_MASKREQ and friends */ | 
| 122 | 		uint32_t id_mask; | 
| 123 |  | 
| 124 | 		int8_t id_data[1]; | 
| 125 | 	} icmp_dun /* XXX __packed ??? */; | 
| 126 |  | 
| 127 | #define icmp_otime	icmp_dun.id_ts.its_otime | 
| 128 | #define icmp_rtime	icmp_dun.id_ts.its_rtime | 
| 129 | #define icmp_ttime	icmp_dun.id_ts.its_ttime | 
| 130 | #define icmp_ip		icmp_dun.id_ip.idi_ip | 
| 131 | #define icmp_radv	icmp_dun.id_radv | 
| 132 | #define icmp_mask	icmp_dun.id_mask | 
| 133 | #define icmp_data	icmp_dun.id_data | 
| 134 | }; | 
| 135 |  | 
| 136 | #define ICMP_EXT_VERSION	2 | 
| 137 | #define ICMP_EXT_OFFSET		128 | 
| 138 |  | 
| 139 | /* | 
| 140 |  * ICMP Extension Structure Header (RFC4884). | 
| 141 |  */ | 
| 142 | struct icmp_ext_hdr { | 
| 143 | #if BYTE_ORDER == BIG_ENDIAN | 
| 144 | 	uint8_t version:4; | 
| 145 | 	uint8_t rsvd1:4; | 
| 146 | #else | 
| 147 | 	uint8_t rsvd1:4; | 
| 148 | 	uint8_t version:4; | 
| 149 | #endif | 
| 150 | 	uint8_t rsvd2; | 
| 151 | 	uint16_t checksum; | 
| 152 | } __packed; | 
| 153 |  | 
| 154 | /* | 
| 155 |  * ICMP Extension Object Header (RFC4884). | 
| 156 |  */ | 
| 157 | struct icmp_ext_obj_hdr { | 
| 158 | 	uint16_t length; | 
| 159 | 	uint8_t class_num; | 
| 160 | 	uint8_t c_type; | 
| 161 | } __packed; | 
| 162 |  | 
| 163 | /* | 
| 164 |  * Lower bounds on packet lengths for various types. | 
| 165 |  * For the error advice packets must first insure that the | 
| 166 |  * packet is large enought to contain the returned ip header. | 
| 167 |  * Only then can we do the check to see if 64 bits of packet | 
| 168 |  * data have been returned, since we need to check the returned | 
| 169 |  * ip header length. | 
| 170 |  */ | 
| 171 | #define ICMP_MINLEN	8				/* abs minimum */ | 
| 172 | #define ICMP_TSLEN	(8 + 3 * sizeof(uint32_t))	/* timestamp */ | 
| 173 | #define ICMP_MASKLEN	12				/* address mask */ | 
| 174 | #define ICMP_ADVLENMIN	(8 + sizeof(struct ip) + 8)	/* min */ | 
| 175 | #define ICMP_ADVLEN(p)	(8 + ((p)->icmp_ip.ip_hl << 2) + 8) | 
| 176 | 	/* N.B.: must separately check that ip_hl >= 5 */ | 
| 177 |  | 
| 178 | /* | 
| 179 |  * Definition of type and code field values. | 
| 180 |  */ | 
| 181 | #define ICMP_ECHOREPLY		0		/* echo reply */ | 
| 182 | #define ICMP_UNREACH		3		/* dest unreachable, codes: */ | 
| 183 | #define		ICMP_UNREACH_NET	0		/* bad net */ | 
| 184 | #define		ICMP_UNREACH_HOST	1		/* bad host */ | 
| 185 | #define		ICMP_UNREACH_PROTOCOL	2		/* bad protocol */ | 
| 186 | #define		ICMP_UNREACH_PORT	3		/* bad port */ | 
| 187 | #define		ICMP_UNREACH_NEEDFRAG	4		/* IP_DF caused drop */ | 
| 188 | #define		ICMP_UNREACH_SRCFAIL	5		/* src route failed */ | 
| 189 | #define		ICMP_UNREACH_NET_UNKNOWN 6		/* unknown net */ | 
| 190 | #define		ICMP_UNREACH_HOST_UNKNOWN 7		/* unknown host */ | 
| 191 | #define		ICMP_UNREACH_ISOLATED	8		/* src host isolated */ | 
| 192 | #define		ICMP_UNREACH_NET_PROHIB 9		/* prohibited access */ | 
| 193 | #define		ICMP_UNREACH_HOST_PROHIB 10		/* ditto */ | 
| 194 | #define		ICMP_UNREACH_TOSNET	11		/* bad tos for net */ | 
| 195 | #define		ICMP_UNREACH_TOSHOST	12		/* bad tos for host */ | 
| 196 | #define		ICMP_UNREACH_ADMIN_PROHIBIT 13		/* communication | 
| 197 | 							   administratively | 
| 198 | 							   prohibited */ | 
| 199 | #define		ICMP_UNREACH_HOST_PREC	14		/* host precedence | 
| 200 | 							   violation */ | 
| 201 | #define		ICMP_UNREACH_PREC_CUTOFF 15		/* precedence cutoff */ | 
| 202 | #define ICMP_SOURCEQUENCH	4		/* packet lost, slow down */ | 
| 203 | #define ICMP_REDIRECT		5		/* shorter route, codes: */ | 
| 204 | #define		ICMP_REDIRECT_NET	0		/* for network */ | 
| 205 | #define		ICMP_REDIRECT_HOST	1		/* for host */ | 
| 206 | #define		ICMP_REDIRECT_TOSNET	2		/* for tos and net */ | 
| 207 | #define		ICMP_REDIRECT_TOSHOST	3		/* for tos and host */ | 
| 208 | #define ICMP_ALTHOSTADDR	6		/* alternative host address */ | 
| 209 | #define ICMP_ECHO		8		/* echo service */ | 
| 210 | #define ICMP_ROUTERADVERT	9		/* router advertisement */ | 
| 211 | #define		ICMP_ROUTERADVERT_NORMAL 0 | 
| 212 | #define		ICMP_ROUTERADVERT_NOROUTE 16 | 
| 213 | #define ICMP_ROUTERSOLICIT	10		/* router solicitation */ | 
| 214 | #define ICMP_TIMXCEED		11		/* time exceeded, code: */ | 
| 215 | #define		ICMP_TIMXCEED_INTRANS	0		/* ttl==0 in transit */ | 
| 216 | #define		ICMP_TIMXCEED_REASS	1		/* ttl==0 in reass */ | 
| 217 | #define ICMP_PARAMPROB		12		/* ip header bad */ | 
| 218 | #define		ICMP_PARAMPROB_ERRATPTR 0 | 
| 219 | #define		ICMP_PARAMPROB_OPTABSENT 1 | 
| 220 | #define		ICMP_PARAMPROB_LENGTH	2 | 
| 221 | #define ICMP_TSTAMP		13		/* timestamp request */ | 
| 222 | #define ICMP_TSTAMPREPLY	14		/* timestamp reply */ | 
| 223 | #define ICMP_IREQ		15		/* information request */ | 
| 224 | #define ICMP_IREQREPLY		16		/* information reply */ | 
| 225 | #define ICMP_MASKREQ		17		/* address mask request */ | 
| 226 | #define ICMP_MASKREPLY		18		/* address mask reply */ | 
| 227 | #define ICMP_TRACEROUTE		30		/* traceroute */ | 
| 228 | #define ICMP_DATACONVERR	31		/* data conversion error */ | 
| 229 | #define ICMP_MOBILE_REDIRECT	32		/* mobile redirect */ | 
| 230 | #define ICMP_IPV6_WHEREAREYOU	33		/* ipv6 where are you */ | 
| 231 | #define ICMP_IPV6_IAMHERE	34		/* ipv6 i am here */ | 
| 232 | #define ICMP_MOBILE_REGREQUEST	35		/* mobile registration req */ | 
| 233 | #define ICMP_MOBILE_REGREPLY	36		/* mobile registration reply */ | 
| 234 | #define ICMP_SKIP		39		/* SKIP */ | 
| 235 | #define ICMP_PHOTURIS		40		/* security */ | 
| 236 | #define		ICMP_PHOTURIS_UNKNOWN_INDEX	0	/* unknown sec index */ | 
| 237 | #define		ICMP_PHOTURIS_AUTH_FAILED	1	/* auth failed */ | 
| 238 | #define		ICMP_PHOTURIS_DECOMPRESS_FAILED 2	/* decompress failed */ | 
| 239 | #define		ICMP_PHOTURIS_DECRYPT_FAILED	3	/* decrypt failed */ | 
| 240 | #define		ICMP_PHOTURIS_NEED_AUTHN	4	/* no authentication */ | 
| 241 | #define		ICMP_PHOTURIS_NEED_AUTHZ	5	/* no authorization */ | 
| 242 |  | 
| 243 | #define ICMP_MAXTYPE		40 | 
| 244 | #define ICMP_NTYPES		(ICMP_MAXTYPE + 1) | 
| 245 |  | 
| 246 | #ifdef ICMP_STRINGS | 
| 247 | static const char *icmp_type[] = { | 
| 248 | 	"echoreply" , "unassigned_1" , "unassigned_2" , "unreach" , | 
| 249 | 	"sourcequench" , "redirect" , "althostaddr" , "unassigned_7" , | 
| 250 | 	"echo" , "routeradvert" , "routersolicit" , "timxceed" , | 
| 251 | 	"paramprob" , "tstamp" , "tstampreply" , "ireq" , | 
| 252 | 	"ireqreply" , "maskreq" , "maskreply" , "reserved_19" , | 
| 253 | 	"reserved_20" , "reserved_21" , "reserved_22" , "reserved_23" , | 
| 254 | 	"reserved_24" , "reserved_25" , "reserved_26" , "reserved_27" , | 
| 255 | 	"reserved_28" , "reserved_29" , "traceroute" , "dataconverr" , | 
| 256 | 	"mobile_redirect" , "ipv6_whereareyou" , "ipv6_iamhere" , | 
| 257 | 	"mobile_regrequest" , "mobile_regreply" , "reserved_37" , | 
| 258 | 	"reserved_38" , "skip" , "photuris" , NULL | 
| 259 | }; | 
| 260 | static const char *icmp_code_none[] = { "none" , NULL }; | 
| 261 | static const char *icmp_code_unreach[] = { | 
| 262 | 	"net" , "host" , "oprt" , "needfrag" , "srcfail" , "net_unknown" , | 
| 263 | 	"host_unknown" , "isolated" , "net_prohib" , "host_prohib" , | 
| 264 | 	"tosnet" , "toshost" , "admin_prohibit" , "host_prec" , "prec_cutoff" , NULL | 
| 265 | }; | 
| 266 | static const char *icmp_code_redirect[] = { | 
| 267 | 	"net" , "host" , "tosnet" , "toshost" , NULL | 
| 268 | }; | 
| 269 | static const char *icmp_code_routeradvert[] = { | 
| 270 | 	"normal" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , | 
| 271 | 	"noroute" , NULL | 
| 272 | }; | 
| 273 | static const char *icmp_code_timxceed[] = { | 
| 274 | 	"intrans" , "reass" , NULL | 
| 275 | }; | 
| 276 | static const char *icmp_code_paramprob[] = { | 
| 277 | 	"erratptr" , "optabsent" , "length" , NULL | 
| 278 | }; | 
| 279 | static const char *icmp_code_photuris[] = { | 
| 280 | 	"unknown_index" , "auth_failed" , "decompress_failed" , | 
| 281 | 	"decrypt_failed" , "need_authn" , "need_authz" , NULL | 
| 282 | }; | 
| 283 | #endif | 
| 284 |  | 
| 285 | #define ICMP_INFOTYPE(type) \ | 
| 286 | 	((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \ | 
| 287 | 	(type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \ | 
| 288 | 	(type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \ | 
| 289 | 	(type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \ | 
| 290 | 	(type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY) | 
| 291 |  | 
| 292 | #ifdef _KERNEL | 
| 293 | void icmp_error(struct mbuf *, int, int, n_long, int); | 
| 294 | void icmp_mtudisc(struct icmp *, struct in_addr); | 
| 295 | void icmp_input(struct mbuf *, int, int); | 
| 296 | void icmp_init(void); | 
| 297 | void icmp_reflect(struct mbuf *); | 
| 298 |  | 
| 299 | void icmp_mtudisc_callback_register(void (*)(struct in_addr)); | 
| 300 | int icmp_ratelimit(const struct in_addr *, const int, const int); | 
| 301 | void icmp_mtudisc_lock(void); | 
| 302 | void icmp_mtudisc_unlock(void); | 
| 303 | #endif | 
| 304 |  | 
| 305 | #endif /* !_NETINET_IP_ICMP_H_ */ | 
| 306 |  |