[icmp] Add support for sending ICMP echo requests

Merge common functionality between IPv4 and IPv6 ICMP echo handling,
and add support for transmitting ICMP echo requests and delivering
ICMP echo replies to a (not yet implemented) ping_rx() function.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2013-10-21 14:10:07 +01:00
parent 12605efded
commit 5c2ffc26cc
9 changed files with 407 additions and 126 deletions

View File

@@ -184,7 +184,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#define ERRFILE_slam ( ERRFILE_NET | 0x00160000 )
#define ERRFILE_ib_sma ( ERRFILE_NET | 0x00170000 )
#define ERRFILE_ib_packet ( ERRFILE_NET | 0x00180000 )
#define ERRFILE_icmp ( ERRFILE_NET | 0x00190000 )
#define ERRFILE_icmpv4 ( ERRFILE_NET | 0x00190000 )
#define ERRFILE_ib_qset ( ERRFILE_NET | 0x001a0000 )
#define ERRFILE_ib_gma ( ERRFILE_NET | 0x001b0000 )
#define ERRFILE_ib_pathrec ( ERRFILE_NET | 0x001c0000 )
@@ -216,6 +216,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#define ERRFILE_oncrpc_iob ( ERRFILE_NET | 0x00360000 )
#define ERRFILE_neighbour ( ERRFILE_NET | 0x00370000 )
#define ERRFILE_socket ( ERRFILE_NET | 0x00380000 )
#define ERRFILE_icmp ( ERRFILE_NET | 0x00390000 )
#define ERRFILE_image ( ERRFILE_IMAGE | 0x00000000 )
#define ERRFILE_elf ( ERRFILE_IMAGE | 0x00010000 )

View File

@@ -9,6 +9,12 @@
FILE_LICENCE ( GPL2_OR_LATER );
#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 */
@@ -19,7 +25,49 @@ struct icmp_header {
uint16_t chksum;
} __attribute__ (( packed ));
#define ICMP_ECHO_RESPONSE 0
/** 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 */

View File

@@ -13,28 +13,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/tables.h>
#include <ipxe/iobuf.h>
#include <ipxe/netdevice.h>
/** An ICMPv6 header */
struct icmpv6_header {
/** Type */
uint8_t type;
/** Code */
uint8_t code;
/** Checksum */
uint16_t chksum;
} __attribute__ (( packed ));
/** An ICMPv6 echo request/reply */
struct icmpv6_echo {
/** ICMPv6 header */
struct icmpv6_header icmp;
/** Identifier */
uint16_t ident;
/** Sequence number */
uint16_t sequence;
/** Data */
uint8_t data[0];
} __attribute__ (( packed ));
#include <ipxe/icmp.h>
/** An ICMPv6 handler */
struct icmpv6_handler {

View File

@@ -31,7 +31,7 @@ struct ndp_option {
/** An NDP header */
struct ndp_header {
/** ICMPv6 header */
struct icmpv6_header icmp;
struct icmp_header icmp;
/** Flags */
uint8_t flags;
/** Reserved */

18
src/include/ipxe/ping.h Normal file
View File

@@ -0,0 +1,18 @@
#ifndef _IPXE_PING_H
#define _IPXE_PING_H
/** @file
*
* ICMP ping protocol
*
*/
FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/iobuf.h>
#include <ipxe/tcpip.h>
extern int ping_rx ( struct io_buffer *iobuf,
struct sockaddr_tcpip *st_src );
#endif /* _IPXE_PING_H */