1 /*
2  * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Sun designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Sun in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22  * CA 95054 USA or visit www.sun.com if you need additional information or
23  * have any questions.
24  */
25 
26 #ifndef ICMP_H
27 #define ICMP_H
28 
29 /*
30  * Structure of an internet header, naked of options.
31  *
32  * We declare ip_len and ip_off to be short, rather than ushort_t
33  * pragmatically since otherwise unsigned comparisons can result
34  * against negative integers quite easily, and fail in subtle ways.
35  */
36 struct ip {
37 	unsigned char	ip_hl:4,	/* header length */
38 			ip_v:4;		/* version */
39 	unsigned char	ip_tos;			/* type of service */
40 	short	ip_len;			/* total length */
41 	unsigned short ip_id;			/* identification */
42 	short	ip_off;			/* fragment offset field */
43 #define	IP_DF 0x4000			/* dont fragment flag */
44 #define	IP_MF 0x2000			/* more fragments flag */
45 	unsigned char	ip_ttl;			/* time to live */
46 	unsigned char	ip_p;			/* protocol */
47 	unsigned short ip_sum;		/* checksum */
48 	struct	in_addr ip_src, ip_dst;	/* source and dest address */
49 };
50 
51 /*
52  * Structure of an icmp header.
53  */
54 struct icmp {
55 	unsigned char	icmp_type;		/* type of message, see below */
56 	unsigned char	icmp_code;		/* type sub code */
57 	unsigned short icmp_cksum;		/* ones complement cksum of struct */
58 	union {
59 		unsigned char ih_pptr;		/* ICMP_PARAMPROB */
60 		struct in_addr ih_gwaddr;	/* ICMP_REDIRECT */
61 		struct ih_idseq {
62 			unsigned short icd_id;
63 			unsigned short icd_seq;
64 		} ih_idseq;
65 		int ih_void;
66 
67 		/* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
68 		struct ih_pmtu {
69 			unsigned short ipm_void;
70 			unsigned short ipm_nextmtu;
71 		} ih_pmtu;
72 
73 		struct ih_rtradv {
74 			unsigned char irt_num_addrs;
75 			unsigned char irt_wpa;
76 			unsigned short irt_lifetime;
77 		} ih_rtradv;
78 	} icmp_hun;
79 #define	icmp_pptr	icmp_hun.ih_pptr
80 #define	icmp_gwaddr	icmp_hun.ih_gwaddr
81 #define	icmp_id		icmp_hun.ih_idseq.icd_id
82 #define	icmp_seq	icmp_hun.ih_idseq.icd_seq
83 #define	icmp_void	icmp_hun.ih_void
84 #define	icmp_pmvoid	icmp_hun.ih_pmtu.ipm_void
85 #define	icmp_nextmtu	icmp_hun.ih_pmtu.ipm_nextmtu
86 	union {
87 		struct id_ts {
88 			unsigned int its_otime;
89 			unsigned int its_rtime;
90 			unsigned int its_ttime;
91 		} id_ts;
92 		struct id_ip  {
93 			struct ip idi_ip;
94 			/* options and then 64 bits of data */
95 		} id_ip;
96 		unsigned int id_mask;
97 		char	id_data[1];
98 	} icmp_dun;
99 #define	icmp_otime	icmp_dun.id_ts.its_otime
100 #define	icmp_rtime	icmp_dun.id_ts.its_rtime
101 #define	icmp_ttime	icmp_dun.id_ts.its_ttime
102 #define	icmp_ip		icmp_dun.id_ip.idi_ip
103 #define	icmp_mask	icmp_dun.id_mask
104 #define	icmp_data	icmp_dun.id_data
105 };
106 
107 #define ICMP_ECHOREPLY		0		/* echo reply */
108 #define ICMP_ECHO		8		/* echo service */
109 
110 #ifdef USE_IPV6
111 
112 /*
113  * ICMPv6 structures & constants
114  */
115 
116 typedef struct icmp6_hdr {
117 	u_char	 icmp6_type;	/* type field */
118 	u_char	 icmp6_code;	/* code field */
119 	u_short	 icmp6_cksum;	/* checksum field */
120 	union {
121 		u_int icmp6_un_data32[1];	/* type-specific field */
122 		u_short icmp6_un_data16[2];	/* type-specific field */
123 		u_char  icmp6_un_data8[4];	/* type-specific field */
124 	} icmp6_dataun;
125 } icmp6_t;
126 
127 #define	icmp6_data32	icmp6_dataun.icmp6_un_data32
128 #define	icmp6_data16	icmp6_dataun.icmp6_un_data16
129 #define	icmp6_data8	icmp6_dataun.icmp6_un_data8
130 #define	icmp6_pptr	icmp6_data32[0]	/* parameter prob */
131 #define	icmp6_mtu	icmp6_data32[0]	/* packet too big */
132 #define	icmp6_id	icmp6_data16[0]	/* echo request/reply */
133 #define	icmp6_seq	icmp6_data16[1]	/* echo request/reply */
134 #define	icmp6_maxdelay	icmp6_data16[0]	/* mcast group membership */
135 
136 struct ip6_pseudo_hdr  /* for calculate the ICMPv6 checksum */
137 {
138   struct in6_addr ip6_src;
139   struct in6_addr ip6_dst;
140   u_int       ip6_plen;
141   u_int       ip6_nxt;
142 };
143 
144 #define ICMP6_ECHO_REQUEST	128
145 #define ICMP6_ECHO_REPLY	129
146 #define IPPROTO_ICMPV6		58
147 #define IPV6_UNICAST_HOPS       4  /* Set/get IP unicast hop limit */
148 
149 #endif // USE_IPV6
150 
151 #endif
152