134 lines
5.9 KiB
C
134 lines
5.9 KiB
C
/* -*- c-basic-offset: 4 -*- */
|
|
#ifndef CLICKNET_ICMP_H
|
|
#define CLICKNET_ICMP_H
|
|
#include <clicknet/ip.h>
|
|
|
|
/*
|
|
* <clicknet/icmp.h> -- ICMP packet definitions, based on FreeBSD.
|
|
*
|
|
* Relevant RFCs include:
|
|
* RFC792 Internet Control Message Protocol
|
|
* RFC1122 Requirements for Internet Hosts - Communication Layers
|
|
* RFC1123 Requirements for Internet Hosts - Application and Support
|
|
* RFC1812 Requirements for IP Version 4 Routers
|
|
*/
|
|
|
|
/* most icmp request types: ICMP_UNREACH, ICMP_SOURCEQUENCH, ICMP_TIMXCEED */
|
|
struct click_icmp {
|
|
uint8_t icmp_type; /* 0 ICMP type (see below) */
|
|
uint8_t icmp_code; /* 1 ICMP code (see below) */
|
|
uint16_t icmp_cksum; /* 2-3 checksum */
|
|
uint32_t padding; /* 4-7 should be zero */
|
|
/* followed by original IP header and initial portion of data */
|
|
};
|
|
|
|
/* header for types with sequence numbers: ICMP_ECHO, ICMP_ECHOREPLY,
|
|
ICMP_IREQ, ICMP_IREQREPLY */
|
|
struct click_icmp_sequenced {
|
|
uint8_t icmp_type; /* 0 ICMP type (see below) */
|
|
uint8_t icmp_code; /* 1 ICMP code (see below) */
|
|
uint16_t icmp_cksum; /* 2-3 checksum */
|
|
uint16_t icmp_identifier; /* 4-5 flow identifier */
|
|
uint16_t icmp_sequence; /* 6-7 sequence number in flow */
|
|
};
|
|
|
|
/* ICMP_PARAMPROB header */
|
|
struct click_icmp_paramprob {
|
|
uint8_t icmp_type; /* 0 ICMP type (see below) */
|
|
uint8_t icmp_code; /* 1 ICMP code (see below) */
|
|
uint16_t icmp_cksum; /* 2-3 checksum */
|
|
uint8_t icmp_pointer; /* 4 parameter pointer */
|
|
uint8_t padding[3]; /* 5-7 should be zero */
|
|
/* followed by original IP header and initial portion of data */
|
|
};
|
|
|
|
/* Redirect header: ICMP_REDIRECT */
|
|
struct click_icmp_redirect {
|
|
uint8_t icmp_type; /* 0 ICMP_REDIRECT (see below) */
|
|
uint8_t icmp_code; /* 1 ICMP code (see below) */
|
|
uint16_t icmp_cksum; /* 2-3 checksum */
|
|
struct in_addr icmp_gateway; /* 4-7 address of gateway */
|
|
/* followed by original IP header and initial portion of data */
|
|
};
|
|
|
|
/* Timestamp and TimestampReply header: ICMP_TSTAMP and ICMP_TSTAMPREPLY */
|
|
struct click_icmp_tstamp {
|
|
uint8_t icmp_type; /* 0 ICMP type (see below) */
|
|
uint8_t icmp_code; /* 1 ICMP code (see below) */
|
|
uint16_t icmp_cksum; /* 2-3 checksum */
|
|
uint16_t icmp_identifier; /* 4-5 flow identifier */
|
|
uint16_t icmp_sequence; /* 6-7 sequence number in flow */
|
|
uint32_t icmp_originate; /* 8-11 originate timestamp */
|
|
uint32_t icmp_receive; /* 12-15 receive timestamp */
|
|
uint32_t icmp_transmit; /* 16-19 transmit timestamp */
|
|
};
|
|
|
|
/* Path MTU Discovery header: ICMP_UNREACH_NEEDFRAG */
|
|
struct click_icmp_needfrag {
|
|
uint8_t icmp_type; /* 0 ICMP_UNREACH (see below) */
|
|
uint8_t icmp_code; /* 1 ICMP_UNREACH_NEEDFRAG */
|
|
uint16_t icmp_cksum; /* 2-3 checksum */
|
|
uint16_t padding; /* 4-5 should be zero */
|
|
uint16_t icmp_nextmtu; /* 6-7 Next-Hop MTU */
|
|
/* followed by original IP header and initial portion of data */
|
|
};
|
|
|
|
#define click_icmp_unreach click_icmp
|
|
#define click_icmp_sourcequench click_icmp
|
|
#define click_icmp_timxceed click_icmp
|
|
#define click_icmp_echo click_icmp_sequenced
|
|
|
|
|
|
/* ICMP type definitions and (indented) code definitions */
|
|
#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_PROTOCOL 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 /* net prohibited access */
|
|
#define ICMP_UNREACH_HOST_PROHIB 10 /* host prohibited access */
|
|
#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */
|
|
#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */
|
|
#define ICMP_UNREACH_FILTER_PROHIB 13 /* admin prohib */
|
|
#define ICMP_UNREACH_HOST_PRECEDENCE 14 /* host prec violation */
|
|
#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* prec cutoff */
|
|
#define ICMP_SOURCEQUENCH 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_ECHO 8 /* echo service */
|
|
#define ICMP_ROUTERADVERT 9 /* router advertisement */
|
|
#define ICMP_ROUTERSOLICIT 10 /* router solicitation */
|
|
#define ICMP_TIMXCEED 11 /* time exceeded, code: */
|
|
#define ICMP_TIMXCEED_TRANSIT 0 /* ttl==0 in transit */
|
|
#define ICMP_TIMXCEED_REASSEMBLY 1 /* ttl==0 in reassembly */
|
|
#define ICMP_PARAMPROB 12 /* ip header bad */
|
|
#define ICMP_PARAMPROB_ERRATPTR 0 /* error at param ptr */
|
|
#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_IREQ 15 /* information request */
|
|
#define ICMP_IREQREPLY 16 /* information reply */
|
|
#define ICMP_MASKREQ 17 /* address mask request */
|
|
#define ICMP_MASKREQREPLY 18 /* address mask reply */
|
|
|
|
static inline size_t
|
|
click_icmp_hl(uint8_t icmp_type)
|
|
{
|
|
if (icmp_type == ICMP_TSTAMP || icmp_type == ICMP_TSTAMPREPLY)
|
|
return sizeof(click_icmp_tstamp);
|
|
else
|
|
return sizeof(click_icmp);
|
|
}
|
|
|
|
#endif
|