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