#ifndef _IPXE_ICMP_H #define _IPXE_ICMP_H /** @file * * ICMP protocol * */ FILE_LICENCE ( GPL2_OR_LATER ); #include #include #include #include #include /** An ICMP header */ struct icmp_header { /** Type */ uint8_t type; /** Code */ uint8_t code; /** Checksum */ uint16_t chksum; } __attribute__ (( packed )); /** An ICMP echo request/reply */ struct icmp_echo { /** ICMPv6 header */ struct icmp_header icmp; /** Identifier */ uint16_t ident; /** Sequence number */ uint16_t sequence; /** Data */ uint8_t data[0]; } __attribute__ (( packed )); /** An ICMP echo protocol */ struct icmp_echo_protocol { /** Address family */ sa_family_t family; /** Request type */ uint8_t request; /** Reply type */ uint8_t reply; /** TCP/IP protocol */ struct tcpip_protocol *tcpip_protocol; /** Include network-layer checksum within packet */ int net_checksum; }; /** ICMP echo protocol table */ #define ICMP_ECHO_PROTOCOLS \ __table ( struct icmp_echo_protocol, "icmp_echo_protocols" ) /** Declare an ICMP echo protocol */ #define __icmp_echo_protocol __table_entry ( ICMP_ECHO_PROTOCOLS, 01 ) #define ICMP_ECHO_REPLY 0 #define ICMP_ECHO_REQUEST 8 extern int icmp_tx_echo_request ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_dest ); extern int icmp_rx_echo_request ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src, struct icmp_echo_protocol *echo_protocol ); extern int icmp_rx_echo_reply ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src ); #endif /* _IPXE_ICMP_H */