text: #ifndef _NETINET_IP_ICMP_H
  #define _NETINET_IP_ICMP_H
  
  #include <stdint.h>
  #include <netinet/in.h>
  #include <netinet/ip.h>
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  struct icmphdr {
  	uint8_t type;
  	uint8_t code;
  	uint16_t checksum;
  	union {
  		struct {
  			uint16_t id;
  			uint16_t sequence;
  		} echo;
  		uint32_t gateway;
  		struct {
  			uint16_t __unused;
  			uint16_t mtu;
  		} frag;
  	} un;
  };
  
  #define ICMP_ECHOREPLY		0
  #define ICMP_DEST_UNREACH	3
  #define ICMP_SOURCE_QUENCH	4
  #define ICMP_REDIRECT		5
  #define ICMP_ECHO		8
  #define ICMP_TIME_EXCEEDED	11
  #define ICMP_PARAMETERPROB	12
  #define ICMP_TIMESTAMP		13
  #define ICMP_TIMESTAMPREPLY	14
  #define ICMP_INFO_REQUEST	15
  #define ICMP_INFO_REPLY		16
  #define ICMP_ADDRESS		17
  #define ICMP_ADDRESSREPLY	18
  #define NR_ICMP_TYPES		18
  
  
  #define ICMP_NET_UNREACH	0
  #define ICMP_HOST_UNREACH	1
  #define ICMP_PROT_UNREACH	2
  #define ICMP_PORT_UNREACH	3
  #define ICMP_FRAG_NEEDED	4
  #define ICMP_SR_FAILED		5
  #define ICMP_NET_UNKNOWN	6
  #define ICMP_HOST_UNKNOWN	7
  #define ICMP_HOST_ISOLATED	8
  #define ICMP_NET_ANO		9
  #define ICMP_HOST_ANO		10
  #define ICMP_NET_UNR_TOS	11
  #define ICMP_HOST_UNR_TOS	12
  #define ICMP_PKT_FILTERED	13
  #define ICMP_PREC_VIOLATION	14
  #define ICMP_PREC_CUTOFF	15
  #define NR_ICMP_UNREACH		15
  
  #define ICMP_REDIR_NET		0
  #define ICMP_REDIR_HOST		1
  #define ICMP_REDIR_NETTOS	2
  #define ICMP_REDIR_HOSTTOS	3
  
  #define ICMP_EXC_TTL		0
  #define ICMP_EXC_FRAGTIME	1
  
  
  struct icmp_ra_addr {
  	uint32_t ira_addr;
  	uint32_t ira_preference;
  };
  
  struct icmp {
  	uint8_t  icmp_type;
  	uint8_t  icmp_code;
  	uint16_t icmp_cksum;
  	union {
  		uint8_t ih_pptr;
  		struct in_addr ih_gwaddr;
  		struct ih_idseq {
  			uint16_t icd_id;
  			uint16_t icd_seq;
  		} ih_idseq;
  		uint32_t ih_void;
  
  		struct ih_pmtu {
  			uint16_t ipm_void;
  			uint16_t ipm_nextmtu;
  		} ih_pmtu;
  
  		struct ih_rtradv {
  			uint8_t irt_num_addrs;
  			uint8_t irt_wpa;
  			uint16_t irt_lifetime;
  		} ih_rtradv;
  	} icmp_hun;
  	union {
  		struct {
  			uint32_t its_otime;
  			uint32_t its_rtime;
  			uint32_t its_ttime;
  		} id_ts;
  		struct {
  			struct ip idi_ip;
  		} id_ip;
  		struct icmp_ra_addr id_radv;
  		uint32_t   id_mask;
  		uint8_t    id_data[1];
  	} icmp_dun;
  };
  
  #define	icmp_pptr	icmp_hun.ih_pptr
  #define	icmp_gwaddr	icmp_hun.ih_gwaddr
  #define	icmp_id		icmp_hun.ih_idseq.icd_id
  #define	icmp_seq	icmp_hun.ih_idseq.icd_seq
  #define	icmp_void	icmp_hun.ih_void
  #define	icmp_pmvoid	icmp_hun.ih_pmtu.ipm_void
  #define	icmp_nextmtu	icmp_hun.ih_pmtu.ipm_nextmtu
  #define	icmp_num_addrs	icmp_hun.ih_rtradv.irt_num_addrs
  #define	icmp_wpa	icmp_hun.ih_rtradv.irt_wpa
  #define	icmp_lifetime	icmp_hun.ih_rtradv.irt_lifetime
  #define	icmp_otime	icmp_dun.id_ts.its_otime
  #define	icmp_rtime	icmp_dun.id_ts.its_rtime
  #define	icmp_ttime	icmp_dun.id_ts.its_ttime
  #define	icmp_ip		icmp_dun.id_ip.idi_ip
  #define	icmp_radv	icmp_dun.id_radv
  #define	icmp_mask	icmp_dun.id_mask
  #define	icmp_data	icmp_dun.id_data
  
  #define	ICMP_MINLEN	8
  #define	ICMP_TSLEN	(8 + 3 * sizeof (n_time))
  #define	ICMP_MASKLEN	12
  #define	ICMP_ADVLENMIN	(8 + sizeof (struct ip) + 8)
  #define	ICMP_ADVLEN(p)	(8 + ((p)->icmp_ip.ip_hl << 2) + 8)
  
  #define	ICMP_UNREACH		3
  #define	ICMP_SOURCEQUENCH	4
  #define	ICMP_ROUTERADVERT	9
  #define	ICMP_ROUTERSOLICIT	10
  #define	ICMP_TIMXCEED		11
  #define	ICMP_PARAMPROB		12
  #define	ICMP_TSTAMP		13
  #define	ICMP_TSTAMPREPLY	14
  #define	ICMP_IREQ		15
  #define	ICMP_IREQREPLY		16
  #define	ICMP_MASKREQ		17
  #define	ICMP_MASKREPLY		18
  #define	ICMP_MAXTYPE		18
  
  #define	ICMP_UNREACH_NET	        0
  #define	ICMP_UNREACH_HOST	        1
  #define	ICMP_UNREACH_PROTOCOL	        2
  #define	ICMP_UNREACH_PORT	        3
  #define	ICMP_UNREACH_NEEDFRAG	        4
  #define	ICMP_UNREACH_SRCFAIL	        5
  #define	ICMP_UNREACH_NET_UNKNOWN        6
  #define	ICMP_UNREACH_HOST_UNKNOWN       7
  #define	ICMP_UNREACH_ISOLATED	        8
  #define	ICMP_UNREACH_NET_PROHIB	        9
  #define	ICMP_UNREACH_HOST_PROHIB        10
  #define	ICMP_UNREACH_TOSNET	        11
  #define	ICMP_UNREACH_TOSHOST	        12
  #define	ICMP_UNREACH_FILTER_PROHIB      13
  #define	ICMP_UNREACH_HOST_PRECEDENCE    14
  #define	ICMP_UNREACH_PRECEDENCE_CUTOFF  15
  
  #define	ICMP_REDIRECT_NET	0
  #define	ICMP_REDIRECT_HOST	1
  #define	ICMP_REDIRECT_TOSNET	2
  #define	ICMP_REDIRECT_TOSHOST	3
  
  #define	ICMP_TIMXCEED_INTRANS	0
  #define	ICMP_TIMXCEED_REASS	1
  
  #define	ICMP_PARAMPROB_OPTABSENT 1
  
  #define	ICMP_INFOTYPE(type) \
  	((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \
  	(type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \
  	(type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
  	(type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \
  	(type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif
  