a102f84540
move dnet to the correct place so that we use this --HG-- rename : ext/dnet/dnet/addr.h => ext/dnet/addr.h rename : ext/dnet/dnet/arp.h => ext/dnet/arp.h rename : ext/dnet/dnet/blob.h => ext/dnet/blob.h rename : ext/dnet/dnet/eth.h => ext/dnet/eth.h rename : ext/dnet/dnet/fw.h => ext/dnet/fw.h rename : ext/dnet/dnet/icmp.h => ext/dnet/icmp.h rename : ext/dnet/dnet/intf.h => ext/dnet/intf.h rename : ext/dnet/dnet/ip.h => ext/dnet/ip.h rename : ext/dnet/dnet/ip6.h => ext/dnet/ip6.h rename : ext/dnet/dnet/os.h => ext/dnet/os.h rename : ext/dnet/dnet/rand.h => ext/dnet/rand.h rename : ext/dnet/dnet/route.h => ext/dnet/route.h rename : ext/dnet/dnet/tcp.h => ext/dnet/tcp.h rename : ext/dnet/dnet/udp.h => ext/dnet/udp.h
265 lines
9.8 KiB
C
265 lines
9.8 KiB
C
/*
|
|
* 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 */
|