1*76404edcSAsim Jamshed #ifndef __ICMP_H_
2*76404edcSAsim Jamshed #define __ICMP_H_
3*76404edcSAsim Jamshed 
4*76404edcSAsim Jamshed #include "mos_api.h"
5*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
6*76404edcSAsim Jamshed struct icmphdr {
7*76404edcSAsim Jamshed     uint8_t  icmp_type;
8*76404edcSAsim Jamshed     uint8_t  icmp_code;
9*76404edcSAsim Jamshed     uint16_t icmp_checksum;
10*76404edcSAsim Jamshed     union {
11*76404edcSAsim Jamshed         struct {
12*76404edcSAsim Jamshed             uint16_t icmp_id;
13*76404edcSAsim Jamshed             uint16_t icmp_sequence;
14*76404edcSAsim Jamshed         } echo;                     // ECHO | ECHOREPLY
15*76404edcSAsim Jamshed         struct {
16*76404edcSAsim Jamshed             uint16_t unused;
17*76404edcSAsim Jamshed             uint16_t nhop_mtu;
18*76404edcSAsim Jamshed         } dest;                     // DEST_UNREACH
19*76404edcSAsim Jamshed     } un;
20*76404edcSAsim Jamshed };
21*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
22*76404edcSAsim Jamshed /* getters and setters for ICMP fields */
23*76404edcSAsim Jamshed #define ICMP_ECHO_GET_ID(icmph)          (icmph->un.echo.icmp_id)
24*76404edcSAsim Jamshed #define ICMP_ECHO_GET_SEQ(icmph)         (icmph->un.echo.icmp_sequence)
25*76404edcSAsim Jamshed #define ICMP_DEST_UNREACH_GET_MTU(icmph) (icmph->un.dest.nhop_mtu)
26*76404edcSAsim Jamshed 
27*76404edcSAsim Jamshed #define ICMP_ECHO_SET_ID(icmph, id)      (icmph->un.echo.icmp_id = id)
28*76404edcSAsim Jamshed #define ICMP_ECHO_SET_SEQ(icmph, seq)    (icmph->un.echo.icmp_sequence = seq)
29*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
30*76404edcSAsim Jamshed void
31*76404edcSAsim Jamshed RequestICMP(mtcp_manager_t mtcp, struct pkt_ctx *pctx, uint32_t saddr, uint32_t daddr,
32*76404edcSAsim Jamshed         uint16_t icmp_id, uint16_t icmp_seq,
33*76404edcSAsim Jamshed         uint8_t *icmpd, uint16_t len);
34*76404edcSAsim Jamshed 
35*76404edcSAsim Jamshed int
36*76404edcSAsim Jamshed ProcessICMPPacket(mtcp_manager_t mtcp, struct pkt_ctx *pctx);
37*76404edcSAsim Jamshed 
38*76404edcSAsim Jamshed /* ICMP types */
39*76404edcSAsim Jamshed #define ICMP_ECHOREPLY      		0   /* Echo Reply               */
40*76404edcSAsim Jamshed #define ICMP_DEST_UNREACH   		3   /* Destination Unreachable  */
41*76404edcSAsim Jamshed #define ICMP_SOURCE_QUENCH  		4   /* Source Quench            */
42*76404edcSAsim Jamshed #define ICMP_REDIRECT       		5   /* Redirect (change route)  */
43*76404edcSAsim Jamshed #define ICMP_ECHO           		8   /* Echo Request             */
44*76404edcSAsim Jamshed #define ICMP_TIME_EXCEEDED  		11  /* Time Exceeded            */
45*76404edcSAsim Jamshed #define ICMP_PARAMETERPROB  		12  /* Parameter Problem        */
46*76404edcSAsim Jamshed #define ICMP_TIMESTAMP      		13  /* Timestamp Request        */
47*76404edcSAsim Jamshed #define ICMP_TIMESTAMPREPLY 		14  /* Timestamp Reply          */
48*76404edcSAsim Jamshed #define ICMP_INFO_REQUEST   		15  /* Information Request      */
49*76404edcSAsim Jamshed #define ICMP_INFO_REPLY     		16  /* Information Reply        */
50*76404edcSAsim Jamshed #define ICMP_ADDRESS        		17  /* Address Mask Request     */
51*76404edcSAsim Jamshed #define ICMP_ADDRESSREPLY   		18  /* Address Mask Reply       */
52*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
53*76404edcSAsim Jamshed #endif /* __ICMP_H_ */
54