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