xref: /plan9/sys/src/cmd/ip/icmp.h (revision 94aa1c4c0955b2b4e990c9f4679be8e9f67a469b)
15a354e27SDavid du Colombier /* ICMP for IP v4 and v6 */
25a354e27SDavid du Colombier enum
35a354e27SDavid du Colombier {
45a354e27SDavid du Colombier 	/* Packet Types, icmp v4 (rfc 792) */
55a354e27SDavid du Colombier 	EchoReply	= 0,
65a354e27SDavid du Colombier 	Unreachable	= 3,
75a354e27SDavid du Colombier 	SrcQuench	= 4,
85a354e27SDavid du Colombier 	Redirect	= 5,
95a354e27SDavid du Colombier 	EchoRequest	= 8,
105a354e27SDavid du Colombier 	TimeExceed	= 11,
115a354e27SDavid du Colombier 	InParmProblem	= 12,
125a354e27SDavid du Colombier 	Timestamp	= 13,
135a354e27SDavid du Colombier 	TimestampReply	= 14,
145a354e27SDavid du Colombier 	InfoRequest	= 15,
155a354e27SDavid du Colombier 	InfoReply	= 16,
165a354e27SDavid du Colombier 	AddrMaskRequest = 17,
175a354e27SDavid du Colombier 	AddrMaskReply   = 18,
185a354e27SDavid du Colombier 	Traceroute	= 30,
195a354e27SDavid du Colombier 	IPv6WhereAreYou	= 33,
205a354e27SDavid du Colombier 	IPv6IAmHere	= 34,
215a354e27SDavid du Colombier 
225a354e27SDavid du Colombier 	/* packet types, icmp v6 (rfc 2463) */
235a354e27SDavid du Colombier 
245a354e27SDavid du Colombier         /* error messages */
255a354e27SDavid du Colombier 	UnreachableV6	= 1,
265a354e27SDavid du Colombier 	PacketTooBigV6	= 2,
275a354e27SDavid du Colombier 	TimeExceedV6	= 3,
285a354e27SDavid du Colombier 	ParamProblemV6	= 4,
295a354e27SDavid du Colombier 
305a354e27SDavid du Colombier         /* informational messages (rfc 2461 also) */
315a354e27SDavid du Colombier 	EchoRequestV6	= 128,
325a354e27SDavid du Colombier 	EchoReplyV6	= 129,
335a354e27SDavid du Colombier 	RouterSolicit	= 133,
345a354e27SDavid du Colombier 	RouterAdvert	= 134,
355a354e27SDavid du Colombier 	NbrSolicit	= 135,
365a354e27SDavid du Colombier 	NbrAdvert	= 136,
375a354e27SDavid du Colombier 	RedirectV6	= 137,
385a354e27SDavid du Colombier 
395a354e27SDavid du Colombier 	Maxtype6	= 137,
405a354e27SDavid du Colombier 
415a354e27SDavid du Colombier 	ICMP_HDRSIZE	= 8,
425a354e27SDavid du Colombier };
435a354e27SDavid du Colombier 
44*94aa1c4cSDavid du Colombier typedef struct Ip4hdr Ip4hdr;
45*94aa1c4cSDavid du Colombier struct Ip4hdr
465a354e27SDavid du Colombier {
475a354e27SDavid du Colombier 	uchar	vihl;		/* Version and header length */
485a354e27SDavid du Colombier 	uchar	tos;		/* Type of service */
495a354e27SDavid du Colombier 	uchar	length[2];	/* packet length */
505a354e27SDavid du Colombier 	uchar	id[2];		/* Identification */
515a354e27SDavid du Colombier 	uchar	frag[2];	/* Fragment information */
525a354e27SDavid du Colombier 	uchar	ttl;		/* Time to live */
535a354e27SDavid du Colombier 	uchar	proto;		/* Protocol */
545a354e27SDavid du Colombier 	uchar	ipcksum[2];	/* Header checksum */
5503a1fc68SDavid du Colombier 	uchar	src[4];		/* Ipv4 source */
5603a1fc68SDavid du Colombier 	uchar	dst[4];		/* Ipv4 destination */
575a354e27SDavid du Colombier 
58*94aa1c4cSDavid du Colombier 	uchar	data[];
595a354e27SDavid du Colombier };
605a354e27SDavid du Colombier 
61*94aa1c4cSDavid du Colombier // #define IP4HDRSZ offsetof(Ip4hdr, data[0])
62*94aa1c4cSDavid du Colombier 
63*94aa1c4cSDavid du Colombier /* the icmp payload has the same format in v4 and v6 */
64*94aa1c4cSDavid du Colombier typedef struct Icmphdr Icmphdr;
65*94aa1c4cSDavid du Colombier struct Icmphdr {
66*94aa1c4cSDavid du Colombier 	uchar	type;
67*94aa1c4cSDavid du Colombier 	uchar	code;
68*94aa1c4cSDavid du Colombier 	uchar	cksum[2];
69*94aa1c4cSDavid du Colombier 	uchar	icmpid[2];
70*94aa1c4cSDavid du Colombier 	uchar	seq[2];
71*94aa1c4cSDavid du Colombier 	uchar	data[];
725a354e27SDavid du Colombier };
73*94aa1c4cSDavid du Colombier 
74*94aa1c4cSDavid du Colombier // #define ICMPHDRSZ offsetof(Icmphdr, data[0])
75