master
  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
  9extern "C" {
 10#endif
 11
 12struct 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
 73struct icmp_ra_addr {
 74	uint32_t ira_addr;
 75	uint32_t ira_preference;
 76};
 77
 78struct 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