75 lines
1.5 KiB
C
75 lines
1.5 KiB
C
/* ICMP for IP v4 and v6 */
|
|
enum
|
|
{
|
|
/* Packet Types, icmp v4 (rfc 792) */
|
|
EchoReply = 0,
|
|
Unreachable = 3,
|
|
SrcQuench = 4,
|
|
Redirect = 5,
|
|
EchoRequest = 8,
|
|
TimeExceed = 11,
|
|
InParmProblem = 12,
|
|
Timestamp = 13,
|
|
TimestampReply = 14,
|
|
InfoRequest = 15,
|
|
InfoReply = 16,
|
|
AddrMaskRequest = 17,
|
|
AddrMaskReply = 18,
|
|
Traceroute = 30,
|
|
IPv6WhereAreYou = 33,
|
|
IPv6IAmHere = 34,
|
|
|
|
/* packet types, icmp v6 (rfc 2463) */
|
|
|
|
/* error messages */
|
|
UnreachableV6 = 1,
|
|
PacketTooBigV6 = 2,
|
|
TimeExceedV6 = 3,
|
|
ParamProblemV6 = 4,
|
|
|
|
/* informational messages (rfc 2461 also) */
|
|
EchoRequestV6 = 128,
|
|
EchoReplyV6 = 129,
|
|
RouterSolicit = 133,
|
|
RouterAdvert = 134,
|
|
NbrSolicit = 135,
|
|
NbrAdvert = 136,
|
|
RedirectV6 = 137,
|
|
|
|
Maxtype6 = 137,
|
|
|
|
ICMP_HDRSIZE = 8,
|
|
};
|
|
|
|
typedef struct Ip4hdr Ip4hdr;
|
|
struct Ip4hdr
|
|
{
|
|
uchar vihl; /* Version and header length */
|
|
uchar tos; /* Type of service */
|
|
uchar length[2]; /* packet length */
|
|
uchar id[2]; /* Identification */
|
|
uchar frag[2]; /* Fragment information */
|
|
uchar ttl; /* Time to live */
|
|
uchar proto; /* Protocol */
|
|
uchar ipcksum[2]; /* Header checksum */
|
|
uchar src[4]; /* Ipv4 source */
|
|
uchar dst[4]; /* Ipv4 destination */
|
|
|
|
uchar data[];
|
|
};
|
|
|
|
// #define IP4HDRSZ offsetof(Ip4hdr, data[0])
|
|
|
|
/* the icmp payload has the same format in v4 and v6 */
|
|
typedef struct Icmphdr Icmphdr;
|
|
struct Icmphdr {
|
|
uchar type;
|
|
uchar code;
|
|
uchar cksum[2];
|
|
uchar icmpid[2];
|
|
uchar seq[2];
|
|
uchar data[];
|
|
};
|
|
|
|
// #define ICMPHDRSZ offsetof(Icmphdr, data[0])
|