1 #ifndef _NETINET_IP_ICMP_H
2 #define _NETINET_IP_ICMP_H
3 
4 #include <stdint.h>
5 #include <netinet/in.h>
6 #include <netinet/ip.h>
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 struct icmphdr {
13 	uint8_t type;
14 	uint8_t code;
15 	uint16_t checksum;
16 	union {
17 		struct {
18 			uint16_t id;
19 			uint16_t sequence;
20 		} echo;
21 		uint32_t gateway;
22 		struct {
23 			uint16_t __unused;
24 			uint16_t mtu;
25 		} frag;
26 		uint8_t reserved[4];
27 	} un;
28 };
29 
30 #define ICMP_ECHOREPLY		0
31 #define ICMP_DEST_UNREACH	3
32 #define ICMP_SOURCE_QUENCH	4
33 #define ICMP_REDIRECT		5
34 #define ICMP_ECHO		8
35 #define ICMP_TIME_EXCEEDED	11
36 #define ICMP_PARAMETERPROB	12
37 #define ICMP_TIMESTAMP		13
38 #define ICMP_TIMESTAMPREPLY	14
39 #define ICMP_INFO_REQUEST	15
40 #define ICMP_INFO_REPLY		16
41 #define ICMP_ADDRESS		17
42 #define ICMP_ADDRESSREPLY	18
43 #define NR_ICMP_TYPES		18
44 
45 
46 #define ICMP_NET_UNREACH	0
47 #define ICMP_HOST_UNREACH	1
48 #define ICMP_PROT_UNREACH	2
49 #define ICMP_PORT_UNREACH	3
50 #define ICMP_FRAG_NEEDED	4
51 #define ICMP_SR_FAILED		5
52 #define ICMP_NET_UNKNOWN	6
53 #define ICMP_HOST_UNKNOWN	7
54 #define ICMP_HOST_ISOLATED	8
55 #define ICMP_NET_ANO		9
56 #define ICMP_HOST_ANO		10
57 #define ICMP_NET_UNR_TOS	11
58 #define ICMP_HOST_UNR_TOS	12
59 #define ICMP_PKT_FILTERED	13
60 #define ICMP_PREC_VIOLATION	14
61 #define ICMP_PREC_CUTOFF	15
62 #define NR_ICMP_UNREACH		15
63 
64 #define ICMP_REDIR_NET		0
65 #define ICMP_REDIR_HOST		1
66 #define ICMP_REDIR_NETTOS	2
67 #define ICMP_REDIR_HOSTTOS	3
68 
69 #define ICMP_EXC_TTL		0
70 #define ICMP_EXC_FRAGTIME	1
71 
72 
73 struct icmp_ra_addr {
74 	uint32_t ira_addr;
75 	uint32_t ira_preference;
76 };
77 
78 struct icmp {
79 	uint8_t  icmp_type;
80 	uint8_t  icmp_code;
81 	uint16_t icmp_cksum;
82 	union {
83 		uint8_t ih_pptr;
84 		struct in_addr ih_gwaddr;
85 		struct ih_idseq {
86 			uint16_t icd_id;
87 			uint16_t icd_seq;
88 		} ih_idseq;
89 		uint32_t ih_void;
90 
91 		struct ih_pmtu {
92 			uint16_t ipm_void;
93 			uint16_t ipm_nextmtu;
94 		} ih_pmtu;
95 
96 		struct ih_rtradv {
97 			uint8_t irt_num_addrs;
98 			uint8_t irt_wpa;
99 			uint16_t irt_lifetime;
100 		} ih_rtradv;
101 	} icmp_hun;
102 	union {
103 		struct {
104 			uint32_t its_otime;
105 			uint32_t its_rtime;
106 			uint32_t its_ttime;
107 		} id_ts;
108 		struct {
109 			struct ip idi_ip;
110 		} id_ip;
111 		struct icmp_ra_addr id_radv;
112 		uint32_t   id_mask;
113 		uint8_t    id_data[1];
114 	} icmp_dun;
115 };
116 
117 #define	icmp_pptr	icmp_hun.ih_pptr
118 #define	icmp_gwaddr	icmp_hun.ih_gwaddr
119 #define	icmp_id		icmp_hun.ih_idseq.icd_id
120 #define	icmp_seq	icmp_hun.ih_idseq.icd_seq
121 #define	icmp_void	icmp_hun.ih_void
122 #define	icmp_pmvoid	icmp_hun.ih_pmtu.ipm_void
123 #define	icmp_nextmtu	icmp_hun.ih_pmtu.ipm_nextmtu
124 #define	icmp_num_addrs	icmp_hun.ih_rtradv.irt_num_addrs
125 #define	icmp_wpa	icmp_hun.ih_rtradv.irt_wpa
126 #define	icmp_lifetime	icmp_hun.ih_rtradv.irt_lifetime
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 #define	ICMP_MINLEN	8
136 #define	ICMP_TSLEN	(8 + 3 * sizeof (n_time))
137 #define	ICMP_MASKLEN	12
138 #define	ICMP_ADVLENMIN	(8 + sizeof (struct ip) + 8)
139 #define	ICMP_ADVLEN(p)	(8 + ((p)->icmp_ip.ip_hl << 2) + 8)
140 
141 #define	ICMP_UNREACH		3
142 #define	ICMP_SOURCEQUENCH	4
143 #define	ICMP_ROUTERADVERT	9
144 #define	ICMP_ROUTERSOLICIT	10
145 #define	ICMP_TIMXCEED		11
146 #define	ICMP_PARAMPROB		12
147 #define	ICMP_TSTAMP		13
148 #define	ICMP_TSTAMPREPLY	14
149 #define	ICMP_IREQ		15
150 #define	ICMP_IREQREPLY		16
151 #define	ICMP_MASKREQ		17
152 #define	ICMP_MASKREPLY		18
153 #define	ICMP_MAXTYPE		18
154 
155 #define	ICMP_UNREACH_NET	        0
156 #define	ICMP_UNREACH_HOST	        1
157 #define	ICMP_UNREACH_PROTOCOL	        2
158 #define	ICMP_UNREACH_PORT	        3
159 #define	ICMP_UNREACH_NEEDFRAG	        4
160 #define	ICMP_UNREACH_SRCFAIL	        5
161 #define	ICMP_UNREACH_NET_UNKNOWN        6
162 #define	ICMP_UNREACH_HOST_UNKNOWN       7
163 #define	ICMP_UNREACH_ISOLATED	        8
164 #define	ICMP_UNREACH_NET_PROHIB	        9
165 #define	ICMP_UNREACH_HOST_PROHIB        10
166 #define	ICMP_UNREACH_TOSNET	        11
167 #define	ICMP_UNREACH_TOSHOST	        12
168 #define	ICMP_UNREACH_FILTER_PROHIB      13
169 #define	ICMP_UNREACH_HOST_PRECEDENCE    14
170 #define	ICMP_UNREACH_PRECEDENCE_CUTOFF  15
171 
172 #define	ICMP_REDIRECT_NET	0
173 #define	ICMP_REDIRECT_HOST	1
174 #define	ICMP_REDIRECT_TOSNET	2
175 #define	ICMP_REDIRECT_TOSHOST	3
176 
177 #define	ICMP_TIMXCEED_INTRANS	0
178 #define	ICMP_TIMXCEED_REASS	1
179 
180 #define	ICMP_PARAMPROB_OPTABSENT 1
181 
182 #define	ICMP_INFOTYPE(type) \
183 	((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \
184 	(type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \
185 	(type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
186 	(type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \
187 	(type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
188 
189 #ifdef __cplusplus
190 }
191 #endif
192 
193 #endif
194