| /* | |
| * icmp.h | |
| * | |
| * Internet Control Message Protocol. | |
| * RFC 792, 950, 1256, 1393, 1475, 2002, 2521 | |
| * | |
| * Copyright (c) 2000 Dug Song <dugsong@monkey.org> | |
| * | |
| * $Id: icmp.h,v 1.14 2003/03/16 17:39:17 dugsong Exp $ | |
| */ | |
| #ifndef DNET_ICMP_H | |
| #define DNET_ICMP_H | |
| #define ICMP_HDR_LEN 4 /* base ICMP header length */ | |
| #define ICMP_LEN_MIN 8 /* minimum ICMP message size, with header */ | |
| #ifndef __GNUC__ | |
| # define __attribute__(x) | |
| # pragma pack(1) | |
| #endif | |
| /* | |
| * ICMP header | |
| */ | |
| struct icmp_hdr { | |
| uint8_t icmp_type; /* type of message, see below */ | |
| uint8_t icmp_code; /* type sub code */ | |
| uint16_t icmp_cksum; /* ones complement cksum of struct */ | |
| }; | |
| /* | |
| * Types (icmp_type) and codes (icmp_code) - | |
| * http://www.iana.org/assignments/icmp-parameters | |
| */ | |
| #define ICMP_CODE_NONE 0 /* for types without codes */ | |
| #define ICMP_ECHOREPLY 0 /* echo reply */ | |
| #define ICMP_UNREACH 3 /* dest unreachable, codes: */ | |
| #define ICMP_UNREACH_NET 0 /* bad net */ | |
| #define ICMP_UNREACH_HOST 1 /* bad host */ | |
| #define ICMP_UNREACH_PROTO 2 /* bad protocol */ | |
| #define ICMP_UNREACH_PORT 3 /* bad port */ | |
| #define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ | |
| #define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ | |
| #define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */ | |
| #define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */ | |
| #define ICMP_UNREACH_ISOLATED 8 /* src host isolated */ | |
| #define ICMP_UNREACH_NET_PROHIB 9 /* for crypto devs */ | |
| #define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */ | |
| #define ICMP_UNREACH_TOSNET 11 /* bad tos for net */ | |
| #define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */ | |
| #define ICMP_UNREACH_FILTER_PROHIB 13 /* prohibited access */ | |
| #define ICMP_UNREACH_HOST_PRECEDENCE 14 /* precedence error */ | |
| #define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* precedence cutoff */ | |
| #define ICMP_SRCQUENCH 4 /* packet lost, slow down */ | |
| #define ICMP_REDIRECT 5 /* shorter route, codes: */ | |
| #define ICMP_REDIRECT_NET 0 /* for network */ | |
| #define ICMP_REDIRECT_HOST 1 /* for host */ | |
| #define ICMP_REDIRECT_TOSNET 2 /* for tos and net */ | |
| #define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */ | |
| #define ICMP_ALTHOSTADDR 6 /* alternate host address */ | |
| #define ICMP_ECHO 8 /* echo service */ | |
| #define ICMP_RTRADVERT 9 /* router advertise, codes: */ | |
| #define ICMP_RTRADVERT_NORMAL 0 /* normal */ | |
| #define ICMP_RTRADVERT_NOROUTE_COMMON 16 /* selective routing */ | |
| #define ICMP_RTRSOLICIT 10 /* router solicitation */ | |
| #define ICMP_TIMEXCEED 11 /* time exceeded, code: */ | |
| #define ICMP_TIMEXCEED_INTRANS 0 /* ttl==0 in transit */ | |
| #define ICMP_TIMEXCEED_REASS 1 /* ttl==0 in reass */ | |
| #define ICMP_PARAMPROB 12 /* ip header bad */ | |
| #define ICMP_PARAMPROB_ERRATPTR 0 /* req. opt. absent */ | |
| #define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */ | |
| #define ICMP_PARAMPROB_LENGTH 2 /* bad length */ | |
| #define ICMP_TSTAMP 13 /* timestamp request */ | |
| #define ICMP_TSTAMPREPLY 14 /* timestamp reply */ | |
| #define ICMP_INFO 15 /* information request */ | |
| #define ICMP_INFOREPLY 16 /* information reply */ | |
| #define ICMP_MASK 17 /* address mask request */ | |
| #define ICMP_MASKREPLY 18 /* address mask reply */ | |
| #define ICMP_TRACEROUTE 30 /* traceroute */ | |
| #define ICMP_DATACONVERR 31 /* data conversion error */ | |
| #define ICMP_MOBILE_REDIRECT 32 /* mobile host redirect */ | |
| #define ICMP_IPV6_WHEREAREYOU 33 /* IPv6 where-are-you */ | |
| #define ICMP_IPV6_IAMHERE 34 /* IPv6 i-am-here */ | |
| #define ICMP_MOBILE_REG 35 /* mobile registration req */ | |
| #define ICMP_MOBILE_REGREPLY 36 /* mobile registration reply */ | |
| #define ICMP_DNS 37 /* domain name request */ | |
| #define ICMP_DNSREPLY 38 /* domain name reply */ | |
| #define ICMP_SKIP 39 /* SKIP */ | |
| #define ICMP_PHOTURIS 40 /* Photuris */ | |
| #define ICMP_PHOTURIS_UNKNOWN_INDEX 0 /* unknown sec index */ | |
| #define ICMP_PHOTURIS_AUTH_FAILED 1 /* auth failed */ | |
| #define ICMP_PHOTURIS_DECOMPRESS_FAILED 2 /* decompress failed */ | |
| #define ICMP_PHOTURIS_DECRYPT_FAILED 3 /* decrypt failed */ | |
| #define ICMP_PHOTURIS_NEED_AUTHN 4 /* no authentication */ | |
| #define ICMP_PHOTURIS_NEED_AUTHZ 5 /* no authorization */ | |
| #define ICMP_TYPE_MAX 40 | |
| #define ICMP_INFOTYPE(type) \ | |
| ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \ | |
| (type) == ICMP_RTRADVERT || (type) == ICMP_RTRSOLICIT || \ | |
| (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \ | |
| (type) == ICMP_INFO || (type) == ICMP_INFOREPLY || \ | |
| (type) == ICMP_MASK || (type) == ICMP_MASKREPLY) | |
| /* | |
| * Echo message data | |
| */ | |
| struct icmp_msg_echo { | |
| uint16_t icmp_id; | |
| uint16_t icmp_seq; | |
| uint8_t icmp_data __flexarr; /* optional data */ | |
| }; | |
| /* | |
| * Fragmentation-needed (unreachable) message data | |
| */ | |
| struct icmp_msg_needfrag { | |
| uint16_t icmp_void; /* must be zero */ | |
| uint16_t icmp_mtu; /* MTU of next-hop network */ | |
| uint8_t icmp_ip __flexarr; /* IP hdr + 8 bytes of pkt */ | |
| }; | |
| /* | |
| * Unreachable, source quench, redirect, time exceeded, | |
| * parameter problem message data | |
| */ | |
| struct icmp_msg_quote { | |
| uint32_t icmp_void; /* must be zero */ | |
| #define icmp_gwaddr icmp_void /* router IP address to use */ | |
| #define icmp_pptr icmp_void /* ptr to bad octet field */ | |
| uint8_t icmp_ip __flexarr; /* IP hdr + 8 bytes of pkt */ | |
| }; | |
| /* | |
| * Router advertisement message data, RFC 1256 | |
| */ | |
| struct icmp_msg_rtradvert { | |
| uint8_t icmp_num_addrs; /* # of address / pref pairs */ | |
| uint8_t icmp_wpa; /* words / address == 2 */ | |
| uint16_t icmp_lifetime; /* route lifetime in seconds */ | |
| struct icmp_msg_rtr_data { | |
| uint32_t icmp_void; | |
| #define icmp_gwaddr icmp_void /* router IP address */ | |
| uint32_t icmp_pref; /* router preference (usu 0) */ | |
| } icmp_rtr __flexarr; /* variable # of routers */ | |
| }; | |
| #define ICMP_RTR_PREF_NODEFAULT 0x80000000 /* do not use as default gw */ | |
| /* | |
| * Timestamp message data | |
| */ | |
| struct icmp_msg_tstamp { | |
| uint32_t icmp_id; /* identifier */ | |
| uint32_t icmp_seq; /* sequence number */ | |
| uint32_t icmp_ts_orig; /* originate timestamp */ | |
| uint32_t icmp_ts_rx; /* receive timestamp */ | |
| uint32_t icmp_ts_tx; /* transmit timestamp */ | |
| }; | |
| /* | |
| * Address mask message data, RFC 950 | |
| */ | |
| struct icmp_msg_mask { | |
| uint32_t icmp_id; /* identifier */ | |
| uint32_t icmp_seq; /* sequence number */ | |
| uint32_t icmp_mask; /* address mask */ | |
| }; | |
| /* | |
| * Traceroute message data, RFC 1393, RFC 1812 | |
| */ | |
| struct icmp_msg_traceroute { | |
| uint16_t icmp_id; /* identifier */ | |
| uint16_t icmp_void; /* unused */ | |
| uint16_t icmp_ohc; /* outbound hop count */ | |
| uint16_t icmp_rhc; /* return hop count */ | |
| uint32_t icmp_speed; /* link speed, bytes/sec */ | |
| uint32_t icmp_mtu; /* MTU in bytes */ | |
| }; | |
| /* | |
| * Domain name reply message data, RFC 1788 | |
| */ | |
| struct icmp_msg_dnsreply { | |
| uint16_t icmp_id; /* identifier */ | |
| uint16_t icmp_seq; /* sequence number */ | |
| uint32_t icmp_ttl; /* time-to-live */ | |
| uint8_t icmp_names __flexarr; /* variable number of names */ | |
| }; | |
| /* | |
| * Generic identifier, sequence number data | |
| */ | |
| struct icmp_msg_idseq { | |
| uint16_t icmp_id; | |
| uint16_t icmp_seq; | |
| }; | |
| /* | |
| * ICMP message union | |
| */ | |
| union icmp_msg { | |
| struct icmp_msg_echo echo; /* ICMP_ECHO{REPLY} */ | |
| struct icmp_msg_quote unreach; /* ICMP_UNREACH */ | |
| struct icmp_msg_needfrag needfrag; /* ICMP_UNREACH_NEEDFRAG */ | |
| struct icmp_msg_quote srcquench; /* ICMP_SRCQUENCH */ | |
| struct icmp_msg_quote redirect; /* ICMP_REDIRECT (set to 0) */ | |
| uint32_t rtrsolicit; /* ICMP_RTRSOLICIT */ | |
| struct icmp_msg_rtradvert rtradvert; /* ICMP_RTRADVERT */ | |
| struct icmp_msg_quote timexceed; /* ICMP_TIMEXCEED */ | |
| struct icmp_msg_quote paramprob; /* ICMP_PARAMPROB */ | |
| struct icmp_msg_tstamp tstamp; /* ICMP_TSTAMP{REPLY} */ | |
| struct icmp_msg_idseq info; /* ICMP_INFO{REPLY} */ | |
| struct icmp_msg_mask mask; /* ICMP_MASK{REPLY} */ | |
| struct icmp_msg_traceroute traceroute; /* ICMP_TRACEROUTE */ | |
| struct icmp_msg_idseq dns; /* ICMP_DNS */ | |
| struct icmp_msg_dnsreply dnsreply; /* ICMP_DNSREPLY */ | |
| }; | |
| #ifndef __GNUC__ | |
| # pragma pack() | |
| #endif | |
| #define icmp_pack_hdr(hdr, type, code) do { \ | |
| struct icmp_hdr *icmp_pack_p = (struct icmp_hdr *)(hdr); \ | |
| icmp_pack_p->icmp_type = type; icmp_pack_p->icmp_code = code; \ | |
| } while (0) | |
| #define icmp_pack_hdr_echo(hdr, type, code, id, seq, data, len) do { \ | |
| struct icmp_msg_echo *echo_pack_p = (struct icmp_msg_echo *) \ | |
| ((uint8_t *)(hdr) + ICMP_HDR_LEN); \ | |
| icmp_pack_hdr(hdr, type, code); \ | |
| echo_pack_p->icmp_id = htons(id); \ | |
| echo_pack_p->icmp_seq = htons(seq); \ | |
| memmove(echo_pack_p->icmp_data, data, len); \ | |
| } while (0) | |
| #define icmp_pack_hdr_quote(hdr, type, code, word, pkt, len) do { \ | |
| struct icmp_msg_quote *quote_pack_p = (struct icmp_msg_quote *) \ | |
| ((uint8_t *)(hdr) + ICMP_HDR_LEN); \ | |
| icmp_pack_hdr(hdr, type, code); \ | |
| quote_pack_p->icmp_void = htonl(word); \ | |
| memmove(quote_pack_p->icmp_ip, pkt, len); \ | |
| } while (0) | |
| #define icmp_pack_hdr_mask(hdr, type, code, id, seq, mask) do { \ | |
| struct icmp_msg_mask *mask_pack_p = (struct icmp_msg_mask *) \ | |
| ((uint8_t *)(hdr) + ICMP_HDR_LEN); \ | |
| icmp_pack_hdr(hdr, type, code); \ | |
| mask_pack_p->icmp_id = htons(id); \ | |
| mask_pack_p->icmp_seq = htons(seq); \ | |
| mask_pack_p->icmp_mask = htonl(mask); \ | |
| } while (0) | |
| #define icmp_pack_hdr_needfrag(hdr, type, code, mtu, pkt, len) do { \ | |
| struct icmp_msg_needfrag *frag_pack_p = \ | |
| (struct icmp_msg_needfrag *)((uint8_t *)(hdr) + ICMP_HDR_LEN); \ | |
| icmp_pack_hdr(hdr, type, code); \ | |
| frag_pack_p->icmp_void = 0; \ | |
| frag_pack_p->icmp_mtu = htons(mtu); \ | |
| memmove(frag_pack_p->icmp_ip, pkt, len); \ | |
| } while (0) | |
| #endif /* DNET_ICMP_H */ |