iPXE
Data Structures | Macros | Functions
icmp.h File Reference

ICMP protocol. More...

#include <stdint.h>
#include <ipxe/iobuf.h>
#include <ipxe/socket.h>
#include <ipxe/tcpip.h>
#include <ipxe/tables.h>

Go to the source code of this file.

Data Structures

struct  icmp_header
 An ICMP header. More...
 
struct  icmp_echo
 An ICMP echo request/reply. More...
 
struct  icmp_echo_protocol
 An ICMP echo protocol. More...
 

Macros

#define ICMP_ECHO_PROTOCOLS   __table ( struct icmp_echo_protocol, "icmp_echo_protocols" )
 ICMP echo protocol table. More...
 
#define __icmp_echo_protocol   __table_entry ( ICMP_ECHO_PROTOCOLS, 01 )
 Declare an ICMP echo protocol. More...
 
#define ICMP_ECHO_REPLY   0
 
#define ICMP_ECHO_REQUEST   8
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
int icmp_tx_echo_request (struct io_buffer *iobuf, struct sockaddr_tcpip *st_dest)
 Transmit ICMP echo request. More...
 
int icmp_rx_echo_request (struct io_buffer *iobuf, struct sockaddr_tcpip *st_src, struct icmp_echo_protocol *echo_protocol)
 Process a received ICMP echo request. More...
 
int icmp_rx_echo_reply (struct io_buffer *iobuf, struct sockaddr_tcpip *st_src)
 Process a received ICMP echo request. More...
 

Detailed Description

ICMP protocol.

Definition in file icmp.h.

Macro Definition Documentation

◆ ICMP_ECHO_PROTOCOLS

#define ICMP_ECHO_PROTOCOLS   __table ( struct icmp_echo_protocol, "icmp_echo_protocols" )

ICMP echo protocol table.

Definition at line 55 of file icmp.h.

◆ __icmp_echo_protocol

struct icmp_echo_protocol icmpv6_echo_protocol __icmp_echo_protocol   __table_entry ( ICMP_ECHO_PROTOCOLS, 01 )

Declare an ICMP echo protocol.

ICMPv6 echo protocol.

ICMPv4 echo protocol.

Definition at line 59 of file icmp.h.

◆ ICMP_ECHO_REPLY

#define ICMP_ECHO_REPLY   0

Definition at line 61 of file icmp.h.

◆ ICMP_ECHO_REQUEST

#define ICMP_ECHO_REQUEST   8

Definition at line 62 of file icmp.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ icmp_tx_echo_request()

int icmp_tx_echo_request ( struct io_buffer iobuf,
struct sockaddr_tcpip st_dest 
)

Transmit ICMP echo request.

Parameters
iobufI/O buffer
st_destDestination socket address
Return values
rcReturn status code

Definition at line 105 of file icmp.c.

106  {
107  struct icmp_echo *echo = iobuf->data;
108  struct icmp_echo_protocol *echo_protocol;
109  int rc;
110 
111  /* Identify ICMP echo protocol */
112  echo_protocol = icmp_echo_protocol ( st_dest->st_family );
113  if ( ! echo_protocol ) {
114  DBGC ( icmpcol ( st_dest ), "ICMP TX echo request unknown "
115  "address family %d\n", st_dest->st_family );
116  free_iob ( iobuf );
117  return -ENOTSUP;
118  }
119 
120  /* Set type */
121  echo->icmp.type = echo_protocol->request;
122 
123  /* Transmit request */
124  DBGC ( icmpcol ( st_dest ), "ICMP TX echo request id %04x seq %04x\n",
125  ntohs ( echo->ident ), ntohs ( echo->sequence ) );
126  if ( ( rc = icmp_tx_echo ( iobuf, st_dest, echo_protocol ) ) != 0 )
127  return rc;
128 
129  return 0;
130 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
An ICMP echo request/reply.
Definition: icmp.h:29
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:145
sa_family_t st_family
Socket address family (part of struct sockaddr)
Definition: tcpip.h:77
#define DBGC(...)
Definition: compiler.h:505
#define ntohs(value)
Definition: byteswap.h:136
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
static struct icmp_echo_protocol * icmp_echo_protocol(sa_family_t family)
Identify ICMP echo protocol.
Definition: icmp.c:48
uint8_t request
Request type.
Definition: icmp.h:45
static int icmp_tx_echo(struct io_buffer *iobuf, struct sockaddr_tcpip *st_dest, struct icmp_echo_protocol *echo_protocol)
Transmit ICMP echo packet.
Definition: icmp.c:78
static uint32_t icmpcol(struct sockaddr_tcpip *st_peer)
Determine debugging colour for ICMP debug messages.
Definition: icmp.c:65
An ICMP echo protocol.
Definition: icmp.h:41
void * data
Start of data.
Definition: iobuf.h:44
int echo(void)
Definition: kb.c:133

References io_buffer::data, DBGC, echo(), ENOTSUP, free_iob(), icmp_echo_protocol(), icmp_tx_echo(), icmpcol(), ntohs, rc, icmp_echo_protocol::request, and sockaddr_tcpip::st_family.

Referenced by ping_deliver().

◆ icmp_rx_echo_request()

int icmp_rx_echo_request ( struct io_buffer iobuf,
struct sockaddr_tcpip st_src,
struct icmp_echo_protocol echo_protocol 
)

Process a received ICMP echo request.

Parameters
iobufI/O buffer
st_srcSource socket address
echo_protocolICMP echo protocol
Return values
rcReturn status code

Definition at line 165 of file icmp.c.

167  {
168  struct icmp_echo *echo = iobuf->data;
169  int rc;
170 
171  /* Sanity check */
172  if ( iob_len ( iobuf ) < sizeof ( *echo ) ) {
173  DBGC ( icmpcol ( st_src ), "ICMP RX echo request too short at "
174  "%zd bytes (min %zd bytes)\n",
175  iob_len ( iobuf ), sizeof ( *echo ) );
176  free_iob ( iobuf );
177  return -EINVAL;
178  }
179  DBGC ( icmpcol ( st_src ), "ICMP RX echo request id %04x seq %04x\n",
180  ntohs ( echo->ident ), ntohs ( echo->sequence ) );
181 
182  /* Transmit echo reply */
183  if ( ( rc = icmp_tx_echo_reply ( iobuf, st_src, echo_protocol ) ) != 0 )
184  return rc;
185 
186  return 0;
187 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
An ICMP echo request/reply.
Definition: icmp.h:29
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:145
#define DBGC(...)
Definition: compiler.h:505
#define ntohs(value)
Definition: byteswap.h:136
static int icmp_tx_echo_reply(struct io_buffer *iobuf, struct sockaddr_tcpip *st_dest, struct icmp_echo_protocol *echo_protocol)
Transmit ICMP echo reply.
Definition: icmp.c:139
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:151
static uint32_t icmpcol(struct sockaddr_tcpip *st_peer)
Determine debugging colour for ICMP debug messages.
Definition: icmp.c:65
void * data
Start of data.
Definition: iobuf.h:44
int echo(void)
Definition: kb.c:133

References io_buffer::data, DBGC, echo(), EINVAL, free_iob(), icmp_tx_echo_reply(), icmpcol(), iob_len(), ntohs, and rc.

Referenced by icmpv4_rx(), and icmpv6_rx_echo_request().

◆ icmp_rx_echo_reply()

int icmp_rx_echo_reply ( struct io_buffer iobuf,
struct sockaddr_tcpip st_src 
)

Process a received ICMP echo request.

Parameters
iobufI/O buffer
st_srcSource socket address
Return values
rcReturn status code

Definition at line 196 of file icmp.c.

197  {
198  struct icmp_echo *echo = iobuf->data;
199  int rc;
200 
201  /* Sanity check */
202  if ( iob_len ( iobuf ) < sizeof ( *echo ) ) {
203  DBGC ( icmpcol ( st_src ), "ICMP RX echo reply too short at "
204  "%zd bytes (min %zd bytes)\n",
205  iob_len ( iobuf ), sizeof ( *echo ) );
206  free_iob ( iobuf );
207  return -EINVAL;
208  }
209  DBGC ( icmpcol ( st_src ), "ICMP RX echo reply id %04x seq %04x\n",
210  ntohs ( echo->ident ), ntohs ( echo->sequence ) );
211 
212  /* Deliver to ping protocol */
213  if ( ( rc = ping_rx ( iobuf, st_src ) ) != 0 )
214  return rc;
215 
216  return 0;
217 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
An ICMP echo request/reply.
Definition: icmp.h:29
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:145
#define DBGC(...)
Definition: compiler.h:505
#define ntohs(value)
Definition: byteswap.h:136
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:151
static uint32_t icmpcol(struct sockaddr_tcpip *st_peer)
Determine debugging colour for ICMP debug messages.
Definition: icmp.c:65
void * data
Start of data.
Definition: iobuf.h:44
__weak int ping_rx(struct io_buffer *iobuf, struct sockaddr_tcpip *st_src __unused)
Receive ping reply (when no ping protocol is present)
Definition: icmp.c:226
int echo(void)
Definition: kb.c:133

References io_buffer::data, DBGC, echo(), EINVAL, free_iob(), icmpcol(), iob_len(), ntohs, ping_rx(), and rc.

Referenced by icmpv4_rx(), and icmpv6_rx_echo_reply().