aboutsummaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2013-10-21 14:10:07 +0100
committerMichael Brown <mcb30@ipxe.org>2013-10-21 15:08:12 +0100
commit5c2ffc26cc9b73ef60cbd123cd90f499dc01bbc2 (patch)
tree5dc77a8f4b54549e1468ecf93d1cd5cc454f6e60 /src/include
parent12605efded6928add185d8d9666b4be9a67b7945 (diff)
downloadipxe-5c2ffc26cc9b73ef60cbd123cd90f499dc01bbc2.zip
ipxe-5c2ffc26cc9b73ef60cbd123cd90f499dc01bbc2.tar.gz
ipxe-5c2ffc26cc9b73ef60cbd123cd90f499dc01bbc2.tar.bz2
[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>
Diffstat (limited to 'src/include')
-rw-r--r--src/include/ipxe/errfile.h3
-rw-r--r--src/include/ipxe/icmp.h50
-rw-r--r--src/include/ipxe/icmpv6.h23
-rw-r--r--src/include/ipxe/ndp.h2
-rw-r--r--src/include/ipxe/ping.h18
5 files changed, 71 insertions, 25 deletions
diff --git a/src/include/ipxe/errfile.h b/src/include/ipxe/errfile.h
index c55107a..376f88c 100644
--- a/src/include/ipxe/errfile.h
+++ b/src/include/ipxe/errfile.h
@@ -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 )
diff --git a/src/include/ipxe/icmp.h b/src/include/ipxe/icmp.h
index e402ce4..0480ddf 100644
--- a/src/include/ipxe/icmp.h
+++ b/src/include/ipxe/icmp.h
@@ -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 */
diff --git a/src/include/ipxe/icmpv6.h b/src/include/ipxe/icmpv6.h
index c8f0be0..c09a71a 100644
--- a/src/include/ipxe/icmpv6.h
+++ b/src/include/ipxe/icmpv6.h
@@ -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 {
diff --git a/src/include/ipxe/ndp.h b/src/include/ipxe/ndp.h
index 7b98637..1f05e9a 100644
--- a/src/include/ipxe/ndp.h
+++ b/src/include/ipxe/ndp.h
@@ -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 */
diff --git a/src/include/ipxe/ping.h b/src/include/ipxe/ping.h
new file mode 100644
index 0000000..6cd376b
--- /dev/null
+++ b/src/include/ipxe/ping.h
@@ -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 */