mirror of https://github.com/ipxe/ipxe.git
74 lines
1.6 KiB
C
74 lines
1.6 KiB
C
#ifndef _IPXE_ICMP_H
|
|
#define _IPXE_ICMP_H
|
|
|
|
/** @file
|
|
*
|
|
* ICMP protocol
|
|
*
|
|
*/
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|
|
|
#include <stdint.h>
|
|
#include <ipxe/iobuf.h>
|
|
#include <ipxe/socket.h>
|
|
#include <ipxe/tcpip.h>
|
|
#include <ipxe/tables.h>
|
|
|
|
/** 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 */
|